diff --git a/docs/src/consts.ts b/docs/src/consts.ts index 4e0351f..1fb1fb4 100644 --- a/docs/src/consts.ts +++ b/docs/src/consts.ts @@ -38,10 +38,23 @@ export const SIDEBAR: Sidebar = { { text: 'Contributors', link: 'contributors' }, { text: 'Sponsors', link: 'sponsors' }, ], - tRPC: [ - { text: 'Install', link: 'trpc/install' }, - { text: 'Router', link: 'trpc/router' }, - { text: 'API Handler', link: 'trpc/handler' }, + pRPC: [ + { text: 'query$', link: 'prpc/query' }, + { text: 'query$', link: 'prpc/mutation' }, + { text: 'middleware$', link: 'prpc/middleware' }, + { text: 'pipe$', link: 'prpc/pipe' }, + { + text: 'error$', + link: 'prpc/error', + }, + { + text: 'PRPCClientError', + link: 'prpc/prpc-client-error', + }, + { + text: 'hideRequest', + link: 'prpc/hideRequest', + }, ], Auth: [ { text: 'Install', link: 'auth/install' }, @@ -50,6 +63,11 @@ export const SIDEBAR: Sidebar = { { text: 'createSession', link: 'auth/createsession' }, { text: 'getSession', link: 'auth/getsession' }, ], + tRPC: [ + { text: 'Install', link: 'trpc/install' }, + { text: 'Router', link: 'trpc/router' }, + { text: 'API Handler', link: 'trpc/handler' }, + ], Media: [ { text: 'Install', link: 'media/install' }, { text: 'createVideo', link: 'media/createvideo' }, diff --git a/docs/src/content/docs/prpc/error.mdx b/docs/src/content/docs/prpc/error.mdx new file mode 100644 index 0000000..7be0b7a --- /dev/null +++ b/docs/src/content/docs/prpc/error.mdx @@ -0,0 +1,62 @@ +--- +title: 'error$' +description: 'API for the error$ function' +--- + +**API for the error$ function** + +This function will be used from the server-side, in order to throw errors on the client side and break out of running middlewares. + +## Usage + +```ts +import { + error$, + hideRequest, + middleware$, + pipe$, + query$, +} from '@solid-mediakit/prpc' +import { z } from 'zod' + +const myMiddleware1 = middleware$(({ event$ }) => { + console.log('ua', event$.request.headers.get('user-agent')) + const random = Math.random() + const test = random > 0.5 ? 'test' : null + console.log({ test }) + return { test } +}) + +const middleWare2 = pipe$(myMiddleware1, (ctx) => { + if (!ctx.test) { + return error$('Expected test to be defined') + // this will throw an error on the client side and will break out of the middlewares + } + return { + test: ctx.test, + o: 1, + } +}) + +const middleware3 = pipe$(middleWare2, (ctx) => { + // ctx.test is inferred to be string because we checked it in the previous middleware + return { + ...ctx, + b: 2, + } +}) + +export const add = query$({ + queryFn: ({ payload, ctx$ }) => { + console.log({ ctx$: hideRequest(ctx$) }) + const result = payload.a + payload.b + return { result } + }, + key: 'add', + schema: z.object({ + a: z.number().max(5), + b: z.number().max(10), + }), + middleware: middleware3, +}) +``` diff --git a/docs/src/content/docs/prpc/hideRequest.mdx b/docs/src/content/docs/prpc/hideRequest.mdx new file mode 100644 index 0000000..e3cb3ed --- /dev/null +++ b/docs/src/content/docs/prpc/hideRequest.mdx @@ -0,0 +1,69 @@ +--- +title: 'hideRequest' +description: 'API for the hideRequest function' +--- + +**API for the hideRequest function** + +This function will be used to remove the `event$` object from the context passed to a function. + +## Usage + +```ts +import { hideRequest, middleware$, pipe$, query$ } from '@solid-mediakit/prpc' +import { z } from 'zod' + +const myMiddleware1 = middleware$(({ event$ }) => { + console.log('ua', event$.request.headers.get('user-agent')) + return { test: null } +}) + +const middleWare2 = pipe$(myMiddleware1, (ctx) => { + return { + test: ctx.test, + o: 1, + } +}) + +const middleware3 = pipe$(middleWare2, (ctx) => { + return { + ...ctx, + b: 2, + } +}) + +export const add = query$({ + queryFn: ({ payload, ctx$ }) => { + console.log({ ctx$: hideRequest(ctx$) }) + const result = payload.a + payload.b + return { result } + }, + key: 'add', + schema: z.object({ + a: z.number().max(5), + b: z.number().max(10), + }), + middleware: middleware3, +}) +``` + +## Parameters + +`hideRequest` also takes in a second argument - `fully`, setting this to true will use the `delete` op to remove the event$ from the context, so you can use this a bit differently: + +```ts +export const add = query$({ + queryFn: ({ payload, ctx$ }) => { + hideRequest(ctx$, true) + console.log({ ctx$ }) + const result = payload.a + payload.b + return { result } + }, + key: 'add', + schema: z.object({ + a: z.number().max(5), + b: z.number().max(10), + }), + middleware: middleware3, +}) +``` diff --git a/docs/src/content/docs/prpc/install.mdx b/docs/src/content/docs/prpc/install.mdx new file mode 100644 index 0000000..182b8d9 --- /dev/null +++ b/docs/src/content/docs/prpc/install.mdx @@ -0,0 +1,35 @@ +--- +title: 'Install' +description: 'Install pRPC' +--- + +**Install pRPC** + +### Installation + +```bash +pnpm install @solid-mediakit/prpc @tanstack/solid-query @solid-mediakit/prpc-plugin +``` + +### Adding The Vite Plugin + +Go ahead to `app.config.ts` and add the following: + +```ts +import { defineConfig } from '@solidjs/start/config' +import { prpcVite } from '@solid-mediakit/prpc-plugin' // -> + +export default defineConfig({ + ssr: true, + vite: { + plugins: [prpcVite({ log: false })], // -> + }, +}) +``` + +Basically, what is going to happen is that the Vite plugin will make this piece of code run on the server, causing it so Zod doesn't leak to the client nor any other server-side code. What's so special about it is that it includes many useful features which aren't build in Vinxi, like Zod validation, `event$` property, custom error handling and more. The transformation process is done via Babel at real time so you don't have to worry about having ugly code in your code base, you just write it and we are in charge of the 'behind the scenes' stuff. + +Now you can start using pRPC in your project. + +- [query$](/prpc/query) +- [mutation$](/prpc/mutation) diff --git a/docs/src/content/docs/prpc/middleware.mdx b/docs/src/content/docs/prpc/middleware.mdx new file mode 100644 index 0000000..f7cb371 --- /dev/null +++ b/docs/src/content/docs/prpc/middleware.mdx @@ -0,0 +1,37 @@ +--- +title: 'middleware$' +description: 'API for the middleware$ function' +--- + +**API for the middleware$ function** + +Functions that will run before the actual function. Useful for authentication, logging, etc. Can be used for both `mutation$` and `query$`. + +## Usage + +```ts +import { middleware$, query$ } from '@solid-mediakit/prpc' +import { z } from 'zod' + +const middleware3 = middleware$(({ event$ }) => { + console.log('req', event$) + return Math.random() > 0.5 ? { test: true } : { test: null } +}) + +export const cleanSyntaxQuery = query$({ + queryFn: async ({ payload, event$, ctx$ }) => { + ctx$.test + console.log('called', event$.request.headers.get('user-agent')) + return { result: payload.a + payload.b } + }, + key: 'cleanSyntaxQuery', + schema: z.object({ + a: z.number().max(5), + b: z.number().max(10), + }), + // middleware3 was returned from `middleware$` + middleware: [middleware3], +}) +``` + +If you want to pipe a middleware, check out the [pipe](/pipe) function. diff --git a/docs/src/content/docs/prpc/mutation.mdx b/docs/src/content/docs/prpc/mutation.mdx new file mode 100644 index 0000000..40215a2 --- /dev/null +++ b/docs/src/content/docs/prpc/mutation.mdx @@ -0,0 +1,101 @@ +--- +title: 'mutation$' +description: 'API for the mutation$ function' +--- + +**API for the mutation$ function** + +`mutation$` is basically a wrapper for createMutation, it should be used whenever createMutation should be used. + +## Usage + +```tsx +// server function declaration +import { z } from 'zod' +import { error$, mutation$ } from '@solid-mediakit/prpc' + +const testMutation = mutation$({ + mutationFn: ({ payload, event$ }) => { + const ua = event$.request.headers.get('user-agent') + console.log({ ua }) + if (payload.hello === 'error') { + return error$('This is an error') + } + return `hey ${payload.hello}` + }, + key: 'hello', + schema: z.object({ + hello: z.string(), + }), +}) + +// client code +const Home: VoidComponent = () => { + const [hello, setHello] = createSignal('') + const helloMutation = testMutation(() => ({ + onError(error) { + if (error.isZodError()) { + console.log('zod error:', error.cause.fieldErrors) + } else { + console.log(error.message) + } + }, + })) + return ( +
+

+ {helloMutation.data ?? 'No Data yet...'} +

+ +

+ {helloMutation.error?.message ?? 'Unknown Error'} +

+
+
+ setHello(e.currentTarget.value)} + /> + +
+
+ ) +} +``` + +## API + +```ts +export type Mutation$Props< + Mw extends IMiddleware[], + Fn extends ExpectedFn, + ZObj extends ExpectedSchema = EmptySchema +> = { + mutationFn: Fn + key: string + schema?: ZObj + middleware?: Mw +} +``` + +### mutationFn API + +```ts +export type Fn$Input< + ZObj extends ExpectedSchema = EmptySchema, + Mw extends IMiddleware[] = [] +> = { + payload: Infer$PayLoad + event$: PRPCEvent + ctx$: FilterOutResponse>> +} +``` + +Read more regarding the [Middleware API](/prpc/middleware) diff --git a/docs/src/content/docs/prpc/pipe.mdx b/docs/src/content/docs/prpc/pipe.mdx new file mode 100644 index 0000000..a669568 --- /dev/null +++ b/docs/src/content/docs/prpc/pipe.mdx @@ -0,0 +1,51 @@ +--- +title: 'pipe$' +description: 'API for the pipe$ function' +--- + +**API for the pipe$ function** + +This will modify the return type of an existing middleware, in a type safe way. + +## Usage + +```ts +import { + middleware$, + pipe$, + query$, + error$, + hideRequest, +} from '@solid-mediakit/prpc' +import { z } from 'zod' + +const myMiddleware1 = middleware$(({ event$ }) => { + console.log('req', event$) + return Math.random() > 0.5 ? { test: true } : { test: null } +}) + +const middleWare2 = pipe$(myMiddleware1, (ctx) => { + if (ctx.test === null) { + return error$('test is null') + } + return { + test: ctx.test, + o: 1, + } +}) + +export const add = query$({ + queryFn: ({ payload, ctx$ }) => { + hideRequest(ctx$, true) + console.log({ ctx$ }) + const result = payload.a + payload.b + return { result } + }, + key: 'add', + schema: z.object({ + a: z.number().max(5), + b: z.number().max(10), + }), + middleware: [middleWare2], +}) +``` diff --git a/docs/src/content/docs/prpc/prpc-client-error.mdx b/docs/src/content/docs/prpc/prpc-client-error.mdx new file mode 100644 index 0000000..af69dee --- /dev/null +++ b/docs/src/content/docs/prpc/prpc-client-error.mdx @@ -0,0 +1,56 @@ +--- +title: 'PRPCClientError' +description: 'API for the PRPCClientError instance' +--- + +**API for the PRPCClientError instance** + +This is the error instance that pRPC will throw when ever it faces any issue. + +Assuming you have this query defined: + +```ts +export const add = query$({ + queryFn: ({ payload }) => { + const result = payload.a + payload.b + if (result === 10) { + return error$('Result is 10') + } + return { result } + }, + key: 'add', + schema: z.object({ + a: z.number().max(5), + b: z.number().max(10), + }), +}) +``` + +You can handle errors thrown by zod on the client side like this: + +```ts +const addRes = add( + () => ({ + a: num1(), + b: 3, + }), + () => ({ + placeholderData: (prev) => prev, + onError: (error) => { + if (error.isZodError()) { + const fieldErrors = error.cause.fieldErrors + console.log(fieldErrors.a) + console.log(fieldErrors.b) + } else { + // the value is probably 10 + // ... + } + }, + retry: false, + }) +) +``` + +Using `error.isZodError()` you can check if the error is a zod error and then you can access the `fieldErrors` property to get the errors for each field, in a type safe way ofc. + +You can also check if the error is a native `Error` instance using `error.isError()`, this will give you access to its `message` property. diff --git a/docs/src/content/docs/prpc/query.mdx b/docs/src/content/docs/prpc/query.mdx new file mode 100644 index 0000000..ccd94e9 --- /dev/null +++ b/docs/src/content/docs/prpc/query.mdx @@ -0,0 +1,64 @@ +--- +title: 'query$' +description: 'API for the query$ function' +--- + +**API for the query$ function** + +`query$` is basically a wrapper for createQuery, it should be used whenever createQuery should be used. + +## Usage + +```tsx +// server function declaration +import { query$ } from '@solid-mediakit/prpc' +import { z } from 'zod' + +const testQuery = query$({ + queryFn: async ({ payload, event$ }) => { + const ua = event$.request.headers.get('user-agent') + console.log({ ua }) + return `hey ${payload.hello}` + }, + key: 'hello', + schema: z.object({ + hello: z.string(), + }), +}) + +// client code: +// input should be an accessor +const hello = testQuery(() => ({ + hello: 'JDev', +})) +``` + +## API + +```ts +export type Query$Props< + Mw extends IMiddleware[], + Fn extends ExpectedFn, + ZObj extends ExpectedSchema = EmptySchema +> = { + queryFn: Fn + key: string + middleware?: Mw + schema?: ZObj +} +``` + +### queryFn API + +```ts +export type Fn$Input< + ZObj extends ExpectedSchema = EmptySchema, + Mw extends IMiddleware[] = [] +> = { + payload: Infer$PayLoad + event$: PRPCEvent + ctx$: FilterOutResponse>> +} +``` + +Read more regarding the [Middleware API](/prpc/middleware) diff --git a/examples/auth/package.json b/examples/auth/package.json index 9d4007e..a08c560 100644 --- a/examples/auth/package.json +++ b/examples/auth/package.json @@ -19,14 +19,14 @@ "esbuild": "^0.14.54", "postcss": "^8.4.28", "typescript": "^4.9.5", - "vite": "^4.4.9" + "vite": "^5.1.6" }, "dependencies": { "zod": "^3.20.6", "@solid-mediakit/auth": "workspace:*", "@auth/core": "^0.28.0", - "@solidjs/router": "^0.13.0", - "@solidjs/start": "^0.7.4", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", "solid-js": "^1.8.15", "vinxi": "^0.3.10", "@solidjs/meta": "^0.29.3" diff --git a/examples/media/package.json b/examples/media/package.json index 996f0cc..252413b 100644 --- a/examples/media/package.json +++ b/examples/media/package.json @@ -18,11 +18,11 @@ "postcss": "^8.4.21", "tailwindcss": "^3.2.7", "typescript": "^4.9.5", - "vite": "^4.4.9" + "vite": "^5.1.6" }, "dependencies": { - "@solidjs/router": "^0.13.0", - "@solidjs/start": "^0.7.4", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", "solid-js": "^1.8.15", "vinxi": "^0.3.10", "@solidjs/meta": "^0.29.3", diff --git a/examples/prpc/app.config.ts b/examples/prpc/app.config.ts index 0e29371..c4ad661 100644 --- a/examples/prpc/app.config.ts +++ b/examples/prpc/app.config.ts @@ -1,9 +1,9 @@ import { defineConfig } from '@solidjs/start/config' -import prpc from '~/prpc/plugin' +import { prpcVite } from '@solid-mediakit/prpc-plugin' export default defineConfig({ ssr: true, vite: { - plugins: [prpc({ log: true })], + plugins: [prpcVite({ log: true })], }, }) diff --git a/examples/prpc/package.json b/examples/prpc/package.json index 568d7ec..c592918 100644 --- a/examples/prpc/package.json +++ b/examples/prpc/package.json @@ -18,20 +18,18 @@ "postcss": "^8.4.21", "tailwindcss": "^3.2.7", "typescript": "^4.9.5", - "vite": "^5.1.6", - "@types/babel__core": "^7.20.0", - "@rollup/pluginutils": "^5.0.2" + "vite": "^5.1.6" }, "dependencies": { - "@solidjs/router": "^0.13.0", - "@solidjs/start": "^0.7.4", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", "solid-js": "^1.8.15", "vinxi": "^0.3.10", "@solidjs/meta": "^0.29.3", "@tanstack/solid-query": "^5.28.5", "zod": "^3.22.4", - "@babel/core": "^7.20.12", - "@babel/preset-typescript": "^7.18.6" + "@solid-mediakit/prpc": "workspace:*", + "@solid-mediakit/prpc-plugin": "workspace:*" }, "engines": { "node": ">=16" diff --git a/examples/prpc/src/prpc/lib/helpers.ts b/examples/prpc/src/prpc/lib/helpers.ts deleted file mode 100644 index b4764ce..0000000 --- a/examples/prpc/src/prpc/lib/helpers.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const makeKey = ( - type: 'query' | 'mutation', - key: string, - input?: any -) => { - if (type === 'mutation') { - return ['prpc.mutation', key] - } - return ['prpc.query', key, input] -} - -export const unwrapValue = (value: any) => { - if (typeof value === 'function') { - return { payload: value() } - } - return { payload: value } -} diff --git a/examples/prpc/src/prpc/lib/types.ts b/examples/prpc/src/prpc/lib/types.ts deleted file mode 100644 index 47fb995..0000000 --- a/examples/prpc/src/prpc/lib/types.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - FunctionedParams, - QueryKey, - SolidMutationOptions, - SolidQueryOptions, -} from '@tanstack/solid-query' -import type zod from 'zod' - -export type EmptySchema = void | undefined - -export type ExpectedSchema = zod.ZodSchema | EmptySchema - -export type Infer$PayLoad = - ZObj extends zod.ZodSchema ? zod.infer : never - -export type ExpectedFn = ZObject extends EmptySchema - ? (input: Fn$Input) => any - : ZObject extends zod.ZodSchema - ? (input: Fn$Input) => any - : (input: Fn$Input) => any - -export type Fn$Input = { - payload: Infer$PayLoad - request$: Request -} - -export type Fn$Output = ReturnType extends Promise< - infer T -> - ? T - : ReturnType - -export type FCreateQueryOptions< - TQueryFnData = unknown, - TError = Error, - TData = TQueryFnData, - TQueryKey extends QueryKey = QueryKey -> = FunctionedParams< - OmitQueryData> -> -export type OmitQueryData = Omit< - T, - 'queryKey' | 'queryFn' | 'mutationFn' | 'mutationKey' -> - -export type FCreateMutationOptions< - TData = unknown, - TError = Error, - TVariables = void, - TContext = unknown -> = FunctionedParams< - OmitQueryData> -> diff --git a/examples/prpc/src/prpc/lib/utils.ts b/examples/prpc/src/prpc/lib/utils.ts deleted file mode 100644 index 1db80d8..0000000 --- a/examples/prpc/src/prpc/lib/utils.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ZodSchema } from 'zod' - -export const validateZod = async ( - payload: any, - schema: Schema -) => { - const res = await schema.safeParseAsync( - typeof payload === 'object' ? payload : JSON.parse(payload) - ) - if (!res.success) { - return error$(res.error.flatten()) - } - return res.data -} - -export const error$ = (error: any, init?: ResponseInit): Response => { - const headers = new Headers(init?.headers) - headers.set('Content-Type', 'application/json') - headers.set('X-Prpc-Error', '1') - return new Response( - JSON.stringify({ - error: typeof error === 'string' ? { message: error } : error, - }), - { - status: init?.status ?? 400, - headers, - } - ) as any -} diff --git a/examples/prpc/src/prpc/mutation.ts b/examples/prpc/src/prpc/mutation.ts deleted file mode 100644 index 4c4e1e1..0000000 --- a/examples/prpc/src/prpc/mutation.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { CreateMutationResult, createMutation } from '@tanstack/solid-query' -import { Accessor } from 'solid-js' -import { - EmptySchema, - ExpectedFn, - ExpectedSchema, - FCreateMutationOptions, - Fn$Output, - Infer$PayLoad, -} from './lib/types' -import { makeKey, unwrapValue } from './lib/helpers' - -export type Mutation$Props< - Fn extends ExpectedFn, - ZObj extends ExpectedSchema = EmptySchema -> = { - mutationFn: Fn - key: string - schema?: ZObj -} - -export const mutation$ = < - Fn extends ExpectedFn, - ZObj extends ExpectedSchema = EmptySchema ->( - props: Mutation$Props -) => { - return (opts?: FCreateMutationOptions>) => { - return createMutation(() => ({ - mutationFn: (input) => props.mutationFn(unwrapValue(input) as any), - mutationKey: makeKey('mutation', props.key), - ...(opts?.() ?? {}), - })) as CreateMutationResult> - } -} diff --git a/examples/prpc/src/routes/index.tsx b/examples/prpc/src/routes/index.tsx index 8a7c106..44cf112 100644 --- a/examples/prpc/src/routes/index.tsx +++ b/examples/prpc/src/routes/index.tsx @@ -4,30 +4,13 @@ import { A } from '@solidjs/router' const Home: VoidComponent = () => { return (
-
-

CSR

- -
-
-

SSR

- -
+ + Query + + | + + Mutation +
) } diff --git a/examples/prpc/src/routes/mutation.tsx b/examples/prpc/src/routes/mutation.tsx index 4232895..1b0d543 100644 --- a/examples/prpc/src/routes/mutation.tsx +++ b/examples/prpc/src/routes/mutation.tsx @@ -1,10 +1,16 @@ -import { type VoidComponent } from 'solid-js' -import { A } from '@solidjs/router' +import { createSignal, Show, type VoidComponent } from 'solid-js' import { z } from 'zod' -import { mutation$ } from '~/prpc/mutation' +import { error$, mutation$ } from '@solid-mediakit/prpc' const testMutation = mutation$({ - mutationFn: ({ payload }) => { + mutationFn: ({ payload, event$ }) => { + const ua = event$.request.headers.get('user-agent') + console.log({ ua }) + if (payload.hello === 'error') { + return error$('This is an error') + } else if (payload.hello === 'cookie') { + event$.response.headers.set('set-cookie', 'hello=world123123; path=/;') + } return `hey ${payload.hello}` }, key: 'hello', @@ -14,14 +20,39 @@ const testMutation = mutation$({ }) const Home: VoidComponent = () => { - const hello = testMutation() + const [hello, setHello] = createSignal('') + const helloMutation = testMutation(() => ({ + onError(error) { + if (error.isZodError()) { + console.log('zod error:', error.cause.fieldErrors) + } else { + console.log('not zod error', error.message) + } + }, + })) return (
-
-

- Mutation -

-

{hello.data}

+

+ {helloMutation.data ?? 'No Data yet...'} +

+ +

+ {helloMutation.error?.message ?? 'Unknown Error'} +

+
+
+ setHello(e.currentTarget.value)} + /> +
) diff --git a/examples/prpc/src/routes/query.tsx b/examples/prpc/src/routes/query.tsx index 103531c..86dcdee 100644 --- a/examples/prpc/src/routes/query.tsx +++ b/examples/prpc/src/routes/query.tsx @@ -1,18 +1,5 @@ import { type VoidComponent } from 'solid-js' -import { query$ } from '~/prpc/query' -import { z } from 'zod' - -const testQuery = query$({ - queryFn: ({ payload, request$ }) => { - const ua = request$ - console.log({ ua }) - return `hey ${payload.hello}` - }, - key: 'hello', - schema: z.object({ - hello: z.string(), - }), -}) +import { testQuery } from '~/testing/piped' const Home: VoidComponent = () => { const hello = testQuery(() => ({ diff --git a/examples/prpc/src/testing/piped.ts b/examples/prpc/src/testing/piped.ts new file mode 100644 index 0000000..77ecfcf --- /dev/null +++ b/examples/prpc/src/testing/piped.ts @@ -0,0 +1,50 @@ +import { + middleware$, + pipe$, + query$, + error$, + hideRequest, +} from '@solid-mediakit/prpc' +import { z } from 'zod' + +const myMiddleware1 = middleware$(({ event$ }) => { + return Math.random() > 0.5 ? { test: true } : { test: null } +}) + +const middleWare2 = pipe$(myMiddleware1, (ctx) => { + if (ctx.test === null) { + return error$('test is null') + } + return { + test: ctx.test, + o: 1, + } +}) + +export const add = query$({ + queryFn: ({ payload, ctx$ }) => { + hideRequest(ctx$, true) + console.log({ ctx$ }) + const result = payload.a + payload.b + return { result } + }, + key: 'add', + schema: z.object({ + a: z.number().max(5), + b: z.number().max(10), + }), + middleware: [middleWare2], +}) + +export const testQuery = query$({ + queryFn: async ({ payload, ctx$ }) => { + hideRequest(ctx$, true) + console.log({ ctx$ }) + return `hey ${payload.hello}` + }, + key: 'hello', + schema: z.object({ + hello: z.string(), + }), + middleware: [middleWare2], +}) diff --git a/examples/prpc/src/prpc/query.ts b/examples/prpc/src/testing/query.ts similarity index 52% rename from examples/prpc/src/prpc/query.ts rename to examples/prpc/src/testing/query.ts index 83b1b33..c8ed279 100644 --- a/examples/prpc/src/prpc/query.ts +++ b/examples/prpc/src/testing/query.ts @@ -1,24 +1,19 @@ -import { createQuery } from '@tanstack/solid-query' -import { CreateQueryResult } from '@tanstack/solid-query' -import { Accessor } from 'solid-js' import { + createQuery, + CreateQueryResult, + FunctionedParams, + QueryKey, + SolidQueryOptions, +} from '@tanstack/solid-query' +import { Accessor } from 'solid-js' +import type { EmptySchema, ExpectedFn, ExpectedSchema, - FCreateQueryOptions, Fn$Output, Infer$PayLoad, -} from './lib/types' -import { makeKey, unwrapValue } from './lib/helpers' - -export type Query$Props< - Fn extends ExpectedFn, - ZObj extends ExpectedSchema = EmptySchema -> = { - queryFn: Fn - key: string - schema?: ZObj -} + OmitQueryData, +} from '@solid-mediakit/prpc' export const query$ = < Fn extends ExpectedFn, @@ -33,9 +28,32 @@ export const query$ = < opts?: FCreateQueryOptions> ) => { return createQuery(() => ({ - queryFn: () => props.queryFn(unwrapValue(input) as any), - queryKey: makeKey('query', props.key, unwrapValue(input)) as any, + queryFn: async () => + await props.queryFn({ payload: input ? input() : undefined } as any), + queryKey: ['prpc.query', props.key, input ? input() : undefined], ...((opts?.() ?? {}) as any), })) as CreateQueryResult> } } + +export type Query$Props< + Fn extends ExpectedFn, + ZObj extends ExpectedSchema = EmptySchema +> = { + queryFn: Fn + key: string + schema?: ZObj +} + +export type FCreateQueryOptions< + TQueryFnData = unknown, + TError = Error, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey +> = FunctionedParams< + OmitQueryData< + SolidQueryOptions & { + initialData?: undefined + } + > +> diff --git a/examples/prpc/src/testing/u.ts b/examples/prpc/src/testing/u.ts new file mode 100644 index 0000000..e43bc6e --- /dev/null +++ b/examples/prpc/src/testing/u.ts @@ -0,0 +1,59 @@ +import { getRequestEvent, isServer } from 'solid-js/web' +import type { ExpectedFn } from '@solid-mediakit/prpc' + +export async function tryAndWrap>( + queryFn: Fn, + input: any, + handleResponse = genHandleResponse() +) { + const response = await queryFn({ + payload: input + ? typeof input === 'function' + ? input() + : input + : undefined, + } as any) + if (response instanceof Response) { + handleResponse?.(response) + const url = response.headers.get('location') + if (response.headers.get('X-Prpc-Error') === '1') { + const error = await optionalData(response) + throw new Error(error.error.message, error.error) + } else if (!isRedirectResponse(response) || !url) { + return await optionalData(response) + } + } + return response +} + +export const optionalData = async (response: Response) => { + try { + return await response.clone().json() + } catch { + return await response.clone().text() + } +} + +const redirectStatusCodes = new Set([204, 301, 302, 303, 307, 308]) + +export function isRedirectResponse(response: Response): response is Response { + return ( + response && + response instanceof Response && + redirectStatusCodes.has(response.status) + ) +} + +export const genHandleResponse = () => { + const event = getRequestEvent() + return (response: Response) => { + if (isServer && event) { + if ((event as any).response) { + response.headers.forEach((value, key) => { + if (key === 'content-type') return + ;(event as any).response.headers.set(key, value) + }) + } + } + } +} diff --git a/examples/trpc/package.json b/examples/trpc/package.json index 873b7b4..5b0c4ee 100644 --- a/examples/trpc/package.json +++ b/examples/trpc/package.json @@ -18,11 +18,11 @@ "postcss": "^8.4.21", "tailwindcss": "^3.2.7", "typescript": "^4.9.5", - "vite": "^4.4.9" + "vite": "^5.1.6" }, "dependencies": { - "@solidjs/router": "^0.13.0", - "@solidjs/start": "^0.7.4", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", "solid-js": "^1.8.15", "vinxi": "^0.3.10", "@solidjs/meta": "^0.29.3", diff --git a/package.json b/package.json index 2665e18..b462304 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,6 @@ "tslib": "^2.5.0", "turbo": "1.2.4", "typescript": "^4.8.2", - "vite": "^4.4.9" + "vite": "^5.1.6" } } diff --git a/packages/auth/package.json b/packages/auth/package.json index 235aef8..04db3b3 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -44,8 +44,8 @@ "rollup-preset-solid": "^2.0.1", "@types/node": "^18.7.14", "@typescript-eslint/parser": "^5.44.0", - "@solidjs/router": "^0.13.0", - "@solidjs/start": "^0.7.4", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", "solid-js": "^1.8.15", "vinxi": "^0.3.10", "@solidjs/meta": "^0.29.3", @@ -58,8 +58,8 @@ "cookie": "^0.6.0" }, "peerDependencies": { - "@solidjs/router": "^0.13.0", - "@solidjs/start": "^0.7.4", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", "solid-js": "^1.8.15", "vinxi": "^0.3.10", "@solidjs/meta": "^0.29.3", diff --git a/packages/prpc-plugin/.gitignore b/packages/prpc-plugin/.gitignore new file mode 100644 index 0000000..c8beaee --- /dev/null +++ b/packages/prpc-plugin/.gitignore @@ -0,0 +1,108 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.production +.env.development + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +.npmrc +types \ No newline at end of file diff --git a/packages/prpc-plugin/README.md b/packages/prpc-plugin/README.md new file mode 100644 index 0000000..a098a1e --- /dev/null +++ b/packages/prpc-plugin/README.md @@ -0,0 +1,27 @@ +# @solid-mediakit/prpc-plugin + +A Vite plugin for pRPC + +### Installation + +```bash +pnpm install @solid-mediakit/prpc-plugin +``` + +### Adding The Vite Plugin + +Go ahead to `app.config.ts` and add the following: + +```ts +import { defineConfig } from '@solidjs/start/config' +import { prpcVite } from '@solid-mediakit/prpc-plugin' // -> + +export default defineConfig({ + ssr: true, + vite: { + plugins: [prpcVite({ log: false })], // -> + }, +}) +``` + +Now read the [pRPC documentation](...) diff --git a/packages/prpc-plugin/package.json b/packages/prpc-plugin/package.json new file mode 100644 index 0000000..c1733e2 --- /dev/null +++ b/packages/prpc-plugin/package.json @@ -0,0 +1,64 @@ +{ + "name": "@solid-mediakit/prpc-plugin", + "version": "1.0.0", + "type": "module", + "files": [ + "dist" + ], + "engines": { + "node": ">=10" + }, + "keywords": [ + "pRPC", + "server$" + ], + "devDependencies": { + "@types/babel__core": "^7.20.0", + "@types/node": "^18.13.0", + "@typescript-eslint/parser": "^5.44.0", + "eslint": "^8.33.0", + "pridepack": "2.4.0", + "tslib": "^2.5.0", + "typescript": "^4.9.5", + "vite": "^5.1.6", + "vitest": "0.29.2" + }, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/preset-typescript": "^7.18.6", + "@rollup/pluginutils": "^5.0.2" + }, + "scripts": { + "prepublishOnly": "pridepack clean && pridepack build", + "build": "pridepack build", + "type-check": "pridepack check", + "lint": "pridepack lint", + "clean": "pridepack clean", + "watch": "pridepack watch", + "start": "pridepack start", + "dev": "pridepack dev", + "test": "vitest" + }, + "description": "Package for easily creating server rpc functions in solid-start with goodies baked in", + "publishConfig": { + "access": "public" + }, + "private": false, + "types": "./dist/types/index.d.ts", + "main": "./dist/cjs/production/index.cjs", + "module": "./dist/esm/production/index.mjs", + "exports": { + ".": { + "development": { + "require": "./dist/cjs/development/index.cjs", + "import": "./dist/esm/development/index.mjs" + }, + "require": "./dist/cjs/production/index.cjs", + "import": "./dist/esm/production/index.mjs", + "types": "./dist/types/index.d.ts" + } + }, + "typesVersions": { + "*": {} + } +} diff --git a/packages/prpc-plugin/pridepack.json b/packages/prpc-plugin/pridepack.json new file mode 100644 index 0000000..2723856 --- /dev/null +++ b/packages/prpc-plugin/pridepack.json @@ -0,0 +1,3 @@ +{ + "target": "es2017" +} diff --git a/examples/prpc/src/prpc/plugin/compiler/babel.ts b/packages/prpc-plugin/src/compiler/babel.ts similarity index 82% rename from examples/prpc/src/prpc/plugin/compiler/babel.ts rename to packages/prpc-plugin/src/compiler/babel.ts index 3e6f8dd..b5efcbc 100644 --- a/examples/prpc/src/prpc/plugin/compiler/babel.ts +++ b/packages/prpc-plugin/src/compiler/babel.ts @@ -9,7 +9,7 @@ import { shiftMiddleware, } from './utils' -const prpcLoc = `~/prpc/utils` +const prpcLoc = `@solid-mediakit/prpc` export function createTransformpRPC$() { return function transformpRPC$({ @@ -40,7 +40,7 @@ export function createTransformpRPC$() { importIfNotThere('validateZod') importIfNotThere('cache', '@solidjs/router') importIfNotThere('getRequestEvent', 'solid-js/web') - // disable middlewares importIfNotThere('callMiddleware$') + importIfNotThere('callMiddleware$') }, CallExpression(path) { const nodeInfo = getNodeInfo(path, t) @@ -51,10 +51,17 @@ export function createTransformpRPC$() { t.identifier('payload'), t.identifier('_$$payload') ) - addRequestIfNeeded(args.serverFunction, t, path) + shiftMiddleware(temp, t, args.serverFunction, nodeInfo, args) + addRequestIfNeeded( + args.serverFunction, + nodeInfo.isReuseableQuery, + nodeInfo.isReuseableMutation, + args.middlewares ?? [], + t, + path + ) cleanOutParams('payload', path, '_$$payload') args.serverFunction.params[0] = t.objectPattern([payload]) - shiftMiddleware(temp, t, args.serverFunction, nodeInfo, args) if ( args.zodSchema && !t.isIdentifier(args.zodSchema, { name: 'undefined' }) @@ -90,7 +97,7 @@ export function createTransformpRPC$() { const destructuring = args.serverFunction.params[0] if (t.isObjectPattern(destructuring)) { destructuring.properties = destructuring.properties.filter( - (p: any) => p.key.name !== 'request$' && p.key.name !== 'ctx$' + (p: any) => p.key.name !== 'event$' && p.key.name !== 'ctx$' ) } const originFn = t.arrowFunctionExpression( @@ -109,29 +116,10 @@ export function createTransformpRPC$() { args.key, ]) - const prefix = `__$` - const n = nodeInfo.isQuery - ? `${prefix}${args.key.value}Query` - : `${prefix}${args.key.value}Mutation` - const uniqueVar = path.scope.generateUidIdentifierBasedOnNode( - path.node.arguments[0] - ) - uniqueVar.name = n - - const p = (path.findParent((p) => p.isProgram())!.node as any).body - const lastImport = p.findLast( - (n: any) => n.type === 'ImportDeclaration' - ) - if (lastImport) { - const dec = t.variableDeclaration('const', [ - t.variableDeclarator(uniqueVar, wrappedArg), - ]) - p.splice(p.indexOf(lastImport) + 1, 0, dec) - } path.node.arguments[0] = t.objectExpression([ t.objectProperty( t.identifier(nodeInfo.isQuery ? 'queryFn' : 'mutationFn'), - uniqueVar + wrappedArg ), t.objectProperty(t.identifier('key'), args.key), ]) diff --git a/examples/prpc/src/prpc/plugin/compiler/index.ts b/packages/prpc-plugin/src/compiler/index.ts similarity index 100% rename from examples/prpc/src/prpc/plugin/compiler/index.ts rename to packages/prpc-plugin/src/compiler/index.ts diff --git a/examples/prpc/src/prpc/plugin/compiler/utils.ts b/packages/prpc-plugin/src/compiler/utils.ts similarity index 88% rename from examples/prpc/src/prpc/plugin/compiler/utils.ts rename to packages/prpc-plugin/src/compiler/utils.ts index 3e1d67b..0950e88 100644 --- a/examples/prpc/src/prpc/plugin/compiler/utils.ts +++ b/packages/prpc-plugin/src/compiler/utils.ts @@ -2,17 +2,23 @@ import * as babel from '@babel/core' export const addRequestIfNeeded = ( serverFunction: any, + isReuseableQuery: boolean, + isReuseableMutation: boolean, + middlewares: any[], t: typeof babel.types, path: babel.NodePath ) => { - const shouldAddRequest = serverFunction.params[0].properties.some( - (p: any) => p.key.name === 'request$' - ) + const useMw = + (middlewares?.length ?? 0) >= 1 || isReuseableQuery || isReuseableMutation + const shouldAddRequest = + serverFunction.params[0].properties.some( + (p: any) => p.key.name === 'event$' + ) || useMw if (shouldAddRequest) { serverFunction.body.body.unshift( t.variableDeclaration('const', [ t.variableDeclarator( - t.identifier('_$$request'), + t.identifier('_$$event'), t.callExpression(t.identifier('getRequestEvent'), []) ), ]) @@ -20,10 +26,10 @@ export const addRequestIfNeeded = ( path.traverse({ Identifier(innerPath: any) { if ( - innerPath.node.name === 'request$' && + innerPath.node.name === 'event$' && innerPath.scope?.path?.listKey !== 'params' ) { - innerPath.node.name = '_$$request' + innerPath.node.name = '_$$event' } }, }) @@ -79,7 +85,7 @@ export const getFunctionArgs = ( !nodeInfo.isReuseableQuery && !nodeInfo.isReuseableMutation ? ( arg.properties.find( - (prop: any) => prop.key.name === 'middlewares' + (prop: any) => prop.key.name === 'middleware' ) as any )?.value?.elements.map((e: any) => e.name) ?? [] : [] @@ -132,7 +138,7 @@ export const shiftMiddleware = ( args: FnArgs ) => { if (args.middlewares?.length || isReuseableQuery || isReuseableMutation) { - const req = '_$$request' + const req = '_$$event' let callMiddleware if (isReuseableQuery || isReuseableMutation) { const name = ((callee as any).object as any).name diff --git a/examples/prpc/src/prpc/plugin/index.ts b/packages/prpc-plugin/src/index.ts similarity index 85% rename from examples/prpc/src/prpc/plugin/index.ts rename to packages/prpc-plugin/src/index.ts index fe785e3..4071b72 100644 --- a/examples/prpc/src/prpc/plugin/index.ts +++ b/packages/prpc-plugin/src/index.ts @@ -6,7 +6,7 @@ import { compilepRRPC, type PRPCPluginOptions } from './compiler' const DEFAULT_INCLUDE = 'src/**/*.{jsx,tsx,ts,js,mjs,cjs}' const DEFAULT_EXCLUDE = 'node_modules/**/*.{jsx,tsx,ts,js,mjs,cjs}' -export default function prpc(opts?: PRPCPluginOptions): Plugin { +export function prpcVite(opts?: PRPCPluginOptions): Plugin { const filter = createFilter( opts?.filter?.include || DEFAULT_INCLUDE, opts?.filter?.exclude || DEFAULT_EXCLUDE @@ -14,7 +14,8 @@ export default function prpc(opts?: PRPCPluginOptions): Plugin { const plugin: Plugin = { enforce: 'pre', name: 'prpc', - async transform(code: string, id: string) { + async transform(code, id) { + id = getId(id) if (!filter(id)) { return code } @@ -62,3 +63,12 @@ function repushPlugin( plugins.splice(baseIndex, 0, plugin) } } + +function getId(id: string) { + if (id.includes('?')) { + // might be useful for the future + const [actualId] = id.split('?') + return actualId + } + return id +} diff --git a/packages/prpc-plugin/tsconfig.json b/packages/prpc-plugin/tsconfig.json new file mode 100644 index 0000000..3c6ca02 --- /dev/null +++ b/packages/prpc-plugin/tsconfig.json @@ -0,0 +1,21 @@ +{ + "exclude": ["node_modules"], + "include": ["src"], + "compilerOptions": { + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "importHelpers": true, + "declaration": true, + "sourceMap": true, + "rootDir": "./src", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "jsx": "react", + "esModuleInterop": true, + "target": "ES2017" + } +} diff --git a/packages/prpc/.eslintrc.json b/packages/prpc/.eslintrc.json new file mode 100644 index 0000000..80d4f31 --- /dev/null +++ b/packages/prpc/.eslintrc.json @@ -0,0 +1,14 @@ +{ + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json" + }, + "plugins": ["@typescript-eslint"], + "extends": [ + "plugin:solid/typescript", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/consistent-type-imports": "warn" + } +} diff --git a/packages/prpc/.gitignore b/packages/prpc/.gitignore new file mode 100644 index 0000000..e83c2ea --- /dev/null +++ b/packages/prpc/.gitignore @@ -0,0 +1,35 @@ +dist +.solid +.output +.vercel +.netlify +netlify + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +*.launch +.settings/ + +# Temp +gitignore + +# System Files +.DS_Store +Thumbs.db + +.env + +**/*.d.ts +**/*.d.ts.map +**/*.js +**/*.module.js.map +**/*.jsx +/compiler +!tsup.config.js +!scripts/**/*.js +!solid.d.ts diff --git a/packages/prpc/README.md b/packages/prpc/README.md new file mode 100644 index 0000000..7dc21e2 --- /dev/null +++ b/packages/prpc/README.md @@ -0,0 +1,201 @@ +# @solid-mediakit/prpc + +A typesafed Wrapper for Solid's RPC protocol + +## Docs + +Please read the docs [here](https://mediakit-taupe.vercel.app/trpc/install), bellow info is less accurate. + +### Installation + +```bash +pnpm install @solid-mediakit/prpc @tanstack/solid-query @solid-mediakit/prpc-plugin +``` + +### Adding The Vite Plugin + +Go ahead to `app.config.ts` and add the following: + +```ts +import { defineConfig } from '@solidjs/start/config' +import { prpcVite } from '@solid-mediakit/prpc-plugin' // -> + +export default defineConfig({ + ssr: true, + vite: { + plugins: [prpcVite({ log: false })], // -> + }, +}) +``` + +Basically, what is going to happen is that the Vite plugin will make this piece of code run on the server, causing it so Zod doesn't leak to the client nor any other server-side code. What's so special about it is that it includes many useful features which aren't build in Vinxi, like Zod validation, `event$` property, custom error handling and more. The transformation process is done via Babel at real time so you don't have to worry about having ugly code in your code base, you just write it and we are in charge of the 'behind the scenes' stuff. + +## Usage + +### Query + +```tsx +// server function declaration +import { query$ } from '@solid-mediakit/prpc' +import { z } from 'zod' + +const testQuery = query$({ + queryFn: async ({ payload, event$ }) => { + const ua = event$.request.headers.get('user-agent') + console.log({ ua }) + return `hey ${payload.hello}` + }, + key: 'hello', + schema: z.object({ + hello: z.string(), + }), +}) + +// client code: +// input should be an accessor +const hello = testQuery(() => ({ + hello: 'JDev', +})) +``` + +#### Transforms Into + +```ts +const __$helloQuery = cache(async ({ payload: _$$payload }) => { + 'use server' + const _$$validatedZod = await validateZod( + _$$payload, + z.object({ + hello: z.string(), + }) + ) + if (_$$validatedZod instanceof Response) return _$$validatedZod + const _$$event = getRequestEvent() + const ua = _$$event.request.headers.get('user-agent') + console.log({ + ua, + }) + return `hey ${_$$validatedZod.hello}` +}, 'hello') +const testQuery = query$({ + queryFn: __$helloQuery, + key: 'hello', +}) +``` + +### Mutation + +```tsx +// server function declaration +import { z } from 'zod' +import { error$, mutation$ } from '@solid-mediakit/prpc' + +const testMutation = mutation$({ + mutationFn: ({ payload, event$ }) => { + const ua = event$.request.headers.get('user-agent') + console.log({ ua }) + if (payload.hello === 'error') { + return error$('This is an error') + } + return `hey ${payload.hello}` + }, + key: 'hello', + schema: z.object({ + hello: z.string(), + }), +}) + +// client code +const Home: VoidComponent = () => { + const [hello, setHello] = createSignal('') + const helloMutation = testMutation(() => ({ + onError(error) { + if (error.isZodError()) { + console.log('zod error:', error.cause.fieldErrors) + } else { + console.log(error.message) + } + }, + })) + return ( +
+

+ {helloMutation.data ?? 'No Data yet...'} +

+ +

+ {helloMutation.error?.message ?? 'Unknown Error'} +

+
+
+ setHello(e.currentTarget.value)} + /> + +
+
+ ) +} +``` + +#### Transforms Into + +```ts +const __$helloMutation = cache(async ({ payload: _$$payload }) => { + 'use server' + const _$$validatedZod = await validateZod( + _$$payload, + z.object({ + hello: z.string(), + }) + ) + if (_$$validatedZod instanceof Response) return _$$validatedZod + const _$$event = getRequestEvent() + const ua = _$$event.request.headers.get('user-agent') + console.log({ + ua, + }) + if (_$$validatedZod.hello === 'error') { + return error$('This is an error') + } + return `hey ${_$$validatedZod.hello}` +}, 'hello') +const testMutation = mutation$({ + mutationFn: __$helloMutation, + key: 'hello', +}) +``` + +## Middleware + +One of pRPC's features is the ability to add middleware to your queries and mutations. This is useful for adding additional logic to your queries and mutations, such as logging, authentication, and more. + +```ts +const mw1 = middleware$(({ event$ }) => { + const ua = event$.request.headers.get('user-agent')! + const isBot = ua.includes('bot') + return { + isBot, + } +}) +const testQuery = query$({ + queryFn: async ({ payload, ctx$ }) => { + return `hey ${payload.hello} ${ctx$.isBot ? 'bot' : 'human'}` + }, + key: 'hello', + schema: z.object({ + hello: z.string(), + }), + middleware: [mw1], +}) +``` + +In this example, the middleware function `mw1` adds a `isBot` property to the context object. This property is then used in the query function to determine if the user is a bot or a human. diff --git a/packages/prpc/package.json b/packages/prpc/package.json new file mode 100644 index 0000000..604fd00 --- /dev/null +++ b/packages/prpc/package.json @@ -0,0 +1,105 @@ +{ + "name": "@solid-mediakit/prpc", + "description": "A typesafed Wrapper for Solid's RPC protocol", + "version": "1.0.0", + "scripts": { + "build": "rm -rf dist && tsup --config ./tsup.config.js", + "clean": "pnpm clean:dist && rm -rf ./node_modules .turbo .solid", + "lint": "eslint . --fix --ext .ts,.tsx,.js,.jsx", + "clean:dist": "rm -rf dist", + "typecheck": "tsc --noEmit" + }, + "type": "module", + "files": [ + "src/**/*", + "dist/**/*" + ], + "exports": { + "worker": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/server.js" + }, + "require": "./dist/server.cjs" + }, + "browser": { + "development": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/dev.js" + }, + "require": "./dist/dev.cjs" + }, + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": "./dist/index.cjs" + }, + "deno": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/server.js" + }, + "require": "./dist/server.cjs" + }, + "node": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/server.js" + }, + "require": "./dist/server.cjs" + }, + "development": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/dev.js" + }, + "require": "./dist/dev.cjs" + }, + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": "./dist/index.cjs" + }, + "main": "./dist/server.cjs", + "types": "./dist/index.d.ts", + "module": "./dist/server.js", + "devDependencies": { + "@solidjs/meta": "^0.29.3", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", + "@tanstack/solid-query": "^5.28.5", + "@types/node": "^18.7.14", + "@typescript-eslint/parser": "^5.44.0", + "solid-js": "^1.8.15", + "typescript": "^4.8.2", + "vinxi": "^0.3.10", + "zod": "^3.22.4", + "tsup": "^6.5.0", + "tsup-preset-solid": "0.1.8" + }, + "dependencies": { + "@rollup/plugin-typescript": "^11.1.6", + "@rollup/pluginutils": "^5.0.2" + }, + "peerDependencies": { + "@solidjs/meta": "^0.29.3", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", + "@tanstack/solid-query": "^5.28.5", + "solid-js": "^1.8.15", + "typescript": "^4.8.2", + "vinxi": "^0.3.10", + "zod": "^3.22.4" + }, + "engines": { + "node": ">=16" + }, + "browser": { + "./dist/server.js": "./dist/index.js", + "./dist/server.cjs": "./dist/index.cjs" + }, + "typesVersions": {} +} diff --git a/packages/prpc/src/error.ts b/packages/prpc/src/error.ts new file mode 100644 index 0000000..1ef3c4b --- /dev/null +++ b/packages/prpc/src/error.ts @@ -0,0 +1,24 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import type { typeToFlattenedError } from 'zod' + +export class PRPCClientError extends Error { + public cause?: typeToFlattenedError | Error | Record + constructor( + message: string, + cause?: typeToFlattenedError | Error | Record + ) { + super(message) + this.name = 'PRPCClientError' + this.cause = cause + } + isZodError(): this is PRPCClientError & { + cause: typeToFlattenedError + } { + return this.cause && typeof this.cause === 'object' + ? 'fieldErrors' in this.cause + : false + } + isError(): this is PRPCClientError & { cause: Error } { + return this.cause ? this.cause instanceof Error : false + } +} diff --git a/packages/prpc/src/index.ts b/packages/prpc/src/index.ts new file mode 100644 index 0000000..b83bead --- /dev/null +++ b/packages/prpc/src/index.ts @@ -0,0 +1,5 @@ +export * from './utils.js' +export * from './types.js' +export * from './query.js' +export * from './mutation.js' +export * from './error.js' diff --git a/packages/prpc/src/middleware.ts b/packages/prpc/src/middleware.ts new file mode 100644 index 0000000..15256cb --- /dev/null +++ b/packages/prpc/src/middleware.ts @@ -0,0 +1,72 @@ +import { + FilterOutResponse, + IMiddleware, + InferFinalMiddlware, + PRPCEvent, +} from './types' + +export const middleware$ = < + Mw extends IMiddleware, + CurrentContext = unknown +>( + mw: Mw +): Mw => { + return mw +} + +export const callMiddleware$ = async []>( + event: PRPCEvent, + middlewares: Mw, + ctx?: any +) => { + let currentCtx = ctx ? { ...ctx, event$: event } : { event$: event } + if (Array.isArray(middlewares)) { + for (const middleware of middlewares) { + if (Array.isArray(middleware)) { + currentCtx = await callMiddleware$(event, middleware, currentCtx) + if (currentCtx instanceof Response) { + return currentCtx + } + } else { + currentCtx = await middleware({ event$: event, ...currentCtx }) + if (currentCtx instanceof Response) { + return currentCtx + } + } + } + return currentCtx + } else { + return await (middlewares as any)({ + event$: event, + ...ctx, + }) + } +} + +type Flattened = T extends Array ? Flattened : T + +export const pipe$ = < + CurrentMw extends IMiddleware | IMiddleware[], + Mw extends IMiddleware>>[] +>( + currentMw: CurrentMw, + ...middlewares: Mw +): Flattened => { + if (Array.isArray(currentMw)) { + return [...currentMw, ...middlewares].flat() as any + } + return [currentMw, ...middlewares].flat() as any +} + +export const hideEvent = (ctx$: T, fully?: boolean) => { + if (typeof ctx$ === 'object' && ctx$ !== null && 'event$' in ctx$) { + if (fully) { + delete (ctx$ as any).event$ + } else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { event$: _$ignore, ...rest } = ctx$ as any + return rest + } + } + return ctx$ +} diff --git a/packages/prpc/src/mutation.ts b/packages/prpc/src/mutation.ts new file mode 100644 index 0000000..5635837 --- /dev/null +++ b/packages/prpc/src/mutation.ts @@ -0,0 +1,53 @@ +import { + CreateMutationResult, + FunctionedParams, + SolidMutationOptions, + createMutation, +} from '@tanstack/solid-query' +import { + EmptySchema, + ExpectedFn, + ExpectedSchema, + Fn$Output, + IMiddleware, + Infer$PayLoad, + OmitQueryData, +} from './types' +import type { PRPCClientError } from './error' +import { tryAndWrap } from './wrap' + +export const mutation$ = < + Mw extends IMiddleware[], + Fn extends ExpectedFn, + ZObj extends ExpectedSchema = EmptySchema +>( + props: Mutation$Props +) => { + return (opts?: FCreateMutationOptions>) => { + return createMutation(() => ({ + mutationFn: async (input) => await tryAndWrap(props.mutationFn, input), + mutationKey: ['prpc.mutation', props.key], + ...(opts?.() ?? {}), + })) as CreateMutationResult> + } +} + +export type Mutation$Props< + Mw extends IMiddleware[], + Fn extends ExpectedFn, + ZObj extends ExpectedSchema = EmptySchema +> = { + mutationFn: Fn + key: string + schema?: ZObj + middleware?: Mw +} + +export type FCreateMutationOptions< + TData = unknown, + TError = PRPCClientError, + TVariables = void, + TContext = unknown +> = FunctionedParams< + OmitQueryData> +> diff --git a/packages/prpc/src/query.ts b/packages/prpc/src/query.ts new file mode 100644 index 0000000..b7c2e43 --- /dev/null +++ b/packages/prpc/src/query.ts @@ -0,0 +1,65 @@ +import { + createQuery, + CreateQueryResult, + FunctionedParams, + QueryKey, + SolidQueryOptions, +} from '@tanstack/solid-query' +import { Accessor } from 'solid-js' +import type { + EmptySchema, + ExpectedFn, + ExpectedSchema, + Fn$Output, + IMiddleware, + Infer$PayLoad, + OmitQueryData, +} from './types' +import type { PRPCClientError } from './error' +import { tryAndWrap } from './wrap' + +export const query$ = < + Mw extends IMiddleware[], + Fn extends ExpectedFn, + ZObj extends ExpectedSchema = EmptySchema +>( + props: Query$Props +) => { + return ( + input: ZObj extends EmptySchema + ? EmptySchema + : Accessor>, + opts?: FCreateQueryOptions> + ) => { + return createQuery(() => ({ + queryFn: async () => + await tryAndWrap(props.queryFn, input ? input() : undefined), + queryKey: ['prpc.query', props.key, input ? input() : undefined], + ...((opts?.() ?? {}) as any), + })) as CreateQueryResult> + } +} + +export type Query$Props< + Mw extends IMiddleware[], + Fn extends ExpectedFn, + ZObj extends ExpectedSchema = EmptySchema +> = { + queryFn: Fn + key: string + schema?: ZObj + middleware?: Mw +} + +export type FCreateQueryOptions< + TQueryFnData = unknown, + TError = PRPCClientError, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey +> = FunctionedParams< + OmitQueryData< + SolidQueryOptions & { + initialData?: undefined + } + > +> diff --git a/packages/prpc/src/types.ts b/packages/prpc/src/types.ts new file mode 100644 index 0000000..9d730dd --- /dev/null +++ b/packages/prpc/src/types.ts @@ -0,0 +1,71 @@ +import type zod from 'zod' +import type { getRequestEvent } from 'solid-js/web' + +export type EmptySchema = void | undefined + +export type ExpectedSchema = zod.ZodSchema | EmptySchema + +export type Infer$PayLoad = + ZObj extends zod.ZodSchema ? zod.infer : never + +export type PRPCEvent = NonNullable> + +export type ExpectedFn< + ZObject = EmptySchema, + Mw extends IMiddleware[] = [] +> = ZObject extends EmptySchema + ? (input: Fn$Input) => any + : ZObject extends zod.ZodSchema + ? (input: Fn$Input) => any + : (input: Fn$Input) => any + +export type IMiddleware = (ctx$: T & { event$: PRPCEvent }) => any + +export type Fn$Input< + ZObj extends ExpectedSchema = EmptySchema, + Mw extends IMiddleware[] = [] +> = { + payload: Infer$PayLoad + event$: PRPCEvent + ctx$: FilterOutResponse>> +} + +export type Fn$Output< + Fn extends ExpectedFn, + ZObject = EmptySchema, + Mw extends IMiddleware[] = [] +> = FilterOutResponse< + ReturnType extends Promise ? T : ReturnType +> + +export type OmitQueryData = Omit< + T, + 'queryKey' | 'queryFn' | 'mutationFn' | 'mutationKey' +> + +export type InferReturnType = T extends (...args: any[]) => infer R + ? R extends Promise + ? R2 + : R + : never + +export type FilterOutResponse = T extends Response + ? never + : T extends object + ? { [K in keyof T]: FilterOutResponse } + : T + +export type FlattenArray = T extends (infer U)[] ? U : T + +export type InferFinalMiddlware = + (Mw extends [ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ...infer _Start, + infer Last + ] + ? InferReturnType + : Mw extends IMiddleware + ? InferReturnType + : Mw extends any[] + ? InferReturnType> + : InferReturnType) & {} diff --git a/packages/prpc/src/utils.ts b/packages/prpc/src/utils.ts new file mode 100644 index 0000000..96f3710 --- /dev/null +++ b/packages/prpc/src/utils.ts @@ -0,0 +1,114 @@ +import { ZodSchema } from 'zod' +import { + FilterOutResponse, + IMiddleware, + InferFinalMiddlware, + PRPCEvent, +} from './types' + +export const validateZod = async ( + payload: any, + schema: Schema +) => { + const res = await schema.safeParseAsync( + typeof payload === 'object' ? payload : JSON.parse(payload) + ) + if (!res.success) { + return error$(res.error.flatten()) + } + return res.data +} + +export const error$ = (error: any, init?: ResponseInit): Response => { + const headers = new Headers(init?.headers) + headers.set('Content-Type', 'application/json') + headers.set('X-Prpc-Error', '1') + return new Response( + JSON.stringify({ + error: typeof error === 'string' ? { message: error } : error, + }), + { + status: init?.status ?? 400, + headers, + } + ) as any +} + +export const middleware$ = < + Mw extends IMiddleware, + CurrentContext = unknown +>( + mw: Mw +): Mw => { + return mw +} + +export const callMiddleware$ = async []>( + event: PRPCEvent, + middlewares: Mw, + ctx?: any +) => { + let currentCtx = ctx ? { ...ctx, event$: event } : { event$: event } + if (Array.isArray(middlewares)) { + for (const middleware of middlewares) { + if (Array.isArray(middleware)) { + currentCtx = await callMiddleware$(event, middleware, currentCtx) + if (currentCtx instanceof Response) { + return currentCtx + } + } else { + currentCtx = await middleware({ event$: event, ...currentCtx }) + if (currentCtx instanceof Response) { + return currentCtx + } + } + } + return currentCtx + } else { + return await (middlewares as any)({ + event$: event, + ...ctx, + }) + } +} + +type Flattened = T extends Array ? Flattened : T + +export const pipe$ = < + CurrentMw extends IMiddleware | IMiddleware[], + Mw extends IMiddleware>>[] +>( + currentMw: CurrentMw, + ...middlewares: Mw +): Flattened => { + if (Array.isArray(currentMw)) { + return [...currentMw, ...middlewares].flat() as any + } + return [currentMw, ...middlewares].flat() as any +} + +export const hideEvent = (ctx$: T, fully?: boolean) => { + if (typeof ctx$ === 'object' && ctx$ !== null && 'event$' in ctx$) { + if (fully) { + delete (ctx$ as any).event$ + } else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { event$: _$ignore, ...rest } = ctx$ as any + return rest + } + } + return ctx$ +} + +export const hideRequest = (ctx$: T, fully?: boolean) => { + if (typeof ctx$ === 'object' && ctx$ !== null && 'event$' in ctx$) { + if (fully) { + delete (ctx$ as any).event$ + } else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { event$: _$ignore, ...rest } = ctx$ as any + return rest + } + } + return ctx$ +} diff --git a/packages/prpc/src/wrap.ts b/packages/prpc/src/wrap.ts new file mode 100644 index 0000000..a242e8b --- /dev/null +++ b/packages/prpc/src/wrap.ts @@ -0,0 +1,64 @@ +import { getRequestEvent, isServer } from 'solid-js/web' +import type { ExpectedFn } from './types' +import { PRPCClientError } from './error' + +export async function tryAndWrap>( + queryFn: Fn, + input: any, + handleResponse = genHandleResponse() +) { + try { + const response = await queryFn({ + payload: input + ? typeof input === 'function' + ? input() + : input + : undefined, + } as any) + if (response instanceof Response) { + handleResponse?.(response) + const url = response.headers.get('location') + if (response.headers.get('X-Prpc-Error') === '1') { + const error = await optionalData(response) + throw new PRPCClientError(error.error.message, error.error) + } else if (!isRedirectResponse(response) || !url) { + return await optionalData(response) + } + } + return response + } catch (e: any) { + throw new PRPCClientError(e.message, e) + } +} + +export const optionalData = async (response: Response) => { + try { + return await response.clone().json() + } catch { + return await response.clone().text() + } +} + +const redirectStatusCodes = new Set([204, 301, 302, 303, 307, 308]) + +export function isRedirectResponse(response: Response): response is Response { + return ( + response && + response instanceof Response && + redirectStatusCodes.has(response.status) + ) +} + +export const genHandleResponse = () => { + const event = getRequestEvent() + return (response: Response) => { + if (isServer && event) { + if ((event as any).response) { + response.headers.forEach((value, key) => { + if (key === 'content-type') return + ;(event as any).response.headers.set(key, value) + }) + } + } + } +} diff --git a/packages/prpc/tsconfig.json b/packages/prpc/tsconfig.json new file mode 100644 index 0000000..ec10ba9 --- /dev/null +++ b/packages/prpc/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "declaration": true, + "allowSyntheticDefaultImports": true, + "target": "esnext", + "moduleResolution": "Node", + "esModuleInterop": true, + "strict": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "module": "esnext", + "outDir": "./dist", + "rootDir": "./src", + "types": ["vite/client", "vinxi/client", "@solidjs/start/env", "node"], + "strictNullChecks": true, + "skipDefaultLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "skipLibCheck": true + }, + "include": ["./src/**/*"] +} diff --git a/packages/prpc/tsup.config.js b/packages/prpc/tsup.config.js new file mode 100644 index 0000000..eb7f8d7 --- /dev/null +++ b/packages/prpc/tsup.config.js @@ -0,0 +1,31 @@ +import { defineConfig } from 'tsup-preset-solid' + +export default defineConfig( + [ + { + entry: 'src/index.ts', + devEntry: true, + serverEntry: true, + }, + ], + [ + { + entry: 'src/query.tsx', + devEntry: true, + serverEntry: true, + }, + ], + [ + { + entry: 'src/mutation.tsx', + devEntry: true, + serverEntry: true, + }, + ], + { + printInstructions: false, + writePackageJson: true, + dropConsole: false, + cjs: true, + } +) diff --git a/packages/trpc/package.json b/packages/trpc/package.json index 052e924..d41c8b2 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -30,8 +30,8 @@ }, "devDependencies": { "@rollup/plugin-typescript": "^11.1.2", - "@solidjs/router": "^0.13.0", - "@solidjs/start": "^0.7.4", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", "solid-js": "^1.8.15", "vinxi": "^0.3.10", "@solidjs/meta": "^0.29.3", @@ -46,8 +46,8 @@ "typescript": "^4.8.2" }, "peerDependencies": { - "@solidjs/router": "^0.13.0", - "@solidjs/start": "^0.7.4", + "@solidjs/router": "^0.13.1", + "@solidjs/start": "^1.0.0-rc.0", "solid-js": "^1.8.15", "vinxi": "^0.3.10", "@tanstack/solid-query": "^5.28.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4d3350..994ad2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,8 +66,8 @@ importers: specifier: ^4.8.2 version: 4.9.5 vite: - specifier: ^4.4.9 - version: 4.4.9(@types/node@18.17.5) + specifier: ^5.1.6 + version: 5.1.6(@types/node@18.17.5) docs: dependencies: @@ -82,7 +82,7 @@ importers: version: 2.5.2(astro@2.0.15) '@astrojs/solid-js': specifier: ^2.0.2 - version: 2.0.2(@babel/core@7.20.12)(solid-js@1.8.14)(vite@4.4.9) + version: 2.0.2(@babel/core@7.20.12)(solid-js@1.8.14)(vite@5.1.6) '@astrojs/vercel': specifier: ^3.8.0 version: 3.8.0(astro@2.0.15)(react@18.2.0) @@ -118,11 +118,11 @@ importers: specifier: ^0.29.3 version: 0.29.3(solid-js@1.8.15) '@solidjs/router': - specifier: ^0.13.0 - version: 0.13.0(solid-js@1.8.15) + specifier: ^0.13.1 + version: 0.13.1(solid-js@1.8.15) '@solidjs/start': - specifier: ^0.7.4 - version: 0.7.4(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@4.4.9) + specifier: ^1.0.0-rc.0 + version: 1.0.0-rc.0(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) solid-js: specifier: ^1.8.15 version: 1.8.15 @@ -164,8 +164,8 @@ importers: specifier: ^4.9.5 version: 4.9.5 vite: - specifier: ^4.4.9 - version: 4.4.9(@types/node@18.17.5) + specifier: ^5.1.6 + version: 5.1.6(@types/node@18.17.5) examples/media: dependencies: @@ -176,11 +176,11 @@ importers: specifier: ^0.29.3 version: 0.29.3(solid-js@1.8.15) '@solidjs/router': - specifier: ^0.13.0 - version: 0.13.0(solid-js@1.8.15) + specifier: ^0.13.1 + version: 0.13.1(solid-js@1.8.15) '@solidjs/start': - specifier: ^0.7.4 - version: 0.7.4(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@4.4.9) + specifier: ^1.0.0-rc.0 + version: 1.0.0-rc.0(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) solid-js: specifier: ^1.8.15 version: 1.8.15 @@ -216,26 +216,26 @@ importers: specifier: ^4.9.5 version: 4.9.5 vite: - specifier: ^4.4.9 - version: 4.4.9(@types/node@18.17.5) + specifier: ^5.1.6 + version: 5.1.6(@types/node@18.17.5) examples/prpc: dependencies: - '@babel/core': - specifier: ^7.20.12 - version: 7.20.12 - '@babel/preset-typescript': - specifier: ^7.18.6 - version: 7.23.3(@babel/core@7.20.12) + '@solid-mediakit/prpc': + specifier: workspace:* + version: link:../../packages/prpc + '@solid-mediakit/prpc-plugin': + specifier: workspace:* + version: link:../../packages/prpc-plugin '@solidjs/meta': specifier: ^0.29.3 version: 0.29.3(solid-js@1.8.15) '@solidjs/router': - specifier: ^0.13.0 - version: 0.13.0(solid-js@1.8.15) + specifier: ^0.13.1 + version: 0.13.1(solid-js@1.8.15) '@solidjs/start': - specifier: ^0.7.4 - version: 0.7.4(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) + specifier: ^1.0.0-rc.0 + version: 1.0.0-rc.0(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) '@tanstack/solid-query': specifier: ^5.28.5 version: 5.28.5(solid-js@1.8.15) @@ -249,12 +249,6 @@ importers: specifier: ^3.22.4 version: 3.22.4 devDependencies: - '@rollup/pluginutils': - specifier: ^5.0.2 - version: 5.0.2(rollup@4.9.6) - '@types/babel__core': - specifier: ^7.20.0 - version: 7.20.0 '@types/node': specifier: ^18.14.0 version: 18.17.5 @@ -295,11 +289,11 @@ importers: specifier: ^0.29.3 version: 0.29.3(solid-js@1.8.15) '@solidjs/router': - specifier: ^0.13.0 - version: 0.13.0(solid-js@1.8.15) + specifier: ^0.13.1 + version: 0.13.1(solid-js@1.8.15) '@solidjs/start': - specifier: ^0.7.4 - version: 0.7.4(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@4.4.9) + specifier: ^1.0.0-rc.0 + version: 1.0.0-rc.0(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) '@tanstack/solid-query': specifier: ^5.28.5 version: 5.28.5(solid-js@1.8.15) @@ -347,8 +341,8 @@ importers: specifier: ^4.9.5 version: 4.9.5 vite: - specifier: ^4.4.9 - version: 4.4.9(@types/node@18.17.5) + specifier: ^5.1.6 + version: 5.1.6(@types/node@18.17.5) packages/auth: dependencies: @@ -369,11 +363,11 @@ importers: specifier: ^0.29.3 version: 0.29.3(solid-js@1.8.15) '@solidjs/router': - specifier: ^0.13.0 - version: 0.13.0(solid-js@1.8.15) + specifier: ^0.13.1 + version: 0.13.1(solid-js@1.8.15) '@solidjs/start': - specifier: ^0.7.4 - version: 0.7.4(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) + specifier: ^1.0.0-rc.0 + version: 1.0.0-rc.0(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) '@types/node': specifier: ^18.7.14 version: 18.17.5 @@ -418,6 +412,92 @@ importers: specifier: ^5.1.6 version: 5.1.6 + packages/prpc: + dependencies: + '@rollup/plugin-typescript': + specifier: ^11.1.6 + version: 11.1.6(rollup@4.9.6)(tslib@2.5.0)(typescript@4.9.5) + '@rollup/pluginutils': + specifier: ^5.0.2 + version: 5.0.2(rollup@4.9.6) + devDependencies: + '@solidjs/meta': + specifier: ^0.29.3 + version: 0.29.3(solid-js@1.8.15) + '@solidjs/router': + specifier: ^0.13.1 + version: 0.13.1(solid-js@1.8.15) + '@solidjs/start': + specifier: ^1.0.0-rc.0 + version: 1.0.0-rc.0(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) + '@tanstack/solid-query': + specifier: ^5.28.5 + version: 5.28.5(solid-js@1.8.15) + '@types/node': + specifier: ^18.7.14 + version: 18.17.5 + '@typescript-eslint/parser': + specifier: ^5.44.0 + version: 5.52.0(eslint@8.34.0)(typescript@4.9.5) + solid-js: + specifier: ^1.8.15 + version: 1.8.15 + tsup: + specifier: ^6.5.0 + version: 6.5.0(typescript@4.9.5) + tsup-preset-solid: + specifier: 0.1.8 + version: 0.1.8(esbuild@0.14.54)(solid-js@1.8.15)(tsup@6.5.0) + typescript: + specifier: ^4.8.2 + version: 4.9.5 + vinxi: + specifier: ^0.3.10 + version: 0.3.10(@types/node@18.17.5) + zod: + specifier: ^3.22.4 + version: 3.22.4 + + packages/prpc-plugin: + dependencies: + '@babel/core': + specifier: ^7.20.12 + version: 7.20.12 + '@babel/preset-typescript': + specifier: ^7.18.6 + version: 7.23.3(@babel/core@7.20.12) + '@rollup/pluginutils': + specifier: ^5.0.2 + version: 5.0.2(rollup@4.9.6) + devDependencies: + '@types/babel__core': + specifier: ^7.20.0 + version: 7.20.0 + '@types/node': + specifier: ^18.13.0 + version: 18.17.5 + '@typescript-eslint/parser': + specifier: ^5.44.0 + version: 5.52.0(eslint@8.34.0)(typescript@4.9.5) + eslint: + specifier: ^8.33.0 + version: 8.34.0 + pridepack: + specifier: 2.4.0 + version: 2.4.0(eslint@8.34.0)(tslib@2.5.0)(typescript@4.9.5) + tslib: + specifier: ^2.5.0 + version: 2.5.0 + typescript: + specifier: ^4.9.5 + version: 4.9.5 + vite: + specifier: ^5.1.6 + version: 5.1.6(@types/node@18.17.5) + vitest: + specifier: 0.29.2 + version: 0.29.2 + packages/shared: dependencies: '@babel/core': @@ -443,11 +523,11 @@ importers: specifier: ^0.29.3 version: 0.29.3(solid-js@1.8.15) '@solidjs/router': - specifier: ^0.13.0 - version: 0.13.0(solid-js@1.8.15) + specifier: ^0.13.1 + version: 0.13.1(solid-js@1.8.15) '@solidjs/start': - specifier: ^0.7.4 - version: 0.7.4(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) + specifier: ^1.0.0-rc.0 + version: 1.0.0-rc.0(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6) '@tanstack/solid-query': specifier: ^5.28.5 version: 5.28.5(solid-js@1.8.15) @@ -733,7 +813,7 @@ packages: prismjs: 1.29.0 dev: false - /@astrojs/solid-js@2.0.2(@babel/core@7.20.12)(solid-js@1.8.14)(vite@4.4.9): + /@astrojs/solid-js@2.0.2(@babel/core@7.20.12)(solid-js@1.8.14)(vite@5.1.6): resolution: {integrity: sha512-fQMOfBcmvYHXJg8vR0LgoeBgrlLHrxnlzxxmPkDKrGPBRh9y3si2d/ChpMyMRL3ibAOqWTs7Xs5gOYqrFZbw3g==} engines: {node: '>=16.12.0'} peerDependencies: @@ -741,7 +821,7 @@ packages: dependencies: babel-preset-solid: 1.8.15(@babel/core@7.20.12) solid-js: 1.8.14 - vitefu: 0.2.5(vite@4.4.9) + vitefu: 0.2.5(vite@5.1.6) transitivePeerDependencies: - '@babel/core' - vite @@ -973,7 +1053,7 @@ packages: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.0 + '@babel/types': 7.23.9 /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} @@ -2371,7 +2451,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/android-arm64@0.18.20: @@ -2412,7 +2491,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/android-arm@0.18.20: @@ -2445,7 +2523,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/android-x64@0.18.20: @@ -2478,7 +2555,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@esbuild/darwin-arm64@0.18.20: @@ -2511,7 +2587,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@esbuild/darwin-x64@0.18.20: @@ -2544,7 +2619,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false optional: true /@esbuild/freebsd-arm64@0.18.20: @@ -2577,7 +2651,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false optional: true /@esbuild/freebsd-x64@0.18.20: @@ -2610,7 +2683,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-arm64@0.18.20: @@ -2643,7 +2715,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-arm@0.18.20: @@ -2676,7 +2747,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-ia32@0.18.20: @@ -2726,7 +2796,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-loong64@0.18.20: @@ -2759,7 +2828,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-mips64el@0.18.20: @@ -2792,7 +2860,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-ppc64@0.18.20: @@ -2825,7 +2892,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-riscv64@0.18.20: @@ -2858,7 +2924,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-s390x@0.18.20: @@ -2891,7 +2956,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-x64@0.18.20: @@ -2924,7 +2988,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false optional: true /@esbuild/netbsd-x64@0.18.20: @@ -2957,7 +3020,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false optional: true /@esbuild/openbsd-x64@0.18.20: @@ -2990,7 +3052,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false optional: true /@esbuild/sunos-x64@0.18.20: @@ -3023,7 +3084,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true /@esbuild/win32-arm64@0.18.20: @@ -3056,7 +3116,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true /@esbuild/win32-ia32@0.18.20: @@ -3089,7 +3148,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@esbuild/win32-x64@0.18.20: @@ -3333,17 +3391,14 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + /@ovyerus/licenses@6.4.4: + resolution: {integrity: sha512-IHjc31WXciQT3hfvdY+M59jBkQp70Fpr04tNDVO5rez2PNv4u8tE6w//CkU+GeBoO9k2ahneSqzjzvlgjyjkGw==} + engines: {node: '>=8'} + dev: true + /@panva/hkdf@1.1.1: resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} - /@parcel/watcher-android-arm64@2.4.0: - resolution: {integrity: sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - requiresBuild: true - optional: true - /@parcel/watcher-android-arm64@2.4.1: resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} engines: {node: '>= 10.0.0'} @@ -3352,14 +3407,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-darwin-arm64@2.4.0: - resolution: {integrity: sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - /@parcel/watcher-darwin-arm64@2.4.1: resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} engines: {node: '>= 10.0.0'} @@ -3368,14 +3415,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-darwin-x64@2.4.0: - resolution: {integrity: sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - /@parcel/watcher-darwin-x64@2.4.1: resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} engines: {node: '>= 10.0.0'} @@ -3384,14 +3423,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-freebsd-x64@2.4.0: - resolution: {integrity: sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - optional: true - /@parcel/watcher-freebsd-x64@2.4.1: resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} engines: {node: '>= 10.0.0'} @@ -3400,14 +3431,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-linux-arm-glibc@2.4.0: - resolution: {integrity: sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - optional: true - /@parcel/watcher-linux-arm-glibc@2.4.1: resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} engines: {node: '>= 10.0.0'} @@ -3416,14 +3439,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-linux-arm64-glibc@2.4.0: - resolution: {integrity: sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - /@parcel/watcher-linux-arm64-glibc@2.4.1: resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} @@ -3432,14 +3447,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-linux-arm64-musl@2.4.0: - resolution: {integrity: sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - /@parcel/watcher-linux-arm64-musl@2.4.1: resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} @@ -3448,14 +3455,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-linux-x64-glibc@2.4.0: - resolution: {integrity: sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - /@parcel/watcher-linux-x64-glibc@2.4.1: resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} @@ -3464,14 +3463,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-linux-x64-musl@2.4.0: - resolution: {integrity: sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - /@parcel/watcher-linux-x64-musl@2.4.1: resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} @@ -3490,16 +3481,6 @@ packages: bundledDependencies: - napi-wasm - /@parcel/watcher-wasm@2.4.0: - resolution: {integrity: sha512-MNgQ4WCbBybqQ97KwR/hqJGYTg3+s8qHpgIyFWB2qJOBvoJWbXuJGmm4ZkPLq2bMaANqCZqrXwmKYagZTkMKZA==} - engines: {node: '>= 10.0.0'} - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.5 - napi-wasm: 1.1.0 - bundledDependencies: - - napi-wasm - /@parcel/watcher-wasm@2.4.1: resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} engines: {node: '>= 10.0.0'} @@ -3510,14 +3491,6 @@ packages: bundledDependencies: - napi-wasm - /@parcel/watcher-win32-arm64@2.4.0: - resolution: {integrity: sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true - /@parcel/watcher-win32-arm64@2.4.1: resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} engines: {node: '>= 10.0.0'} @@ -3526,14 +3499,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-win32-ia32@2.4.0: - resolution: {integrity: sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true - /@parcel/watcher-win32-ia32@2.4.1: resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} engines: {node: '>= 10.0.0'} @@ -3542,14 +3507,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher-win32-x64@2.4.0: - resolution: {integrity: sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true - /@parcel/watcher-win32-x64@2.4.1: resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} engines: {node: '>= 10.0.0'} @@ -3558,28 +3515,6 @@ packages: requiresBuild: true optional: true - /@parcel/watcher@2.4.0: - resolution: {integrity: sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==} - engines: {node: '>= 10.0.0'} - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.1.0 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.0 - '@parcel/watcher-darwin-arm64': 2.4.0 - '@parcel/watcher-darwin-x64': 2.4.0 - '@parcel/watcher-freebsd-x64': 2.4.0 - '@parcel/watcher-linux-arm-glibc': 2.4.0 - '@parcel/watcher-linux-arm64-glibc': 2.4.0 - '@parcel/watcher-linux-arm64-musl': 2.4.0 - '@parcel/watcher-linux-x64-glibc': 2.4.0 - '@parcel/watcher-linux-x64-musl': 2.4.0 - '@parcel/watcher-win32-arm64': 2.4.0 - '@parcel/watcher-win32-ia32': 2.4.0 - '@parcel/watcher-win32-x64': 2.4.0 - /@parcel/watcher@2.4.1: resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} @@ -3824,6 +3759,26 @@ packages: typescript: 5.1.6 dev: true + /@rollup/plugin-typescript@11.1.6(rollup@4.9.6)(tslib@2.5.0)(typescript@4.9.5): + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.9.6) + resolve: 1.22.8 + rollup: 4.9.6 + tslib: 2.5.0 + typescript: 4.9.5 + dev: false + /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} @@ -3844,7 +3799,7 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 4.9.6 - dev: true + dev: false /@rollup/pluginutils@5.1.0(rollup@3.29.4): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} @@ -4082,43 +4037,15 @@ packages: dependencies: solid-js: 1.8.15 - /@solidjs/router@0.13.0(solid-js@1.8.15): - resolution: {integrity: sha512-YHLbFv9J53+iG4yVrh0vVdYiyXPTk892UyZ1jiMPsUXn2dYkX4552N+8SjvlKWWsmNmYxaoefM6jZn1YtVIUUg==} + /@solidjs/router@0.13.1(solid-js@1.8.15): + resolution: {integrity: sha512-Rz5Lf0ssWMuN+Wm2GFO0vwZoO/KSwYFSuCUzWrRAvje5M0ZYZrMk5FZxuzdJT+zg8KuqWJQlRALks5E0r+FjAA==} peerDependencies: solid-js: ^1.8.6 dependencies: solid-js: 1.8.15 - /@solidjs/start@0.7.4(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@4.4.9): - resolution: {integrity: sha512-SBFCpLo0yGUFPKNyneZ7g8cHchQKm0+G/Gr19SEtGzCn0KE4/YmDCtuDUk4ANxm6XTFrdcDPjdLgYXHDrWxVLA==} - dependencies: - '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.10) - '@vinxi/server-components': 0.3.3(vinxi@0.3.10) - '@vinxi/server-functions': 0.3.2(vinxi@0.3.10) - defu: 6.1.4 - error-stack-parser: 2.1.4 - glob: 10.3.10 - html-to-image: 1.11.11 - radix3: 1.1.0 - seroval: 1.0.4 - seroval-plugins: 1.0.4(seroval@1.0.4) - shikiji: 0.9.19 - source-map-js: 1.0.2 - terracotta: 1.0.5(solid-js@1.8.15) - vite-plugin-inspect: 0.7.42(rollup@4.9.6)(vite@4.4.9) - vite-plugin-solid: 2.9.1(solid-js@1.8.15)(vite@4.4.9) - transitivePeerDependencies: - - '@nuxt/kit' - - '@testing-library/jest-dom' - - rollup - - solid-js - - supports-color - - vinxi - - vite - dev: false - - /@solidjs/start@0.7.4(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6): - resolution: {integrity: sha512-SBFCpLo0yGUFPKNyneZ7g8cHchQKm0+G/Gr19SEtGzCn0KE4/YmDCtuDUk4ANxm6XTFrdcDPjdLgYXHDrWxVLA==} + /@solidjs/start@1.0.0-rc.0(rollup@4.9.6)(solid-js@1.8.15)(vinxi@0.3.10)(vite@5.1.6): + resolution: {integrity: sha512-wimF6eqYx8L1XC1MMxwruOgS+BGmv6nEnCa1Fd/VPcYaSF8BKBvgIQYNJALl8QUjfJ7lMK4b41uKAXz451vNNA==} dependencies: '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.10) '@vinxi/server-components': 0.3.3(vinxi@0.3.10) @@ -4127,7 +4054,7 @@ packages: error-stack-parser: 2.1.4 glob: 10.3.10 html-to-image: 1.11.11 - radix3: 1.1.0 + radix3: 1.1.1 seroval: 1.0.4 seroval-plugins: 1.0.4(seroval@1.0.4) shikiji: 0.9.19 @@ -4193,13 +4120,13 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.20.0 + '@babel/types': 7.23.9 /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: '@babel/parser': 7.23.9 - '@babel/types': 7.20.0 + '@babel/types': 7.23.9 /@types/babel__traverse@7.20.5: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} @@ -4209,6 +4136,16 @@ packages: /@types/braces@3.0.4: resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} + /@types/chai-subset@1.3.5: + resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + dependencies: + '@types/chai': 4.3.14 + dev: true + + /@types/chai@4.3.14: + resolution: {integrity: sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==} + dev: true + /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -4595,7 +4532,7 @@ packages: resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} hasBin: true dependencies: - '@parcel/watcher': 2.4.0 + '@parcel/watcher': 2.4.1 '@parcel/watcher-wasm': 2.3.0 citty: 0.1.6 clipboardy: 4.0.0 @@ -4605,11 +4542,11 @@ packages: h3: 1.11.1 http-shutdown: 1.2.2 jiti: 1.21.0 - mlly: 1.5.0 + mlly: 1.6.1 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.7.0 - ufo: 1.4.0 + ufo: 1.5.1 untun: 0.1.3 uqr: 0.1.2 transitivePeerDependencies: @@ -4659,6 +4596,38 @@ packages: recast: 0.23.4 vinxi: 0.3.10(@types/node@18.17.5) + /@vitest/expect@0.29.2: + resolution: {integrity: sha512-wjrdHB2ANTch3XKRhjWZN0UueFocH0cQbi2tR5Jtq60Nb3YOSmakjdAvUa2JFBu/o8Vjhj5cYbcMXkZxn1NzmA==} + dependencies: + '@vitest/spy': 0.29.2 + '@vitest/utils': 0.29.2 + chai: 4.4.1 + dev: true + + /@vitest/runner@0.29.2: + resolution: {integrity: sha512-A1P65f5+6ru36AyHWORhuQBJrOOcmDuhzl5RsaMNFe2jEkoj0faEszQS4CtPU/LxUYVIazlUtZTY0OEZmyZBnA==} + dependencies: + '@vitest/utils': 0.29.2 + p-limit: 4.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/spy@0.29.2: + resolution: {integrity: sha512-Hc44ft5kaAytlGL2PyFwdAsufjbdOvHklwjNy/gy/saRbg9Kfkxfh+PklLm1H2Ib/p586RkQeNFKYuJInUssyw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.2: + resolution: {integrity: sha512-F14/Uc+vCdclStS2KEoXJlOLAEyqRhnw0gM27iXw9bMTcyKRPJrQ+rlC6XZ125GIPvvKYMPpVxNhiou6PsEeYQ==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.2.0 + loupe: 2.3.7 + picocolors: 1.0.0 + pretty-format: 27.5.1 + dev: true + /@vscode/emmet-helper@2.9.2: resolution: {integrity: sha512-MaGuyW+fa13q3aYsluKqclmh62Hgp0BpKIqS66fCxfOaBcVQ1OnMQxRRgQUYnCkxFISAQlkJ0qWWPyXjro1Qrg==} dependencies: @@ -4722,6 +4691,11 @@ packages: engines: {node: '>=0.4.0'} dev: true + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} @@ -4802,10 +4776,19 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4925,6 +4908,10 @@ packages: object.assign: 4.1.5 util: 0.12.5 + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -5149,7 +5136,6 @@ packages: buffer: 6.0.3 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false /boxen@6.2.1: resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} @@ -5246,6 +5232,16 @@ packages: dependencies: run-applescript: 5.0.0 + /bundle-require@3.1.2(esbuild@0.15.18): + resolution: {integrity: sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.13' + dependencies: + esbuild: 0.15.18 + load-tsconfig: 0.2.5 + dev: true + /c12@1.10.0: resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} dependencies: @@ -5262,6 +5258,11 @@ packages: pkg-types: 1.0.3 rc9: 2.1.1 + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -5312,6 +5313,19 @@ packages: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -5351,6 +5365,12 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -5387,12 +5407,18 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: restore-cursor: 4.0.0 - dev: false /cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - dev: false + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true /clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} @@ -5458,6 +5484,11 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + /common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} dev: false @@ -5481,6 +5512,18 @@ packages: /confbox@0.1.3: resolution: {integrity: sha512-eH3ZxAihl1PhKfpr4VfEN6/vUd87fmgb6JkldHgg/YR6aEBhW63qUDgzP2Y6WM0UumdsYp5H3kibalXAdHfbgg==} + /configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + dev: true + /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -5547,9 +5590,6 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /crossws@0.1.1: - resolution: {integrity: sha512-c9c/o7bS3OjsdpSkvexpka0JNlesBF2JU9B2V1yNsYGwRbAafxhJQ7VI9b48D5bpONz/oxbPGMzBojy9sXoQIQ==} - /crossws@0.2.4: resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} peerDependencies: @@ -5558,6 +5598,11 @@ packages: uWebSockets.js: optional: true + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -5664,6 +5709,13 @@ packages: character-entities: 2.0.2 dev: false + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -5729,6 +5781,12 @@ packages: /defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + /degit@2.8.4: + resolution: {integrity: sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng==} + engines: {node: '>=8.0.0'} + hasBin: true + dev: true + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -5797,7 +5855,6 @@ packages: /diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - dev: false /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -5823,6 +5880,13 @@ packages: esutils: 2.0.3 dev: true + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + /dot-prop@8.0.2: resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} engines: {node: '>=16'} @@ -6250,6 +6314,21 @@ packages: requiresBuild: true optional: true + /esbuild-plugin-solid@0.5.0(esbuild@0.14.54)(solid-js@1.8.15): + resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} + peerDependencies: + esbuild: '>=0.12' + solid-js: '>= 1.0' + dependencies: + '@babel/core': 7.20.12 + '@babel/preset-typescript': 7.23.3(@babel/core@7.20.12) + babel-preset-solid: 1.8.15(@babel/core@7.20.12) + esbuild: 0.14.54 + solid-js: 1.8.15 + transitivePeerDependencies: + - supports-color + dev: true + /esbuild-sunos-64@0.14.54: resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} engines: {node: '>=12'} @@ -6404,7 +6483,6 @@ packages: '@esbuild/win32-arm64': 0.17.19 '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - dev: false /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} @@ -7143,6 +7221,10 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /fuzzy-search@3.2.1: + resolution: {integrity: sha512-vAcPiyomt1ioKAsAL2uxSABHJ4Ju/e4UeDM+g1OlR0vV4YhLGMNsdLNvZTpEDY4JCSt0E4hASCNM5t2ETtsbyg==} + dev: true + /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -7165,6 +7247,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + /get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -7208,6 +7294,11 @@ packages: pathe: 1.1.2 tar: 6.2.0 + /git-config-path@2.0.0: + resolution: {integrity: sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==} + engines: {node: '>=4'} + dev: true + /git-hooks-list@3.1.0: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} dev: true @@ -7353,8 +7444,8 @@ packages: destr: 2.0.3 iron-webcrypto: 1.0.0 ohash: 1.1.3 - radix3: 1.1.0 - ufo: 1.4.0 + radix3: 1.1.1 + ufo: 1.5.1 uncrypto: 0.1.3 unenv: 1.9.0 transitivePeerDependencies: @@ -7640,6 +7731,10 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -7782,6 +7877,11 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -7815,7 +7915,6 @@ packages: /is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - dev: false /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -7843,6 +7942,11 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -7925,10 +8029,13 @@ packages: dependencies: which-typed-array: 1.1.14 + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + /is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} - dev: false /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} @@ -7992,6 +8099,11 @@ packages: /jose@5.2.3: resolution: {integrity: sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==} + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: true + /js-sdsl@4.4.2: resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} dev: true @@ -8097,7 +8209,6 @@ packages: /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - dev: false /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} @@ -8128,6 +8239,21 @@ packages: type-check: 0.4.0 dev: true + /license@1.0.3: + resolution: {integrity: sha512-M3F6dUcor+vy4znXK5ULfTikeMWxSf/K2w7EUk5vbuZL4UAEN4zOmjh7d2UJ0/v9GYTOz13LNsLqPXJGu+A26w==} + hasBin: true + dependencies: + '@ovyerus/licenses': 6.4.4 + configstore: 5.0.1 + detect-indent: 6.1.0 + fuzzy-search: 3.2.1 + git-config-path: 2.0.0 + parse-git-config: 3.0.0 + prompts: 2.4.2 + wrap-text: 1.0.9 + yargs: 15.4.1 + dev: true + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -8137,31 +8263,6 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /listhen@1.6.0: - resolution: {integrity: sha512-z0RcEXVX5oTpY1bO02SKoTU/kmZSrFSngNNzHRM6KICR17PTq7ANush6AE6ztGJwJD4RLpBrVHd9GnV51J7s3w==} - hasBin: true - dependencies: - '@parcel/watcher': 2.4.0 - '@parcel/watcher-wasm': 2.4.0 - citty: 0.1.6 - clipboardy: 4.0.0 - consola: 3.2.3 - crossws: 0.1.1 - defu: 6.1.4 - get-port-please: 3.1.2 - h3: 1.11.1 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.6.1 - node-forge: 1.3.1 - pathe: 1.1.2 - std-env: 3.7.0 - ufo: 1.5.1 - untun: 0.1.3 - uqr: 0.1.2 - transitivePeerDependencies: - - uWebSockets.js - /listhen@1.7.2: resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} hasBin: true @@ -8187,6 +8288,11 @@ packages: transitivePeerDependencies: - uWebSockets.js + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -8196,6 +8302,11 @@ packages: pify: 4.0.1 strip-bom: 3.0.0 + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + /local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} @@ -8229,6 +8340,10 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true @@ -8242,7 +8357,6 @@ packages: dependencies: chalk: 5.3.0 is-unicode-supported: 1.3.0 - dev: false /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -8255,6 +8369,12 @@ packages: js-tokens: 4.0.0 dev: false + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} @@ -8987,14 +9107,6 @@ packages: engines: {node: '>=10'} hasBin: true - /mlly@1.5.0: - resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.5.1 - /mlly@1.6.1: resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} dependencies: @@ -9020,6 +9132,14 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -9354,7 +9474,6 @@ packages: stdin-discarder: 0.1.0 strip-ansi: 7.1.0 wcwidth: 1.0.1 - dev: false /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} @@ -9384,6 +9503,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -9405,6 +9531,10 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /package-json-type@1.0.3: + resolution: {integrity: sha512-Bey4gdRuOwDbS8Fj1qA3/pTq5r8pqiI5E3tjSqCdhaLSsyGG364VFzXLTIexN5AaNGe/vgdBzLfoKdr7EVg2KQ==} + dev: true + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -9425,6 +9555,14 @@ packages: is-hexadecimal: 2.0.1 dev: false + /parse-git-config@3.0.0: + resolution: {integrity: sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==} + engines: {node: '>=8'} + dependencies: + git-config-path: 2.0.0 + ini: 1.3.8 + dev: true + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -9492,6 +9630,10 @@ packages: /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -9519,6 +9661,11 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -9600,6 +9747,7 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /postcss@8.4.35: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} @@ -9657,9 +9805,43 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + /pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + /pridepack@2.4.0(eslint@8.34.0)(tslib@2.5.0)(typescript@4.9.5): + resolution: {integrity: sha512-KL+X7UP1UNO/+ylH4xr8FPnThvbWPbNQonHI1RPk36bptA0/vjkZPU6PTKH3oTJVvd4Gvs2FfsSOFtT4hEoB0A==} + engines: {node: '>=12.12.0'} + hasBin: true + peerDependencies: + eslint: ^8.0 + tslib: ^2.0 + typescript: ^4.0 + dependencies: + '@ovyerus/licenses': 6.4.4 + degit: 2.8.4 + dotenv: 16.4.5 + esbuild: 0.17.19 + eslint: 8.34.0 + execa: 5.1.1 + license: 1.0.3 + ora: 6.3.1 + package-json-type: 1.0.3 + pretty-bytes: 6.1.1 + prompts: 2.4.2 + tslib: 2.5.0 + typescript: 4.9.5 + yargs: 17.7.2 + dev: true + /prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} @@ -9678,7 +9860,6 @@ packages: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: false /property-information@6.4.1: resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} @@ -9709,9 +9890,6 @@ packages: engines: {node: '>=10'} dev: true - /radix3@1.1.0: - resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} - /radix3@1.1.1: resolution: {integrity: sha512-yUUd5VTiFtcMEx0qFUxGAv5gbMc1un4RvEO1JZdP7ZUl/RHygZK6PknIKntmQRZxnMY3ZXD2ISaw1ij8GYW1yg==} @@ -9741,6 +9919,10 @@ packages: scheduler: 0.23.0 dev: false + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -10031,7 +10213,6 @@ packages: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: false /retext-latin@3.1.0: resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} @@ -10399,6 +10580,10 @@ packages: object-inspect: 1.13.1 dev: true + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -10416,7 +10601,6 @@ packages: /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -10431,6 +10615,14 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + /smartwrap@2.0.2: resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} engines: {node: '>=6'} @@ -10513,6 +10705,13 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false @@ -10549,6 +10748,10 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -10567,7 +10770,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: bl: 5.1.0 - dev: false /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} @@ -10704,6 +10906,20 @@ packages: inline-style-parser: 0.1.1 dev: false + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + /suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} dependencies: @@ -10828,6 +11044,33 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + + /tinypool@0.3.1: + resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + dev: true + /titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} @@ -10860,6 +11103,17 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -10873,6 +11127,10 @@ packages: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: false + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: @@ -10899,11 +11157,60 @@ packages: /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: true /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tsup-preset-solid@0.1.8(esbuild@0.14.54)(solid-js@1.8.15)(tsup@6.5.0): + resolution: {integrity: sha512-V5TZFEZY9emACO3AZvKyCRzdoyjUcuMEEbTGcJnCma7OVvGnSNVoewFff9g0CaveJ8cZcC3u2tW9gMaxmPZ71A==} + peerDependencies: + tsup: ^6.5.0 + dependencies: + esbuild-plugin-solid: 0.5.0(esbuild@0.14.54)(solid-js@1.8.15) + tsup: 6.5.0(typescript@4.9.5) + type-fest: 3.13.1 + transitivePeerDependencies: + - esbuild + - solid-js + - supports-color + dev: true + + /tsup@6.5.0(typescript@4.9.5): + resolution: {integrity: sha512-36u82r7rYqRHFkD15R20Cd4ercPkbYmuvRkz3Q1LCm5BsiFNUgpo36zbjVhCOgvjyxNBWNKHsaD5Rl8SykfzNA==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: ^4.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 3.1.2(esbuild@0.15.18) + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.3.4 + esbuild: 0.15.18 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 3.1.4(postcss@8.4.28) + resolve-from: 5.0.0 + rollup: 3.29.4 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -11050,6 +11357,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -11115,6 +11427,12 @@ packages: is-typed-array: 1.1.13 dev: true + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -11126,9 +11444,6 @@ packages: hasBin: true dev: true - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} - /ufo@1.5.1: resolution: {integrity: sha512-HGyF79+/qZ4soRvM+nHERR2pJ3VXDZ/8sL1uLahdgEDf580NkgiWOxLk33FetExqOWp352JZRsgXbG/4MaGOSg==} @@ -11228,10 +11543,17 @@ packages: pkg-types: 1.0.3 scule: 1.3.0 strip-literal: 1.3.0 - unplugin: 1.7.1 + unplugin: 1.10.0 transitivePeerDependencies: - rollup + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + /unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} dev: false @@ -11342,62 +11664,6 @@ packages: webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.1 - /unstorage@1.10.1: - resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} - peerDependencies: - '@azure/app-configuration': ^1.4.1 - '@azure/cosmos': ^4.0.0 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^3.3.2 - '@azure/keyvault-secrets': ^4.7.0 - '@azure/storage-blob': ^12.16.0 - '@capacitor/preferences': ^5.0.6 - '@netlify/blobs': ^6.2.0 - '@planetscale/database': ^1.11.0 - '@upstash/redis': ^1.23.4 - '@vercel/kv': ^0.2.3 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@netlify/blobs': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - idb-keyval: - optional: true - dependencies: - anymatch: 3.1.3 - chokidar: 3.6.0 - destr: 2.0.3 - h3: 1.11.1 - ioredis: 5.3.2 - listhen: 1.6.0 - lru-cache: 10.2.0 - mri: 1.2.0 - node-fetch-native: 1.6.2 - ofetch: 1.3.3 - ufo: 1.4.0 - transitivePeerDependencies: - - supports-color - - uWebSockets.js - /unstorage@1.10.2(ioredis@5.3.2): resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} peerDependencies: @@ -11584,14 +11850,14 @@ packages: node-fetch-native: 1.6.2 path-to-regexp: 6.2.1 pathe: 1.1.2 - radix3: 1.1.0 + radix3: 1.1.1 resolve: 1.22.8 serve-placeholder: 2.0.1 serve-static: 1.15.0 - ufo: 1.4.0 + ufo: 1.5.1 unctx: 2.3.1 unenv: 1.9.0 - unstorage: 1.10.1 + unstorage: 1.10.2(ioredis@5.3.2) vite: 5.1.6(@types/node@18.17.5) zod: 3.22.4 transitivePeerDependencies: @@ -11613,6 +11879,7 @@ packages: - drizzle-orm - encoding - idb-keyval + - ioredis - less - lightningcss - sass @@ -11623,29 +11890,27 @@ packages: - uWebSockets.js - xml2js - /vite-plugin-inspect@0.7.42(rollup@4.9.6)(vite@4.4.9): - resolution: {integrity: sha512-JCyX86wr3siQc+p9Kd0t8VkFHAJag0RaQVIpdFGSv5FEaePEVB6+V/RGtz2dQkkGSXQzRWrPs4cU3dRKg32bXw==} - engines: {node: '>=14'} - peerDependencies: - '@nuxt/kit': '*' - vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 - peerDependenciesMeta: - '@nuxt/kit': - optional: true + /vite-node@0.29.2(@types/node@18.17.5): + resolution: {integrity: sha512-5oe1z6wzI3gkvc4yOBbDBbgpiWiApvuN4P55E8OI131JGrSuo4X3SOZrNmZYo4R8Zkze/dhi572blX0zc+6SdA==} + engines: {node: '>=v14.16.0'} + hasBin: true dependencies: - '@antfu/utils': 0.7.7 - '@rollup/pluginutils': 5.1.0(rollup@4.9.6) + cac: 6.7.14 debug: 4.3.4 - error-stack-parser-es: 0.1.1 - fs-extra: 11.2.0 - open: 9.1.0 + mlly: 1.6.1 + pathe: 1.1.2 picocolors: 1.0.0 - sirv: 2.0.4 vite: 4.4.9(@types/node@18.17.5) transitivePeerDependencies: - - rollup + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss - supports-color - dev: false + - terser + dev: true /vite-plugin-inspect@0.7.42(rollup@4.9.6)(vite@5.1.6): resolution: {integrity: sha512-JCyX86wr3siQc+p9Kd0t8VkFHAJag0RaQVIpdFGSv5FEaePEVB6+V/RGtz2dQkkGSXQzRWrPs4cU3dRKg32bXw==} @@ -11670,28 +11935,6 @@ packages: - rollup - supports-color - /vite-plugin-solid@2.9.1(solid-js@1.8.15)(vite@4.4.9): - resolution: {integrity: sha512-RC4hj+lbvljw57BbMGDApvEOPEh14lwrr/GeXRLNQLcR1qnOdzOwwTSFy13Gj/6FNIZpBEl0bWPU+VYFawrqUw==} - peerDependencies: - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* - solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - '@testing-library/jest-dom': - optional: true - dependencies: - '@babel/core': 7.23.9 - '@types/babel__core': 7.20.5 - babel-preset-solid: 1.8.15(@babel/core@7.23.9) - merge-anything: 5.1.7 - solid-js: 1.8.15 - solid-refresh: 0.6.3(solid-js@1.8.15) - vite: 4.4.9(@types/node@18.17.5) - vitefu: 0.2.5(vite@4.4.9) - transitivePeerDependencies: - - supports-color - dev: false - /vite-plugin-solid@2.9.1(solid-js@1.8.15)(vite@5.1.6): resolution: {integrity: sha512-RC4hj+lbvljw57BbMGDApvEOPEh14lwrr/GeXRLNQLcR1qnOdzOwwTSFy13Gj/6FNIZpBEl0bWPU+VYFawrqUw==} peerDependencies: @@ -11743,7 +11986,7 @@ packages: dependencies: '@types/node': 18.17.5 esbuild: 0.18.20 - postcss: 8.4.28 + postcss: 8.4.35 rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 @@ -11804,6 +12047,62 @@ packages: dependencies: vite: 5.1.6(@types/node@18.17.5) + /vitest@0.29.2: + resolution: {integrity: sha512-ydK9IGbAvoY8wkg29DQ4ivcVviCaUi3ivuPKfZEVddMTenFHUfB8EEDXQV8+RasEk1ACFLgMUqAaDuQ/Nk+mQA==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/chai': 4.3.14 + '@types/chai-subset': 1.3.5 + '@types/node': 18.17.5 + '@vitest/expect': 0.29.2 + '@vitest/runner': 0.29.2 + '@vitest/spy': 0.29.2 + '@vitest/utils': 0.29.2 + acorn: 8.11.3 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.2 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.6.0 + tinypool: 0.3.1 + tinyspy: 1.1.1 + vite: 4.4.9(@types/node@18.17.5) + vite-node: 0.29.2(@types/node@18.17.5) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vscode-css-languageservice@6.2.12: resolution: {integrity: sha512-PS9r7HgNjqzRl3v91sXpCyZPc8UDotNo6gntFNtGCKPhGA9Frk7g/VjX1Mbv3F00pn56D+rxrFzR9ep4cawOgA==} dependencies: @@ -11901,6 +12200,10 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -11914,6 +12217,14 @@ packages: tr46: 0.0.3 webidl-conversions: 3.0.1 + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -11971,6 +12282,15 @@ packages: dependencies: isexe: 3.1.1 + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: @@ -12007,9 +12327,27 @@ packages: string-width: 5.1.2 strip-ansi: 7.1.0 + /wrap-text@1.0.9: + resolution: {integrity: sha512-NWfjspSgMDXQIMpKM56AwCQPI01OMFRYYJBh6dGNCfH7AOl+j/VqqbiopgJ4VuQfSluqLc+2ekqaPNpYAGZ/Vg==} + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + dev: true + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -12083,6 +12421,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'}