{"version":3,"file":"transformer.cjs","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<AnySerializationAdapter>,\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<AnySerializationAdapter>\n    | never = never,\n>(\n  opts: CreateSerializationAdapterOptions<TInput, TOutput, TExtendsAdapters>,\n): SerializationAdapter<TInput, TOutput, TExtendsAdapters> {\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<AnySerializationAdapter> | 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<TExtendsAdapters>\n  >\n  fromSerializable: (value: TOutput) => TInput\n}\n\nexport type ValidateSerializable<T, TSerializable> = T extends TSerializable\n  ? T\n  : T extends (...args: Array<any>) => any\n    ? SerializationError<'Function may not be serializable'>\n    : T extends RegisteredReadableStream\n      ? SerializationError<'JSX is not be serializable'>\n      : T extends ReadonlyArray<any>\n        ? ValidateSerializableArray<T, TSerializable>\n        : T extends Promise<any>\n          ? ValidateSerializablePromise<T, TSerializable>\n          : T extends ReadableStream<any>\n            ? ValidateReadableStream<T, TSerializable>\n            : T extends Set<any>\n              ? ValidateSerializableSet<T, TSerializable>\n              : T extends Map<any, any>\n                ? ValidateSerializableMap<T, TSerializable>\n                : T extends AsyncGenerator<any, any>\n                  ? ValidateSerializableAsyncGenerator<T, TSerializable>\n                  : T extends object\n                    ? ValidateSerializableMapped<T, TSerializable>\n                    : SerializationError<'Type may not be serializable'>\n\nexport type ValidateSerializableAsyncGenerator<T, TSerializable> =\n  T extends AsyncGenerator<infer T, infer TReturn, infer TNext>\n    ? AsyncGenerator<\n        ValidateSerializable<T, TSerializable>,\n        ValidateSerializable<TReturn, TSerializable>,\n        TNext\n      >\n    : never\n\nexport type ValidateSerializablePromise<T, TSerializable> =\n  T extends Promise<infer TAwaited>\n    ? Promise<ValidateSerializable<TAwaited, TSerializable>>\n    : never\n\nexport type ValidateReadableStream<T, TSerializable> =\n  T extends ReadableStream<infer TStreamed>\n    ? ReadableStream<ValidateSerializable<TStreamed, TSerializable>>\n    : never\n\nexport type ValidateSerializableSet<T, TSerializable> =\n  T extends Set<infer TItem>\n    ? Set<ValidateSerializable<TItem, TSerializable>>\n    : never\n\nexport type ValidateSerializableMap<T, TSerializable> =\n  T extends Map<infer TKey, infer TValue>\n    ? Map<\n        ValidateSerializable<TKey, TSerializable>,\n        ValidateSerializable<TValue, TSerializable>\n      >\n    : never\n\nexport type ValidateSerializableArray<T, TSerializable> = T extends readonly [\n  any,\n  ...Array<any>,\n]\n  ? ValidateSerializableMapped<T, TSerializable>\n  : T extends Array<infer U>\n    ? Array<ValidateSerializable<U, TSerializable>>\n    : T extends ReadonlyArray<infer U>\n      ? ReadonlyArray<ValidateSerializable<U, TSerializable>>\n      : never\n\nexport type ValidateSerializableMapped<T, TSerializable> = {\n  [K in keyof T]: ValidateSerializable<T[K], TSerializable>\n}\n\nconst SERIALIZATION_ERROR = Symbol.for('TSR_SERIALIZATION_ERROR')\n\nexport interface SerializationError<in out TMessage extends string> {\n  [SERIALIZATION_ERROR]: TMessage\n}\n\nexport interface SerializationAdapter<\n  TInput,\n  TOutput,\n  TExtendsAdapters extends ReadonlyArray<AnySerializationAdapter>,\n> {\n  '~types': SerializationAdapterTypes<TInput, TOutput, TExtendsAdapters>\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<AnySerializationAdapter>,\n> {\n  input: TInput | UnionizeSerializationAdaptersInput<TExtendsAdapters>\n  output: TOutput\n  extends: TExtendsAdapters\n}\n\nexport type AnySerializationAdapter = SerializationAdapter<any, any, any>\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<any, AdapterNode> {\n  return /* @__PURE__ */ createPlugin<any, AdapterNode>({\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<any, AdapterNode> {\n  return /* @__PURE__ */ createPlugin<any, AdapterNode>({\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<TRegister, T> = ValidateSerializable<\n  T,\n  RegisteredSerializableInput<TRegister>\n>\n\nexport type RegisteredSerializableInput<TRegister> =\n  | (unknown extends RegisteredSerializationAdapters<TRegister>\n      ? never\n      : RegisteredSerializationAdapters<TRegister> extends ReadonlyArray<AnySerializationAdapter>\n        ? RegisteredSerializationAdapters<TRegister>[number]['~types']['input']\n        : never)\n  | Serializable\n\nexport type RegisteredSerializationAdapters<TRegister> = RegisteredConfigType<\n  TRegister,\n  'serializationAdapters'\n>\n\nexport type RegisteredSSROption<TRegister> =\n  unknown extends RegisteredConfigType<TRegister, 'defaultSsr'>\n    ? SSROption\n    : RegisteredConfigType<TRegister, 'defaultSsr'>\n\nexport type ValidateSerializableLifecycleResult<\n  TRegister,\n  TParentRoute extends AnyRoute,\n  TSSR,\n  TFn,\n> =\n  false extends RegisteredSsr<TRegister>\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<TParentRoute, TSSR> extends false\n    ? any\n    : RegisteredSSROption<TRegister> extends false\n      ? any\n      : ValidateSerializableInput<TRegister, LooseReturnType<TFn>>\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,iBAAA,GAAA,QAAA,cAA+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,kBAAA,aACA,cACA,qBAAqB,MACrB,SACA,IAAI,UAAU,KAAK,EAAE,GACrB;;EAIJ,aAAa,KAAA;EACd,CAAC;;;;AAKJ,SAAgB,kBACd,sBAC0B;AAC1B,QAAuB,iBAAA,GAAA,QAAA,cAA+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"}