@bgub/fig-tanstack-start 0.0.0-tegami-trusted-publish-setup → 0.1.0-alpha.2

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +225 -0
  2. package/LICENSE +21 -0
  3. package/README.md +280 -3
  4. package/dist/client-B2okTbp3.js +29 -0
  5. package/dist/client-B2okTbp3.js.map +1 -0
  6. package/dist/client.d.ts +13 -0
  7. package/dist/client.js +2 -0
  8. package/dist/data.d.ts +14 -0
  9. package/dist/data.js +34 -0
  10. package/dist/data.js.map +1 -0
  11. package/dist/default-entry/client.d.ts +1 -0
  12. package/dist/default-entry/client.js +7 -0
  13. package/dist/default-entry/client.js.map +1 -0
  14. package/dist/default-entry/server.d.ts +4 -0
  15. package/dist/default-entry/server.js +6 -0
  16. package/dist/default-entry/server.js.map +1 -0
  17. package/dist/default-entry/start.d.ts +4 -0
  18. package/dist/default-entry/start.js +6 -0
  19. package/dist/default-entry/start.js.map +1 -0
  20. package/dist/payload-assets-eHfSAMbN.js +14 -0
  21. package/dist/payload-assets-eHfSAMbN.js.map +1 -0
  22. package/dist/payload-internal-CZhfVhwH.js +168 -0
  23. package/dist/payload-internal-CZhfVhwH.js.map +1 -0
  24. package/dist/payload.d.ts +19 -0
  25. package/dist/payload.js +38 -0
  26. package/dist/payload.js.map +1 -0
  27. package/dist/plugin/vite.d.ts +6 -0
  28. package/dist/plugin/vite.js +857 -0
  29. package/dist/plugin/vite.js.map +1 -0
  30. package/dist/server.d.ts +20 -0
  31. package/dist/server.js +111 -0
  32. package/dist/server.js.map +1 -0
  33. package/dist/start-context-DZ2gsb5m.js +12 -0
  34. package/dist/start-context-DZ2gsb5m.js.map +1 -0
  35. package/dist/storage-context.d.ts +9 -0
  36. package/dist/storage-context.js +21 -0
  37. package/dist/storage-context.js.map +1 -0
  38. package/dist/store-CibAGqiI.js +13 -0
  39. package/dist/store-CibAGqiI.js.map +1 -0
  40. package/dist/transport-DKcSG44e.js +33 -0
  41. package/dist/transport-DKcSG44e.js.map +1 -0
  42. package/package.json +90 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","names":["Buffer"],"sources":["../../src/plugin/module-ids.ts","../../src/plugin/compatibility-profile.ts","../../src/plugin/compatibility-vite.ts","../../src/plugin/compiler-options.ts","../../src/plugin/isomorphic-manifest.ts","../../src/plugin/isomorphic-compiler.ts","../../src/plugin/payload-stylesheet-compiler.ts","../../src/plugin/payload-compiler.ts","../../src/plugin/server-payload-compiler.ts","../../src/plugin/public-assets.ts","../../src/plugin/payload-vite.ts","../../src/plugin/vite.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { isAbsolute, relative, sep } from \"node:path\";\n\nexport const payloadManifestDefinitionQuery = \"fig-payload-manifest\";\nexport const payloadModuleQuery = \"fig-payload-module\";\nexport const payloadReferenceQuery = \"fig-payload-reference\";\n\nexport function cleanModuleId(id: string): string {\n const query = id.indexOf(\"?\");\n return query === -1 ? id : id.slice(0, query);\n}\n\nexport function moduleQueryValue(id: string, name: string): string | undefined {\n const query = id.indexOf(\"?\");\n if (query === -1) return undefined;\n const hash = id.indexOf(\"#\", query);\n const value = new URLSearchParams(\n id.slice(query + 1, hash === -1 ? undefined : hash),\n ).get(name);\n return value ?? undefined;\n}\n\nexport function hasModuleQuery(id: string, name: string): boolean {\n return moduleQueryValue(id, name) !== undefined;\n}\n\nexport function withModuleQuery(\n source: string,\n name: string,\n value: string,\n): string {\n const hash = source.indexOf(\"#\");\n const suffix = hash === -1 ? \"\" : source.slice(hash);\n const path = hash === -1 ? source : source.slice(0, hash);\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n return `${path}${separator}${name}=${encodeURIComponent(value)}${suffix}`;\n}\n\nexport function encodeOpaqueId(id: string): string {\n return Buffer.from(id).toString(\"base64url\");\n}\n\nexport function decodeOpaqueId(id: string): string {\n return Buffer.from(id, \"base64url\").toString();\n}\n\nexport function toViteModulePath(root: string, moduleId: string): string {\n const clean = cleanModuleId(moduleId);\n const path = isAbsolute(clean) ? relative(root, clean) : clean;\n const normalized = normalizePath(path);\n return isAbsolute(path) || normalized.startsWith(\"../\")\n ? toViteFsPath(clean)\n : `/${normalized.replace(/^\\/+/, \"\")}`;\n}\n\nexport function toViteFsPath(path: string): string {\n return `/@fs/${normalizePath(path).replace(/^\\/+/, \"\")}`;\n}\n\nfunction normalizePath(path: string): string {\n return path.split(sep).join(\"/\").replaceAll(\"\\\\\", \"/\");\n}\n","export const tanStackCompatibilityProfile = {\n id: \"tanstack-start-core-1.171\",\n framework: \"solid\",\n packages: {\n figRouter: \"@bgub/fig-tanstack-router\",\n figStart: \"@bgub/fig-tanstack-start\",\n frameworkRouter: \"@tanstack/solid-router\",\n frameworkStart: \"@tanstack/solid-start\",\n startClient: \"@tanstack/start-client-core\",\n startServer: \"@tanstack/start-server-core\",\n },\n versions: {\n routerCore: \"1.171.15\",\n startClientCore: \"1.170.14\",\n startPluginCore: \"1.171.22\",\n startServerCore: \"1.169.17\",\n },\n} as const;\n\nexport function createCompilerRpcModules(\n resolveDependency: (id: string) => string,\n) {\n const { frameworkStart, startClient, startServer } =\n tanStackCompatibilityProfile.packages;\n return [\n {\n source: `${frameworkStart}/client-rpc`,\n id: \"\\0fig-tanstack-start:client-rpc\",\n code: `export { createClientRpc } from \"${startClient}/client-rpc\";`,\n },\n {\n source: `${frameworkStart}/server-rpc`,\n id: \"\\0fig-tanstack-start:server-rpc\",\n code: `export { createServerRpc } from ${JSON.stringify(\n resolveDependency(`${startServer}/createServerRpc`),\n )};`,\n },\n {\n source: `${frameworkStart}/ssr-rpc`,\n id: \"\\0fig-tanstack-start:ssr-rpc\",\n code: `export { createSsrRpc } from ${JSON.stringify(\n resolveDependency(`${startServer}/createSsrRpc`),\n )};`,\n },\n ];\n}\n\nexport function createDefaultServerEntry(): string {\n const { figStart } = tanStackCompatibilityProfile.packages;\n return [\n `import { createFigStartHandler } from ${JSON.stringify(`${figStart}/server`)};`,\n \"const fetch = createFigStartHandler();\",\n \"export default { fetch };\",\n ].join(\"\\n\");\n}\n\nexport function rewriteFrameworkImports(code: string): string {\n const { figStart, frameworkStart } = tanStackCompatibilityProfile.packages;\n return code.replace(\n new RegExp(\n `\\\\b(from|import)\\\\s*(\\\\(\\\\s*)?([\"'])${escapeRegExp(figStart)}\\\\3`,\n \"g\",\n ),\n (_match, keyword: string, parenthesis: string | undefined, quote: string) =>\n `${keyword}${parenthesis === undefined ? \" \" : parenthesis}${quote}${frameworkStart}${quote}`,\n );\n}\n\nexport function incompatibleRuntimeModules(\n moduleIds: Iterable<string>,\n): string[] {\n const { frameworkRouter, frameworkStart } =\n tanStackCompatibilityProfile.packages;\n const forbiddenPackages = [frameworkRouter, frameworkStart];\n return [...moduleIds].filter((id) => {\n const normalized = id.replaceAll(\"\\\\\", \"/\");\n return forbiddenPackages.some((packageName) =>\n normalized.includes(`/node_modules/${packageName}/`),\n );\n });\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { fileURLToPath } from \"node:url\";\nimport { START_ENVIRONMENT_NAMES } from \"@tanstack/start-plugin-core/vite\";\nimport type { PluginOption } from \"vite\";\nimport { toViteFsPath } from \"./module-ids.ts\";\nimport {\n createCompilerRpcModules,\n createDefaultServerEntry,\n incompatibleRuntimeModules,\n rewriteFrameworkImports,\n tanStackCompatibilityProfile,\n} from \"./compatibility-profile.ts\";\n\nconst {\n figRouter: figRouterPackage,\n figStart: figTanStackStartPackage,\n frameworkRouter: tanstackRouterPackage,\n frameworkStart: tanstackStartPackage,\n startClient: tanstackStartClientPackage,\n} = tanStackCompatibilityProfile.packages;\n\nconst resolveDependency = (id: string) =>\n fileURLToPath(import.meta.resolve(id));\nconst tanstackStartClientModules = [\n tanstackStartClientPackage,\n `${tanstackStartClientPackage}/client`,\n `${tanstackStartClientPackage}/client-rpc`,\n] as const;\nconst tanstackStartClientAliases = tanstackStartClientModules.map((id) => ({\n find: new RegExp(`^${id}$`),\n replacement: resolveDependency(id),\n}));\nconst optimizedClientModules = [\"@tanstack/router-core/ssr/client\"] as const;\nconst applicationEntryIds = new Set([\n \"#tanstack-router-entry\",\n \"#tanstack-start-entry\",\n]);\nconst storageContextPath = fileURLToPath(\n new URL(\"../storage-context.js\", import.meta.url),\n);\n\nexport const defaultEntryPaths = {\n client: fileURLToPath(new URL(\"../default-entry/client.js\", import.meta.url)),\n server: fileURLToPath(new URL(\"../default-entry/server.js\", import.meta.url)),\n start: fileURLToPath(new URL(\"../default-entry/start.js\", import.meta.url)),\n} as const;\n\nconst compilerRpcModules = createCompilerRpcModules(resolveDependency);\n\nexport function startCompatibilityPlugin(): PluginOption {\n const applicationEntryUrls = new Map<string, string>();\n const optimizerApplicationEntries = {\n name: \"fig-tanstack-start:optimizer-application-entries\",\n resolveId(source: string) {\n const id = applicationEntryUrls.get(source);\n return id === undefined ? null : { external: true, id };\n },\n };\n\n return {\n name: \"fig-tanstack-start:compatibility\",\n enforce: \"pre\",\n config() {\n return {\n resolve: {\n alias: [\n ...tanstackStartClientAliases,\n {\n find: /^@tanstack\\/start-storage-context$/,\n replacement: storageContextPath,\n },\n {\n find: new RegExp(`^${tanstackRouterPackage}$`),\n replacement: figRouterPackage,\n },\n {\n find: new RegExp(`^${tanstackStartPackage}$`),\n replacement: figTanStackStartPackage,\n },\n ],\n dedupe: [figTanStackStartPackage, figRouterPackage],\n },\n };\n },\n configEnvironment(environmentName, environment) {\n if (environmentName !== START_ENVIRONMENT_NAMES.client) return undefined;\n const optimizerPlugins =\n environment.optimizeDeps?.rolldownOptions?.plugins;\n return {\n optimizeDeps: {\n include: [\n ...(environment.optimizeDeps?.include ?? []),\n ...optimizedClientModules,\n ],\n exclude: [\n ...(environment.optimizeDeps?.exclude ?? []),\n // Start's compiler must rewrite createIsomorphicFn branches per\n // environment; prebundling these first freezes server code into\n // the client graph and makes client-side server functions crash.\n ...tanstackStartClientModules,\n figTanStackStartPackage,\n figRouterPackage,\n ],\n rolldownOptions: {\n ...environment.optimizeDeps?.rolldownOptions,\n plugins: [\n ...(optimizerPlugins === undefined ? [] : [optimizerPlugins]),\n optimizerApplicationEntries,\n ],\n },\n },\n };\n },\n configResolved(config) {\n for (const alias of config.resolve.alias) {\n if (\n typeof alias.find === \"string\" &&\n applicationEntryIds.has(alias.find)\n ) {\n applicationEntryUrls.set(alias.find, toViteFsPath(alias.replacement));\n }\n }\n },\n generateBundle(_options, bundle) {\n if (this.environment.name !== START_ENVIRONMENT_NAMES.client) return;\n const emittedModuleIds = Object.values(bundle).flatMap((output) =>\n output.type === \"chunk\"\n ? Object.entries(output.modules).flatMap(([id, module]) =>\n module.renderedLength === 0 ? [] : [id],\n )\n : [],\n );\n const incompatible = incompatibleRuntimeModules(emittedModuleIds);\n if (incompatible.length === 0) return;\n throw new Error(\n `${tanStackCompatibilityProfile.id} resolved compatibility-only Solid modules into the client runtime:\\n${incompatible.join(\"\\n\")}`,\n );\n },\n resolveId(source) {\n return compilerRpcModules.find((module) => module.source === source)?.id;\n },\n load(id) {\n const rpcModule = compilerRpcModules.find((module) => module.id === id);\n if (rpcModule !== undefined) return rpcModule.code;\n if (id === defaultEntryPaths.server) return createDefaultServerEntry();\n return undefined;\n },\n transform(code) {\n const rewritten = rewriteFrameworkImports(code);\n return rewritten === code ? null : { code: rewritten, map: null };\n },\n };\n}\n","import * as babel from \"@babel/core\";\nimport type { NodePath } from \"@babel/core\";\nimport presetTypescript from \"@babel/preset-typescript\";\n\nexport const payloadPackageId = \"@bgub/fig-tanstack-start/payload\";\nexport const serverPackageId = \"@bgub/fig-tanstack-start/server\";\n\n// One home for what counts as a source module: the manifest glob and the\n// compiler analysis gates must accept the same files.\nexport const sourceModuleExtensions = [\n \"js\",\n \"jsx\",\n \"ts\",\n \"tsx\",\n \"cjs\",\n \"mjs\",\n \"cts\",\n \"mts\",\n] as const;\n\nconst sourceModulePattern = new RegExp(\n `\\\\.(?:${sourceModuleExtensions.join(\"|\")})$`,\n);\n\nexport function babelOptions(\n filename: string,\n): NonNullable<Parameters<typeof babel.transformAsync>[1]> {\n return {\n babelrc: false,\n configFile: false,\n filename,\n presets: [\n [\n presetTypescript,\n { ignoreExtensions: true, onlyRemoveTypeImports: true },\n ],\n ],\n parserOpts: { plugins: filename.endsWith(\"x\") ? [\"jsx\"] : [] },\n };\n}\n\nexport function isSourceModule(id: string): boolean {\n return sourceModulePattern.test(id);\n}\n\nexport function isComponentName(name: string): boolean {\n const first = name.codePointAt(0);\n return first !== undefined && first >= 65 && first <= 90;\n}\n\nexport function isImportedBinding(\n path: NodePath,\n localName: string,\n importedName: string,\n source: string,\n): boolean {\n const binding = path.scope.getBinding(localName);\n if (!binding?.path.isImportSpecifier()) return false;\n const imported = binding.path.node.imported;\n const actualName =\n imported.type === \"Identifier\" ? imported.name : imported.value;\n return (\n actualName === importedName &&\n binding.path.parentPath.isImportDeclaration() &&\n binding.path.parentPath.node.source.value === source\n );\n}\n","import { sourceModuleExtensions } from \"./compiler-options.ts\";\nimport type { CompiledIsomorphicImport } from \"./isomorphic-compiler.ts\";\nimport {\n decodeOpaqueId,\n encodeOpaqueId,\n moduleQueryValue,\n payloadManifestDefinitionQuery,\n payloadReferenceQuery,\n toViteModulePath,\n withModuleQuery,\n} from \"./module-ids.ts\";\n\nexport const payloadManifestId = \"virtual:fig-tanstack-start/payload-manifest\";\nexport const resolvedPayloadManifestId = `\\0${payloadManifestId}`;\n\nexport interface ManifestReference extends CompiledIsomorphicImport {\n developmentStylesheetHrefs: string[];\n resolvedModuleId: string;\n}\n\nexport function isomorphicReferenceId(\n root: string,\n moduleId: string,\n exportName: string,\n): string {\n return `${toViteModulePath(root, moduleId)}#${exportName}`;\n}\n\nexport function payloadManifestDefinitionCode(\n references: readonly ManifestReference[],\n): string {\n const entries = references.map((reference) => {\n const moduleId = withModuleQuery(\n reference.resolvedModuleId,\n payloadReferenceQuery,\n encodeOpaqueId(reference.referenceId),\n );\n return `${JSON.stringify(reference.referenceId)}: {\n load: () => import(${JSON.stringify(moduleId)}).then((module) => module[${JSON.stringify(reference.importedName)}]),\n stylesheets: ${JSON.stringify(reference.developmentStylesheetHrefs)},\n }`;\n });\n return `export const references = {${entries.join(\",\\n\")}};`;\n}\n\nexport function payloadManifestRuntimeCode(\n clientStylesheets: ReadonlyMap<string, readonly string[]>,\n): string {\n const assets = JSON.stringify(Object.fromEntries(clientStylesheets));\n return `import { stylesheet } from \"@bgub/fig\";\nimport { createPayloadClientReferenceResolver } from \"@bgub/fig/payload\";\n\nconst definitions = import.meta.glob([\n \"/**/*.{${sourceModuleExtensions.join(\",\")}}\",\n \"!/**/*.d.ts\",\n \"!/**/*.test.*\",\n \"!/**/*.spec.*\",\n \"!/**/__tests__/**\",\n \"!/**/dist/**\",\n \"!/**/node_modules/**\",\n], {\n eager: true,\n import: \"references\",\n query: \"?${payloadManifestDefinitionQuery}\",\n});\nconst references = Object.assign({}, ...Object.values(definitions));\nconst clientStylesheets = ${assets};\n\nexport const resolveIsomorphicReference = createPayloadClientReferenceResolver(\n (reference) => references[reference.id]?.load(),\n);\n\nexport function compiledIsomorphicReferenceAssets({ id }) {\n const hrefs = clientStylesheets[id] ?? references[id]?.stylesheets ?? [];\n return hrefs.map((href) => stylesheet(href, { precedence: \"isomorphic\" }));\n}`;\n}\n\nexport function payloadReferenceIds(moduleIds: readonly string[]): string[] {\n const ids = new Set<string>();\n for (const moduleId of moduleIds) {\n const id = moduleQueryValue(moduleId, payloadReferenceQuery);\n if (id !== undefined) ids.add(decodeOpaqueId(id));\n }\n return [...ids];\n}\n","import type { NodePath, PluginObject } from \"@babel/core\";\nimport type * as babel from \"@babel/core\";\nimport { isImportedBinding, payloadPackageId } from \"./compiler-options.ts\";\n\nexport interface IsomorphicImport {\n importedName: string;\n localName: string;\n source: string;\n}\n\nexport interface CompiledIsomorphicImport extends IsomorphicImport {\n referenceId: string;\n}\n\nexport function isomorphicBoundaryAnalysisPlugin(\n imports: IsomorphicImport[],\n): () => PluginObject {\n return () => ({\n name: \"fig-tanstack-start-isomorphic-boundary-analysis\",\n visitor: {\n Program(path) {\n const seen = new Set<string>();\n path.traverse({\n JSXOpeningElement(elementPath) {\n if (\n elementPath.node.name.type !== \"JSXIdentifier\" ||\n !isIsomorphicBoundary(elementPath, elementPath.node.name.name)\n ) {\n return;\n }\n const component = isomorphicComponentAttribute(elementPath);\n const imported = importedComponent(\n elementPath,\n component.node.name,\n );\n const key = `${imported.source}\\0${imported.importedName}\\0${component.node.name}`;\n if (seen.has(key)) return;\n seen.add(key);\n imports.push({ ...imported, localName: component.node.name });\n },\n });\n },\n },\n });\n}\n\n// Returns the local identifier for the runtime's createIsomorphicReference\n// when at least one boundary was rewritten, undefined otherwise.\nexport function rewriteIsomorphicBoundaries(\n path: NodePath<babel.types.Program>,\n t: typeof babel.types,\n references: readonly CompiledIsomorphicImport[],\n): babel.types.Identifier | undefined {\n if (references.length === 0) return undefined;\n const byLocalName = new Map(\n references.map((reference) => [reference.localName, reference]),\n );\n const createReference = path.scope.generateUidIdentifier(\n \"createIsomorphicReference\",\n );\n let count = 0;\n\n path.traverse({\n JSXOpeningElement(elementPath) {\n if (\n elementPath.node.name.type !== \"JSXIdentifier\" ||\n !isIsomorphicBoundary(elementPath, elementPath.node.name.name)\n ) {\n return;\n }\n const component = isomorphicComponentAttribute(elementPath);\n const reference = byLocalName.get(component.node.name);\n if (reference === undefined) return;\n component.replaceWith(\n t.callExpression(t.cloneNode(createReference), [\n t.stringLiteral(reference.referenceId),\n ]),\n );\n count += 1;\n },\n });\n if (count === 0) return undefined;\n\n path.scope.crawl();\n for (const localName of byLocalName.keys()) {\n const binding = path.scope.getBinding(localName);\n if (\n binding?.referenced ||\n (!binding?.path.isImportSpecifier() &&\n !binding?.path.isImportDefaultSpecifier())\n ) {\n continue;\n }\n const declaration = binding.path.parentPath;\n binding.path.remove();\n if (\n declaration.isImportDeclaration() &&\n declaration.node.specifiers.length === 0\n ) {\n declaration.remove();\n }\n }\n return createReference;\n}\n\nfunction isIsomorphicBoundary(path: NodePath, localName: string): boolean {\n return isImportedBinding(path, localName, \"Isomorphic\", payloadPackageId);\n}\n\nfunction isomorphicComponentAttribute(\n path: NodePath<babel.types.JSXOpeningElement>,\n): NodePath<babel.types.Identifier> {\n const attribute = path\n .get(\"attributes\")\n .find(\n (candidate) =>\n candidate.isJSXAttribute() &&\n candidate.node.name.type === \"JSXIdentifier\" &&\n candidate.node.name.name === \"component\",\n );\n if (attribute === undefined || !attribute.isJSXAttribute()) {\n throw path.buildCodeFrameError(\n \"Isomorphic requires a component prop containing a statically imported component.\",\n );\n }\n const value = attribute.get(\"value\");\n if (!value.isJSXExpressionContainer()) {\n throw attribute.buildCodeFrameError(\n \"Isomorphic component must be a statically imported component identifier.\",\n );\n }\n const expression = value.get(\"expression\");\n if (Array.isArray(expression) || !expression.isIdentifier()) {\n throw value.buildCodeFrameError(\n \"Isomorphic component must be a statically imported component identifier.\",\n );\n }\n return expression;\n}\n\nfunction importedComponent(\n path: NodePath,\n localName: string,\n): Omit<IsomorphicImport, \"localName\"> {\n const binding = path.scope.getBinding(localName);\n if (\n binding === undefined ||\n (!binding.path.isImportSpecifier() &&\n !binding.path.isImportDefaultSpecifier()) ||\n !binding.path.parentPath.isImportDeclaration()\n ) {\n throw path.buildCodeFrameError(\n \"Isomorphic component must be a statically imported component identifier.\",\n );\n }\n const importedName = binding.path.isImportDefaultSpecifier()\n ? \"default\"\n : binding.path.node.imported.type === \"Identifier\"\n ? binding.path.node.imported.name\n : binding.path.node.imported.value;\n return {\n importedName,\n source: binding.path.parentPath.node.source.value,\n };\n}\n","import type { NodePath, PluginObject } from \"@babel/core\";\nimport type * as babel from \"@babel/core\";\nimport { isComponentName } from \"./compiler-options.ts\";\nimport { cleanModuleId, hasModuleQuery } from \"./module-ids.ts\";\n\nexport function stylesheetImportAnalysisPlugin(\n stylesheets: string[],\n): () => PluginObject {\n return () => ({\n name: \"fig-tanstack-start-stylesheet-import-analysis\",\n visitor: {\n ImportDeclaration(path) {\n const source = path.node.source.value;\n if (isStylesheetSpecifier(source)) stylesheets.push(source);\n },\n },\n });\n}\n\nexport function rewriteStylesheetImports(\n path: NodePath<babel.types.Program>,\n t: typeof babel.types,\n): babel.types.Identifier[] {\n const hrefs: babel.types.Identifier[] = [];\n for (const statement of path.get(\"body\")) {\n if (!statement.isImportDeclaration()) continue;\n const source = statement.node.source.value;\n if (!isStylesheetSpecifier(source)) continue;\n\n const existingUrl = hasUrlQuery(source);\n const defaultSpecifier = statement.node.specifiers.find(\n (specifier): specifier is babel.types.ImportDefaultSpecifier =>\n t.isImportDefaultSpecifier(specifier),\n );\n if (existingUrl && defaultSpecifier !== undefined) {\n hrefs.push(defaultSpecifier.local);\n continue;\n }\n\n const local = path.scope.generateUidIdentifier(\"figPayloadStylesheet\");\n if (statement.node.specifiers.length === 0) {\n statement.node.source = t.stringLiteral(withUrlQuery(source));\n statement.node.specifiers.push(t.importDefaultSpecifier(local));\n } else {\n statement.insertAfter(\n t.importDeclaration(\n [t.importDefaultSpecifier(local)],\n t.stringLiteral(withUrlQuery(source)),\n ),\n );\n }\n hrefs.push(local);\n }\n return hrefs;\n}\n\nexport function collectComponentNames(\n path: NodePath<babel.types.Program>,\n t: typeof babel.types,\n): string[] {\n const names = new Set<string>();\n for (const statement of path.get(\"body\")) {\n const declaration =\n statement.isExportNamedDeclaration() ||\n statement.isExportDefaultDeclaration()\n ? statement.get(\"declaration\")\n : statement;\n if (Array.isArray(declaration)) continue;\n\n if (declaration.isFunctionDeclaration()) {\n const name = declaration.node.id?.name;\n if (name !== undefined && isComponentName(name)) names.add(name);\n continue;\n }\n if (!declaration.isVariableDeclaration()) continue;\n\n for (const declarator of declaration.node.declarations) {\n if (\n t.isIdentifier(declarator.id) &&\n isComponentName(declarator.id.name) &&\n (t.isArrowFunctionExpression(declarator.init) ||\n t.isFunctionExpression(declarator.init))\n ) {\n names.add(declarator.id.name);\n }\n }\n }\n return [...names];\n}\n\nexport function isStylesheetSpecifier(source: string): boolean {\n const path = cleanModuleId(source);\n return /\\.(?:css|less|sass|scss|styl|stylus|pcss|postcss)$/.test(path);\n}\n\nfunction hasUrlQuery(source: string): boolean {\n return hasModuleQuery(source, \"url\");\n}\n\n// Vite's url plugin only matches the bare `?url` flag, so this cannot use\n// withModuleQuery's `name=value` form.\nfunction withUrlQuery(source: string): string {\n if (hasUrlQuery(source)) return source;\n return `${source}${source.includes(\"?\") ? \"&\" : \"?\"}url`;\n}\n","import * as babel from \"@babel/core\";\nimport type { NodePath, PluginObject } from \"@babel/core\";\nimport { payloadStylesheetsSymbolKey } from \"../payload-assets.ts\";\nimport {\n babelOptions,\n isComponentName,\n isImportedBinding,\n isSourceModule,\n serverPackageId,\n} from \"./compiler-options.ts\";\nimport {\n type CompiledIsomorphicImport,\n type IsomorphicImport,\n isomorphicBoundaryAnalysisPlugin,\n rewriteIsomorphicBoundaries,\n} from \"./isomorphic-compiler.ts\";\nimport {\n cleanModuleId,\n hasModuleQuery,\n payloadModuleQuery,\n withModuleQuery,\n} from \"./module-ids.ts\";\nimport {\n collectComponentNames,\n isStylesheetSpecifier,\n rewriteStylesheetImports,\n stylesheetImportAnalysisPlugin,\n} from \"./payload-stylesheet-compiler.ts\";\n\nexport const payloadRuntimeId = \"virtual:fig-tanstack-start/payload-runtime\";\nexport const resolvedPayloadRuntimeId = `\\0${payloadRuntimeId}`;\n\nconst figRuntimePackageIds: readonly string[] = [\n \"@bgub/fig\",\n \"@bgub/fig-devtools\",\n \"@bgub/fig-dom\",\n \"@bgub/fig-reconciler\",\n \"@bgub/fig-refresh\",\n \"@bgub/fig-server\",\n \"@bgub/fig-tanstack-router\",\n \"@bgub/fig-tanstack-start\",\n \"@bgub/fig-vite\",\n];\n\nexport async function analyzeStylesheetImports(\n code: string,\n id: string,\n): Promise<string[]> {\n const clean = cleanModuleId(id);\n if (!isSourceModule(clean)) return [];\n const stylesheets: string[] = [];\n await babel.transformAsync(code, {\n ...babelOptions(clean),\n plugins: [stylesheetImportAnalysisPlugin(stylesheets)],\n });\n return stylesheets;\n}\n\nexport async function analyzeIsomorphicBoundaries(\n code: string,\n id: string,\n): Promise<IsomorphicImport[]> {\n const clean = cleanModuleId(id);\n if (!isSourceModule(clean) || !code.includes(\"Isomorphic\")) return [];\n\n const imports: IsomorphicImport[] = [];\n await babel.transformAsync(code, {\n ...babelOptions(clean),\n plugins: [isomorphicBoundaryAnalysisPlugin(imports)],\n });\n return imports;\n}\n\n// Cheap pre-parse gate shared with the Vite transform hook, so callers can\n// skip boundary analysis for modules this transform cannot apply to.\nexport function mayBePayloadModule(code: string, id: string): boolean {\n return (\n isSourceModule(cleanModuleId(id)) &&\n (hasModuleQuery(id, payloadModuleQuery) ||\n code.includes(\"renderPayloadResponse\"))\n );\n}\n\nexport async function transformPayloadModule(\n code: string,\n id: string,\n isomorphicImports: readonly CompiledIsomorphicImport[] = [],\n) {\n if (!mayBePayloadModule(code, id)) return null;\n\n const state = { changed: false };\n const result = await babel.transformAsync(code, {\n ...babelOptions(cleanModuleId(id)),\n sourceMaps: true,\n plugins: [\n payloadBabelPlugin(\n isomorphicImports,\n hasModuleQuery(id, payloadModuleQuery),\n state,\n ),\n ],\n });\n\n if (!state.changed || result?.code == null) return null;\n return {\n code: result.code,\n map: result.map == null ? null : JSON.stringify(result.map),\n };\n}\n\nexport function payloadRuntimeCode(): string {\n return `import { clientReference } from \"@bgub/fig\";\nconst stylesheetKey = Symbol.for(${JSON.stringify(payloadStylesheetsSymbolKey)});\nexport function createIsomorphicReference(id) {\n return clientReference({ id });\n}\nexport function registerPayloadStylesheets(components, hrefs) {\n for (const component of components) {\n if (typeof component === \"function\") {\n Object.defineProperty(component, stylesheetKey, { configurable: true, value: hrefs });\n }\n }\n}`;\n}\n\nfunction payloadBabelPlugin(\n isomorphicImports: readonly CompiledIsomorphicImport[],\n compiledPayloadModule: boolean,\n state: { changed: boolean },\n): (api: typeof babel) => PluginObject {\n return (api: typeof babel) => {\n const t = api.types;\n\n return {\n name: \"fig-tanstack-start-payload\",\n visitor: {\n Program: {\n exit(path: NodePath<babel.types.Program>) {\n if (!compiledPayloadModule && !callsRenderPayloadResponse(path)) {\n return;\n }\n const components = collectComponentNames(path, t);\n const hrefs =\n components.length === 0 ? [] : rewriteStylesheetImports(path, t);\n const createReference = rewriteIsomorphicBoundaries(\n path,\n t,\n isomorphicImports,\n );\n\n if (rewritePayloadComponentImports(path) > 0) state.changed = true;\n\n const runtimeSpecifiers: babel.types.ImportSpecifier[] = [];\n if (createReference !== undefined) {\n runtimeSpecifiers.push(\n t.importSpecifier(\n createReference,\n t.identifier(\"createIsomorphicReference\"),\n ),\n );\n }\n let registerStylesheets: babel.types.Identifier | undefined;\n if (hrefs.length > 0) {\n registerStylesheets = path.scope.generateUidIdentifier(\n \"registerPayloadStylesheets\",\n );\n runtimeSpecifiers.push(\n t.importSpecifier(\n registerStylesheets,\n t.identifier(\"registerPayloadStylesheets\"),\n ),\n );\n }\n if (runtimeSpecifiers.length === 0) return;\n state.changed = true;\n\n path.node.body.unshift(\n t.importDeclaration(\n runtimeSpecifiers,\n t.stringLiteral(payloadRuntimeId),\n ),\n );\n if (registerStylesheets !== undefined) {\n path.node.body.push(\n t.expressionStatement(\n t.callExpression(registerStylesheets, [\n t.arrayExpression(\n components.map((name) => t.identifier(name)),\n ),\n t.arrayExpression(hrefs),\n ]),\n ),\n );\n }\n },\n },\n },\n };\n };\n}\n\nfunction callsRenderPayloadResponse(\n path: NodePath<babel.types.Program>,\n): boolean {\n let found = false;\n path.traverse({\n CallExpression(callPath) {\n if (\n callPath.node.callee.type === \"Identifier\" &&\n isImportedBinding(\n callPath,\n callPath.node.callee.name,\n \"renderPayloadResponse\",\n serverPackageId,\n )\n ) {\n found = true;\n callPath.stop();\n }\n },\n });\n return found;\n}\n\n// Returns the number of import declarations marked with the payload query.\nfunction rewritePayloadComponentImports(\n path: NodePath<babel.types.Program>,\n): number {\n const componentBindings = new Set<string>();\n path.traverse({\n JSXOpeningElement(elementPath) {\n if (elementPath.node.name.type === \"JSXNamespacedName\") return;\n const name = rootJsxIdentifier(elementPath.node.name);\n if (name !== undefined) componentBindings.add(name);\n },\n CallExpression(callPath) {\n if (\n callPath.node.callee.type !== \"Identifier\" ||\n !isImportedBinding(\n callPath,\n callPath.node.callee.name,\n \"createElement\",\n \"@bgub/fig\",\n )\n ) {\n return;\n }\n const [type] = callPath.node.arguments;\n if (type?.type === \"Identifier\" && isComponentName(type.name)) {\n componentBindings.add(type.name);\n }\n },\n });\n\n let count = 0;\n for (const statement of path.get(\"body\")) {\n if (!statement.isImportDeclaration()) continue;\n const source = statement.node.source.value;\n if (\n statement.node.importKind === \"type\" ||\n isStylesheetSpecifier(source) ||\n isFigRuntimeSpecifier(source) ||\n hasModuleQuery(source, payloadModuleQuery) ||\n !statement.node.specifiers.some(\n (specifier) =>\n !(\"importKind\" in specifier && specifier.importKind === \"type\") &&\n componentBindings.has(specifier.local.name),\n )\n ) {\n continue;\n }\n statement.node.source.value = withModuleQuery(\n source,\n payloadModuleQuery,\n \"1\",\n );\n count += 1;\n }\n return count;\n}\n\nfunction isFigRuntimeSpecifier(source: string): boolean {\n return figRuntimePackageIds.some(\n (packageId) => source === packageId || source.startsWith(`${packageId}/`),\n );\n}\n\nfunction rootJsxIdentifier(\n name: babel.types.JSXIdentifier | babel.types.JSXMemberExpression,\n): string | undefined {\n let current: typeof name = name;\n while (current.type === \"JSXMemberExpression\") current = current.object;\n return current.type === \"JSXIdentifier\" && isComponentName(current.name)\n ? current.name\n : undefined;\n}\n","import * as babel from \"@babel/core\";\nimport type { NodePath, PluginObject } from \"@babel/core\";\nimport { tanStackCompatibilityProfile } from \"./compatibility-profile.ts\";\nimport {\n babelOptions,\n isImportedBinding,\n isSourceModule,\n payloadPackageId,\n serverPackageId,\n} from \"./compiler-options.ts\";\nimport { cleanModuleId } from \"./module-ids.ts\";\n\nconst compiledServerPayloadMarkerKey =\n \"fig.tanstack-start.compiled-server-payload\";\n\nexport async function transformServerPayloadDefinitions(\n code: string,\n id: string,\n) {\n const clean = cleanModuleId(id);\n if (!isSourceModule(clean) || !code.includes(\"serverPayload\")) return null;\n\n const state = { transformed: false };\n const result = await babel.transformAsync(code, {\n ...babelOptions(clean),\n sourceMaps: true,\n plugins: [serverPayloadBabelPlugin(state)],\n });\n\n if (!state.transformed || result?.code == null) return null;\n return {\n code: result.code,\n map: result.map == null ? null : JSON.stringify(result.map),\n };\n}\n\nfunction serverPayloadBabelPlugin(state: {\n transformed: boolean;\n}): (api: typeof babel) => PluginObject {\n return (api: typeof babel) => {\n const t = api.types;\n let createElement: babel.types.Identifier;\n let createServerFn: babel.types.Identifier;\n let renderPayloadResponse: babel.types.Identifier;\n\n return {\n name: \"fig-tanstack-start-server-payload\",\n visitor: {\n Program: {\n enter(path: NodePath<babel.types.Program>) {\n createElement = path.scope.generateUidIdentifier(\"createElement\");\n createServerFn = path.scope.generateUidIdentifier(\"createServerFn\");\n renderPayloadResponse = path.scope.generateUidIdentifier(\n \"renderPayloadResponse\",\n );\n },\n exit(path: NodePath<babel.types.Program>) {\n if (!state.transformed) return;\n path.node.body.unshift(\n t.importDeclaration(\n [\n t.importSpecifier(\n createElement,\n t.identifier(\"createElement\"),\n ),\n ],\n t.stringLiteral(\"@bgub/fig\"),\n ),\n );\n path.node.body.unshift(\n t.importDeclaration(\n [\n t.importSpecifier(\n renderPayloadResponse,\n t.identifier(\"renderPayloadResponse\"),\n ),\n ],\n t.stringLiteral(serverPackageId),\n ),\n );\n path.node.body.unshift(\n t.importDeclaration(\n [\n t.importSpecifier(\n createServerFn,\n t.identifier(\"createServerFn\"),\n ),\n ],\n t.stringLiteral(\n tanStackCompatibilityProfile.packages.frameworkStart,\n ),\n ),\n );\n },\n },\n CallExpression(path: NodePath<babel.types.CallExpression>) {\n if (\n path.node.callee.type !== \"Identifier\" ||\n !isImportedBinding(\n path,\n path.node.callee.name,\n \"serverPayload\",\n payloadPackageId,\n )\n ) {\n return;\n }\n\n transformServerPayloadCall(\n path,\n t,\n createElement,\n createServerFn,\n renderPayloadResponse,\n );\n state.transformed = true;\n },\n },\n };\n };\n}\n\nfunction transformServerPayloadCall(\n path: NodePath<babel.types.CallExpression>,\n t: typeof babel.types,\n createElement: babel.types.Identifier,\n createServerFn: babel.types.Identifier,\n renderPayloadResponse: babel.types.Identifier,\n): void {\n const [render, ...extra] = path.node.arguments;\n if (\n render === undefined ||\n render.type === \"SpreadElement\" ||\n render.type === \"ArgumentPlaceholder\" ||\n extra.length > 0\n ) {\n throw path.buildCodeFrameError(\n \"serverPayload requires exactly one server component or render callback.\",\n );\n }\n if (!isRenderExpression(render)) {\n throw path.buildCodeFrameError(\n \"serverPayload requires a component reference or inline render callback.\",\n );\n }\n const statement = path.getStatementParent();\n if (\n path.getFunctionParent() !== null ||\n statement === null ||\n !statement.parentPath.isProgram()\n ) {\n throw path.buildCodeFrameError(\n \"serverPayload must be declared in a top-level statement.\",\n );\n }\n\n const declarator = path.findParent((candidate) =>\n candidate.isVariableDeclarator(),\n );\n const requestName =\n declarator?.isVariableDeclarator() &&\n declarator.node.id.type === \"Identifier\"\n ? `${declarator.node.id.name}Request`\n : \"payloadRequest\";\n const request = statement.scope.generateUidIdentifier(requestName);\n const data = statement.scope.generateUidIdentifier(\"data\");\n const input = statement.scope.generateUidIdentifier(\"input\");\n const signal = statement.scope.generateUidIdentifier(\"signal\");\n\n const serverFn = t.callExpression(\n t.memberExpression(\n t.callExpression(createServerFn, []),\n t.identifier(\"handler\"),\n ),\n [\n t.arrowFunctionExpression(\n [\n t.objectPattern([\n t.objectProperty(t.identifier(\"data\"), data, false, false),\n ]),\n ],\n t.callExpression(renderPayloadResponse, [\n t.callExpression(createElement, [render, data]),\n ]),\n ),\n ],\n );\n\n statement.insertBefore(\n t.variableDeclaration(\"const\", [t.variableDeclarator(request, serverFn)]),\n );\n const proxy = t.arrowFunctionExpression(\n [\n input,\n t.objectPattern([\n t.objectProperty(t.identifier(\"signal\"), signal, false, false),\n ]),\n ],\n t.callExpression(request, [\n t.objectExpression([\n t.objectProperty(t.identifier(\"data\"), input, false, false),\n t.objectProperty(t.identifier(\"signal\"), signal, false, false),\n ]),\n ]),\n );\n path.node.arguments = [\n t.callExpression(\n t.memberExpression(t.identifier(\"Object\"), t.identifier(\"assign\")),\n [\n proxy,\n t.objectExpression([\n t.objectProperty(\n t.callExpression(\n t.memberExpression(t.identifier(\"Symbol\"), t.identifier(\"for\")),\n [t.stringLiteral(compiledServerPayloadMarkerKey)],\n ),\n t.booleanLiteral(true),\n true,\n ),\n ]),\n ],\n ),\n ];\n}\n\nfunction isRenderExpression(\n value: babel.types.Expression,\n): value is\n | babel.types.ArrowFunctionExpression\n | babel.types.FunctionExpression\n | babel.types.Identifier\n | babel.types.MemberExpression {\n return (\n value.type === \"ArrowFunctionExpression\" ||\n (value.type === \"FunctionExpression\" && !value.generator) ||\n value.type === \"Identifier\" ||\n value.type === \"MemberExpression\"\n );\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nexport async function writePublicAsset(\n path: string,\n source: string | Uint8Array,\n): Promise<void> {\n const bytes = Buffer.from(source);\n let existing: Buffer | undefined;\n try {\n existing = await readFile(path);\n } catch (error) {\n if (!isMissingFile(error)) throw error;\n }\n\n if (existing !== undefined) {\n if (existing.equals(bytes)) return;\n throw new Error(\n `TanStack Start server asset ${JSON.stringify(path)} conflicts with a different client asset at the same public path. Use content-hashed or separately namespaced asset file names.`,\n );\n }\n\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, bytes);\n}\n\nfunction isMissingFile(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n","import { readFile } from \"node:fs/promises\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport { START_ENVIRONMENT_NAMES } from \"@tanstack/start-plugin-core/vite\";\nimport type { EnvironmentModuleNode, PluginOption } from \"vite\";\nimport { rewriteFrameworkImports } from \"./compatibility-profile.ts\";\nimport {\n isomorphicReferenceId,\n type ManifestReference,\n payloadManifestDefinitionCode,\n payloadManifestId,\n payloadManifestRuntimeCode,\n payloadReferenceIds,\n resolvedPayloadManifestId,\n} from \"./isomorphic-manifest.ts\";\nimport {\n cleanModuleId,\n decodeOpaqueId,\n encodeOpaqueId,\n hasModuleQuery,\n payloadManifestDefinitionQuery,\n payloadModuleQuery,\n toViteModulePath,\n withModuleQuery,\n} from \"./module-ids.ts\";\nimport type { IsomorphicImport } from \"./isomorphic-compiler.ts\";\nimport {\n analyzeIsomorphicBoundaries,\n analyzeStylesheetImports,\n mayBePayloadModule,\n payloadRuntimeCode,\n payloadRuntimeId,\n resolvedPayloadRuntimeId,\n transformPayloadModule,\n} from \"./payload-compiler.ts\";\nimport { transformServerPayloadDefinitions } from \"./server-payload-compiler.ts\";\nimport { writePublicAsset } from \"./public-assets.ts\";\n\nconst payloadManifestDefinitionPrefix =\n \"\\0fig-tanstack-start:payload-manifest-definition:\";\n\nexport function serverPayloadPlugin(): PluginOption {\n return {\n name: \"fig-tanstack-start:server-payload\",\n enforce: \"pre\",\n transform: transformServerPayloadDefinitions,\n };\n}\n\nexport function payloadPlugin(): PluginOption {\n let root = process.cwd();\n let base = \"/\";\n let clientOutDir: string | undefined;\n let serverAssetsPrefix = \"assets/\";\n // Start runs the client build before the server build with this plugin\n // instance. Retain Vite's final client CSS names for the server manifest.\n const clientStylesheets = new Map<string, string[]>();\n // Loaded manifest definitions read their source — and each referenced\n // component's stylesheet imports — through the filesystem, so the module\n // graph cannot see when those analyzed inputs change; hotUpdate compares\n // these fingerprints to reload only affected definitions.\n const definitionInputs = new Map<string, DefinitionInputs>();\n\n return {\n name: \"fig-tanstack-start:payload\",\n enforce: \"pre\",\n configEnvironment(environmentName) {\n if (environmentName === START_ENVIRONMENT_NAMES.server) {\n return { build: { emitAssets: true } };\n }\n return undefined;\n },\n configResolved(config) {\n root = config.root;\n base = config.base;\n const outDir =\n config.environments[START_ENVIRONMENT_NAMES.client]?.build.outDir;\n if (outDir !== undefined) clientOutDir = resolve(config.root, outDir);\n const assetsDir =\n config.environments[START_ENVIRONMENT_NAMES.server]?.build.assetsDir;\n if (assetsDir !== undefined) {\n const normalized = assetsDir.replace(/\\/+$/, \"\");\n serverAssetsPrefix = normalized === \"\" ? \"\" : `${normalized}/`;\n }\n },\n async writeBundle(_options, bundle) {\n if (\n this.environment.name !== START_ENVIRONMENT_NAMES.server ||\n clientOutDir === undefined\n ) {\n return;\n }\n\n const publicOutDir = clientOutDir;\n await Promise.all(\n Object.values(bundle).map(async (output) => {\n if (\n output.type !== \"asset\" ||\n !output.fileName.startsWith(serverAssetsPrefix) ||\n output.fileName.endsWith(\".map\")\n ) {\n return;\n }\n const path = resolve(publicOutDir, output.fileName);\n await writePublicAsset(path, output.source);\n }),\n );\n },\n generateBundle(_options, bundle) {\n if (this.environment.name !== START_ENVIRONMENT_NAMES.client) return;\n collectClientStylesheets(bundle, clientStylesheets, base);\n },\n async resolveId(source, importer) {\n if (source === payloadRuntimeId) return resolvedPayloadRuntimeId;\n if (source === payloadManifestId) return resolvedPayloadManifestId;\n if (hasModuleQuery(source, payloadModuleQuery)) {\n const resolved = await this.resolve(cleanModuleId(source), importer, {\n skipSelf: true,\n });\n return resolved === null\n ? null\n : withModuleQuery(\n cleanModuleId(resolved.id),\n payloadModuleQuery,\n \"1\",\n );\n }\n if (!hasModuleQuery(source, payloadManifestDefinitionQuery)) {\n return undefined;\n }\n\n const resolved = await this.resolve(cleanModuleId(source), importer, {\n skipSelf: true,\n });\n if (resolved === null) return null;\n // Start protects .server modules from the client graph. The manifest\n // needs only their compiled definitions, so expose those definitions\n // through a private virtual id before import protection runs.\n return definitionModuleId(cleanModuleId(resolved.id));\n },\n async load(id) {\n if (id === resolvedPayloadRuntimeId) return payloadRuntimeCode();\n if (id === resolvedPayloadManifestId) {\n return payloadManifestRuntimeCode(clientStylesheets);\n }\n if (!id.startsWith(payloadManifestDefinitionPrefix)) return undefined;\n\n const sourceId = decodeOpaqueId(\n id.slice(payloadManifestDefinitionPrefix.length),\n );\n const code = rewriteFrameworkImports(await readFile(sourceId, \"utf8\"));\n const stylesheetSources = new Map<string, string>();\n const references = await collectPayloadReferences(\n sourceId,\n code,\n (source, importer) =>\n this.resolve(source, importer, { skipSelf: true }),\n root,\n stylesheetSources,\n );\n if (references.length > 0) {\n this.addWatchFile(sourceId);\n definitionInputs.set(sourceId, {\n boundaries: boundaryFingerprint(references),\n stylesheetSources,\n });\n } else {\n // A missing entry means the empty fingerprint, so the map only holds\n // the few definitions that actually have boundaries.\n definitionInputs.delete(sourceId);\n }\n return payloadManifestDefinitionCode(references);\n },\n async hotUpdate({ file, modules, read }) {\n const { moduleGraph } = this.environment;\n const invalidated = new Set<EnvironmentModuleNode>();\n let content: string | undefined;\n const readContent = async () => (content ??= await read());\n\n const definition = moduleGraph.getModuleById(definitionModuleId(file));\n if (definition !== undefined) {\n let changed: boolean;\n try {\n const boundaries = boundaryFingerprint(\n await analyzeIsomorphicBoundaries(\n rewriteFrameworkImports(await readContent()),\n file,\n ),\n );\n changed =\n (definitionInputs.get(file)?.boundaries ??\n emptyBoundaryFingerprint) !== boundaries;\n } catch {\n // Mid-edit analysis failures surface through the module's own\n // transform; reload the definition so the manifest cannot go stale.\n changed = true;\n }\n if (changed) invalidated.add(definition);\n }\n\n // The changed file may be a component module whose stylesheet imports\n // are embedded in other definitions as development hrefs.\n const dependents = [...definitionInputs].filter(([, inputs]) =>\n inputs.stylesheetSources.has(file),\n );\n if (dependents.length > 0) {\n let sources: string | undefined;\n try {\n sources = stylesheetSourceFingerprint(\n await analyzeStylesheetImports(await readContent(), file),\n );\n } catch {\n sources = undefined;\n }\n for (const [sourceId, inputs] of dependents) {\n if (inputs.stylesheetSources.get(file) === sources) continue;\n const dependent = moduleGraph.getModuleById(\n definitionModuleId(sourceId),\n );\n if (dependent !== undefined) invalidated.add(dependent);\n }\n }\n\n if (invalidated.size === 0) return undefined;\n return [...modules, ...invalidated];\n },\n async transform(code, id) {\n if (\n this.environment.name !== START_ENVIRONMENT_NAMES.server ||\n !mayBePayloadModule(code, id)\n ) {\n return null;\n }\n const references = await collectPayloadReferences(\n id,\n code,\n (source, importer) =>\n this.resolve(source, importer, { skipSelf: true }),\n root,\n );\n return transformPayloadModule(code, id, references);\n },\n };\n}\n\ninterface DefinitionInputs {\n boundaries: string;\n // Referenced component module id → fingerprint of its stylesheet imports.\n stylesheetSources: Map<string, string>;\n}\n\nfunction definitionModuleId(sourceId: string): string {\n return `${payloadManifestDefinitionPrefix}${encodeOpaqueId(sourceId)}`;\n}\n\nfunction boundaryFingerprint(imports: readonly IsomorphicImport[]): string {\n return JSON.stringify(\n imports.map(({ importedName, localName, source }) => [\n source,\n importedName,\n localName,\n ]),\n );\n}\n\nconst emptyBoundaryFingerprint = boundaryFingerprint([]);\n\n// hotUpdate has no resolver, so fingerprints use the raw import specifiers\n// rather than resolved stylesheet ids.\nfunction stylesheetSourceFingerprint(sources: readonly string[]): string {\n return JSON.stringify(sources);\n}\n\ntype ResolveModule = (\n source: string,\n importer: string,\n) => Promise<{ id: string } | null>;\n\nasync function collectPayloadReferences(\n id: string,\n code: string,\n resolveModule: ResolveModule,\n root: string,\n stylesheetSources?: Map<string, string>,\n): Promise<ManifestReference[]> {\n const importerId = cleanModuleId(id);\n const imports = await analyzeIsomorphicBoundaries(code, id);\n return Promise.all(\n imports.map(async (imported): Promise<ManifestReference> => {\n const resolved = await resolveModule(imported.source, importerId);\n if (resolved === null) {\n throw new Error(\n `Cannot resolve Isomorphic component import ${JSON.stringify(imported.source)} from ${importerId}.`,\n );\n }\n const moduleId = cleanModuleId(resolved.id);\n const referenceId = isomorphicReferenceId(\n root,\n moduleId,\n imported.importedName,\n );\n let hrefs: string[] = [];\n if (stylesheetSources !== undefined) {\n const stylesheets = await moduleStylesheets(\n moduleId,\n root,\n resolveModule,\n );\n hrefs = stylesheets.hrefs;\n stylesheetSources.set(\n moduleId,\n stylesheetSourceFingerprint(stylesheets.sources),\n );\n }\n return {\n ...imported,\n referenceId,\n resolvedModuleId: moduleId,\n developmentStylesheetHrefs: hrefs,\n };\n }),\n );\n}\n\nasync function moduleStylesheets(\n moduleId: string,\n root: string,\n resolveModule: ResolveModule,\n): Promise<{ hrefs: string[]; sources: string[] }> {\n if (!isAbsolute(moduleId)) return { hrefs: [], sources: [] };\n let code: string;\n try {\n code = await readFile(moduleId, \"utf8\");\n } catch {\n return { hrefs: [], sources: [] };\n }\n const sources = await analyzeStylesheetImports(code, moduleId);\n const hrefs = (\n await Promise.all(\n sources.map(async (source) => {\n const resolved = await resolveModule(source, moduleId);\n return resolved === null\n ? undefined\n : toViteModulePath(root, cleanModuleId(resolved.id));\n }),\n )\n ).filter((href): href is string => href !== undefined);\n return { hrefs, sources };\n}\n\nfunction collectClientStylesheets(\n bundle: OutputBundle,\n clientStylesheets: Map<string, string[]>,\n base: string,\n): void {\n clientStylesheets.clear();\n for (const output of Object.values(bundle)) {\n if (output.type !== \"chunk\") continue;\n const referenceIds = payloadReferenceIds(Object.keys(output.modules));\n for (const referenceId of referenceIds) {\n const stylesheets = new Set(clientStylesheets.get(referenceId));\n for (const file of output.viteMetadata?.importedCss ?? []) {\n stylesheets.add(`${base.replace(/\\/$/, \"\")}/${file}`);\n }\n clientStylesheets.set(referenceId, [...stylesheets]);\n }\n }\n}\n\ntype OutputBundle = Record<string, OutputChunk | OutputAsset>;\n\ninterface OutputAsset {\n type: \"asset\";\n}\n\ninterface OutputChunk {\n modules: Record<string, unknown>;\n type: \"chunk\";\n viteMetadata?: { importedCss?: Set<string> };\n}\n","import {\n START_ENVIRONMENT_NAMES,\n tanStackStartVite,\n type TanStackStartViteInputConfig,\n} from \"@tanstack/start-plugin-core/vite\";\nimport { figRefresh } from \"@bgub/fig-vite\";\nimport type { PluginOption } from \"vite\";\nimport {\n defaultEntryPaths,\n startCompatibilityPlugin,\n} from \"./compatibility-vite.ts\";\nimport { payloadPlugin, serverPayloadPlugin } from \"./payload-vite.ts\";\nimport { tanStackCompatibilityProfile } from \"./compatibility-profile.ts\";\n\nexport function tanstackStart(\n options?: TanStackStartViteInputConfig,\n): PluginOption[] {\n return [\n startCompatibilityPlugin(),\n serverPayloadPlugin(),\n payloadPlugin(),\n tanStackStartVite(\n {\n defaultEntryPaths,\n framework: tanStackCompatibilityProfile.framework,\n providerEnvironmentName: START_ENVIRONMENT_NAMES.server,\n ssrIsProvider: true,\n ssrResolverStrategy: { type: \"default\" },\n },\n options,\n ),\n // Route splitting must run first: it moves component declarations into\n // virtual modules. Refresh then registers the declarations where they\n // actually remain instead of leaving references in the route shell.\n figRefresh(),\n ];\n}\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { FigNode } from "@bgub/fig";
2
+ import { ServerPreloadHeaderOptions } from "@bgub/fig-server";
3
+ import { PayloadRenderOptions } from "@bgub/fig-server/payload";
4
+ import { CreateStartHandlerOptions } from "@tanstack/start-server-core";
5
+ import { AnyRouter } from "@tanstack/router-core";
6
+ //#region src/server.d.ts
7
+ interface RenderRouterToStreamOptions {
8
+ preloadHeader?: boolean | ServerPreloadHeaderOptions;
9
+ request: Request;
10
+ responseHeaders: Headers;
11
+ router: AnyRouter;
12
+ }
13
+ interface CreateFigStartHandlerOptions extends Omit<CreateStartHandlerOptions, "handler"> {
14
+ preloadHeader?: boolean | ServerPreloadHeaderOptions;
15
+ }
16
+ declare function createFigStartHandler({ preloadHeader, ...options }?: CreateFigStartHandlerOptions): (request: Request, opts?: import("@tanstack/start-server-core").RequestOptions<import("@tanstack/router-core").Register> | undefined) => Promise<Response> | Response;
17
+ declare function renderRouterToStream({ preloadHeader, request, responseHeaders, router }: RenderRouterToStreamOptions): Promise<import("@tanstack/router-core/ssr/server").SsrResponse>;
18
+ declare function renderPayloadResponse(node: FigNode, options?: Omit<PayloadRenderOptions, "clientReferenceAssets" | "componentAssets">): Response;
19
+ //#endregion
20
+ export { CreateFigStartHandlerOptions, RenderRouterToStreamOptions, createFigStartHandler, renderPayloadResponse, renderRouterToStream };
package/dist/server.js ADDED
@@ -0,0 +1,111 @@
1
+ import { n as injectPayloadDocument } from "./payload-internal-CZhfVhwH.js";
2
+ import { t as requireStartDataStore } from "./store-CibAGqiI.js";
3
+ import { t as getStartContext } from "./start-context-DZ2gsb5m.js";
4
+ import { t as compiledPayloadAssets } from "./payload-assets-eHfSAMbN.js";
5
+ import { RouterProvider } from "@bgub/fig-tanstack-router";
6
+ import { jsx } from "@bgub/fig-dom/jsx-runtime";
7
+ import { compiledIsomorphicReferenceAssets } from "virtual:fig-tanstack-start/payload-manifest";
8
+ import { renderToDocumentStream } from "@bgub/fig-server";
9
+ import { renderToPayloadStream } from "@bgub/fig-server/payload";
10
+ import { createStartHandler } from "@tanstack/start-server-core";
11
+ import { createSsrStreamResponse, transformReadableStreamWithRouter } from "@tanstack/router-core/ssr/server";
12
+ //#region src/server.tsx
13
+ function createFigStartHandler({ preloadHeader = false, ...options } = {}) {
14
+ return createStartHandler({
15
+ ...options,
16
+ handler: (context) => renderRouterToStream({
17
+ ...context,
18
+ preloadHeader
19
+ })
20
+ });
21
+ }
22
+ async function renderRouterToStream({ preloadHeader = false, request, responseHeaders, router }) {
23
+ const render = renderToDocumentStream(/* @__PURE__ */ jsx(RouterProvider, { router }), {
24
+ dataStore: requireStartDataStore(router.options.context),
25
+ nonce: router.options.ssr?.nonce,
26
+ signal: request.signal
27
+ });
28
+ await render.shellReady;
29
+ try {
30
+ if (preloadHeader !== false) {
31
+ const value = render.getPreloadHeader(preloadHeader === true ? void 0 : preloadHeader);
32
+ if (value !== void 0) mergeLinkHeader(responseHeaders, value);
33
+ }
34
+ const stream = transformReadableStreamWithRouter(router, injectPayloadDocument(render.stream, router.options.ssr?.nonce, render.allReady), { onAbort: (reason) => render.abort(reason) });
35
+ responseHeaders.set("content-type", render.contentType);
36
+ return createSsrStreamResponse(router, new Response(stream, {
37
+ headers: responseHeaders,
38
+ status: router.stores.statusCode.get()
39
+ }));
40
+ } catch (error) {
41
+ render.abort(error);
42
+ throw error;
43
+ }
44
+ }
45
+ function mergeLinkHeader(headers, incoming) {
46
+ const current = headers.get("link");
47
+ if (current === null) {
48
+ headers.set("link", incoming);
49
+ return;
50
+ }
51
+ const values = new Set(splitLinkHeader(current));
52
+ for (const value of splitLinkHeader(incoming)) values.add(value);
53
+ headers.set("link", [...values].join(", "));
54
+ }
55
+ function splitLinkHeader(value) {
56
+ const links = [];
57
+ let angleDepth = 0;
58
+ let escaped = false;
59
+ let quoted = false;
60
+ let start = 0;
61
+ for (let index = 0; index < value.length; index += 1) {
62
+ const character = value[index];
63
+ if (escaped) {
64
+ escaped = false;
65
+ continue;
66
+ }
67
+ if (quoted && character === "\\") {
68
+ escaped = true;
69
+ continue;
70
+ }
71
+ if (character === "\"") {
72
+ quoted = !quoted;
73
+ continue;
74
+ }
75
+ if (quoted) continue;
76
+ if (character === "<") {
77
+ angleDepth += 1;
78
+ continue;
79
+ }
80
+ if (character === ">") {
81
+ angleDepth = Math.max(0, angleDepth - 1);
82
+ continue;
83
+ }
84
+ if (character !== "," || angleDepth !== 0) continue;
85
+ const link = value.slice(start, index).trim();
86
+ if (link !== "") links.push(link);
87
+ start = index + 1;
88
+ }
89
+ const link = value.slice(start).trim();
90
+ if (link !== "") links.push(link);
91
+ return links;
92
+ }
93
+ function renderPayloadResponse(node, options = {}) {
94
+ const payload = renderToPayloadStream(node, {
95
+ ...options,
96
+ clientReferenceAssets: compiledIsomorphicReferenceAssets,
97
+ componentAssets: compiledPayloadAssets,
98
+ signal: options.signal ?? requestAbortSignal()
99
+ });
100
+ payload.allReady.catch(() => void 0);
101
+ return new Response(payload.stream, { headers: { "content-type": payload.contentType } });
102
+ }
103
+ function requestAbortSignal() {
104
+ const context = getStartContext({ throwIfNotFound: false });
105
+ const request = typeof context === "object" && context !== null ? context.request : void 0;
106
+ return request instanceof Request ? request.signal : void 0;
107
+ }
108
+ //#endregion
109
+ export { createFigStartHandler, renderPayloadResponse, renderRouterToStream };
110
+
111
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","names":[],"sources":["../src/server.tsx"],"sourcesContent":["import type { FigNode } from \"@bgub/fig\";\nimport {\n renderToDocumentStream,\n type ServerPreloadHeaderOptions,\n} from \"@bgub/fig-server\";\nimport {\n renderToPayloadStream,\n type PayloadRenderOptions,\n} from \"@bgub/fig-server/payload\";\nimport { RouterProvider } from \"@bgub/fig-tanstack-router\";\nimport {\n createStartHandler,\n type CreateStartHandlerOptions,\n} from \"@tanstack/start-server-core\";\nimport {\n createSsrStreamResponse,\n transformReadableStreamWithRouter,\n} from \"@tanstack/router-core/ssr/server\";\nimport type { AnyRouter } from \"@tanstack/router-core\";\nimport { compiledPayloadAssets } from \"./payload-assets.ts\";\nimport { injectPayloadDocument } from \"./payload-internal.ts\";\nimport { getStartContext } from \"./start-context.ts\";\nimport { requireStartDataStore } from \"./store.ts\";\nimport { compiledIsomorphicReferenceAssets } from \"virtual:fig-tanstack-start/payload-manifest\";\n\nexport interface RenderRouterToStreamOptions {\n preloadHeader?: boolean | ServerPreloadHeaderOptions;\n request: Request;\n responseHeaders: Headers;\n router: AnyRouter;\n}\n\nexport interface CreateFigStartHandlerOptions extends Omit<\n CreateStartHandlerOptions,\n \"handler\"\n> {\n preloadHeader?: boolean | ServerPreloadHeaderOptions;\n}\n\nexport function createFigStartHandler({\n preloadHeader = false,\n ...options\n}: CreateFigStartHandlerOptions = {}) {\n return createStartHandler({\n ...options,\n handler: (context) => renderRouterToStream({ ...context, preloadHeader }),\n });\n}\n\nexport async function renderRouterToStream({\n preloadHeader = false,\n request,\n responseHeaders,\n router,\n}: RenderRouterToStreamOptions) {\n const render = renderToDocumentStream(<RouterProvider router={router} />, {\n dataStore: requireStartDataStore(router.options.context),\n nonce: router.options.ssr?.nonce,\n signal: request.signal,\n });\n await render.shellReady;\n\n try {\n if (preloadHeader !== false) {\n const value = render.getPreloadHeader(\n preloadHeader === true ? undefined : preloadHeader,\n );\n if (value !== undefined) mergeLinkHeader(responseHeaders, value);\n }\n\n // Router Core and the DOM library resolve this Web stream through different\n // Node buffer generics, even though the runtime value is the same.\n const documentStream = injectPayloadDocument(\n render.stream,\n router.options.ssr?.nonce,\n render.allReady,\n );\n const routerStream = documentStream as unknown as Parameters<\n typeof transformReadableStreamWithRouter\n >[1];\n const stream = transformReadableStreamWithRouter(router, routerStream, {\n onAbort: (reason) => render.abort(reason),\n });\n responseHeaders.set(\"content-type\", render.contentType);\n return createSsrStreamResponse(\n router,\n new Response(stream as unknown as BodyInit, {\n headers: responseHeaders,\n status: router.stores.statusCode.get(),\n }),\n );\n } catch (error) {\n render.abort(error);\n throw error;\n }\n}\n\nfunction mergeLinkHeader(headers: Headers, incoming: string): void {\n const current = headers.get(\"link\");\n if (current === null) {\n headers.set(\"link\", incoming);\n return;\n }\n\n const values = new Set(splitLinkHeader(current));\n for (const value of splitLinkHeader(incoming)) values.add(value);\n headers.set(\"link\", [...values].join(\", \"));\n}\n\nfunction splitLinkHeader(value: string): string[] {\n const links: string[] = [];\n let angleDepth = 0;\n let escaped = false;\n let quoted = false;\n let start = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n\n if (escaped) {\n escaped = false;\n continue;\n }\n if (quoted && character === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (character === '\"') {\n quoted = !quoted;\n continue;\n }\n if (quoted) continue;\n if (character === \"<\") {\n angleDepth += 1;\n continue;\n }\n if (character === \">\") {\n angleDepth = Math.max(0, angleDepth - 1);\n continue;\n }\n if (character !== \",\" || angleDepth !== 0) continue;\n\n const link = value.slice(start, index).trim();\n if (link !== \"\") links.push(link);\n start = index + 1;\n }\n\n const link = value.slice(start).trim();\n if (link !== \"\") links.push(link);\n return links;\n}\n\nexport function renderPayloadResponse(\n node: FigNode,\n options: Omit<\n PayloadRenderOptions,\n \"clientReferenceAssets\" | \"componentAssets\"\n > = {},\n): Response {\n const payload = renderToPayloadStream(node, {\n ...options,\n clientReferenceAssets: compiledIsomorphicReferenceAssets,\n componentAssets: compiledPayloadAssets,\n signal: options.signal ?? requestAbortSignal(),\n });\n void payload.allReady.catch(() => undefined);\n return new Response(payload.stream, {\n headers: { \"content-type\": payload.contentType },\n });\n}\n\n// TanStack server-function handlers receive no abort signal; the incoming\n// request in Start's storage context is the render's abort authority.\nfunction requestAbortSignal(): AbortSignal | undefined {\n const context = getStartContext({ throwIfNotFound: false });\n const request =\n typeof context === \"object\" && context !== null\n ? (context as { request?: unknown }).request\n : undefined;\n return request instanceof Request ? request.signal : undefined;\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ //#region src/start-context.ts
2
+ const startStorageKey = Symbol.for("tanstack-start:start-storage-context");
3
+ const globalObject = globalThis;
4
+ function getStartContext(options) {
5
+ const context = globalObject[startStorageKey]?.getStore();
6
+ if (context === void 0 && options?.throwIfNotFound !== false) throw new Error("No TanStack Start context is available outside the server runtime.");
7
+ return context;
8
+ }
9
+ //#endregion
10
+ export { startStorageKey as n, getStartContext as t };
11
+
12
+ //# sourceMappingURL=start-context-DZ2gsb5m.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-context-DZ2gsb5m.js","names":[],"sources":["../src/start-context.ts"],"sourcesContent":["export interface StartStorage {\n getStore(): unknown;\n run<T>(context: unknown, callback: () => T): T;\n}\n\nexport const startStorageKey = Symbol.for(\n \"tanstack-start:start-storage-context\",\n);\n\nconst globalObject = globalThis as typeof globalThis & {\n [startStorageKey]?: StartStorage;\n};\n\nexport function getStartContext(options?: {\n throwIfNotFound?: boolean;\n}): unknown {\n const context = globalObject[startStorageKey]?.getStore();\n if (context === undefined && options?.throwIfNotFound !== false) {\n throw new Error(\n \"No TanStack Start context is available outside the server runtime.\",\n );\n }\n return context;\n}\n"],"mappings":";AAKA,MAAa,kBAAkB,OAAO,IACpC,sCACF;AAEA,MAAM,eAAe;AAIrB,SAAgB,gBAAgB,SAEpB;CACV,MAAM,UAAU,aAAa,gBAAgB,EAAE,SAAS;CACxD,IAAI,YAAY,KAAA,KAAa,SAAS,oBAAoB,OACxD,MAAM,IAAI,MACR,oEACF;CAEF,OAAO;AACT"}
@@ -0,0 +1,9 @@
1
+ //#region src/start-context.d.ts
2
+ declare function getStartContext(options?: {
3
+ throwIfNotFound?: boolean;
4
+ }): unknown;
5
+ //#endregion
6
+ //#region src/storage-context.d.ts
7
+ declare function runWithStartContext<T>(context: unknown, callback: () => T | Promise<T>): Promise<T>;
8
+ //#endregion
9
+ export { getStartContext, runWithStartContext };
@@ -0,0 +1,21 @@
1
+ import { n as startStorageKey, t as getStartContext } from "./start-context-DZ2gsb5m.js";
2
+ //#region src/storage-context.ts
3
+ const globalObject = globalThis;
4
+ const storage = globalObject[startStorageKey] ??= await createStorage();
5
+ async function runWithStartContext(context, callback) {
6
+ return await storage.run(context, callback);
7
+ }
8
+ async function createStorage() {
9
+ if (typeof process !== "undefined" && process.release?.name === "node") {
10
+ const { AsyncLocalStorage } = await import("node:async_hooks");
11
+ return new AsyncLocalStorage();
12
+ }
13
+ return {
14
+ getStore: () => void 0,
15
+ run: (_context, callback) => callback()
16
+ };
17
+ }
18
+ //#endregion
19
+ export { getStartContext, runWithStartContext };
20
+
21
+ //# sourceMappingURL=storage-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-context.js","names":[],"sources":["../src/storage-context.ts"],"sourcesContent":["import {\n getStartContext,\n type StartStorage,\n startStorageKey,\n} from \"./start-context.ts\";\n\nconst globalObject = globalThis as typeof globalThis & {\n [startStorageKey]?: StartStorage;\n};\n\nconst storage = (globalObject[startStorageKey] ??= await createStorage());\n\nexport { getStartContext };\n\nexport async function runWithStartContext<T>(\n context: unknown,\n callback: () => T | Promise<T>,\n): Promise<T> {\n return await storage.run(context, callback);\n}\n\nasync function createStorage(): Promise<StartStorage> {\n if (typeof process !== \"undefined\" && process.release?.name === \"node\") {\n const { AsyncLocalStorage } = await import(\"node:async_hooks\");\n return new AsyncLocalStorage();\n }\n return {\n getStore: () => undefined,\n run: (_context, callback) => callback(),\n };\n}\n"],"mappings":";;AAMA,MAAM,eAAe;AAIrB,MAAM,UAAW,aAAa,qBAAqB,MAAM,cAAc;AAIvE,eAAsB,oBACpB,SACA,UACY;CACZ,OAAO,MAAM,QAAQ,IAAI,SAAS,QAAQ;AAC5C;AAEA,eAAe,gBAAuC;CACpD,IAAI,OAAO,YAAY,eAAe,QAAQ,SAAS,SAAS,QAAQ;EACtE,MAAM,EAAE,sBAAsB,MAAM,OAAO;EAC3C,OAAO,IAAI,kBAAkB;CAC/B;CACA,OAAO;EACL,gBAAgB,KAAA;EAChB,MAAM,UAAU,aAAa,SAAS;CACxC;AACF"}
@@ -0,0 +1,13 @@
1
+ import { isDataStoreController } from "@bgub/fig/internal";
2
+ //#region src/store.ts
3
+ function requireStartDataStore(context) {
4
+ if ((typeof context === "object" || typeof context === "function") && context !== null) {
5
+ const data = Reflect.get(context, "data");
6
+ if (isDataStoreController(data)) return data;
7
+ }
8
+ throw new Error("TanStack Start routers must spread createStartDataContext() into createRouter().");
9
+ }
10
+ //#endregion
11
+ export { requireStartDataStore as t };
12
+
13
+ //# sourceMappingURL=store-CibAGqiI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-CibAGqiI.js","names":[],"sources":["../src/store.ts"],"sourcesContent":["import type { FigDataStoreController } from \"@bgub/fig\";\nimport { isDataStoreController } from \"@bgub/fig/internal\";\n\nexport function requireStartDataStore(\n context: unknown,\n): FigDataStoreController {\n if (\n (typeof context === \"object\" || typeof context === \"function\") &&\n context !== null\n ) {\n const data = Reflect.get(context, \"data\");\n if (isDataStoreController(data)) return data;\n }\n throw new Error(\n \"TanStack Start routers must spread createStartDataContext() into createRouter().\",\n );\n}\n"],"mappings":";;AAGA,SAAgB,sBACd,SACwB;CACxB,KACG,OAAO,YAAY,YAAY,OAAO,YAAY,eACnD,YAAY,MACZ;EACA,MAAM,OAAO,QAAQ,IAAI,SAAS,MAAM;EACxC,IAAI,sBAAsB,IAAI,GAAG,OAAO;CAC1C;CACA,MAAM,IAAI,MACR,kFACF;AACF"}
@@ -0,0 +1,33 @@
1
+ import { i as serializableStartData } from "./payload-internal-CZhfVhwH.js";
2
+ import { t as requireStartDataStore } from "./store-CibAGqiI.js";
3
+ import { createDataStore } from "@bgub/fig";
4
+ import { decodePayloadDataEntries, encodePayloadDataEntries } from "@bgub/fig/internal";
5
+ import { escapeScriptJson } from "@bgub/fig-server/html";
6
+ //#region src/transport.ts
7
+ const startDataScriptId = "__fig_tanstack_start_data__";
8
+ const hydratedStores = /* @__PURE__ */ new WeakSet();
9
+ function createStartDataStore() {
10
+ const dataStore = createDataStore();
11
+ if (typeof document !== "undefined") hydrateDataStore(dataStore, document);
12
+ return dataStore;
13
+ }
14
+ function hydrateStartDataStore(context, source) {
15
+ const dataStore = requireStartDataStore(context);
16
+ hydrateDataStore(dataStore, source);
17
+ return dataStore;
18
+ }
19
+ function serializeStartDataStore(dataStore) {
20
+ return escapeScriptJson(encodePayloadDataEntries(serializableStartData(dataStore.snapshot())));
21
+ }
22
+ function hydrateDataStore(dataStore, source) {
23
+ if (hydratedStores.has(dataStore)) return;
24
+ const element = source.querySelector(`#${startDataScriptId}`);
25
+ if (element === null) return;
26
+ const serialized = JSON.parse(element.textContent ?? "[]");
27
+ dataStore.hydrate(decodePayloadDataEntries(serialized));
28
+ hydratedStores.add(dataStore);
29
+ }
30
+ //#endregion
31
+ export { startDataScriptId as i, hydrateStartDataStore as n, serializeStartDataStore as r, createStartDataStore as t };
32
+
33
+ //# sourceMappingURL=transport-DKcSG44e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-DKcSG44e.js","names":[],"sources":["../src/transport.ts"],"sourcesContent":["import { createDataStore, type FigDataStoreController } from \"@bgub/fig\";\nimport {\n decodePayloadDataEntries,\n encodePayloadDataEntries,\n type PayloadDataHydrationEntry,\n} from \"@bgub/fig/internal\";\nimport { escapeScriptJson } from \"@bgub/fig-server/html\";\nimport { serializableStartData } from \"./payload-internal.ts\";\nimport { requireStartDataStore } from \"./store.ts\";\n\nexport const startDataScriptId = \"__fig_tanstack_start_data__\";\n\nconst hydratedStores = new WeakSet<FigDataStoreController>();\n\nexport function createStartDataStore(): FigDataStoreController {\n const dataStore = createDataStore();\n if (typeof document !== \"undefined\") {\n hydrateDataStore(dataStore, document);\n }\n return dataStore;\n}\n\nexport function hydrateStartDataStore(\n context: unknown,\n source: ParentNode,\n): FigDataStoreController {\n const dataStore = requireStartDataStore(context);\n hydrateDataStore(dataStore, source);\n return dataStore;\n}\n\nexport function serializeStartDataStore(\n dataStore: FigDataStoreController,\n): string {\n return escapeScriptJson(\n encodePayloadDataEntries(serializableStartData(dataStore.snapshot())),\n );\n}\n\nfunction hydrateDataStore(\n dataStore: FigDataStoreController,\n source: ParentNode,\n): void {\n if (hydratedStores.has(dataStore)) return;\n const element = source.querySelector(`#${startDataScriptId}`);\n if (element === null) return;\n const serialized = JSON.parse(\n element.textContent ?? \"[]\",\n ) as PayloadDataHydrationEntry[];\n dataStore.hydrate(decodePayloadDataEntries(serialized));\n hydratedStores.add(dataStore);\n}\n"],"mappings":";;;;;;AAUA,MAAa,oBAAoB;AAEjC,MAAM,iCAAiB,IAAI,QAAgC;AAE3D,SAAgB,uBAA+C;CAC7D,MAAM,YAAY,gBAAgB;CAClC,IAAI,OAAO,aAAa,aACtB,iBAAiB,WAAW,QAAQ;CAEtC,OAAO;AACT;AAEA,SAAgB,sBACd,SACA,QACwB;CACxB,MAAM,YAAY,sBAAsB,OAAO;CAC/C,iBAAiB,WAAW,MAAM;CAClC,OAAO;AACT;AAEA,SAAgB,wBACd,WACQ;CACR,OAAO,iBACL,yBAAyB,sBAAsB,UAAU,SAAS,CAAC,CAAC,CACtE;AACF;AAEA,SAAS,iBACP,WACA,QACM;CACN,IAAI,eAAe,IAAI,SAAS,GAAG;CACnC,MAAM,UAAU,OAAO,cAAc,IAAI,mBAAmB;CAC5D,IAAI,YAAY,MAAM;CACtB,MAAM,aAAa,KAAK,MACtB,QAAQ,eAAe,IACzB;CACA,UAAU,QAAQ,yBAAyB,UAAU,CAAC;CACtD,eAAe,IAAI,SAAS;AAC9B"}
package/package.json CHANGED
@@ -1,5 +1,92 @@
1
1
  {
2
2
  "name": "@bgub/fig-tanstack-start",
3
- "version": "0.0.0-tegami-trusted-publish-setup",
4
- "description": "Placeholder published by Tegami for npm trusted publishing setup."
5
- }
3
+ "version": "0.1.0-alpha.2",
4
+ "description": "TanStack Start adapter for Fig",
5
+ "keywords": [
6
+ "fig",
7
+ "tanstack",
8
+ "start",
9
+ "ssr"
10
+ ],
11
+ "homepage": "https://github.com/bgub/fig",
12
+ "type": "module",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/data.d.ts",
16
+ "import": "./dist/data.js",
17
+ "default": "./dist/data.js"
18
+ },
19
+ "./client": {
20
+ "types": "./dist/client.d.ts",
21
+ "import": "./dist/client.js",
22
+ "default": "./dist/client.js"
23
+ },
24
+ "./payload": {
25
+ "types": "./dist/payload.d.ts",
26
+ "import": "./dist/payload.js",
27
+ "default": "./dist/payload.js"
28
+ },
29
+ "./server": {
30
+ "types": "./dist/server.d.ts",
31
+ "import": "./dist/server.js",
32
+ "default": "./dist/server.js"
33
+ },
34
+ "./plugin/vite": {
35
+ "types": "./dist/plugin/vite.d.ts",
36
+ "import": "./dist/plugin/vite.js",
37
+ "default": "./dist/plugin/vite.js"
38
+ },
39
+ "./package.json": "./package.json"
40
+ },
41
+ "types": "./dist/data.d.ts",
42
+ "files": [
43
+ "dist",
44
+ "CHANGELOG.md",
45
+ "LICENSE",
46
+ "README.md"
47
+ ],
48
+ "author": "Ben Gubler <nebrelbug@gmail.com>",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/bgub/fig",
52
+ "directory": "packages/fig-tanstack-start"
53
+ },
54
+ "bugs": {
55
+ "url": "https://github.com/bgub/fig/issues"
56
+ },
57
+ "license": "MIT",
58
+ "publishConfig": {
59
+ "access": "public"
60
+ },
61
+ "sideEffects": false,
62
+ "dependencies": {
63
+ "@babel/core": "^8.0.1",
64
+ "@babel/preset-typescript": "^8.0.1",
65
+ "@tanstack/router-core": "1.171.15",
66
+ "@tanstack/start-client-core": "1.170.14",
67
+ "@tanstack/start-plugin-core": "1.171.22",
68
+ "@tanstack/start-server-core": "1.169.17",
69
+ "@bgub/fig-vite": "0.1.0-alpha.2"
70
+ },
71
+ "peerDependencies": {
72
+ "vite": ">=7.0.0",
73
+ "@bgub/fig-server": "0.1.0-alpha.2",
74
+ "@bgub/fig": "0.1.0-alpha.2",
75
+ "@bgub/fig-tanstack-router": "0.1.0-alpha.2",
76
+ "@bgub/fig-dom": "0.1.0-alpha.2"
77
+ },
78
+ "devDependencies": {
79
+ "vite": "8.1.4",
80
+ "@bgub/fig-dom": "0.1.0-alpha.2",
81
+ "@bgub/fig-server": "0.1.0-alpha.2",
82
+ "@bgub/fig": "0.1.0-alpha.2",
83
+ "@bgub/fig-tanstack-router": "0.1.0-alpha.2"
84
+ },
85
+ "engines": {
86
+ "node": ">=22.12.0"
87
+ },
88
+ "scripts": {
89
+ "build": "tsdown --config ../../tsdown.config.ts && node ../../scripts/strip-declaration-map-comments.mjs dist",
90
+ "test": "vitest run --config ../../vite.config.ts src"
91
+ }
92
+ }