diff --git a/.changeset/olive-squids-think.md b/.changeset/olive-squids-think.md new file mode 100644 index 0000000..b0a15dc --- /dev/null +++ b/.changeset/olive-squids-think.md @@ -0,0 +1,6 @@ +--- +"@examples/playground": patch +"simple-stack-form": patch +--- + +Add Solid JS template diff --git a/examples/playground/astro.config.mjs b/examples/playground/astro.config.mjs index 277ed15..690a245 100644 --- a/examples/playground/astro.config.mjs +++ b/examples/playground/astro.config.mjs @@ -4,6 +4,7 @@ import simpleStackStream from "simple-stack-stream"; import react from "@astrojs/react"; import node from "@astrojs/node"; import preact from "@astrojs/preact"; +import solidJs from "@astrojs/solid-js"; import tailwind from "@astrojs/tailwind"; // https://astro.build/config @@ -14,6 +15,7 @@ export default defineConfig({ simpleStackStream(), react({ include: ["**/react/*"] }), preact({ include: ["**/preact/*"] }), + solidJs({ include: ["**/solid-js/*"] }), tailwind(), ], adapter: node({ diff --git a/examples/playground/package.json b/examples/playground/package.json index d52da9c..0187955 100644 --- a/examples/playground/package.json +++ b/examples/playground/package.json @@ -14,6 +14,7 @@ "@astrojs/node": "^7.0.0", "@astrojs/preact": "^3.0.1", "@astrojs/react": "^3.0.7", + "@astrojs/solid-js": "^3.0.3", "@astrojs/tailwind": "^5.0.3", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", @@ -25,6 +26,7 @@ "sanitize-html": "^2.11.0", "simple-stack-form": "^0.1.0", "simple-stack-stream": "^0.0.3", + "solid-js": "^1.8.7", "tailwindcss": "^3.0.24", "zod": "^3.22.4" }, diff --git a/examples/playground/src/components/solid-js/Form.tsx b/examples/playground/src/components/solid-js/Form.tsx new file mode 100644 index 0000000..c5b5567 --- /dev/null +++ b/examples/playground/src/components/solid-js/Form.tsx @@ -0,0 +1,137 @@ +/** @jsxImportSource solid-js */ + +// Generated by simple:form + +import { + createSignal, + createContext, + useContext, + type ComponentProps, + Show, + For, +} from "solid-js"; +import { + type FieldErrors, + type FormState, + type FormValidator, + getInitialFormState, + toSetValidationErrors, + toTrackAstroSubmitStatus, + toValidateField, + validateForm, + formNameInputProps, +} from "simple:form"; + +export function useCreateFormContext( + validator: FormValidator, + fieldErrors?: FieldErrors, +) { + const initial = getInitialFormState({ validator, fieldErrors }); + const [formState, setFormState] = createSignal(initial); + return { + value: formState, + set: setFormState, + setValidationErrors: toSetValidationErrors(setFormState), + validateField: toValidateField(setFormState), + trackAstroSubmitStatus: toTrackAstroSubmitStatus(setFormState), + }; +} + +export function useFormContext() { + const formContext = useContext(FormContext); + if (!formContext) { + throw new Error( + "Form context not found. `useFormContext()` should only be called from children of a
component.", + ); + } + return formContext; +} + +type FormContextType = ReturnType; + +const FormContext = createContext(undefined); + +export function Form( + props: { + validator: FormValidator; + context?: FormContextType; + fieldErrors?: FieldErrors; + } & Omit, "method" | "onSubmit">, +) { + const formContext = + props.context ?? useCreateFormContext(props.validator, props.fieldErrors); + + return ( + + { + const formData = new FormData(e.currentTarget); + formContext.set((formState) => ({ + ...formState, + isSubmitPending: true, + submitStatus: "validating", + })); + const parsed = await validateForm({ + formData, + validator: props.validator, + }); + if (parsed.data) { + return formContext.trackAstroSubmitStatus(); + } + + e.preventDefault(); + e.stopPropagation(); + formContext.setValidationErrors(parsed.fieldErrors); + }} + > + + {(name) => } + + {props.children} + + + ); +} + +export function Input(inputProps: ComponentProps<"input"> & { name: string }) { + const formContext = useFormContext(); + const fieldState = () => { + const value = formContext.value().fields[inputProps.name]; + if (!value) { + throw new Error( + `Input "${inputProps.name}" not found in form. Did you use the
component?`, + ); + } + return value; + }; + return ( + <> + { + const value = e.target.value; + if (value === "") return; + formContext.validateField( + inputProps.name, + value, + fieldState().validator, + ); + }} + onInput={(e) => { + if (!fieldState().hasErroredOnce) return; + const value = e.target.value; + formContext.validateField( + inputProps.name, + value, + fieldState().validator, + ); + }} + {...inputProps} + /> + + {(e) =>

{e}

} +
+ + ); +} diff --git a/examples/playground/src/components/solid-js/Signup.tsx b/examples/playground/src/components/solid-js/Signup.tsx new file mode 100644 index 0000000..1dc1263 --- /dev/null +++ b/examples/playground/src/components/solid-js/Signup.tsx @@ -0,0 +1,60 @@ +/** @jsxImportSource solid-js */ +import { type JSX, Show } from "solid-js"; +import { z } from "zod"; +import { Form, Input, useFormContext } from "./Form"; +import { type FieldErrors, createForm } from "simple:form"; + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +export const signup = createForm({ + username: z + .string() + .min(2) + .refine(async (s) => { + await sleep(400); + return s !== "admin"; + }), + optIn: z.boolean().optional(), +}); + +export default function Signup(props: { + serverErrors?: FieldErrors; +}) { + return ( + + + + + + + + + + + + + ); +} + +function FormGroup(props: { children: JSX.Element }) { + return
{props.children}
; +} + +function Loading() { + const formContext = useFormContext(); + return ( + +

{formContext.value().submitStatus}

+
+ ); +} diff --git a/examples/playground/src/pages/index.astro b/examples/playground/src/pages/index.astro index 2bc5657..a6a4845 100644 --- a/examples/playground/src/pages/index.astro +++ b/examples/playground/src/pages/index.astro @@ -3,26 +3,29 @@ import SignupReact, { signup as signupReact } from "../components/react/Signup"; import SignupPreact, { signup as signupPreact, } from "../components/preact/Signup"; +import SignupSolid, { + signup as signupSolid, +} from "../components/solid-js/Signup"; import Sanitize, { sanitize } from "../components/Sanitize"; import { ViewTransitions } from "astro:transitions"; const { form } = Astro.locals; + const formResultReact = await form.getDataByName("signupReact", signupReact); const formResultPreact = await form.getDataByName("signupPreact", signupPreact); - -if (formResultReact?.data) { - console.log(formResultReact.data); -} - -if (formResultPreact?.data) { - console.log(formResultPreact.data); -} - +const formResultSolid = await form.getDataByName("signupSolid", signupSolid); const sanitizeFormResult = await form.getDataByName("sanitize", sanitize); -if (sanitizeFormResult?.data) { - console.log(sanitizeFormResult.data); -} +[ + formResultReact, + formResultPreact, + formResultSolid, + sanitizeFormResult +].forEach((formResult) => { + if (formResult?.data) { + console.log(formResult.data); + } +}); await new Promise((resolve) => setTimeout(resolve, 400)); --- @@ -79,7 +82,32 @@ await new Promise((resolve) => setTimeout(resolve, 400)); client:load /> + +
+ +

Solid

+ { + formResultSolid?.data && ( + + ) + } +
+ +
+
+

Sanitize

Try pasting this code snippet into each field once and submit diff --git a/packages/form/package.json b/packages/form/package.json index cd87c1f..d7ffc32 100644 --- a/packages/form/package.json +++ b/packages/form/package.json @@ -35,6 +35,7 @@ "astro": "^4.0.7", "preact": "^10.19.3", "react": "^18.0.0", + "solid-js": "^1.8.7", "typescript": "^5.3.3", "zod": "^3.22.4" }, diff --git a/packages/form/src/cli.ts b/packages/form/src/cli.ts index 9614c63..3393ab9 100644 --- a/packages/form/src/cli.ts +++ b/packages/form/src/cli.ts @@ -25,6 +25,11 @@ const frameworks = [ label: "Preact", templateDir: "preact", }, + { + value: "solid-js", + label: "SolidJS", + templateDir: "solid-js", + }, ] as const; type Framework = (typeof frameworks)[number]; diff --git a/packages/form/templates/solid-js/Form.tsx b/packages/form/templates/solid-js/Form.tsx new file mode 100644 index 0000000..92f4690 --- /dev/null +++ b/packages/form/templates/solid-js/Form.tsx @@ -0,0 +1,133 @@ +// Generated by simple:form + +import { + type ComponentProps, + For, + Show, + createContext, + createSignal, + useContext, +} from "solid-js"; +import { + type FieldErrors, + type FormState, + type FormValidator, + formNameInputProps, + getInitialFormState, + toSetValidationErrors, + toTrackAstroSubmitStatus, + toValidateField, + validateForm, +} from "simple:form"; + +export function useCreateFormContext( + validator: FormValidator, + fieldErrors?: FieldErrors, +) { + const initial = getInitialFormState({ validator, fieldErrors }); + const [formState, setFormState] = createSignal(initial); + return { + value: formState, + set: setFormState, + setValidationErrors: toSetValidationErrors(setFormState), + validateField: toValidateField(setFormState), + trackAstroSubmitStatus: toTrackAstroSubmitStatus(setFormState), + }; +} + +export function useFormContext() { + const formContext = useContext(FormContext); + if (!formContext) { + throw new Error( + "Form context not found. `useFormContext()` should only be called from children of a
component.", + ); + } + return formContext; +} + +type FormContextType = ReturnType; + +const FormContext = createContext(undefined); + +export function Form( + props: { + validator: FormValidator; + context?: FormContextType; + fieldErrors?: FieldErrors; + } & Omit, "method" | "onSubmit">, +) { + const formContext = + props.context ?? useCreateFormContext(props.validator, props.fieldErrors); + + return ( + + { + const formData = new FormData(e.currentTarget); + formContext.set((formState) => ({ + ...formState, + isSubmitPending: true, + submitStatus: "validating", + })); + const parsed = await validateForm({ + formData, + validator: props.validator, + }); + if (parsed.data) { + return formContext.trackAstroSubmitStatus(); + } + + e.preventDefault(); + e.stopPropagation(); + formContext.setValidationErrors(parsed.fieldErrors); + }} + > + + {(name) => } + + {props.children} + + + ); +} + +export function Input(inputProps: ComponentProps<"input"> & { name: string }) { + const formContext = useFormContext(); + const fieldState = () => { + const value = formContext.value().fields[inputProps.name]; + if (!value) { + throw new Error( + `Input "${inputProps.name}" not found in form. Did you use the
component?`, + ); + } + return value; + }; + return ( + <> + { + const value = e.target.value; + if (value === "") return; + formContext.validateField( + inputProps.name, + value, + fieldState().validator, + ); + }} + onInput={(e) => { + if (!fieldState().hasErroredOnce) return; + const value = e.target.value; + formContext.validateField( + inputProps.name, + value, + fieldState().validator, + ); + }} + {...inputProps} + /> + {(e) =>

{e}

}
+ + ); +} diff --git a/packages/form/templates/solid-js/env.d.ts b/packages/form/templates/solid-js/env.d.ts new file mode 100644 index 0000000..c59f3d6 --- /dev/null +++ b/packages/form/templates/solid-js/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/form/templates/solid-js/tsconfig.json b/packages/form/templates/solid-js/tsconfig.json new file mode 100644 index 0000000..20c7ac6 --- /dev/null +++ b/packages/form/templates/solid-js/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "astro/tsconfigs/strictest", + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "solid-js" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da1b953..27b5c8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: '@astrojs/react': specifier: ^3.0.7 version: 3.0.7(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)(vite@4.5.1) + '@astrojs/solid-js': + specifier: ^3.0.3 + version: 3.0.3(solid-js@1.8.7)(vite@4.5.1) '@astrojs/tailwind': specifier: ^5.0.3 version: 5.0.3(astro@4.0.7)(tailwindcss@3.3.6) @@ -65,6 +68,9 @@ importers: simple-stack-stream: specifier: ^0.0.3 version: link:../../packages/stream + solid-js: + specifier: ^1.8.7 + version: 1.8.7 tailwindcss: specifier: ^3.0.24 version: 3.3.6 @@ -109,6 +115,9 @@ importers: react: specifier: ^18.0.0 version: 18.2.0 + solid-js: + specifier: ^1.8.7 + version: 1.8.7 typescript: specifier: ^5.3.3 version: 5.3.3 @@ -248,6 +257,19 @@ packages: - vite dev: false + /@astrojs/solid-js@3.0.3(solid-js@1.8.7)(vite@4.5.1): + resolution: {integrity: sha512-MS/SoKUNByBjclhXn004DEsfi4rDNrg0LVbjgSnVfGHrdjP1dQd5bnm0wah04QuhqJCfsIF0ba9c02qJhaj/2w==} + engines: {node: '>=18.14.1'} + peerDependencies: + solid-js: ^1.4.3 + dependencies: + solid-js: 1.8.7 + vite-plugin-solid: 2.8.0(solid-js@1.8.7)(vite@4.5.1) + transitivePeerDependencies: + - supports-color + - vite + dev: false + /@astrojs/tailwind@5.0.3(astro@4.0.7)(tailwindcss@3.3.6): resolution: {integrity: sha512-p+uFa1PNuV8RxhGkPUFgVq8CUbmS3xr0u5k1An2xKECLotRh7vsrGcPUijHvYOt42URohcg8rIq0CxNoVMhReg==} peerDependencies: @@ -335,6 +357,24 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.6): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: false + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} @@ -352,6 +392,20 @@ packages: dependencies: '@babel/types': 7.23.6 + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@babel/helper-module-imports@7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} @@ -371,16 +425,42 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: false + /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.6 + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} @@ -433,6 +513,28 @@ packages: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: false + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.6): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} @@ -476,6 +578,33 @@ packages: '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) '@babel/types': 7.23.6 + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.6) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) + dev: false + + /@babel/preset-typescript@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.6) + dev: false + /@babel/runtime@7.23.7: resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} engines: {node: '>=6.9.0'} @@ -1730,6 +1859,19 @@ packages: requiresBuild: true optional: true + /babel-plugin-jsx-dom-expressions@0.37.9(@babel/core@7.23.6): + resolution: {integrity: sha512-6w+zs2i14fVanj4e1hXCU5cp+x0U0LJ5jScknpMZZUteHhwFRGJflHMVJ+xAcW7ku41FYjr7DgtK9mnc2SXlJg==} + peerDependencies: + '@babel/core': ^7.20.12 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/types': 7.23.6 + html-entities: 2.3.3 + validate-html-nesting: 1.2.2 + dev: false + /babel-plugin-transform-hook-names@1.0.2(@babel/core@7.23.6): resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} peerDependencies: @@ -1738,6 +1880,15 @@ packages: '@babel/core': 7.23.6 dev: false + /babel-preset-solid@1.8.6(@babel/core@7.23.6): + resolution: {integrity: sha512-Ened42CHjU4EFkvNeS042/3Pm21yvMWn8p4G4ddzQTlKaMwSGGD1VciA/e7EshBVHJCcBj9vHiUd/r3A4qLPZA==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + babel-plugin-jsx-dom-expressions: 0.37.9(@babel/core@7.23.6) + dev: false + /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2897,6 +3048,10 @@ packages: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true + /html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + dev: false + /html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} @@ -3157,6 +3312,11 @@ packages: call-bind: 1.0.5 dev: true + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: false + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -3486,6 +3646,13 @@ packages: yargs-parser: 18.1.3 dev: true + /merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: false + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -4633,6 +4800,10 @@ packages: - supports-color dev: false + /seroval@0.15.1: + resolution: {integrity: sha512-OPVtf0qmeC7RW+ScVX+7aOS+xoIM7pWcZ0jOWg2aTZigCydgRB04adfteBRbecZnnrO1WuGQ+C3tLeBBzX2zSQ==} + engines: {node: '>=10'} + /server-destroy@1.0.1: resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} @@ -4762,6 +4933,23 @@ packages: yargs: 15.4.1 dev: true + /solid-js@1.8.7: + resolution: {integrity: sha512-9dzrSVieh2zj3SnJ02II6xZkonR6c+j/91b7XZUNcC6xSaldlqjjGh98F1fk5cRJ8ZTkzqF5fPIWDxEOs6QZXA==} + dependencies: + csstype: 3.1.3 + seroval: 0.15.1 + + /solid-refresh@0.5.3(solid-js@1.8.7): + resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==} + peerDependencies: + solid-js: ^1.3 + dependencies: + '@babel/generator': 7.23.6 + '@babel/helper-module-imports': 7.22.15 + '@babel/types': 7.23.6 + solid-js: 1.8.7 + dev: false + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -5380,6 +5568,10 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + /validate-html-nesting@1.2.2: + resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} + dev: false + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -5420,6 +5612,25 @@ packages: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 + /vite-plugin-solid@2.8.0(solid-js@1.8.7)(vite@4.5.1): + resolution: {integrity: sha512-n5FAm7ZmTl94VWUoiJCgG7bouF2NlC9CA1wY/qbVnkFbYDWk++bFWyNoU48aLJ+lMtzNeYzJypJXOHzFKxL9xA==} + peerDependencies: + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.6) + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.8.6(@babel/core@7.23.6) + merge-anything: 5.1.7 + solid-js: 1.8.7 + solid-refresh: 0.5.3(solid-js@1.8.7) + vite: 4.5.1 + vitefu: 0.2.5(vite@4.5.1) + transitivePeerDependencies: + - supports-color + dev: false + /vite@4.5.1: resolution: {integrity: sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5489,6 +5700,17 @@ packages: optionalDependencies: fsevents: 2.3.3 + /vitefu@0.2.5(vite@4.5.1): + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 4.5.1 + dev: false + /vitefu@0.2.5(vite@5.0.10): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: