diff --git a/frontend/.bazelignore b/frontend/.bazelignore index e8d37fb2b..1e8fe8421 100644 --- a/frontend/.bazelignore +++ b/frontend/.bazelignore @@ -1,5 +1,6 @@ node_modules next.js/node_modules +next.js14/node_modules packages/one/node_modules react/node_modules react-webpack/node_modules diff --git a/frontend/MODULE.bazel b/frontend/MODULE.bazel index 004d9ec44..eaf0a40d9 100644 --- a/frontend/MODULE.bazel +++ b/frontend/MODULE.bazel @@ -9,6 +9,10 @@ bazel_dep(name = "aspect_rules_ts", version = "2.2.0") bazel_dep(name = "aspect_rules_rollup", version = "1.0.2") bazel_dep(name = "aspect_rules_webpack", version = "0.14.0") bazel_dep(name = "bazel_skylib", version = "1.5.0") +bazel_dep(name = "rules_nodejs", version = "6.1.0") + +node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True) +node.toolchain(node_version = "18.17.0") pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm", dev_dependency = True) use_repo(pnpm, "pnpm") diff --git a/frontend/next.js/BUILD.bazel b/frontend/next.js/BUILD.bazel index 21321342a..36c239ad9 100644 --- a/frontend/next.js/BUILD.bazel +++ b/frontend/next.js/BUILD.bazel @@ -74,9 +74,5 @@ build_test( name = "build_test", targets = [ ":next", - # Not build testing the `:next_export` target since this `next export` writes back to the `.next` directory which - # causes issues with trying to write to an input. See https://github.com/vercel/next.js/issues/43344. - # TODO: fix in Next.js (https://github.com/vercel/next.js/issues/43344) or find work-around. - # ":next_export", ], ) diff --git a/frontend/next.js14/.gitignore b/frontend/next.js14/.gitignore new file mode 100644 index 000000000..fd3dbb571 --- /dev/null +++ b/frontend/next.js14/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/frontend/next.js14/BUILD.bazel b/frontend/next.js14/BUILD.bazel new file mode 100644 index 000000000..2ddb5113f --- /dev/null +++ b/frontend/next.js14/BUILD.bazel @@ -0,0 +1,45 @@ +load("@aspect_rules_js//js:defs.bzl", "js_library", "js_test") +load("@aspect_rules_ts//ts:defs.bzl", "ts_config") +load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@npm//:defs.bzl", "npm_link_all_packages") +load("@npm//next.js14:next/package_json.bzl", next_bin = "bin") +load(":defs.bzl", "next") + +npm_link_all_packages(name = "node_modules") + +next_bin.next_binary( + name = "next_js_binary", + visibility = ["//visibility:public"], +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + visibility = ["//visibility:public"], +) + +next( + name = "next", + srcs = [ + "//next.js14/src/app", + "//next.js14/public", + ], + data = [ + "next.config.mjs", + "package.json", + ":node_modules/@bazel-example/one", + ":node_modules/next", + ":node_modules/react", + ":node_modules/react-dom", + ":node_modules/typescript", + ], + next_bin = "./node_modules/next/dist/bin/next", + next_js_binary = ":next_js_binary", +) + +build_test( + name = "build_test", + targets = [ + ":next", + ], +) diff --git a/frontend/next.js14/README.md b/frontend/next.js14/README.md new file mode 100644 index 000000000..c4033664f --- /dev/null +++ b/frontend/next.js14/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/frontend/next.js14/defs.bzl b/frontend/next.js14/defs.bzl new file mode 100644 index 000000000..853084407 --- /dev/null +++ b/frontend/next.js14/defs.bzl @@ -0,0 +1,189 @@ +"""Wrapper macro to make the next.js rules more ergonomic. + +This might be upstreamed to a "contrib" folder in rules_js at some point. +Follow https://github.com/aspect-build/rules_js/issues/1292 +""" + +load("@aspect_rules_js//js:defs.bzl", "js_run_binary", "js_run_devserver") + +def next( + name, + srcs, + data, + next_js_binary, + next_bin, + next_build_out = ".next", + next_export_out = "out", + **kwargs): + """Generates Next.js targets build, dev & start targets. + + `{name}` - a js_run_binary build target that runs `next build` + `{name}_dev` - a js_run_devserver binary target that runs `next dev` + `{name}_start` - a js_run_devserver binary target that runs `next start` + + Use this macro in the BUILD file at the root of a next app where the `next.config.js` file is + located. + + For example, a target such as + + ``` + next( + name = "next", + srcs = [ + "//next.js/pages", + "//next.js/public", + "//next.js/styles", + ], + data = [ + "//next.js:node_modules/next", + "//next.js:node_modules/react-dom", + "//next.js:node_modules/react", + "//next.js:node_modules/typescript", + "next.config.js", + "package.json", + ], + next_bin = "../../node_modules/.bin/next", + next_js_binary = "//:next_js_binary", + ) + ``` + + in an `next.js/BUILD.bazel` file where the root `BUILD.bazel` file has + next linked to `node_modules` and the `next_js_binary`: + + ``` + load("@npm//:defs.bzl", "npm_link_all_packages") + load("@npm//:next/package_json.bzl", next_bin = "bin") + + npm_link_all_packages(name = "node_modules") + + next_bin.next_binary( + name = "next_js_binary", + visibility = ["//visibility:public"], + ) + ``` + + will create the targets: + + ``` + //next.js:next + //next.js:next_dev + //next.js:next_start + ``` + + To build the above next app, equivalent to running + `next build` outside Bazel, run, + + ``` + bazel build //next.js:next + ``` + + To run the development server in watch mode with + [ibazel](https://github.com/bazelbuild/bazel-watcher), equivalent to running + `next dev` outside Bazel, run + + ``` + ibazel run //next.js:next_dev + ``` + + To run the production server in watch mode with + [ibazel](https://github.com/bazelbuild/bazel-watcher), equivalent to running + `next start` outside Bazel, + + ``` + ibazel run //next.js:next_start + ``` + + To export the above next app, equivalent to running + `next export` outside Bazel, run, + + ``` + bazel build //next.js:next_export + ``` + + Args: + name: The name of the build target. + + srcs: Source files to include in build & dev targets. + Typically these are source files or transpiled source files in Next.js source folders + such as `pages`, `public` & `styles`. + + data: Data files to include in all targets. + These are typically npm packages required for the build & configuration files such as + package.json and next.config.js. + + next_js_binary: The next js_binary. Used for the `build `target. + + Typically this is a js_binary target created using `bin` loaded from the `package_json.bzl` + file of the npm package. + + See main docstring above for example usage. + + next_bin: The next bin command. Used for the `dev` and `start` targets. + + Typically the path to the next entry point from the current package. For example `./node_modules/.bin/next`, + if next is linked to the current package, or a relative path such as `../node_modules/.bin/next`, if next is + linked in the parent package. + + See main docstring above for example usage. + + next_build_out: The `next build` output directory. Defaults to `.next` which is the Next.js default output directory for the `build` command. + + next_export_out: The `next export` output directory. Defaults to `out` which is the Next.js default output directory for the `export` command. + + **kwargs: Other attributes passed to all targets such as `tags`. + """ + + tags = kwargs.pop("tags", []) + + # `next build` creates an optimized bundle of the application + # https://nextjs.org/docs/api-reference/cli#build + js_run_binary( + name = name, + tool = next_js_binary, + args = ["build"], + srcs = srcs + data, + out_dirs = [next_build_out], + chdir = native.package_name(), + tags = tags, + **kwargs + ) + + # `next dev` runs the application in development mode + # https://nextjs.org/docs/api-reference/cli#development + js_run_devserver( + name = "{}_dev".format(name), + command = next_bin, + args = ["dev"], + data = srcs + data, + chdir = native.package_name(), + tags = tags, + **kwargs + ) + + # `next start` runs the application in production mode + # https://nextjs.org/docs/api-reference/cli#production + js_run_devserver( + name = "{}_start".format(name), + command = next_bin, + args = ["start"], + data = data + [name], + chdir = native.package_name(), + tags = tags, + **kwargs + ) + + # `next export` runs the application in production mode + # https://nextjs.org/docs/api-reference/cli#production + js_run_binary( + name = "{}_export".format(name), + tool = next_js_binary, + args = ["export"], + srcs = data + [name], + out_dirs = [next_export_out], + chdir = native.package_name(), + # Tagged as "manual" since this `next export` writes back to the `.next` directory which causes issues with + # trying to write to an input. See https://github.com/vercel/next.js/issues/43344. + # TODO: fix in Next.js (https://github.com/vercel/next.js/issues/43344) or find work-around. + tags = tags + ["manual"], + **kwargs + ) diff --git a/frontend/next.js14/next.config.mjs b/frontend/next.js14/next.config.mjs new file mode 100644 index 000000000..4678774e6 --- /dev/null +++ b/frontend/next.js14/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/frontend/next.js14/package.json b/frontend/next.js14/package.json new file mode 100644 index 000000000..bc2cae149 --- /dev/null +++ b/frontend/next.js14/package.json @@ -0,0 +1,24 @@ +{ + "name": "my-app", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@bazel-example/one": "workspace:*", + "@types/is-even": "1.0.1", + "next": "14.2.3", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "typescript": "^5" + } +} diff --git a/frontend/next.js14/public/BUILD.bazel b/frontend/next.js14/public/BUILD.bazel new file mode 100644 index 000000000..17284204f --- /dev/null +++ b/frontend/next.js14/public/BUILD.bazel @@ -0,0 +1,10 @@ +load("@aspect_rules_js//js:defs.bzl", "js_library") + +js_library( + name = "public", + srcs = [ + "next.svg", + "vercel.svg", + ], + visibility = ["//next.js14:__subpackages__"], +) diff --git a/frontend/next.js14/public/next.svg b/frontend/next.js14/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/frontend/next.js14/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/next.js14/public/vercel.svg b/frontend/next.js14/public/vercel.svg new file mode 100644 index 000000000..d2f842227 --- /dev/null +++ b/frontend/next.js14/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/next.js14/src/app/BUILD.bazel b/frontend/next.js14/src/app/BUILD.bazel new file mode 100644 index 000000000..9ec71c9fd --- /dev/null +++ b/frontend/next.js14/src/app/BUILD.bazel @@ -0,0 +1,24 @@ +load("@aspect_rules_ts//ts:defs.bzl", "ts_project") + +SRCS = [ + "layout.tsx", + "page.tsx", +] + +ts_project( + name = "app", + assets = ["page.module.css"], + srcs = SRCS, + allow_js = True, + declaration = True, + preserve_jsx = True, + resolve_json_module = True, + transpiler = "tsc", + tsconfig = "//next.js14:tsconfig", + visibility = ["//next.js14:__subpackages__"], + deps = [ + "//next.js14:node_modules/@types/react", + "//next.js14:node_modules/@types/react-dom", + "//next.js14:node_modules/next", + ], +) diff --git a/frontend/next.js14/src/app/favicon.ico b/frontend/next.js14/src/app/favicon.ico new file mode 100644 index 000000000..718d6fea4 Binary files /dev/null and b/frontend/next.js14/src/app/favicon.ico differ diff --git a/frontend/next.js14/src/app/globals.css b/frontend/next.js14/src/app/globals.css new file mode 100644 index 000000000..f4bd77c0c --- /dev/null +++ b/frontend/next.js14/src/app/globals.css @@ -0,0 +1,107 @@ +:root { + --max-width: 1100px; + --border-radius: 12px; + --font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", + "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro", + "Fira Mono", "Droid Sans Mono", "Courier New", monospace; + + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; + + --primary-glow: conic-gradient( + from 180deg at 50% 50%, + #16abff33 0deg, + #0885ff33 55deg, + #54d6ff33 120deg, + #0071ff33 160deg, + transparent 360deg + ); + --secondary-glow: radial-gradient( + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); + + --tile-start-rgb: 239, 245, 249; + --tile-end-rgb: 228, 232, 233; + --tile-border: conic-gradient( + #00000080, + #00000040, + #00000030, + #00000020, + #00000010, + #00000010, + #00000080 + ); + + --callout-rgb: 238, 240, 241; + --callout-border-rgb: 172, 175, 176; + --card-rgb: 180, 185, 188; + --card-border-rgb: 131, 134, 135; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + + --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); + --secondary-glow: linear-gradient( + to bottom right, + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0.3) + ); + + --tile-start-rgb: 2, 13, 46; + --tile-end-rgb: 2, 5, 19; + --tile-border: conic-gradient( + #ffffff80, + #ffffff40, + #ffffff30, + #ffffff20, + #ffffff10, + #ffffff10, + #ffffff80 + ); + + --callout-rgb: 20, 20, 20; + --callout-border-rgb: 108, 108, 108; + --card-rgb: 100, 100, 100; + --card-border-rgb: 200, 200, 200; + } +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +a { + color: inherit; + text-decoration: none; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} diff --git a/frontend/next.js14/src/app/layout.tsx b/frontend/next.js14/src/app/layout.tsx new file mode 100644 index 000000000..3314e4780 --- /dev/null +++ b/frontend/next.js14/src/app/layout.tsx @@ -0,0 +1,22 @@ +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import "./globals.css"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/frontend/next.js14/src/app/page.module.css b/frontend/next.js14/src/app/page.module.css new file mode 100644 index 000000000..5c4b1e6a2 --- /dev/null +++ b/frontend/next.js14/src/app/page.module.css @@ -0,0 +1,230 @@ +.main { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 6rem; + min-height: 100vh; +} + +.description { + display: inherit; + justify-content: inherit; + align-items: inherit; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + z-index: 2; + font-family: var(--font-mono); +} + +.description a { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} + +.description p { + position: relative; + margin: 0; + padding: 1rem; + background-color: rgba(var(--callout-rgb), 0.5); + border: 1px solid rgba(var(--callout-border-rgb), 0.3); + border-radius: var(--border-radius); +} + +.code { + font-weight: 700; + font-family: var(--font-mono); +} + +.grid { + display: grid; + grid-template-columns: repeat(4, minmax(25%, auto)); + max-width: 100%; + width: var(--max-width); +} + +.card { + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0); + transition: background 200ms, border 200ms; +} + +.card span { + display: inline-block; + transition: transform 200ms; +} + +.card h2 { + font-weight: 600; + margin-bottom: 0.7rem; +} + +.card p { + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + max-width: 30ch; + text-wrap: balance; +} + +.center { + display: flex; + justify-content: center; + align-items: center; + position: relative; + padding: 4rem 0; +} + +.center::before { + background: var(--secondary-glow); + border-radius: 50%; + width: 480px; + height: 360px; + margin-left: -400px; +} + +.center::after { + background: var(--primary-glow); + width: 240px; + height: 180px; + z-index: -1; +} + +.center::before, +.center::after { + content: ""; + left: 50%; + position: absolute; + filter: blur(45px); + transform: translateZ(0); +} + +.logo { + position: relative; +} +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } + + .card:hover span { + transform: translateX(4px); + } +} + +@media (prefers-reduced-motion) { + .card:hover span { + transform: none; + } +} + +/* Mobile */ +@media (max-width: 700px) { + .content { + padding: 4rem; + } + + .grid { + grid-template-columns: 1fr; + margin-bottom: 120px; + max-width: 320px; + text-align: center; + } + + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } + + .center { + padding: 8rem 0 6rem; + } + + .center::before { + transform: none; + height: 300px; + } + + .description { + font-size: 0.8rem; + } + + .description a { + padding: 1rem; + } + + .description p, + .description div { + display: flex; + justify-content: center; + position: fixed; + width: 100%; + } + + .description p { + align-items: center; + inset: 0 0 auto; + padding: 2rem 1rem 1.4rem; + border-radius: 0; + border: none; + border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); + background: linear-gradient( + to bottom, + rgba(var(--background-start-rgb), 1), + rgba(var(--callout-rgb), 0.5) + ); + background-clip: padding-box; + backdrop-filter: blur(24px); + } + + .description div { + align-items: flex-end; + pointer-events: none; + inset: auto 0 0; + padding: 2rem; + height: 200px; + background: linear-gradient( + to bottom, + transparent 0%, + rgb(var(--background-end-rgb)) 40% + ); + z-index: 1; + } +} + +/* Tablet and Smaller Desktop */ +@media (min-width: 701px) and (max-width: 1120px) { + .grid { + grid-template-columns: repeat(2, 50%); + } +} + +@media (prefers-color-scheme: dark) { + .vercelLogo { + filter: invert(1); + } + + .logo { + filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); + } +} + +@keyframes rotate { + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } +} diff --git a/frontend/next.js14/src/app/page.tsx b/frontend/next.js14/src/app/page.tsx new file mode 100644 index 000000000..d2c63a496 --- /dev/null +++ b/frontend/next.js14/src/app/page.tsx @@ -0,0 +1,95 @@ +import Image from "next/image"; +import styles from "./page.module.css"; + +export default function Home() { + return ( +
+
+

+ Get started by editing  + src/app/page.tsx +

+
+ + By{" "} + Vercel Logo + +
+
+ +
+ Next.js Logo +
+ +
+ +

+ Docs -> +

+

Find in-depth information about Next.js features and API.

+
+ + +

+ Learn -> +

+

Learn about Next.js in an interactive course with quizzes!

+
+ + +

+ Templates -> +

+

Explore starter templates for Next.js.

+
+ + +

+ Deploy -> +

+

+ Instantly deploy your Next.js site to a shareable URL with Vercel. +

+
+
+
+ ); +} diff --git a/frontend/next.js14/tsconfig.json b/frontend/next.js14/tsconfig.json new file mode 100644 index 000000000..a9a4a427d --- /dev/null +++ b/frontend/next.js14/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "declaration": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 64cd5acb7..c8a93514f 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -4,7 +4,7 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -packageExtensionsChecksum: a122f03ed0dc3605ecb32517e9cf5c4c +packageExtensionsChecksum: 1137c84cb3f5d653debe824f83a85f54 importers: @@ -84,6 +84,37 @@ importers: specifier: 4.9.3 version: 4.9.3 + next.js14: + dependencies: + '@bazel-example/one': + specifier: workspace:* + version: link:../packages/one + '@types/is-even': + specifier: 1.0.1 + version: 1.0.1 + next: + specifier: 14.2.3 + version: 14.2.3(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18 + version: 18.2.0 + react-dom: + specifier: ^18 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/node': + specifier: ^20 + version: 20.0.0 + '@types/react': + specifier: ^18 + version: 18.2.0 + '@types/react-dom': + specifier: ^18 + version: 18.0.9 + typescript: + specifier: ^5 + version: 5.0.2 + packages/one: dependencies: is-odd: @@ -2608,6 +2639,10 @@ packages: /@next/env@13.0.5: resolution: {integrity: sha512-F3KLtiDrUslAZhTYTh8Zk5ZaavbYwLUn3NYPBnOjAXU8hWm0QVGVzKIOuURQ098ofRU4e9oglf3Sj9pFx5nI5w==} + /@next/env@14.2.3: + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + dev: false + /@next/eslint-plugin-next@13.0.5: resolution: {integrity: sha512-H9U9B1dFnCDmylDZ6/dYt95Ie1Iu+SLBMcO6rkIGIDcj5UK+DNyMiWm83xWBZ1gREM8cfp5Srv1g6wqf8pM4lw==} dependencies: @@ -2638,6 +2673,15 @@ packages: requiresBuild: true optional: true + /@next/swc-darwin-arm64@14.2.3: + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-darwin-x64@13.0.5: resolution: {integrity: sha512-SfigOKW4Z2UB3ruUPyvrlDIkcJq1hiw1wvYApWugD+tQsAkYZKEoz+/8emCmeYZ6Gwgi1WHV+z52Oj8u7bEHPg==} engines: {node: '>= 10'} @@ -2646,6 +2690,15 @@ packages: requiresBuild: true optional: true + /@next/swc-darwin-x64@14.2.3: + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-freebsd-x64@13.0.5: resolution: {integrity: sha512-0NJg8HZr4yG8ynmMGFXQf+Mahvq4ZgBmUwSlLXXymgxEQgH17erH/LoR69uITtW+KTsALgk9axEt5AAabM4ucg==} engines: {node: '>= 10'} @@ -2670,6 +2723,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-arm64-gnu@14.2.3: + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-musl@13.0.5: resolution: {integrity: sha512-xenvqlXz+KxVKAB1YR723gnVNszpsCvKZkiFFaAYqDGJ502YuqU2fwLsaSm/ASRizNcBYeo9HPLTyc3r/9cdMQ==} engines: {node: '>= 10'} @@ -2678,6 +2740,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-arm64-musl@14.2.3: + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-gnu@13.0.5: resolution: {integrity: sha512-9Ahi1bbdXwhrWQmOyoTod23/hhK05da/FzodiNqd6drrMl1y7+RujoEcU8Dtw3H1mGWB+yuTlWo8B4Iba8hqiQ==} engines: {node: '>= 10'} @@ -2686,6 +2757,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-x64-gnu@14.2.3: + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-musl@13.0.5: resolution: {integrity: sha512-V+1mnh49qmS9fOZxVRbzjhBEz9IUGJ7AQ80JPWAYQM5LI4TxfdiF4APLPvJ52rOmNeTqnVz1bbKtVOso+7EZ4w==} engines: {node: '>= 10'} @@ -2694,6 +2774,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-x64-musl@14.2.3: + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-arm64-msvc@13.0.5: resolution: {integrity: sha512-wRE9rkp7I+/3Jf2T9PFIJOKq3adMWYEFkPOA7XAkUfYbQHlDJm/U5cVCWUsKByyQq5RThwufI91sgd19MfxRxg==} engines: {node: '>= 10'} @@ -2702,6 +2791,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-arm64-msvc@14.2.3: + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-ia32-msvc@13.0.5: resolution: {integrity: sha512-Q1XQSLEhFuFhkKFdJIGt7cYQ4T3u6P5wrtUNreg5M+7P+fjSiC8+X+Vjcw+oebaacsdl0pWZlK+oACGafush1w==} engines: {node: '>= 10'} @@ -2710,6 +2808,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-ia32-msvc@14.2.3: + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-x64-msvc@13.0.5: resolution: {integrity: sha512-t5gRblrwwiNZP6cT7NkxlgxrFgHWtv9ei5vUraCLgBqzvIsa7X+PnarZUeQCXqz6Jg9JSGGT9j8lvzD97UqeJQ==} engines: {node: '>= 10'} @@ -2718,6 +2825,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-x64-msvc@14.2.3: + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: @@ -3118,13 +3234,19 @@ packages: /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: true /@swc/helpers@0.4.14: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: tslib: 2.6.2 + /@swc/helpers@0.5.5: + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.6.2 + dev: false + /@swc/types@0.1.5: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} dev: true @@ -3313,7 +3435,6 @@ packages: /@types/is-even@1.0.1: resolution: {integrity: sha512-8FbDpWHrWEiXXCuuwkuPT2p4tHr7fhOR2STGdSyQ0ljlqJT7sIqtHSRDXFSLTHqtizXmvThht0Hx3+2+7MAewg==} - dev: true /@types/is-odd@3.0.2: resolution: {integrity: sha512-a/mE50FokBkPY86oocj/oorgDaYjT+l2EGSVLwbAUFwjOpFFDlbqHW5I9FS0cISLxmuDRr1J26znAy88UkHUbg==} @@ -3383,6 +3504,10 @@ packages: undici-types: 5.26.5 dev: true + /@types/node@20.0.0: + resolution: {integrity: sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw==} + dev: true + /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: true @@ -4796,7 +4921,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001542 + caniuse-lite: 1.0.30001614 electron-to-chromium: 1.4.539 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) @@ -4807,7 +4932,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001566 + caniuse-lite: 1.0.30001614 electron-to-chromium: 1.4.608 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) @@ -4822,6 +4947,13 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -4866,11 +4998,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001542: - resolution: {integrity: sha512-UrtAXVcj1mvPBFQ4sKd38daP8dEcXXr5sQe6QNNinaPd0iA/cxg9/l3VrSdL73jgw5sKyuQ6jNgiKO12W3SsVA==} - - /caniuse-lite@1.0.30001566: - resolution: {integrity: sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==} + /caniuse-lite@1.0.30001614: + resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} /chai@4.3.10: resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} @@ -6922,7 +7051,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} @@ -8599,7 +8727,7 @@ packages: dependencies: '@next/env': 13.0.5 '@swc/helpers': 0.4.14 - caniuse-lite: 1.0.30001542 + caniuse-lite: 1.0.30001614 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -8622,6 +8750,48 @@ packages: - '@babel/core' - babel-plugin-macros + /next@14.2.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + dependencies: + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001614 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true @@ -9040,7 +9210,6 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /postcss@8.4.32: resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} @@ -9174,7 +9343,7 @@ packages: dependencies: loose-envify: 1.4.0 react: 18.2.0 - scheduler: 0.23.0 + scheduler: 0.23.2 /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -9487,8 +9656,8 @@ packages: xmlchars: 2.2.0 dev: true - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: loose-envify: 1.4.0 @@ -9816,6 +9985,11 @@ packages: internal-slot: 1.0.5 dev: true + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -9959,6 +10133,23 @@ packages: client-only: 0.0.1 react: 18.2.0 + /styled-jsx@5.1.1(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.2.0 + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -10232,6 +10423,12 @@ packages: hasBin: true dev: true + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + /ufo@1.3.2: resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} dev: true diff --git a/frontend/pnpm-workspace.yaml b/frontend/pnpm-workspace.yaml index 79e47bd17..45a032689 100644 --- a/frontend/pnpm-workspace.yaml +++ b/frontend/pnpm-workspace.yaml @@ -1,5 +1,5 @@ packages: - - next.js + - next.js* - packages/* - react - react-webpack