diff --git a/apps/example-next-conform/.gitignore b/apps/example-next-conform/.gitignore new file mode 100644 index 00000000..fd3dbb57 --- /dev/null +++ b/apps/example-next-conform/.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/apps/example-next-conform/README.md b/apps/example-next-conform/README.md new file mode 100644 index 00000000..a3b5f139 --- /dev/null +++ b/apps/example-next-conform/README.md @@ -0,0 +1,12 @@ +# Examples next app with conform + +## Getting Started + +``` +$ pnpm i +$ pnpm run dev +``` + +## Conform + +https://conform.guide/integration/nextjs diff --git a/apps/example-next-conform/next.config.js b/apps/example-next-conform/next.config.js new file mode 100644 index 00000000..c8028ecb --- /dev/null +++ b/apps/example-next-conform/next.config.js @@ -0,0 +1,15 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + experimental: { + scrollRestoration: true, + }, + productionBrowserSourceMaps: true, + webpack: (config, { isServer }) => { + if (isServer) { + config.devtool = "source-map"; + } + return config; + }, +}; + +module.exports = nextConfig; diff --git a/apps/example-next-conform/package.json b/apps/example-next-conform/package.json new file mode 100644 index 00000000..b6c89f2f --- /dev/null +++ b/apps/example-next-conform/package.json @@ -0,0 +1,22 @@ +{ + "private": true, + "scripts": { + "dev": "next dev --turbo", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "@conform-to/react": "1.0.6", + "@conform-to/zod": "1.0.6", + "next": "14.1.4", + "react": "18.2.0", + "react-dom": "18.2.0", + "zod": "3.22.4" + }, + "devDependencies": { + "@types/node": "20.11.30", + "@types/react": "18.2.67", + "@types/react-dom": "18.2.22", + "typescript": "5.4.3" + } +} diff --git a/apps/example-next-conform/src/app/dynamic-form/action.ts b/apps/example-next-conform/src/app/dynamic-form/action.ts new file mode 100644 index 00000000..ff51c798 --- /dev/null +++ b/apps/example-next-conform/src/app/dynamic-form/action.ts @@ -0,0 +1,19 @@ +"use server"; + +import { parseWithZod } from "@conform-to/zod"; +import { redirect } from "next/navigation"; +import { teamSchema } from "./schema"; + +export async function saveTeam(prevState: unknown, formData: FormData) { + const submission = parseWithZod(formData, { + schema: teamSchema, + }); + + if (submission.status !== "success") { + return submission.reply(); + } + + console.log("submit data", submission.value); + + redirect("/success"); +} diff --git a/apps/example-next-conform/src/app/dynamic-form/form.tsx b/apps/example-next-conform/src/app/dynamic-form/form.tsx new file mode 100644 index 00000000..34e25ac4 --- /dev/null +++ b/apps/example-next-conform/src/app/dynamic-form/form.tsx @@ -0,0 +1,71 @@ +"use client"; + +import { getFormProps, getInputProps, useForm } from "@conform-to/react"; +import { parseWithZod } from "@conform-to/zod"; +import { useFormState } from "react-dom"; +import { saveTeam } from "./action"; +import { teamSchema } from "./schema"; + +export default function Form() { + const [lastResult, action] = useFormState(saveTeam, undefined); + const [form, fields] = useForm({ + lastResult, + onValidate({ formData }) { + return parseWithZod(formData, { schema: teamSchema }); + }, + shouldValidate: "onBlur", + }); + const members = fields.members.getFieldList(); + + return ( +
+ + {members.map((member, index) => { + const memberFields = member.getFieldset(); + + return ( +
+
Member {index + 1}
+ + + + + +
{memberFields.name.errors?.join(", ")}
+
{memberFields.engineer.errors?.join(", ")}
+
+ ); + })} + +
+ ); +} diff --git a/apps/example-next-conform/src/app/dynamic-form/page.tsx b/apps/example-next-conform/src/app/dynamic-form/page.tsx new file mode 100644 index 00000000..57b956f3 --- /dev/null +++ b/apps/example-next-conform/src/app/dynamic-form/page.tsx @@ -0,0 +1,10 @@ +import Form from "./form"; + +export default function Page() { + return ( +
+

Dynamic Form

+
+
+ ); +} diff --git a/apps/example-next-conform/src/app/dynamic-form/schema.ts b/apps/example-next-conform/src/app/dynamic-form/schema.ts new file mode 100644 index 00000000..663552f7 --- /dev/null +++ b/apps/example-next-conform/src/app/dynamic-form/schema.ts @@ -0,0 +1,19 @@ +import { z } from "zod"; + +export const teamSchema = z.object({ + leaderId: z.string({ + required_error: "Leader is required", + }), + members: z.array( + z.object({ + id: z.string().min(1), + name: z + .string({ + required_error: "Name is required", + }) + .min(1) + .max(100), + engineer: z.preprocess((x) => x === "on", z.boolean()), + }), + ), +}); diff --git a/apps/example-next-conform/src/app/layout.tsx b/apps/example-next-conform/src/app/layout.tsx new file mode 100644 index 00000000..225b6038 --- /dev/null +++ b/apps/example-next-conform/src/app/layout.tsx @@ -0,0 +1,11 @@ +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/apps/example-next-conform/src/app/page.tsx b/apps/example-next-conform/src/app/page.tsx new file mode 100644 index 00000000..16c14126 --- /dev/null +++ b/apps/example-next-conform/src/app/page.tsx @@ -0,0 +1,22 @@ +import type { Metadata } from "next"; +import Link from "next/link"; + +export const metadata: Metadata = { + title: "`conform` example", +}; + +export default function Home() { + return ( +
+

`conform` example

+ +
+ ); +} diff --git a/apps/example-next-conform/src/app/simple-form/action.ts b/apps/example-next-conform/src/app/simple-form/action.ts new file mode 100644 index 00000000..7472cbc4 --- /dev/null +++ b/apps/example-next-conform/src/app/simple-form/action.ts @@ -0,0 +1,19 @@ +"use server"; + +import { parseWithZod } from "@conform-to/zod"; +import { redirect } from "next/navigation"; +import { userSchema } from "./schema"; + +export async function saveUser(prevState: unknown, formData: FormData) { + const submission = parseWithZod(formData, { + schema: userSchema, + }); + + if (submission.status !== "success") { + return submission.reply(); + } + + console.log("submit data", submission.value); + + redirect("/success"); +} diff --git a/apps/example-next-conform/src/app/simple-form/form.tsx b/apps/example-next-conform/src/app/simple-form/form.tsx new file mode 100644 index 00000000..a367641c --- /dev/null +++ b/apps/example-next-conform/src/app/simple-form/form.tsx @@ -0,0 +1,42 @@ +"use client"; + +import { getFormProps, getInputProps, useForm } from "@conform-to/react"; +import { parseWithZod } from "@conform-to/zod"; +import { useFormState } from "react-dom"; +import { saveUser } from "./action"; +import { userSchema } from "./schema"; + +export default function Form() { + const [lastResult, action] = useFormState(saveUser, undefined); + const [form, fields] = useForm({ + lastResult, + onValidate({ formData }) { + return parseWithZod(formData, { schema: userSchema }); + }, + shouldValidate: "onBlur", + }); + + return ( + +
+ + +
{fields.firstName.errors}
+
+
+ + +
{fields.lastName.errors}
+
+ + + ); +} diff --git a/apps/example-next-conform/src/app/simple-form/page.tsx b/apps/example-next-conform/src/app/simple-form/page.tsx new file mode 100644 index 00000000..bb81a126 --- /dev/null +++ b/apps/example-next-conform/src/app/simple-form/page.tsx @@ -0,0 +1,10 @@ +import Form from "./form"; + +export default function Page() { + return ( +
+

Simple Form

+
+
+ ); +} diff --git a/apps/example-next-conform/src/app/simple-form/schema.ts b/apps/example-next-conform/src/app/simple-form/schema.ts new file mode 100644 index 00000000..ac9e0986 --- /dev/null +++ b/apps/example-next-conform/src/app/simple-form/schema.ts @@ -0,0 +1,16 @@ +import { z } from "zod"; + +export const userSchema = z.object({ + firstName: z + .string({ + required_error: "`First name` is required", + }) + .min(1) + .max(100), + lastName: z + .string({ + required_error: "`Last name` is required", + }) + .min(1) + .max(100), +}); diff --git a/apps/example-next-conform/src/app/success/page.tsx b/apps/example-next-conform/src/app/success/page.tsx new file mode 100644 index 00000000..ead26b0a --- /dev/null +++ b/apps/example-next-conform/src/app/success/page.tsx @@ -0,0 +1,12 @@ +import Link from "next/link"; + +export default function Page() { + return ( +
+

Success!

+

+ top page +

+
+ ); +} diff --git a/apps/example-next-conform/tsconfig.json b/apps/example-next-conform/tsconfig.json new file mode 100644 index 00000000..b6ba42e2 --- /dev/null +++ b/apps/example-next-conform/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e87c4795..d30155ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: version: 18.2.22 '@vitejs/plugin-react': specifier: 4.2.1 - version: 4.2.1(vite@5.2.6) + version: 4.2.1(vite@5.2.6(@types/node@20.12.11)) husky: specifier: 9.0.11 version: 9.0.11 @@ -49,7 +49,7 @@ importers: version: 18.2.0 tsup: specifier: 8.0.2 - version: 8.0.2(typescript@5.4.5) + version: 8.0.2(postcss@8.4.38)(typescript@5.4.5) turbo: specifier: 1.13.3 version: 1.13.3 @@ -79,7 +79,7 @@ importers: version: 18.2.22 next: specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0)(react@18.2.0) + version: 14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -93,6 +93,40 @@ importers: specifier: 3.23.8 version: 3.23.8 + apps/example-next-conform: + dependencies: + '@conform-to/react': + specifier: 1.0.6 + version: 1.0.6(react@18.2.0) + '@conform-to/zod': + specifier: 1.0.6 + version: 1.0.6(zod@3.22.4) + next: + specifier: 14.1.4 + version: 14.1.4(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + zod: + specifier: 3.22.4 + version: 3.22.4 + devDependencies: + '@types/node': + specifier: 20.11.30 + version: 20.11.30 + '@types/react': + specifier: 18.2.67 + version: 18.2.67 + '@types/react-dom': + specifier: 18.2.22 + version: 18.2.22 + typescript: + specifier: 5.4.3 + version: 5.4.3 + apps/example-next-custom-store: dependencies: '@location-state/core': @@ -112,7 +146,7 @@ importers: version: 18.2.22 next: specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0)(react@18.2.0) + version: 14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) qs: specifier: 6.12.1 version: 6.12.1 @@ -152,7 +186,7 @@ importers: version: 18.2.22 next: specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0)(react@18.2.0) + version: 14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -176,10 +210,10 @@ importers: devDependencies: '@testing-library/jest-dom': specifier: 6.4.5 - version: 6.4.5(vitest@1.6.0) + version: 6.4.5(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0)) '@testing-library/react': specifier: 15.0.7 - version: 15.0.7(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + version: 15.0.7(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@testing-library/user-event': specifier: 14.5.2 version: 14.5.2(@testing-library/dom@10.0.0) @@ -213,13 +247,13 @@ importers: version: link:../configs next: specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0)(react@18.2.0) + version: 14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) packages/test-utils: dependencies: '@testing-library/react': specifier: 15.0.7 - version: 15.0.7(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + version: 15.0.7(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@testing-library/user-event': specifier: 14.5.2 version: 14.5.2(@testing-library/dom@10.0.0) @@ -468,6 +502,19 @@ packages: '@changesets/write@0.3.0': resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + '@conform-to/dom@1.0.6': + resolution: {integrity: sha512-24teTftuAfcjv+SiaFYb9msjdQA7Kq8Yk9QkMPrkF8LETl80+i5fpCaIG8V91KyTitBeBcc80gg9HuPuuq3dqQ==} + + '@conform-to/react@1.0.6': + resolution: {integrity: sha512-GHnUP89tGoikg7HhHP3V9U38BybyijjEV618GZFkqmW5o2jcViWsiLiY9XokJVEVckZ7aj5rZo3u6TfBv0lXlQ==} + peerDependencies: + react: '>=18' + + '@conform-to/zod@1.0.6': + resolution: {integrity: sha512-l+fMqEymGG7wrCIdp7Lyt1UPKdlvHbM5KDHeGQkuIEgqISpDVwOH/xt3xb/THzW1unk6beYWh99xMuEmV/ATYw==} + peerDependencies: + zod: ^3.21.0 + '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -777,57 +824,114 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@next/env@14.1.4': + resolution: {integrity: sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==} + '@next/env@14.2.3': resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + '@next/swc-darwin-arm64@14.1.4': + resolution: {integrity: sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-arm64@14.2.3': resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@next/swc-darwin-x64@14.1.4': + resolution: {integrity: sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-darwin-x64@14.2.3': resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-linux-arm64-gnu@14.1.4': + resolution: {integrity: sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-gnu@14.2.3': resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@14.1.4': + resolution: {integrity: sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@14.2.3': resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-x64-gnu@14.1.4': + resolution: {integrity: sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-gnu@14.2.3': resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@14.1.4': + resolution: {integrity: sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@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] + '@next/swc-win32-arm64-msvc@14.1.4': + resolution: {integrity: sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-arm64-msvc@14.2.3': resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-ia32-msvc@14.1.4': + resolution: {integrity: sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + '@next/swc-win32-ia32-msvc@14.2.3': resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] + '@next/swc-win32-x64-msvc@14.1.4': + resolution: {integrity: sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@next/swc-win32-x64-msvc@14.2.3': resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} engines: {node: '>= 10'} @@ -982,6 +1086,9 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.2': + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -1051,6 +1158,9 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.11.30': + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + '@types/node@20.12.11': resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} @@ -2040,6 +2150,21 @@ packages: navigation-api-types@0.5.1: resolution: {integrity: sha512-STpzr4JvInYi+GFIckNe/dM5cKc9M7Q/ZLKLWcWxFzOCXCBK5Oog3PzjwXwJ18yCJ1RnPVgdVueQG357PIeiAA==} + next@14.1.4: + resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + next@14.2.3: resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} engines: {node: '>=18.17.0'} @@ -2736,6 +2861,11 @@ packages: resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} engines: {node: '>= 0.4'} + typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -2967,6 +3097,9 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -3316,6 +3449,18 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 + '@conform-to/dom@1.0.6': {} + + '@conform-to/react@1.0.6(react@18.2.0)': + dependencies: + '@conform-to/dom': 1.0.6 + react: 18.2.0 + + '@conform-to/zod@1.0.6(zod@3.22.4)': + dependencies: + '@conform-to/dom': 1.0.6 + zod: 3.22.4 + '@esbuild/aix-ppc64@0.20.2': optional: true @@ -3501,32 +3646,61 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@next/env@14.1.4': {} + '@next/env@14.2.3': {} + '@next/swc-darwin-arm64@14.1.4': + optional: true + '@next/swc-darwin-arm64@14.2.3': optional: true + '@next/swc-darwin-x64@14.1.4': + optional: true + '@next/swc-darwin-x64@14.2.3': optional: true + '@next/swc-linux-arm64-gnu@14.1.4': + optional: true + '@next/swc-linux-arm64-gnu@14.2.3': optional: true + '@next/swc-linux-arm64-musl@14.1.4': + optional: true + '@next/swc-linux-arm64-musl@14.2.3': optional: true + '@next/swc-linux-x64-gnu@14.1.4': + optional: true + '@next/swc-linux-x64-gnu@14.2.3': optional: true + '@next/swc-linux-x64-musl@14.1.4': + optional: true + '@next/swc-linux-x64-musl@14.2.3': optional: true + '@next/swc-win32-arm64-msvc@14.1.4': + optional: true + '@next/swc-win32-arm64-msvc@14.2.3': optional: true + '@next/swc-win32-ia32-msvc@14.1.4': + optional: true + '@next/swc-win32-ia32-msvc@14.2.3': optional: true + '@next/swc-win32-x64-msvc@14.1.4': + optional: true + '@next/swc-win32-x64-msvc@14.2.3': optional: true @@ -3625,6 +3799,10 @@ snapshots: '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.2': + dependencies: + tslib: 2.6.2 + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 @@ -3641,7 +3819,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(vitest@1.6.0)': + '@testing-library/jest-dom@6.4.5(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0))': dependencies: '@adobe/css-tools': 4.3.2 '@babel/runtime': 7.22.15 @@ -3651,16 +3829,18 @@ snapshots: dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 + optionalDependencies: vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0) - '@testing-library/react@15.0.7(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0)': + '@testing-library/react@15.0.7(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.15 '@testing-library/dom': 10.0.0 - '@types/react': 18.2.67 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.67 '@testing-library/user-event@14.5.2(@testing-library/dom@10.0.0)': dependencies: @@ -3695,6 +3875,10 @@ snapshots: '@types/node@12.20.55': {} + '@types/node@20.11.30': + dependencies: + undici-types: 5.26.5 + '@types/node@20.12.11': dependencies: undici-types: 5.26.5 @@ -3721,7 +3905,7 @@ snapshots: '@types/uuid@9.0.8': {} - '@vitejs/plugin-react@4.2.1(vite@5.2.6)': + '@vitejs/plugin-react@4.2.1(vite@5.2.6(@types/node@20.12.11))': dependencies: '@babel/core': 7.24.3 '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.3) @@ -4790,10 +4974,34 @@ snapshots: navigation-api-types@0.5.1: {} - next@14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0)(react@18.2.0): + next@14.1.4(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@next/env': 14.1.4 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001597 + 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(@babel/core@7.24.3)(react@18.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 14.1.4 + '@next/swc-darwin-x64': 14.1.4 + '@next/swc-linux-arm64-gnu': 14.1.4 + '@next/swc-linux-arm64-musl': 14.1.4 + '@next/swc-linux-x64-gnu': 14.1.4 + '@next/swc-linux-x64-musl': 14.1.4 + '@next/swc-win32-arm64-msvc': 14.1.4 + '@next/swc-win32-ia32-msvc': 14.1.4 + '@next/swc-win32-x64-msvc': 14.1.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@14.2.3(@babel/core@7.24.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 14.2.3 - '@playwright/test': 1.44.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001597 @@ -4812,6 +5020,7 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.3 '@next/swc-win32-ia32-msvc': 14.2.3 '@next/swc-win32-x64-msvc': 14.2.3 + '@playwright/test': 1.44.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -4951,10 +5160,12 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.1: + postcss-load-config@4.0.1(postcss@8.4.38): dependencies: lilconfig: 2.1.0 yaml: 2.3.4 + optionalDependencies: + postcss: 8.4.38 postcss@8.4.31: dependencies: @@ -5312,9 +5523,10 @@ snapshots: styled-jsx@5.1.1(@babel/core@7.24.3)(react@18.2.0): dependencies: - '@babel/core': 7.24.3 client-only: 0.0.1 react: 18.2.0 + optionalDependencies: + '@babel/core': 7.24.3 sucrase@3.34.0: dependencies: @@ -5387,7 +5599,7 @@ snapshots: tslib@2.6.2: {} - tsup@8.0.2(typescript@5.4.5): + tsup@8.0.2(postcss@8.4.38)(typescript@5.4.5): dependencies: bundle-require: 4.0.1(esbuild@0.19.7) cac: 6.7.14 @@ -5397,12 +5609,14 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.1 + postcss-load-config: 4.0.1(postcss@8.4.38) resolve-from: 5.0.0 rollup: 4.5.2 source-map: 0.8.0-beta.0 sucrase: 3.34.0 tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.38 typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5485,6 +5699,8 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typescript@5.4.3: {} + typescript@5.4.5: {} ufo@1.5.3: {} @@ -5539,16 +5755,15 @@ snapshots: vite@5.2.6(@types/node@20.12.11): dependencies: - '@types/node': 20.12.11 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.13.0 optionalDependencies: + '@types/node': 20.12.11 fsevents: 2.3.3 vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0): dependencies: - '@types/node': 20.12.11 '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 '@vitest/snapshot': 1.6.0 @@ -5558,7 +5773,6 @@ snapshots: chai: 4.4.1 debug: 4.3.4 execa: 8.0.1 - jsdom: 24.0.0 local-pkg: 0.5.0 magic-string: 0.30.8 pathe: 1.1.2 @@ -5570,6 +5784,9 @@ snapshots: vite: 5.2.6(@types/node@20.12.11) vite-node: 1.6.0(@types/node@20.12.11) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.11 + jsdom: 24.0.0 transitivePeerDependencies: - less - lightningcss @@ -5717,4 +5934,6 @@ snapshots: yocto-queue@1.0.0: {} + zod@3.22.4: {} + zod@3.23.8: {}