{"version":3,"file":"transformer.js","names":[],"sources":["../../../../src/ssr/serializer/transformer.ts"],"sourcesContent":["import { createPlugin } from 'seroval'\nimport { GLOBAL_TSR } from '../constants'\nimport type { Plugin, PluginInfo, SerovalNode } from 'seroval'\nimport type {\n RegisteredConfigType,\n RegisteredSsr,\n SSROption,\n} from '../../router'\nimport type { LooseReturnType } from '../../utils'\nimport type { AnyRoute, ResolveAllSSR } from '../../route'\nimport type { RawStream } from './RawStream'\n\ndeclare const TSR_SERIALIZABLE: unique symbol\nexport type TSR_SERIALIZABLE = typeof TSR_SERIALIZABLE\n\nexport type TsrSerializable = { [TSR_SERIALIZABLE]: true }\n\nexport interface DefaultSerializable {\n number: number\n string: string\n boolean: boolean\n null: null\n undefined: undefined\n bigint: bigint\n Date: Date\n Uint8Array: Uint8Array\n RawStream: RawStream\n TsrSerializable: TsrSerializable\n void: void\n}\n\nexport interface SerializableExtensions extends DefaultSerializable {}\n\nexport type Serializable = SerializableExtensions[keyof SerializableExtensions]\n\nexport type UnionizeSerializationAdaptersInput<\n TAdapters extends ReadonlyArray,\n> = TAdapters[number]['~types']['input']\n\n/**\n * Create a strongly-typed serialization adapter for SSR hydration.\n * Use to register custom types with the router serializer.\n */\nexport function createSerializationAdapter<\n TInput = unknown,\n TOutput = unknown,\n const TExtendsAdapters extends\n | ReadonlyArray\n | never = never,\n>(\n opts: CreateSerializationAdapterOptions,\n): SerializationAdapter {\n return opts as unknown as SerializationAdapter<\n TInput,\n TOutput,\n TExtendsAdapters\n >\n}\n\nexport interface CreateSerializationAdapterOptions<\n TInput,\n TOutput,\n TExtendsAdapters extends ReadonlyArray | never,\n> {\n key: string\n extends?: TExtendsAdapters\n test: (value: unknown) => value is TInput\n toSerializable: (\n value: TInput,\n ) => ValidateSerializable<\n TOutput,\n Serializable | UnionizeSerializationAdaptersInput\n >\n fromSerializable: (value: TOutput) => TInput\n}\n\nexport type ValidateSerializable = T extends TSerializable\n ? T\n : T extends (...args: Array) => any\n ? SerializationError<'Function may not be serializable'>\n : T extends RegisteredReadableStream\n ? SerializationError<'JSX is not be serializable'>\n : T extends ReadonlyArray\n ? ValidateSerializableArray\n : T extends Promise\n ? ValidateSerializablePromise\n : T extends ReadableStream\n ? ValidateReadableStream\n : T extends Set\n ? ValidateSerializableSet\n : T extends Map\n ? ValidateSerializableMap\n : T extends AsyncGenerator\n ? ValidateSerializableAsyncGenerator\n : T extends object\n ? ValidateSerializableMapped\n : SerializationError<'Type may not be serializable'>\n\nexport type ValidateSerializableAsyncGenerator =\n T extends AsyncGenerator\n ? AsyncGenerator<\n ValidateSerializable,\n ValidateSerializable,\n TNext\n >\n : never\n\nexport type ValidateSerializablePromise =\n T extends Promise\n ? Promise>\n : never\n\nexport type ValidateReadableStream =\n T extends ReadableStream\n ? ReadableStream>\n : never\n\nexport type ValidateSerializableSet =\n T extends Set\n ? Set>\n : never\n\nexport type ValidateSerializableMap =\n T extends Map\n ? Map<\n ValidateSerializable,\n ValidateSerializable\n >\n : never\n\nexport type ValidateSerializableArray = T extends readonly [\n any,\n ...Array,\n]\n ? ValidateSerializableMapped\n : T extends Array\n ? Array>\n : T extends ReadonlyArray\n ? ReadonlyArray>\n : never\n\nexport type ValidateSerializableMapped = {\n [K in keyof T]: ValidateSerializable\n}\n\nconst SERIALIZATION_ERROR = Symbol.for('TSR_SERIALIZATION_ERROR')\n\nexport interface SerializationError {\n [SERIALIZATION_ERROR]: TMessage\n}\n\nexport interface SerializationAdapter<\n TInput,\n TOutput,\n TExtendsAdapters extends ReadonlyArray,\n> {\n '~types': SerializationAdapterTypes\n key: string\n extends?: TExtendsAdapters\n test: (value: unknown) => value is TInput\n toSerializable: (value: TInput) => TOutput\n fromSerializable: (value: TOutput) => TInput\n}\n\nexport interface SerializationAdapterTypes<\n TInput,\n TOutput,\n TExtendsAdapters extends ReadonlyArray,\n> {\n input: TInput | UnionizeSerializationAdaptersInput\n output: TOutput\n extends: TExtendsAdapters\n}\n\nexport type AnySerializationAdapter = SerializationAdapter\n\nexport interface AdapterNode extends PluginInfo {\n v: SerovalNode\n}\n\n/** Create a Seroval plugin for server-side serialization only. */\n/* @__NO_SIDE_EFFECTS__ */\nexport function makeSsrSerovalPlugin(\n serializationAdapter: AnySerializationAdapter,\n options: { didRun: boolean },\n): Plugin {\n return /* @__PURE__ */ createPlugin({\n tag: '$TSR/t/' + serializationAdapter.key,\n test: serializationAdapter.test,\n parse: {\n stream(value, ctx, _data) {\n return {\n v: ctx.parse(serializationAdapter.toSerializable(value)),\n }\n },\n },\n serialize(node, ctx, _data) {\n options.didRun = true\n return (\n GLOBAL_TSR +\n '.t.get(\"' +\n serializationAdapter.key +\n '\")(' +\n ctx.serialize(node.v) +\n ')'\n )\n },\n // we never deserialize on the server during SSR\n deserialize: undefined as never,\n })\n}\n\n/** Create a Seroval plugin for client/server symmetric (de)serialization. */\n/* @__NO_SIDE_EFFECTS__ */\nexport function makeSerovalPlugin(\n serializationAdapter: AnySerializationAdapter,\n): Plugin {\n return /* @__PURE__ */ createPlugin({\n tag: '$TSR/t/' + serializationAdapter.key,\n test: serializationAdapter.test,\n parse: {\n sync(value, ctx, _data) {\n return {\n v: ctx.parse(serializationAdapter.toSerializable(value)),\n }\n },\n async async(value, ctx, _data) {\n return {\n v: await ctx.parse(serializationAdapter.toSerializable(value)),\n }\n },\n stream(value, ctx, _data) {\n return {\n v: ctx.parse(serializationAdapter.toSerializable(value)),\n }\n },\n },\n // we don't generate JS code outside of SSR (for now)\n serialize: undefined as never,\n deserialize(node, ctx, _data) {\n return serializationAdapter.fromSerializable(ctx.deserialize(node.v))\n },\n })\n}\n\nexport type ValidateSerializableInput = ValidateSerializable<\n T,\n RegisteredSerializableInput\n>\n\nexport type RegisteredSerializableInput =\n | (unknown extends RegisteredSerializationAdapters\n ? never\n : RegisteredSerializationAdapters extends ReadonlyArray\n ? RegisteredSerializationAdapters[number]['~types']['input']\n : never)\n | Serializable\n\nexport type RegisteredSerializationAdapters = RegisteredConfigType<\n TRegister,\n 'serializationAdapters'\n>\n\nexport type RegisteredSSROption =\n unknown extends RegisteredConfigType\n ? SSROption\n : RegisteredConfigType\n\nexport type ValidateSerializableLifecycleResult<\n TRegister,\n TParentRoute extends AnyRoute,\n TSSR,\n TFn,\n> =\n false extends RegisteredSsr\n ? any\n : ValidateSerializableLifecycleResultSSR<\n TRegister,\n TParentRoute,\n TSSR,\n TFn\n > extends infer TInput\n ? TInput\n : never\n\nexport type ValidateSerializableLifecycleResultSSR<\n TRegister,\n TParentRoute extends AnyRoute,\n TSSR,\n TFn,\n> =\n ResolveAllSSR extends false\n ? any\n : RegisteredSSROption extends false\n ? any\n : ValidateSerializableInput>\n\nexport type RegisteredReadableStream =\n unknown extends SerializerExtensions['ReadableStream']\n ? never\n : SerializerExtensions['ReadableStream']\n\nexport interface DefaultSerializerExtensions {\n ReadableStream: unknown\n}\n\nexport interface SerializerExtensions extends DefaultSerializerExtensions {}\n"],"mappings":";;;;;;;AA2CA,SAAgB,2BAOd,MACyD;AACzD,QAAO;;;;AAkIT,SAAgB,qBACd,sBACA,SAC0B;AAC1B,QAAuB,6BAA+B;EACpD,KAAK,YAAY,qBAAqB;EACtC,MAAM,qBAAqB;EAC3B,OAAO,EACL,OAAO,OAAO,KAAK,OAAO;AACxB,UAAO,EACL,GAAG,IAAI,MAAM,qBAAqB,eAAe,MAAM,CAAC,EACzD;KAEJ;EACD,UAAU,MAAM,KAAK,OAAO;AAC1B,WAAQ,SAAS;AACjB,UACE,aACA,cACA,qBAAqB,MACrB,SACA,IAAI,UAAU,KAAK,EAAE,GACrB;;EAIJ,aAAa,KAAA;EACd,CAAC;;;;AAKJ,SAAgB,kBACd,sBAC0B;AAC1B,QAAuB,6BAA+B;EACpD,KAAK,YAAY,qBAAqB;EACtC,MAAM,qBAAqB;EAC3B,OAAO;GACL,KAAK,OAAO,KAAK,OAAO;AACtB,WAAO,EACL,GAAG,IAAI,MAAM,qBAAqB,eAAe,MAAM,CAAC,EACzD;;GAEH,MAAM,MAAM,OAAO,KAAK,OAAO;AAC7B,WAAO,EACL,GAAG,MAAM,IAAI,MAAM,qBAAqB,eAAe,MAAM,CAAC,EAC/D;;GAEH,OAAO,OAAO,KAAK,OAAO;AACxB,WAAO,EACL,GAAG,IAAI,MAAM,qBAAqB,eAAe,MAAM,CAAC,EACzD;;GAEJ;EAED,WAAW,KAAA;EACX,YAAY,MAAM,KAAK,OAAO;AAC5B,UAAO,qBAAqB,iBAAiB,IAAI,YAAY,KAAK,EAAE,CAAC;;EAExE,CAAC"}