@tanstack/start-client-core 1.131.7 → 1.132.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/createIsomorphicFn.js.map +1 -1
- package/dist/esm/createMiddleware.d.ts +1 -2
- package/dist/esm/createMiddleware.js.map +1 -1
- package/dist/esm/createServerFn.d.ts +3 -28
- package/dist/esm/createServerFn.js +9 -148
- package/dist/esm/createServerFn.js.map +1 -1
- package/dist/esm/envOnly.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +1 -2
- package/dist/esm/registerGlobalMiddleware.js.map +1 -1
- package/dist/esm/serializer.js +0 -10
- package/dist/esm/serializer.js.map +1 -1
- package/package.json +3 -7
- package/src/createMiddleware.ts +0 -7
- package/src/createServerFn.ts +8 -319
- package/src/index.tsx +0 -3
- package/src/serializer.ts +0 -13
- package/src/tests/createServerFn.test-d.ts +0 -6
- package/dist/cjs/createIsomorphicFn.cjs +0 -12
- package/dist/cjs/createIsomorphicFn.cjs.map +0 -1
- package/dist/cjs/createIsomorphicFn.d.cts +0 -12
- package/dist/cjs/createMiddleware.cjs +0 -37
- package/dist/cjs/createMiddleware.cjs.map +0 -1
- package/dist/cjs/createMiddleware.d.cts +0 -177
- package/dist/cjs/createServerFn.cjs +0 -385
- package/dist/cjs/createServerFn.cjs.map +0 -1
- package/dist/cjs/createServerFn.d.cts +0 -159
- package/dist/cjs/envOnly.cjs +0 -7
- package/dist/cjs/envOnly.cjs.map +0 -1
- package/dist/cjs/envOnly.d.cts +0 -4
- package/dist/cjs/index.cjs +0 -40
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/index.d.cts +0 -11
- package/dist/cjs/registerGlobalMiddleware.cjs +0 -9
- package/dist/cjs/registerGlobalMiddleware.cjs.map +0 -1
- package/dist/cjs/registerGlobalMiddleware.d.cts +0 -5
- package/dist/cjs/serializer.cjs +0 -162
- package/dist/cjs/serializer.cjs.map +0 -1
- package/dist/cjs/serializer.d.cts +0 -23
- package/dist/cjs/tests/createIsomorphicFn.test-d.d.cts +0 -1
- package/dist/cjs/tests/createServerFn.test-d.d.cts +0 -1
- package/dist/cjs/tests/createServerMiddleware.test-d.d.cts +0 -1
- package/dist/cjs/tests/envOnly.test-d.d.cts +0 -1
- package/dist/cjs/tests/serializer.test.d.cts +0 -1
package/dist/esm/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { hydrate, json, mergeHeaders } from "@tanstack/router-core/ssr/client";
|
|
|
2
2
|
import { startSerializer } from "./serializer.js";
|
|
3
3
|
import { createIsomorphicFn } from "./createIsomorphicFn.js";
|
|
4
4
|
import { clientOnly, serverOnly } from "./envOnly.js";
|
|
5
|
-
import { applyMiddleware, createServerFn, execValidator, executeMiddleware, extractFormDataContext, flattenMiddlewares, serverFnBaseToMiddleware
|
|
5
|
+
import { applyMiddleware, createServerFn, execValidator, executeMiddleware, extractFormDataContext, flattenMiddlewares, serverFnBaseToMiddleware } from "./createServerFn.js";
|
|
6
6
|
import { createMiddleware } from "./createMiddleware.js";
|
|
7
7
|
import { globalMiddleware, registerGlobalMiddleware } from "./registerGlobalMiddleware.js";
|
|
8
8
|
export {
|
|
@@ -21,7 +21,6 @@ export {
|
|
|
21
21
|
mergeHeaders,
|
|
22
22
|
registerGlobalMiddleware,
|
|
23
23
|
serverFnBaseToMiddleware,
|
|
24
|
-
serverFnStaticCache,
|
|
25
24
|
serverOnly,
|
|
26
25
|
startSerializer
|
|
27
26
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerGlobalMiddleware.js","sources":["../../src/registerGlobalMiddleware.ts"],"sourcesContent":["import type { AnyFunctionMiddleware } from './createMiddleware'\n\nexport const globalMiddleware: Array<AnyFunctionMiddleware> = []\n\nexport function registerGlobalMiddleware(options: {\n middleware: Array<AnyFunctionMiddleware>\n}) {\n globalMiddleware.push(...options.middleware)\n}\n"],"names":[],"mappings":"AAEO,MAAM,mBAAiD,CAAA;AAEvD,SAAS,yBAAyB,SAEtC;
|
|
1
|
+
{"version":3,"file":"registerGlobalMiddleware.js","sources":["../../src/registerGlobalMiddleware.ts"],"sourcesContent":["import type { AnyFunctionMiddleware } from './createMiddleware'\n\nexport const globalMiddleware: Array<AnyFunctionMiddleware> = []\n\nexport function registerGlobalMiddleware(options: {\n middleware: Array<AnyFunctionMiddleware>\n}) {\n globalMiddleware.push(...options.middleware)\n}\n"],"names":[],"mappings":"AAEO,MAAM,mBAAiD,CAAA;AAEvD,SAAS,yBAAyB,SAEtC;AACD,mBAAiB,KAAK,GAAG,QAAQ,UAAU;AAC7C;"}
|
package/dist/esm/serializer.js
CHANGED
|
@@ -144,16 +144,6 @@ const serializers = [
|
|
|
144
144
|
(v) => v.toString(),
|
|
145
145
|
// From
|
|
146
146
|
(v) => BigInt(v)
|
|
147
|
-
),
|
|
148
|
-
createSerializer(
|
|
149
|
-
// Key
|
|
150
|
-
"server-function",
|
|
151
|
-
// Check
|
|
152
|
-
(v) => typeof v === "function" && "functionId" in v && typeof v.functionId === "string",
|
|
153
|
-
// To
|
|
154
|
-
({ functionId }) => ({ functionId, __serverFn: true }),
|
|
155
|
-
// From, dummy impl. the actual server function lookup is done on the server in packages/start-server-core/src/server-functions-handler.ts
|
|
156
|
-
(v) => v
|
|
157
147
|
)
|
|
158
148
|
];
|
|
159
149
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.js","sources":["../../src/serializer.ts"],"sourcesContent":["import { isPlainObject } from '@tanstack/router-core'\n\nexport interface StartSerializer {\n stringify: (obj: unknown) => string\n parse: (str: string) => unknown\n encode: <T>(value: T) => T\n decode: <T>(value: T) => T\n}\n\nexport type SerializerStringifyBy<T, TSerializable> = T extends TSerializable\n ? T\n : T extends (...args: Array<any>) => any\n ? 'Function is not serializable'\n : { [K in keyof T]: SerializerStringifyBy<T[K], TSerializable> }\n\nexport type SerializerParseBy<T, TSerializable> = T extends TSerializable\n ? T\n : unknown extends SerializerExtensions['ReadableStream']\n ? { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }\n : T extends SerializerExtensions['ReadableStream']\n ? ReadableStream\n : { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }\n\nexport interface DefaultSerializerExtensions {\n ReadableStream: unknown\n}\n\nexport interface SerializerExtensions extends DefaultSerializerExtensions {}\n\nexport type Serializable = Date | undefined | Error | FormData | bigint\n\nexport type SerializerStringify<T> = SerializerStringifyBy<T, Serializable>\n\nexport type SerializerParse<T> = SerializerParseBy<T, Serializable>\nexport const startSerializer: StartSerializer = {\n stringify: (value: any) =>\n JSON.stringify(value, function replacer(key, val) {\n const ogVal = this[key]\n const serializer = serializers.find((t) => t.stringifyCondition(ogVal))\n\n if (serializer) {\n return serializer.stringify(ogVal)\n }\n\n return val\n }),\n parse: (value: string) =>\n JSON.parse(value, function parser(key, val) {\n const ogVal = this[key]\n if (isPlainObject(ogVal)) {\n const serializer = serializers.find((t) => t.parseCondition(ogVal))\n\n if (serializer) {\n return serializer.parse(ogVal)\n }\n }\n\n return val\n }),\n encode: (value: any) => {\n // When encoding, dive first\n if (Array.isArray(value)) {\n return value.map((v) => startSerializer.encode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n startSerializer.encode(v),\n ]),\n )\n }\n\n const serializer = serializers.find((t) => t.stringifyCondition(value))\n if (serializer) {\n return serializer.stringify(value)\n }\n\n return value\n },\n decode: (value: any) => {\n // Attempt transform first\n if (isPlainObject(value)) {\n const serializer = serializers.find((t) => t.parseCondition(value))\n if (serializer) {\n return serializer.parse(value)\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => startSerializer.decode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n startSerializer.decode(v),\n ]),\n )\n }\n\n return value\n },\n}\nconst createSerializer = <TKey extends string, TInput, TSerialized>(\n key: TKey,\n check: (value: any) => value is TInput,\n toValue: (value: TInput) => TSerialized,\n fromValue: (value: TSerialized) => TInput,\n) => ({\n key,\n stringifyCondition: check,\n stringify: (value: any) => ({ [`$${key}`]: toValue(value) }),\n parseCondition: (value: any) => Object.hasOwn(value, `$${key}`),\n parse: (value: any) => fromValue(value[`$${key}`]),\n})\n// Keep these ordered by predicted frequency\n// Make sure to keep DefaultSerializable in sync with these serializers\n// Also, make sure that they are unit tested in serializer.test.tsx\nconst serializers = [\n createSerializer(\n // Key\n 'undefined',\n // Check\n (v): v is undefined => v === undefined,\n // To\n () => 0,\n // From\n () => undefined,\n ),\n createSerializer(\n // Key\n 'date',\n // Check\n (v): v is Date => v instanceof Date,\n // To\n (v) => v.toISOString(),\n // From\n (v) => new Date(v),\n ),\n createSerializer(\n // Key\n 'error',\n // Check\n (v): v is Error => v instanceof Error,\n // To\n (v) => ({\n ...v,\n message: v.message,\n stack: process.env.NODE_ENV === 'development' ? v.stack : undefined,\n cause: v.cause,\n }),\n // From\n (v) => Object.assign(new Error(v.message), v),\n ),\n createSerializer(\n // Key\n 'formData',\n // Check\n (v): v is FormData => v instanceof FormData,\n // To\n (v) => {\n const entries: Record<\n string,\n Array<FormDataEntryValue> | FormDataEntryValue\n > = {}\n v.forEach((value, key) => {\n const entry = entries[key]\n if (entry !== undefined) {\n if (Array.isArray(entry)) {\n entry.push(value)\n } else {\n entries[key] = [entry, value]\n }\n } else {\n entries[key] = value\n }\n })\n return entries\n },\n // From\n (v) => {\n const formData = new FormData()\n Object.entries(v).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach((val) => formData.append(key, val))\n } else {\n formData.append(key, value)\n }\n })\n return formData\n },\n ),\n createSerializer(\n // Key\n 'bigint',\n // Check\n (v): v is bigint => typeof v === 'bigint',\n // To\n (v) => v.toString(),\n // From\n (v) => BigInt(v),\n ),\n
|
|
1
|
+
{"version":3,"file":"serializer.js","sources":["../../src/serializer.ts"],"sourcesContent":["import { isPlainObject } from '@tanstack/router-core'\n\nexport interface StartSerializer {\n stringify: (obj: unknown) => string\n parse: (str: string) => unknown\n encode: <T>(value: T) => T\n decode: <T>(value: T) => T\n}\n\nexport type SerializerStringifyBy<T, TSerializable> = T extends TSerializable\n ? T\n : T extends (...args: Array<any>) => any\n ? 'Function is not serializable'\n : { [K in keyof T]: SerializerStringifyBy<T[K], TSerializable> }\n\nexport type SerializerParseBy<T, TSerializable> = T extends TSerializable\n ? T\n : unknown extends SerializerExtensions['ReadableStream']\n ? { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }\n : T extends SerializerExtensions['ReadableStream']\n ? ReadableStream\n : { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }\n\nexport interface DefaultSerializerExtensions {\n ReadableStream: unknown\n}\n\nexport interface SerializerExtensions extends DefaultSerializerExtensions {}\n\nexport type Serializable = Date | undefined | Error | FormData | bigint\n\nexport type SerializerStringify<T> = SerializerStringifyBy<T, Serializable>\n\nexport type SerializerParse<T> = SerializerParseBy<T, Serializable>\nexport const startSerializer: StartSerializer = {\n stringify: (value: any) =>\n JSON.stringify(value, function replacer(key, val) {\n const ogVal = this[key]\n const serializer = serializers.find((t) => t.stringifyCondition(ogVal))\n\n if (serializer) {\n return serializer.stringify(ogVal)\n }\n\n return val\n }),\n parse: (value: string) =>\n JSON.parse(value, function parser(key, val) {\n const ogVal = this[key]\n if (isPlainObject(ogVal)) {\n const serializer = serializers.find((t) => t.parseCondition(ogVal))\n\n if (serializer) {\n return serializer.parse(ogVal)\n }\n }\n\n return val\n }),\n encode: (value: any) => {\n // When encoding, dive first\n if (Array.isArray(value)) {\n return value.map((v) => startSerializer.encode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n startSerializer.encode(v),\n ]),\n )\n }\n\n const serializer = serializers.find((t) => t.stringifyCondition(value))\n if (serializer) {\n return serializer.stringify(value)\n }\n\n return value\n },\n decode: (value: any) => {\n // Attempt transform first\n if (isPlainObject(value)) {\n const serializer = serializers.find((t) => t.parseCondition(value))\n if (serializer) {\n return serializer.parse(value)\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => startSerializer.decode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n startSerializer.decode(v),\n ]),\n )\n }\n\n return value\n },\n}\nconst createSerializer = <TKey extends string, TInput, TSerialized>(\n key: TKey,\n check: (value: any) => value is TInput,\n toValue: (value: TInput) => TSerialized,\n fromValue: (value: TSerialized) => TInput,\n) => ({\n key,\n stringifyCondition: check,\n stringify: (value: any) => ({ [`$${key}`]: toValue(value) }),\n parseCondition: (value: any) => Object.hasOwn(value, `$${key}`),\n parse: (value: any) => fromValue(value[`$${key}`]),\n})\n// Keep these ordered by predicted frequency\n// Make sure to keep DefaultSerializable in sync with these serializers\n// Also, make sure that they are unit tested in serializer.test.tsx\nconst serializers = [\n createSerializer(\n // Key\n 'undefined',\n // Check\n (v): v is undefined => v === undefined,\n // To\n () => 0,\n // From\n () => undefined,\n ),\n createSerializer(\n // Key\n 'date',\n // Check\n (v): v is Date => v instanceof Date,\n // To\n (v) => v.toISOString(),\n // From\n (v) => new Date(v),\n ),\n createSerializer(\n // Key\n 'error',\n // Check\n (v): v is Error => v instanceof Error,\n // To\n (v) => ({\n ...v,\n message: v.message,\n stack: process.env.NODE_ENV === 'development' ? v.stack : undefined,\n cause: v.cause,\n }),\n // From\n (v) => Object.assign(new Error(v.message), v),\n ),\n createSerializer(\n // Key\n 'formData',\n // Check\n (v): v is FormData => v instanceof FormData,\n // To\n (v) => {\n const entries: Record<\n string,\n Array<FormDataEntryValue> | FormDataEntryValue\n > = {}\n v.forEach((value, key) => {\n const entry = entries[key]\n if (entry !== undefined) {\n if (Array.isArray(entry)) {\n entry.push(value)\n } else {\n entries[key] = [entry, value]\n }\n } else {\n entries[key] = value\n }\n })\n return entries\n },\n // From\n (v) => {\n const formData = new FormData()\n Object.entries(v).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach((val) => formData.append(key, val))\n } else {\n formData.append(key, value)\n }\n })\n return formData\n },\n ),\n createSerializer(\n // Key\n 'bigint',\n // Check\n (v): v is bigint => typeof v === 'bigint',\n // To\n (v) => v.toString(),\n // From\n (v) => BigInt(v),\n ),\n] as const\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/start-client-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.132.0-alpha.0",
|
|
4
4
|
"description": "Modern and scalable routing for React applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,10 +30,6 @@
|
|
|
30
30
|
"import": {
|
|
31
31
|
"types": "./dist/esm/index.d.ts",
|
|
32
32
|
"default": "./dist/esm/index.js"
|
|
33
|
-
},
|
|
34
|
-
"require": {
|
|
35
|
-
"types": "./dist/cjs/index.d.cts",
|
|
36
|
-
"default": "./dist/cjs/index.cjs"
|
|
37
33
|
}
|
|
38
34
|
},
|
|
39
35
|
"./package.json": "./package.json"
|
|
@@ -50,8 +46,8 @@
|
|
|
50
46
|
"cookie-es": "^1.2.2",
|
|
51
47
|
"tiny-invariant": "^1.3.3",
|
|
52
48
|
"tiny-warning": "^1.0.3",
|
|
53
|
-
"@tanstack/router-core": "1.
|
|
54
|
-
"@tanstack/start-storage-context": "1.
|
|
49
|
+
"@tanstack/router-core": "1.132.0-alpha.0",
|
|
50
|
+
"@tanstack/start-storage-context": "1.132.0-alpha.0"
|
|
55
51
|
},
|
|
56
52
|
"scripts": {}
|
|
57
53
|
}
|
package/src/createMiddleware.ts
CHANGED
|
@@ -2,7 +2,6 @@ import type {
|
|
|
2
2
|
ConstrainValidator,
|
|
3
3
|
Method,
|
|
4
4
|
ServerFnResponseType,
|
|
5
|
-
ServerFnTypeOrTypeFn,
|
|
6
5
|
} from './createServerFn'
|
|
7
6
|
import type {
|
|
8
7
|
AnyRouter,
|
|
@@ -552,12 +551,6 @@ export interface FunctionMiddlewareClientFnOptions<
|
|
|
552
551
|
next: FunctionMiddlewareClientNextFn<TMiddlewares>
|
|
553
552
|
filename: string
|
|
554
553
|
functionId: string
|
|
555
|
-
type: ServerFnTypeOrTypeFn<
|
|
556
|
-
Method,
|
|
557
|
-
TServerFnResponseType,
|
|
558
|
-
TMiddlewares,
|
|
559
|
-
TValidator
|
|
560
|
-
>
|
|
561
554
|
router: TRouter
|
|
562
555
|
}
|
|
563
556
|
|
package/src/createServerFn.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { default as invariant } from 'tiny-invariant'
|
|
2
|
-
import { default as warning } from 'tiny-warning'
|
|
3
1
|
import { isNotFound, isRedirect } from '@tanstack/router-core'
|
|
4
2
|
import { mergeHeaders } from '@tanstack/router-core/ssr/client'
|
|
5
3
|
import { getStartContext } from '@tanstack/start-storage-context'
|
|
@@ -49,7 +47,6 @@ export function createServerFn<
|
|
|
49
47
|
options?: {
|
|
50
48
|
method?: TMethod
|
|
51
49
|
response?: TServerFnResponseType
|
|
52
|
-
type?: ServerFnType
|
|
53
50
|
},
|
|
54
51
|
__opts?: ServerFnBaseOptions<
|
|
55
52
|
TMethod,
|
|
@@ -91,15 +88,6 @@ export function createServerFn<
|
|
|
91
88
|
TValidator
|
|
92
89
|
>(undefined, Object.assign(resolvedOptions, { validator })) as any
|
|
93
90
|
},
|
|
94
|
-
type: (type) => {
|
|
95
|
-
return createServerFn<
|
|
96
|
-
TMethod,
|
|
97
|
-
ServerFnResponseType,
|
|
98
|
-
TResponse,
|
|
99
|
-
TMiddlewares,
|
|
100
|
-
TValidator
|
|
101
|
-
>(undefined, Object.assign(resolvedOptions, { type })) as any
|
|
102
|
-
},
|
|
103
91
|
handler: (...args) => {
|
|
104
92
|
// This function signature changes due to AST transformations
|
|
105
93
|
// in the babel plugin. We need to cast it to the correct
|
|
@@ -159,70 +147,20 @@ export function createServerFn<
|
|
|
159
147
|
const opts =
|
|
160
148
|
opts_ instanceof FormData ? extractFormDataContext(opts_) : opts_
|
|
161
149
|
|
|
162
|
-
opts.type =
|
|
163
|
-
typeof resolvedOptions.type === 'function'
|
|
164
|
-
? resolvedOptions.type(opts)
|
|
165
|
-
: resolvedOptions.type
|
|
166
|
-
|
|
167
150
|
const ctx = {
|
|
168
151
|
...extractedFn,
|
|
169
152
|
...opts,
|
|
170
153
|
signal,
|
|
171
154
|
}
|
|
172
155
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
)
|
|
182
|
-
|
|
183
|
-
if (ctx.type === 'static') {
|
|
184
|
-
let response: StaticCachedResult | undefined
|
|
185
|
-
|
|
186
|
-
// If we can get the cached item, try to get it
|
|
187
|
-
if (serverFnStaticCache?.getItem) {
|
|
188
|
-
// If this throws, it's okay to let it bubble up
|
|
189
|
-
response = await serverFnStaticCache.getItem(ctx)
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (!response) {
|
|
193
|
-
// If there's no cached item, execute the server function
|
|
194
|
-
response = await run()
|
|
195
|
-
.then((d) => {
|
|
196
|
-
return {
|
|
197
|
-
ctx: d,
|
|
198
|
-
error: null,
|
|
199
|
-
}
|
|
200
|
-
})
|
|
201
|
-
.catch((e) => {
|
|
202
|
-
return {
|
|
203
|
-
ctx: undefined,
|
|
204
|
-
error: e,
|
|
205
|
-
}
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
if (serverFnStaticCache?.setItem) {
|
|
209
|
-
await serverFnStaticCache.setItem(ctx, response)
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
invariant(
|
|
214
|
-
response,
|
|
215
|
-
'No response from both server and static cache!',
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
if (response.error) {
|
|
219
|
-
throw response.error
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
return response.ctx
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
return run()
|
|
156
|
+
return executeMiddleware(resolvedMiddleware, 'server', ctx).then(
|
|
157
|
+
(d) => ({
|
|
158
|
+
// Only send the result and sendContext back to the client
|
|
159
|
+
result: d.result,
|
|
160
|
+
error: d.error,
|
|
161
|
+
context: d.sendContext,
|
|
162
|
+
}),
|
|
163
|
+
)
|
|
226
164
|
},
|
|
227
165
|
},
|
|
228
166
|
) as any
|
|
@@ -367,12 +305,9 @@ export interface RequiredFetcher<
|
|
|
367
305
|
|
|
368
306
|
export type FetcherBaseOptions = {
|
|
369
307
|
headers?: HeadersInit
|
|
370
|
-
type?: ServerFnType
|
|
371
308
|
signal?: AbortSignal
|
|
372
309
|
}
|
|
373
310
|
|
|
374
|
-
export type ServerFnType = 'static' | 'dynamic'
|
|
375
|
-
|
|
376
311
|
export interface OptionalFetcherDataOptions<TMiddlewares, TValidator>
|
|
377
312
|
extends FetcherBaseOptions {
|
|
378
313
|
data?: Expand<IntersectAllValidatorInputs<TMiddlewares, TValidator>>
|
|
@@ -466,12 +401,6 @@ export type ServerFnBaseOptions<
|
|
|
466
401
|
TResponse
|
|
467
402
|
>
|
|
468
403
|
functionId: string
|
|
469
|
-
type: ServerFnTypeOrTypeFn<
|
|
470
|
-
TMethod,
|
|
471
|
-
TServerFnResponseType,
|
|
472
|
-
TMiddlewares,
|
|
473
|
-
AnyValidator
|
|
474
|
-
>
|
|
475
404
|
}
|
|
476
405
|
|
|
477
406
|
export type ValidatorInputStringify<TValidator> = SerializerStringifyBy<
|
|
@@ -516,7 +445,6 @@ export interface ServerFnAfterMiddleware<
|
|
|
516
445
|
TMiddlewares,
|
|
517
446
|
TValidator,
|
|
518
447
|
> extends ServerFnValidator<TMethod, TServerFnResponseType, TMiddlewares>,
|
|
519
|
-
ServerFnTyper<TMethod, TServerFnResponseType, TMiddlewares, TValidator>,
|
|
520
448
|
ServerFnHandler<TMethod, TServerFnResponseType, TMiddlewares, TValidator> {}
|
|
521
449
|
|
|
522
450
|
export type ValidatorFn<
|
|
@@ -546,47 +474,8 @@ export interface ServerFnAfterValidator<
|
|
|
546
474
|
TMiddlewares,
|
|
547
475
|
TValidator,
|
|
548
476
|
> extends ServerFnMiddleware<TMethod, TServerFnResponseType, TValidator>,
|
|
549
|
-
ServerFnTyper<TMethod, TServerFnResponseType, TMiddlewares, TValidator>,
|
|
550
477
|
ServerFnHandler<TMethod, TServerFnResponseType, TMiddlewares, TValidator> {}
|
|
551
478
|
|
|
552
|
-
// Typer
|
|
553
|
-
export interface ServerFnTyper<
|
|
554
|
-
TMethod extends Method,
|
|
555
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
556
|
-
TMiddlewares,
|
|
557
|
-
TValidator,
|
|
558
|
-
> {
|
|
559
|
-
type: (
|
|
560
|
-
typer: ServerFnTypeOrTypeFn<
|
|
561
|
-
TMethod,
|
|
562
|
-
TServerFnResponseType,
|
|
563
|
-
TMiddlewares,
|
|
564
|
-
TValidator
|
|
565
|
-
>,
|
|
566
|
-
) => ServerFnAfterTyper<
|
|
567
|
-
TMethod,
|
|
568
|
-
TServerFnResponseType,
|
|
569
|
-
TMiddlewares,
|
|
570
|
-
TValidator
|
|
571
|
-
>
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
export type ServerFnTypeOrTypeFn<
|
|
575
|
-
TMethod extends Method,
|
|
576
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
577
|
-
TMiddlewares,
|
|
578
|
-
TValidator,
|
|
579
|
-
> =
|
|
580
|
-
| ServerFnType
|
|
581
|
-
| ((
|
|
582
|
-
ctx: ServerFnCtx<
|
|
583
|
-
TMethod,
|
|
584
|
-
TServerFnResponseType,
|
|
585
|
-
TMiddlewares,
|
|
586
|
-
TValidator
|
|
587
|
-
>,
|
|
588
|
-
) => ServerFnType)
|
|
589
|
-
|
|
590
479
|
export interface ServerFnAfterTyper<
|
|
591
480
|
TMethod extends Method,
|
|
592
481
|
TServerFnResponseType extends ServerFnResponseType,
|
|
@@ -622,7 +511,6 @@ export interface ServerFnBuilder<
|
|
|
622
511
|
TServerFnResponseType extends ServerFnResponseType = 'data',
|
|
623
512
|
> extends ServerFnMiddleware<TMethod, TServerFnResponseType, undefined>,
|
|
624
513
|
ServerFnValidator<TMethod, TServerFnResponseType, undefined>,
|
|
625
|
-
ServerFnTyper<TMethod, TServerFnResponseType, undefined, undefined>,
|
|
626
514
|
ServerFnHandler<TMethod, TServerFnResponseType, undefined, undefined> {
|
|
627
515
|
options: ServerFnBaseOptions<
|
|
628
516
|
TMethod,
|
|
@@ -633,176 +521,6 @@ export interface ServerFnBuilder<
|
|
|
633
521
|
>
|
|
634
522
|
}
|
|
635
523
|
|
|
636
|
-
export type StaticCachedResult = {
|
|
637
|
-
ctx?: {
|
|
638
|
-
result: any
|
|
639
|
-
context: any
|
|
640
|
-
}
|
|
641
|
-
error?: any
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
export type ServerFnStaticCache = {
|
|
645
|
-
getItem: (
|
|
646
|
-
ctx: ServerFnMiddlewareResult,
|
|
647
|
-
) => StaticCachedResult | Promise<StaticCachedResult | undefined>
|
|
648
|
-
setItem: (
|
|
649
|
-
ctx: ServerFnMiddlewareResult,
|
|
650
|
-
response: StaticCachedResult,
|
|
651
|
-
) => Promise<void>
|
|
652
|
-
fetchItem: (
|
|
653
|
-
ctx: ServerFnMiddlewareResult,
|
|
654
|
-
) => StaticCachedResult | Promise<StaticCachedResult | undefined>
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
export let serverFnStaticCache: ServerFnStaticCache | undefined
|
|
658
|
-
|
|
659
|
-
export function setServerFnStaticCache(
|
|
660
|
-
cache?: ServerFnStaticCache | (() => ServerFnStaticCache | undefined),
|
|
661
|
-
) {
|
|
662
|
-
const previousCache = serverFnStaticCache
|
|
663
|
-
serverFnStaticCache = typeof cache === 'function' ? cache() : cache
|
|
664
|
-
|
|
665
|
-
return () => {
|
|
666
|
-
serverFnStaticCache = previousCache
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
export function createServerFnStaticCache(
|
|
671
|
-
serverFnStaticCache: ServerFnStaticCache,
|
|
672
|
-
) {
|
|
673
|
-
return serverFnStaticCache
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
/**
|
|
677
|
-
* This is a simple hash function for generating a hash from a string to make the filenames shorter.
|
|
678
|
-
*
|
|
679
|
-
* It is not cryptographically secure (as its using SHA-1) and should not be used for any security purposes.
|
|
680
|
-
*
|
|
681
|
-
* It is only used to generate a hash for the static cache filenames.
|
|
682
|
-
*
|
|
683
|
-
* @param message - The input string to hash.
|
|
684
|
-
* @returns A promise that resolves to the SHA-1 hash of the input string in hexadecimal format.
|
|
685
|
-
*
|
|
686
|
-
* @example
|
|
687
|
-
* ```typescript
|
|
688
|
-
* const hash = await sha1Hash("hello");
|
|
689
|
-
* console.log(hash); // Outputs the SHA-1 hash of "hello" -> "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d"
|
|
690
|
-
* ```
|
|
691
|
-
*/
|
|
692
|
-
async function sha1Hash(message: string): Promise<string> {
|
|
693
|
-
// Encode the string as UTF-8
|
|
694
|
-
const msgBuffer = new TextEncoder().encode(message)
|
|
695
|
-
|
|
696
|
-
// Hash the message
|
|
697
|
-
const hashBuffer = await crypto.subtle.digest('SHA-1', msgBuffer)
|
|
698
|
-
|
|
699
|
-
// Convert the ArrayBuffer to a string
|
|
700
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer))
|
|
701
|
-
const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')
|
|
702
|
-
return hashHex
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
setServerFnStaticCache(() => {
|
|
706
|
-
const getStaticCacheUrl = async (
|
|
707
|
-
options: ServerFnMiddlewareResult,
|
|
708
|
-
hash: string,
|
|
709
|
-
) => {
|
|
710
|
-
const filename = await sha1Hash(`${options.functionId}__${hash}`)
|
|
711
|
-
return `/__tsr/staticServerFnCache/${filename}.json`
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
const jsonToFilenameSafeString = (json: any) => {
|
|
715
|
-
// Custom replacer to sort keys
|
|
716
|
-
const sortedKeysReplacer = (key: string, value: any) =>
|
|
717
|
-
value && typeof value === 'object' && !Array.isArray(value)
|
|
718
|
-
? Object.keys(value)
|
|
719
|
-
.sort()
|
|
720
|
-
.reduce((acc: any, curr: string) => {
|
|
721
|
-
acc[curr] = value[curr]
|
|
722
|
-
return acc
|
|
723
|
-
}, {})
|
|
724
|
-
: value
|
|
725
|
-
|
|
726
|
-
// Convert JSON to string with sorted keys
|
|
727
|
-
const jsonString = JSON.stringify(json ?? '', sortedKeysReplacer)
|
|
728
|
-
|
|
729
|
-
// Replace characters invalid in filenames
|
|
730
|
-
return jsonString
|
|
731
|
-
.replace(/[/\\?%*:|"<>]/g, '-') // Replace invalid characters with a dash
|
|
732
|
-
.replace(/\s+/g, '_') // Optionally replace whitespace with underscores
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
const staticClientCache =
|
|
736
|
-
typeof document !== 'undefined' ? new Map<string, any>() : null
|
|
737
|
-
|
|
738
|
-
return createServerFnStaticCache({
|
|
739
|
-
getItem: async (ctx) => {
|
|
740
|
-
if (typeof document === 'undefined') {
|
|
741
|
-
const hash = jsonToFilenameSafeString(ctx.data)
|
|
742
|
-
const url = await getStaticCacheUrl(ctx, hash)
|
|
743
|
-
const publicUrl = process.env.TSS_OUTPUT_PUBLIC_DIR!
|
|
744
|
-
|
|
745
|
-
// Use fs instead of fetch to read from filesystem
|
|
746
|
-
const { promises: fs } = await import('node:fs')
|
|
747
|
-
const path = await import('node:path')
|
|
748
|
-
const filePath = path.join(publicUrl, url)
|
|
749
|
-
|
|
750
|
-
const [cachedResult, readError] = await fs
|
|
751
|
-
.readFile(filePath, 'utf-8')
|
|
752
|
-
.then((c) => [
|
|
753
|
-
startSerializer.parse(c) as {
|
|
754
|
-
ctx: unknown
|
|
755
|
-
error: any
|
|
756
|
-
},
|
|
757
|
-
null,
|
|
758
|
-
])
|
|
759
|
-
.catch((e) => [null, e])
|
|
760
|
-
|
|
761
|
-
if (readError && readError.code !== 'ENOENT') {
|
|
762
|
-
throw readError
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
return cachedResult as StaticCachedResult
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
return undefined
|
|
769
|
-
},
|
|
770
|
-
setItem: async (ctx, response) => {
|
|
771
|
-
const { promises: fs } = await import('node:fs')
|
|
772
|
-
const path = await import('node:path')
|
|
773
|
-
|
|
774
|
-
const hash = jsonToFilenameSafeString(ctx.data)
|
|
775
|
-
const url = await getStaticCacheUrl(ctx, hash)
|
|
776
|
-
const publicUrl = process.env.TSS_OUTPUT_PUBLIC_DIR!
|
|
777
|
-
const filePath = path.join(publicUrl, url)
|
|
778
|
-
|
|
779
|
-
// Ensure the directory exists
|
|
780
|
-
await fs.mkdir(path.dirname(filePath), { recursive: true })
|
|
781
|
-
|
|
782
|
-
// Store the result with fs
|
|
783
|
-
await fs.writeFile(filePath, startSerializer.stringify(response))
|
|
784
|
-
},
|
|
785
|
-
fetchItem: async (ctx) => {
|
|
786
|
-
const hash = jsonToFilenameSafeString(ctx.data)
|
|
787
|
-
const url = await getStaticCacheUrl(ctx, hash)
|
|
788
|
-
|
|
789
|
-
let result: any = staticClientCache?.get(url)
|
|
790
|
-
|
|
791
|
-
if (!result) {
|
|
792
|
-
result = await fetch(url, {
|
|
793
|
-
method: 'GET',
|
|
794
|
-
})
|
|
795
|
-
.then((r) => r.text())
|
|
796
|
-
.then((d) => startSerializer.parse(d))
|
|
797
|
-
|
|
798
|
-
staticClientCache?.set(url, result)
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
return result
|
|
802
|
-
},
|
|
803
|
-
})
|
|
804
|
-
})
|
|
805
|
-
|
|
806
524
|
export function extractFormDataContext(formData: FormData) {
|
|
807
525
|
const serializedContext = formData.get('__TSR_CONTEXT')
|
|
808
526
|
formData.delete('__TSR_CONTEXT')
|
|
@@ -859,7 +577,6 @@ export type ServerFnMiddlewareOptions = {
|
|
|
859
577
|
signal?: AbortSignal
|
|
860
578
|
sendContext?: any
|
|
861
579
|
context?: any
|
|
862
|
-
type: ServerFnTypeOrTypeFn<any, any, any, any>
|
|
863
580
|
functionId: string
|
|
864
581
|
router?: AnyRouter
|
|
865
582
|
}
|
|
@@ -867,7 +584,6 @@ export type ServerFnMiddlewareOptions = {
|
|
|
867
584
|
export type ServerFnMiddlewareResult = ServerFnMiddlewareOptions & {
|
|
868
585
|
result?: unknown
|
|
869
586
|
error?: unknown
|
|
870
|
-
type: ServerFnTypeOrTypeFn<any, any, any, any>
|
|
871
587
|
}
|
|
872
588
|
|
|
873
589
|
export type NextFn = (
|
|
@@ -957,35 +673,8 @@ export function serverFnBaseToMiddleware(
|
|
|
957
673
|
...ctx,
|
|
958
674
|
// switch the sendContext over to context
|
|
959
675
|
context: sendContext,
|
|
960
|
-
type: typeof ctx.type === 'function' ? ctx.type(ctx) : ctx.type,
|
|
961
676
|
} as any
|
|
962
677
|
|
|
963
|
-
if (
|
|
964
|
-
ctx.type === 'static' &&
|
|
965
|
-
process.env.NODE_ENV === 'production' &&
|
|
966
|
-
typeof document !== 'undefined'
|
|
967
|
-
) {
|
|
968
|
-
invariant(
|
|
969
|
-
serverFnStaticCache,
|
|
970
|
-
'serverFnStaticCache.fetchItem is not available!',
|
|
971
|
-
)
|
|
972
|
-
|
|
973
|
-
const result = await serverFnStaticCache.fetchItem(payload)
|
|
974
|
-
|
|
975
|
-
if (result) {
|
|
976
|
-
if (result.error) {
|
|
977
|
-
throw result.error
|
|
978
|
-
}
|
|
979
|
-
|
|
980
|
-
return next(result.ctx)
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
warning(
|
|
984
|
-
result,
|
|
985
|
-
`No static cache item found for ${payload.functionId}__${JSON.stringify(payload.data)}, falling back to server function...`,
|
|
986
|
-
)
|
|
987
|
-
}
|
|
988
|
-
|
|
989
678
|
// Execute the extracted function
|
|
990
679
|
// but not before serializing the context
|
|
991
680
|
const res = await options.extractedFn?.(payload)
|
package/src/index.tsx
CHANGED
|
@@ -73,11 +73,9 @@ export type {
|
|
|
73
73
|
ServerFnMiddlewareOptions,
|
|
74
74
|
ServerFnMiddlewareResult,
|
|
75
75
|
ServerFnBuilder,
|
|
76
|
-
ServerFnType,
|
|
77
76
|
ServerFnBaseOptions,
|
|
78
77
|
NextFn,
|
|
79
78
|
Method,
|
|
80
|
-
StaticCachedResult,
|
|
81
79
|
OptionalFetcher,
|
|
82
80
|
RequiredFetcher,
|
|
83
81
|
} from './createServerFn'
|
|
@@ -87,6 +85,5 @@ export {
|
|
|
87
85
|
serverFnBaseToMiddleware,
|
|
88
86
|
extractFormDataContext,
|
|
89
87
|
flattenMiddlewares,
|
|
90
|
-
serverFnStaticCache,
|
|
91
88
|
executeMiddleware,
|
|
92
89
|
} from './createServerFn'
|
package/src/serializer.ts
CHANGED
|
@@ -203,17 +203,4 @@ const serializers = [
|
|
|
203
203
|
// From
|
|
204
204
|
(v) => BigInt(v),
|
|
205
205
|
),
|
|
206
|
-
createSerializer(
|
|
207
|
-
// Key
|
|
208
|
-
'server-function',
|
|
209
|
-
// Check
|
|
210
|
-
(v): v is { functionId: string } =>
|
|
211
|
-
typeof v === 'function' &&
|
|
212
|
-
'functionId' in v &&
|
|
213
|
-
typeof v.functionId === 'string',
|
|
214
|
-
// To
|
|
215
|
-
({ functionId }) => ({ functionId, __serverFn: true }),
|
|
216
|
-
// From, dummy impl. the actual server function lookup is done on the server in packages/start-server-core/src/server-functions-handler.ts
|
|
217
|
-
(v) => v,
|
|
218
|
-
),
|
|
219
206
|
] as const
|
|
@@ -52,7 +52,6 @@ test('createServerFn with validator', () => {
|
|
|
52
52
|
expectTypeOf(fn).parameter(0).toEqualTypeOf<{
|
|
53
53
|
data: { input: string }
|
|
54
54
|
headers?: HeadersInit
|
|
55
|
-
type?: 'static' | 'dynamic'
|
|
56
55
|
signal?: AbortSignal
|
|
57
56
|
}>()
|
|
58
57
|
|
|
@@ -168,7 +167,6 @@ describe('createServerFn with middleware and validator', () => {
|
|
|
168
167
|
readonly inputC: 'inputC'
|
|
169
168
|
}
|
|
170
169
|
headers?: HeadersInit
|
|
171
|
-
type?: 'static' | 'dynamic'
|
|
172
170
|
signal?: AbortSignal
|
|
173
171
|
}>()
|
|
174
172
|
|
|
@@ -212,7 +210,6 @@ describe('createServerFn with middleware and validator', () => {
|
|
|
212
210
|
readonly inputC: 'inputC'
|
|
213
211
|
}
|
|
214
212
|
headers?: HeadersInit
|
|
215
|
-
type?: 'static' | 'dynamic'
|
|
216
213
|
signal?: AbortSignal
|
|
217
214
|
}>()
|
|
218
215
|
|
|
@@ -323,7 +320,6 @@ test('createServerFn where validator is optional if object is optional', () => {
|
|
|
323
320
|
| {
|
|
324
321
|
data?: 'c' | undefined
|
|
325
322
|
headers?: HeadersInit
|
|
326
|
-
type?: 'static' | 'dynamic'
|
|
327
323
|
signal?: AbortSignal
|
|
328
324
|
}
|
|
329
325
|
| undefined
|
|
@@ -347,7 +343,6 @@ test('createServerFn where data is optional if there is no validator', () => {
|
|
|
347
343
|
| {
|
|
348
344
|
data?: undefined
|
|
349
345
|
headers?: HeadersInit
|
|
350
|
-
type?: 'static' | 'dynamic'
|
|
351
346
|
signal?: AbortSignal
|
|
352
347
|
}
|
|
353
348
|
| undefined
|
|
@@ -509,7 +504,6 @@ test('createServerFn validator infers unknown for default input type', () => {
|
|
|
509
504
|
| {
|
|
510
505
|
data?: unknown | undefined
|
|
511
506
|
headers?: HeadersInit
|
|
512
|
-
type?: 'static' | 'dynamic'
|
|
513
507
|
signal?: AbortSignal
|
|
514
508
|
}
|
|
515
509
|
| undefined
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
function createIsomorphicFn() {
|
|
4
|
-
return {
|
|
5
|
-
server: () => ({ client: () => () => {
|
|
6
|
-
} }),
|
|
7
|
-
client: () => ({ server: () => () => {
|
|
8
|
-
} })
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
exports.createIsomorphicFn = createIsomorphicFn;
|
|
12
|
-
//# sourceMappingURL=createIsomorphicFn.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createIsomorphicFn.cjs","sources":["../../src/createIsomorphicFn.ts"],"sourcesContent":["// a function that can have different implementations on the client and server.\n// implementations not provided will default to a no-op function.\n\nexport type IsomorphicFn<\n TArgs extends Array<any> = [],\n TServer = undefined,\n TClient = undefined,\n> = (...args: TArgs) => TServer | TClient\n\nexport interface ServerOnlyFn<TArgs extends Array<any>, TServer>\n extends IsomorphicFn<TArgs, TServer> {\n client: <TClient>(\n clientImpl: (...args: TArgs) => TClient,\n ) => IsomorphicFn<TArgs, TServer, TClient>\n}\n\nexport interface ClientOnlyFn<TArgs extends Array<any>, TClient>\n extends IsomorphicFn<TArgs, undefined, TClient> {\n server: <TServer>(\n serverImpl: (...args: TArgs) => TServer,\n ) => IsomorphicFn<TArgs, TServer, TClient>\n}\n\nexport interface IsomorphicFnBase extends IsomorphicFn {\n server: <TArgs extends Array<any>, TServer>(\n serverImpl: (...args: TArgs) => TServer,\n ) => ServerOnlyFn<TArgs, TServer>\n client: <TArgs extends Array<any>, TClient>(\n clientImpl: (...args: TArgs) => TClient,\n ) => ClientOnlyFn<TArgs, TClient>\n}\n\n// this is a dummy function, it will be replaced by the transformer\n// if we use `createIsomorphicFn` in this library itself, vite tries to execute it before the transformer runs\n// therefore we must return a dummy function that allows calling `server` and `client` method chains.\nexport function createIsomorphicFn(): IsomorphicFnBase {\n return {\n server: () => ({ client: () => () => {} }),\n client: () => ({ server: () => () => {} }),\n } as any\n}\n"],"names":[],"mappings":";;AAmCO,SAAS,qBAAuC;AAC9C,SAAA;AAAA,IACL,QAAQ,OAAO,EAAE,QAAQ,MAAM,MAAM;AAAA,IAAA;IACrC,QAAQ,OAAO,EAAE,QAAQ,MAAM,MAAM;AAAA,IAAA,EAAG;AAAA,EAC1C;AACF;;"}
|