{"version":3,"file":"createStart.js","sources":["../../src/createStart.ts"],"sourcesContent":["import { createMiddleware } from './createMiddleware'\nimport type { TSS_SERVER_FUNCTION } from './constants'\nimport type {\n  AnyFunctionMiddleware,\n  AnyRequestMiddleware,\n  CreateMiddlewareFn,\n} from './createMiddleware'\nimport type { CustomFetch } from './createServerFn'\nimport type {\n  AnySerializationAdapter,\n  Register,\n  SSROption,\n} from '@tanstack/router-core'\n\nexport interface StartInstanceOptions<\n  in out TSerializationAdapters,\n  in out TDefaultSsr,\n  in out TRequestMiddlewares,\n  in out TFunctionMiddlewares,\n> {\n  '~types': StartInstanceTypes<\n    TSerializationAdapters,\n    TDefaultSsr,\n    TRequestMiddlewares,\n    TFunctionMiddlewares\n  >\n  serializationAdapters?: TSerializationAdapters\n  defaultSsr?: TDefaultSsr\n  requestMiddleware?: TRequestMiddlewares\n  functionMiddleware?: TFunctionMiddlewares\n  /**\n   * Configuration options for server functions.\n   */\n  serverFns?: {\n    /**\n     * A custom fetch implementation to use for all server function calls.\n     * This can be overridden by middleware or at the call site.\n     *\n     * Precedence (highest to lowest):\n     * 1. Call site: `serverFn({ fetch: customFetch })`\n     * 2. Later middleware: Last middleware in chain that provides `fetch`\n     * 3. Earlier middleware: First middleware in chain that provides `fetch`\n     * 4. createStart: `createStart({ serverFns: { fetch: customFetch } })`\n     * 5. Default: Global `fetch` function\n     *\n     * @note Only applies on the client side. During SSR, server functions are called directly.\n     */\n    fetch?: CustomFetch\n  }\n}\n\nexport interface StartInstance<\n  in out TSerializationAdapters,\n  in out TDefaultSsr,\n  in out TRequestMiddlewares,\n  in out TFunctionMiddlewares,\n> {\n  getOptions: () =>\n    | Promise<\n        StartInstanceOptions<\n          TSerializationAdapters,\n          TDefaultSsr,\n          TRequestMiddlewares,\n          TFunctionMiddlewares\n        >\n      >\n    | StartInstanceOptions<\n        TSerializationAdapters,\n        TDefaultSsr,\n        TRequestMiddlewares,\n        TFunctionMiddlewares\n      >\n  createMiddleware: CreateMiddlewareFn<Register>\n}\n\nexport interface StartInstanceTypes<\n  in out TSerializationAdapters,\n  in out TDefaultSsr,\n  in out TRequestMiddlewares,\n  in out TFunctionMiddlewares,\n> {\n  serializationAdapters: TSerializationAdapters\n  defaultSsr: TDefaultSsr\n  requestMiddleware: TRequestMiddlewares\n  functionMiddleware: TFunctionMiddlewares\n}\n\nfunction dedupeSerializationAdapters(\n  deduped: Set<AnySerializationAdapter>,\n  serializationAdapters: Array<AnySerializationAdapter>,\n): void {\n  for (let i = 0, len = serializationAdapters.length; i < len; i++) {\n    const current = serializationAdapters[i]!\n    if (!deduped.has(current)) {\n      deduped.add(current)\n      if (current.extends) {\n        dedupeSerializationAdapters(deduped, current.extends)\n      }\n    }\n  }\n}\n\nexport const createStart = <\n  const TSerializationAdapters extends ReadonlyArray<AnySerializationAdapter> =\n    [],\n  TDefaultSsr extends SSROption = SSROption,\n  const TRequestMiddlewares extends ReadonlyArray<AnyRequestMiddleware> = [],\n  const TFunctionMiddlewares extends ReadonlyArray<AnyFunctionMiddleware> = [],\n>(\n  getOptions: () =>\n    | Promise<\n        Omit<\n          StartInstanceOptions<\n            TSerializationAdapters,\n            TDefaultSsr,\n            TRequestMiddlewares,\n            TFunctionMiddlewares\n          >,\n          '~types'\n        >\n      >\n    | Omit<\n        StartInstanceOptions<\n          TSerializationAdapters,\n          TDefaultSsr,\n          TRequestMiddlewares,\n          TFunctionMiddlewares\n        >,\n        '~types'\n      >,\n): StartInstance<\n  TSerializationAdapters,\n  TDefaultSsr,\n  TRequestMiddlewares,\n  TFunctionMiddlewares\n> => {\n  return {\n    getOptions: async () => {\n      const options = await getOptions()\n      if (options.serializationAdapters) {\n        const deduped = new Set<AnySerializationAdapter>()\n        dedupeSerializationAdapters(\n          deduped,\n          options.serializationAdapters as unknown as Array<AnySerializationAdapter>,\n        )\n        options.serializationAdapters = Array.from(deduped) as any\n      }\n      return options\n    },\n    createMiddleware: createMiddleware,\n  } as StartInstance<\n    TSerializationAdapters,\n    TDefaultSsr,\n    TRequestMiddlewares,\n    TFunctionMiddlewares\n  >\n}\n\nexport type AnyStartInstance = StartInstance<any, any, any, any>\nexport type AnyStartInstanceOptions = StartInstanceOptions<any, any, any, any>\n\ndeclare module '@tanstack/router-core' {\n  interface SerializableExtensions {\n    serverFn: { [TSS_SERVER_FUNCTION]: true }\n  }\n}\n"],"names":[],"mappings":";AAuFA,SAAS,4BACP,SACA,uBACM;AACN,WAAS,IAAI,GAAG,MAAM,sBAAsB,QAAQ,IAAI,KAAK,KAAK;AAChE,UAAM,UAAU,sBAAsB,CAAC;AACvC,QAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,cAAQ,IAAI,OAAO;AACnB,UAAI,QAAQ,SAAS;AACnB,oCAA4B,SAAS,QAAQ,OAAO;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,cAAc,CAOzB,eA0BG;AACH,SAAO;AAAA,IACL,YAAY,YAAY;AACtB,YAAM,UAAU,MAAM,WAAA;AACtB,UAAI,QAAQ,uBAAuB;AACjC,cAAM,8BAAc,IAAA;AACpB;AAAA,UACE;AAAA,UACA,QAAQ;AAAA,QAAA;AAEV,gBAAQ,wBAAwB,MAAM,KAAK,OAAO;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,EAAA;AAOJ;"}