@tanstack/start-plugin-core 1.131.7 → 1.132.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/esm/{nitro-plugin/build-sitemap.d.ts → build-sitemap.d.ts} +3 -3
  2. package/dist/esm/{nitro-plugin/build-sitemap.js → build-sitemap.js} +19 -24
  3. package/dist/esm/build-sitemap.js.map +1 -0
  4. package/dist/esm/compilers.js +7 -10
  5. package/dist/esm/compilers.js.map +1 -1
  6. package/dist/esm/constants.d.ts +6 -2
  7. package/dist/esm/constants.js +7 -10
  8. package/dist/esm/constants.js.map +1 -1
  9. package/dist/esm/debug.js.map +1 -1
  10. package/dist/esm/dev-server-plugin/extract-html-scripts.js.map +1 -1
  11. package/dist/esm/dev-server-plugin/plugin.d.ts +5 -5
  12. package/dist/esm/dev-server-plugin/plugin.js +117 -79
  13. package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
  14. package/dist/esm/index.d.ts +1 -1
  15. package/dist/esm/index.js +0 -4
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/load-env-plugin/plugin.d.ts +2 -3
  18. package/dist/esm/load-env-plugin/plugin.js +5 -8
  19. package/dist/esm/load-env-plugin/plugin.js.map +1 -1
  20. package/dist/esm/output-directory.d.ts +3 -0
  21. package/dist/esm/output-directory.js +14 -0
  22. package/dist/esm/output-directory.js.map +1 -0
  23. package/dist/esm/plugin.d.ts +6 -290
  24. package/dist/esm/plugin.js +123 -76
  25. package/dist/esm/plugin.js.map +1 -1
  26. package/dist/esm/post-server-build.d.ts +7 -0
  27. package/dist/esm/post-server-build.js +55 -0
  28. package/dist/esm/post-server-build.js.map +1 -0
  29. package/dist/esm/prerender.d.ts +11 -0
  30. package/dist/esm/{nitro-plugin/prerender.js → prerender.js} +85 -73
  31. package/dist/esm/prerender.js.map +1 -0
  32. package/dist/esm/{nitro-plugin/queue.js → queue.js} +7 -10
  33. package/dist/esm/queue.js.map +1 -0
  34. package/dist/esm/resolve-entries.d.ts +8 -0
  35. package/dist/esm/resolve-entries.js +37 -0
  36. package/dist/esm/resolve-entries.js.map +1 -0
  37. package/dist/esm/schema.d.ts +1369 -6719
  38. package/dist/esm/schema.js +52 -85
  39. package/dist/esm/schema.js.map +1 -1
  40. package/dist/esm/start-compiler-plugin.js +2 -2
  41. package/dist/esm/start-compiler-plugin.js.map +1 -1
  42. package/dist/esm/start-manifest-plugin/plugin.d.ts +1 -1
  43. package/dist/esm/start-manifest-plugin/plugin.js +8 -13
  44. package/dist/esm/start-manifest-plugin/plugin.js.map +1 -1
  45. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js +2 -3
  46. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js.map +1 -1
  47. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js +2 -4
  48. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js.map +1 -1
  49. package/dist/esm/start-router-plugin/plugin.js.map +1 -1
  50. package/dist/esm/start-router-plugin/route-tree-client-plugin.js.map +1 -1
  51. package/dist/esm/start-router-plugin/virtual-route-tree-plugin.js.map +1 -1
  52. package/dist/esm/utils.js.map +1 -1
  53. package/package.json +13 -18
  54. package/src/{nitro-plugin/build-sitemap.ts → build-sitemap.ts} +8 -8
  55. package/src/constants.ts +12 -9
  56. package/src/dev-server-plugin/plugin.ts +140 -99
  57. package/src/global.d.ts +0 -2
  58. package/src/index.ts +1 -5
  59. package/src/load-env-plugin/plugin.ts +6 -11
  60. package/src/output-directory.ts +18 -0
  61. package/src/plugin.ts +160 -98
  62. package/src/post-server-build.ts +73 -0
  63. package/src/{nitro-plugin/prerender.ts → prerender.ts} +93 -86
  64. package/src/resolve-entries.ts +52 -0
  65. package/src/schema.ts +88 -121
  66. package/src/start-manifest-plugin/plugin.ts +8 -14
  67. package/dist/cjs/compilers.cjs +0 -416
  68. package/dist/cjs/compilers.cjs.map +0 -1
  69. package/dist/cjs/compilers.d.cts +0 -21
  70. package/dist/cjs/constants.cjs +0 -20
  71. package/dist/cjs/constants.cjs.map +0 -1
  72. package/dist/cjs/constants.d.cts +0 -6
  73. package/dist/cjs/debug.cjs +0 -5
  74. package/dist/cjs/debug.cjs.map +0 -1
  75. package/dist/cjs/debug.d.cts +0 -1
  76. package/dist/cjs/dev-server-plugin/extract-html-scripts.cjs +0 -35
  77. package/dist/cjs/dev-server-plugin/extract-html-scripts.cjs.map +0 -1
  78. package/dist/cjs/dev-server-plugin/extract-html-scripts.d.cts +0 -4
  79. package/dist/cjs/dev-server-plugin/plugin.cjs +0 -121
  80. package/dist/cjs/dev-server-plugin/plugin.cjs.map +0 -1
  81. package/dist/cjs/dev-server-plugin/plugin.d.cts +0 -5
  82. package/dist/cjs/index.cjs +0 -11
  83. package/dist/cjs/index.cjs.map +0 -1
  84. package/dist/cjs/index.d.cts +0 -3
  85. package/dist/cjs/load-env-plugin/plugin.cjs +0 -34
  86. package/dist/cjs/load-env-plugin/plugin.cjs.map +0 -1
  87. package/dist/cjs/load-env-plugin/plugin.d.cts +0 -3
  88. package/dist/cjs/nitro-plugin/build-sitemap.cjs +0 -138
  89. package/dist/cjs/nitro-plugin/build-sitemap.cjs.map +0 -1
  90. package/dist/cjs/nitro-plugin/build-sitemap.d.cts +0 -31
  91. package/dist/cjs/nitro-plugin/plugin.cjs +0 -187
  92. package/dist/cjs/nitro-plugin/plugin.cjs.map +0 -1
  93. package/dist/cjs/nitro-plugin/plugin.d.cts +0 -3
  94. package/dist/cjs/nitro-plugin/prerender.cjs +0 -178
  95. package/dist/cjs/nitro-plugin/prerender.cjs.map +0 -1
  96. package/dist/cjs/nitro-plugin/prerender.d.cts +0 -8
  97. package/dist/cjs/nitro-plugin/queue.cjs +0 -131
  98. package/dist/cjs/nitro-plugin/queue.cjs.map +0 -1
  99. package/dist/cjs/nitro-plugin/queue.d.cts +0 -32
  100. package/dist/cjs/plugin.cjs +0 -227
  101. package/dist/cjs/plugin.cjs.map +0 -1
  102. package/dist/cjs/plugin.d.cts +0 -300
  103. package/dist/cjs/resolve-virtual-entries-plugin/plugin.cjs +0 -80
  104. package/dist/cjs/resolve-virtual-entries-plugin/plugin.cjs.map +0 -1
  105. package/dist/cjs/resolve-virtual-entries-plugin/plugin.d.cts +0 -3
  106. package/dist/cjs/schema.cjs +0 -158
  107. package/dist/cjs/schema.cjs.map +0 -1
  108. package/dist/cjs/schema.d.cts +0 -8878
  109. package/dist/cjs/start-compiler-plugin.cjs +0 -78
  110. package/dist/cjs/start-compiler-plugin.cjs.map +0 -1
  111. package/dist/cjs/start-compiler-plugin.d.cts +0 -13
  112. package/dist/cjs/start-manifest-plugin/plugin.cjs +0 -182
  113. package/dist/cjs/start-manifest-plugin/plugin.cjs.map +0 -1
  114. package/dist/cjs/start-manifest-plugin/plugin.d.cts +0 -6
  115. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.cjs +0 -39
  116. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.cjs.map +0 -1
  117. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.d.cts +0 -6
  118. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.cjs +0 -121
  119. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.cjs.map +0 -1
  120. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.d.cts +0 -2
  121. package/dist/cjs/start-router-plugin/plugin.cjs +0 -45
  122. package/dist/cjs/start-router-plugin/plugin.cjs.map +0 -1
  123. package/dist/cjs/start-router-plugin/plugin.d.cts +0 -3
  124. package/dist/cjs/start-router-plugin/route-tree-client-plugin.cjs +0 -73
  125. package/dist/cjs/start-router-plugin/route-tree-client-plugin.cjs.map +0 -1
  126. package/dist/cjs/start-router-plugin/route-tree-client-plugin.d.cts +0 -6
  127. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.cjs +0 -29
  128. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.cjs.map +0 -1
  129. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.d.cts +0 -3
  130. package/dist/cjs/utils.cjs +0 -18
  131. package/dist/cjs/utils.cjs.map +0 -1
  132. package/dist/cjs/utils.d.cts +0 -8
  133. package/dist/esm/nitro-plugin/build-sitemap.js.map +0 -1
  134. package/dist/esm/nitro-plugin/plugin.d.ts +0 -3
  135. package/dist/esm/nitro-plugin/plugin.js +0 -187
  136. package/dist/esm/nitro-plugin/plugin.js.map +0 -1
  137. package/dist/esm/nitro-plugin/prerender.d.ts +0 -8
  138. package/dist/esm/nitro-plugin/prerender.js.map +0 -1
  139. package/dist/esm/nitro-plugin/queue.js.map +0 -1
  140. package/dist/esm/resolve-virtual-entries-plugin/plugin.d.ts +0 -3
  141. package/dist/esm/resolve-virtual-entries-plugin/plugin.js +0 -63
  142. package/dist/esm/resolve-virtual-entries-plugin/plugin.js.map +0 -1
  143. package/src/nitro-plugin/plugin.ts +0 -252
  144. package/src/resolve-virtual-entries-plugin/plugin.ts +0 -77
  145. /package/dist/esm/{nitro-plugin/queue.d.ts → queue.d.ts} +0 -0
  146. /package/src/{nitro-plugin/queue.ts → queue.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../../src/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { createNitro } from 'nitropack'\nimport { trimPathRight } from '@tanstack/router-core'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { TanStackServerFnPluginEnv } from '@tanstack/server-functions-plugin'\nimport * as vite from 'vite'\nimport { crawlFrameworkPkgs } from 'vitefu'\nimport { createTanStackConfig } from './schema'\nimport { nitroPlugin } from './nitro-plugin/plugin'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin'\nimport {\n CLIENT_DIST_DIR,\n SSR_ENTRY_FILE,\n VITE_ENVIRONMENT_NAMES,\n} from './constants'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { resolveVirtualEntriesPlugin } from './resolve-virtual-entries-plugin/plugin'\nimport type { createTanStackStartOptionsSchema } from './schema'\nimport type { PluginOption, Rollup } from 'vite'\nimport type { z } from 'zod'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nexport type TanStackStartInputConfig = z.input<\n ReturnType<typeof createTanStackStartOptionsSchema>\n>\n\nconst defaultConfig = createTanStackConfig()\nexport function getTanStackStartOptions(opts?: TanStackStartInputConfig) {\n return defaultConfig.parse(opts)\n}\n\nexport type TanStackStartOutputConfig = ReturnType<\n typeof getTanStackStartOptions\n>\n\nexport interface TanStackStartVitePluginCoreOptions {\n framework: CompileStartFrameworkOptions\n getVirtualServerRootHandler: (ctx: {\n routerFilepath: string\n serverEntryFilepath: string\n }) => string\n getVirtualServerEntry: (ctx: { routerFilepath: string }) => string\n getVirtualClientEntry: (ctx: { routerFilepath: string }) => string\n crawlPackages?: (opts: {\n name: string\n peerDependencies: Record<string, any>\n exports?: Record<string, any> | string\n }) => 'include' | 'exclude' | undefined\n}\n// this needs to live outside of the TanStackStartVitePluginCore since it will be invoked multiple times by vite\nlet ssrBundle: Rollup.OutputBundle\n\nexport function TanStackStartVitePluginCore(\n opts: TanStackStartVitePluginCoreOptions,\n startConfig: TanStackStartOutputConfig,\n): Array<PluginOption> {\n return [\n tanStackStartRouter({\n ...startConfig.tsr,\n target: opts.framework,\n autoCodeSplitting: true,\n }),\n resolveVirtualEntriesPlugin(opts, startConfig),\n {\n name: 'tanstack-start-core:config-client',\n async config(viteConfig, { command }) {\n const viteAppBase = trimPathRight(viteConfig.base || '/')\n globalThis.TSS_APP_BASE = viteAppBase\n\n const nitroOutputPublicDir = await (async () => {\n // Create a dummy nitro app to get the resolved public output path\n const dummyNitroApp = await createNitro({\n preset: startConfig.target,\n compatibilityDate: '2024-12-01',\n })\n\n const nitroOutputPublicDir = dummyNitroApp.options.output.publicDir\n await dummyNitroApp.close()\n\n return nitroOutputPublicDir\n })()\n\n const startPackageName = `@tanstack/${opts.framework}-start`\n const routerPackageName = `@tanstack/${opts.framework}-router`\n\n const additionalOptimizeDeps = {\n include: new Set<string>(),\n exclude: new Set<string>(),\n }\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const result = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n if ([routerPackageName, startPackageName].includes(pkgJson.name)) {\n return false\n }\n\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n const internalResult = opts.crawlPackages?.({\n name: pkgJson.name,\n peerDependencies,\n exports: pkgJson.exports,\n })\n if (internalResult) {\n if (internalResult === 'exclude') {\n additionalOptimizeDeps.exclude.add(pkgJson.name)\n } else {\n additionalOptimizeDeps.include.add(pkgJson.name)\n }\n }\n return (\n startPackageName in peerDependencies ||\n routerPackageName in peerDependencies\n )\n }\n return false\n },\n })\n\n return {\n base: viteAppBase,\n environments: {\n [VITE_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: {\n manifest: true,\n rollupOptions: {\n input: {\n main: getClientEntryPath(startConfig),\n },\n output: {\n dir: path.resolve(startConfig.root, CLIENT_DIST_DIR),\n },\n // TODO: this should be removed\n external: ['node:fs', 'node:path', 'node:os', 'node:crypto'],\n },\n },\n },\n [VITE_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n // we don't write to the file system as the below 'capture-output' plugin will\n // capture the output and write it to the virtual file system\n write: false,\n copyPublicDir: false,\n rollupOptions: {\n output: {\n entryFileNames: SSR_ENTRY_FILE,\n },\n plugins: [\n {\n name: 'capture-output',\n generateBundle(_options, bundle) {\n // TODO: can this hook be called more than once?\n ssrBundle = bundle\n },\n },\n ],\n },\n commonjsOptions: {\n include: [/node_modules/],\n },\n },\n },\n },\n resolve: {\n noExternal: [\n '@tanstack/start**',\n `@tanstack/${opts.framework}-start**`,\n ...Object.values(VIRTUAL_MODULES),\n startPackageName,\n ...result.ssr.noExternal.sort(),\n ],\n external: [...result.ssr.external.sort()],\n dedupe: [startPackageName],\n },\n optimizeDeps: {\n exclude: [\n ...Object.values(VIRTUAL_MODULES),\n startPackageName,\n ...result.optimizeDeps.exclude.sort(),\n ...additionalOptimizeDeps.exclude,\n ],\n include: [...additionalOptimizeDeps.include],\n },\n /* prettier-ignore */\n define: {\n // define is an esbuild function that replaces the any instances of given keys with the given values\n // i.e: __FRAMEWORK_NAME__ can be replaced with JSON.stringify(\"TanStack Start\")\n // This is not the same as injecting environment variables.\n\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', startConfig.serverFns.base),\n ...defineReplaceEnv('TSS_OUTPUT_PUBLIC_DIR', nitroOutputPublicDir),\n ...defineReplaceEnv('TSS_APP_BASE', viteAppBase),\n ...(command === 'serve' ? defineReplaceEnv('TSS_SHELL', startConfig.spa?.enabled ? 'true' : 'false') : {}),\n },\n }\n },\n },\n // N.B. TanStackStartCompilerPlugin must be before the TanStackServerFnPluginEnv\n startCompilerPlugin(opts.framework, {\n client: { envName: VITE_ENVIRONMENT_NAMES.client },\n server: { envName: VITE_ENVIRONMENT_NAMES.server },\n }),\n TanStackServerFnPluginEnv({\n // This is the ID that will be available to look up and import\n // our server function manifest and resolve its module\n manifestVirtualImportId: VIRTUAL_MODULES.serverFnManifest,\n client: {\n getRuntimeCode: () =>\n `import { createClientRpc } from '@tanstack/${opts.framework}-start/server-functions-client'`,\n replacer: (d) =>\n `createClientRpc('${d.functionId}', '${startConfig.serverFns.base}')`,\n envName: VITE_ENVIRONMENT_NAMES.client,\n },\n server: {\n getRuntimeCode: () =>\n `import { createServerRpc } from '@tanstack/${opts.framework}-start/server-functions-server'`,\n replacer: (d) =>\n `createServerRpc('${d.functionId}', '${startConfig.serverFns.base}', ${d.fn})`,\n envName: VITE_ENVIRONMENT_NAMES.server,\n },\n }),\n loadEnvPlugin(startConfig),\n startManifestPlugin({ clientEntry: getClientEntryPath(startConfig) }),\n devServerPlugin(),\n nitroPlugin(startConfig, () => ssrBundle),\n {\n name: 'tanstack-start:core:capture-client-bundle',\n applyToEnvironment(e) {\n return e.name === VITE_ENVIRONMENT_NAMES.client\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n globalThis.TSS_CLIENT_BUNDLE = bundle\n },\n },\n ]\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n\nconst getClientEntryPath = (startConfig: TanStackStartOutputConfig) => {\n // when the user specifies a custom client entry path, we need to resolve it\n // relative to the root of the project, keeping in mind that if not specified\n // it will be /~start/default-client-entry which is a virtual path\n // that is resolved by vite to the actual client entry path\n const entry = startConfig.clientEntryPath.startsWith(\n '/~start/default-client-entry',\n )\n ? startConfig.clientEntryPath\n : vite.normalizePath(\n path.join(\n '/@fs',\n path.resolve(startConfig.root, startConfig.clientEntryPath),\n ),\n )\n\n return entry\n}\n"],"names":["nitroOutputPublicDir","_a"],"mappings":";;;;;;;;;;;;;;;;AA6BsB,qBAAqB;AAwB3C,IAAI;AAEY,SAAA,4BACd,MACA,aACqB;AACd,SAAA;AAAA,IACL,oBAAoB;AAAA,MAClB,GAAG,YAAY;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,mBAAmB;AAAA,IAAA,CACpB;AAAA,IACD,4BAA4B,MAAM,WAAW;AAAA,IAC7C;AAAA,MACE,MAAM;AAAA,MACN,MAAM,OAAO,YAAY,EAAE,WAAW;;AACpC,cAAM,cAAc,cAAc,WAAW,QAAQ,GAAG;AACxD,mBAAW,eAAe;AAEpB,cAAA,uBAAuB,OAAO,YAAY;AAExC,gBAAA,gBAAgB,MAAM,YAAY;AAAA,YACtC,QAAQ,YAAY;AAAA,YACpB,mBAAmB;AAAA,UAAA,CACpB;AAEKA,gBAAAA,wBAAuB,cAAc,QAAQ,OAAO;AAC1D,gBAAM,cAAc,MAAM;AAEnBA,iBAAAA;AAAAA,QAAAA,GACN;AAEG,cAAA,mBAAmB,aAAa,KAAK,SAAS;AAC9C,cAAA,oBAAoB,aAAa,KAAK,SAAS;AAErD,cAAM,yBAAyB;AAAA,UAC7B,6BAAa,IAAY;AAAA,UACzB,6BAAa,IAAY;AAAA,QAC3B;AAQM,cAAA,SAAS,MAAM,mBAAmB;AAAA,UACtC,MAAM,QAAQ,IAAI;AAAA,UAClB,SAAS,YAAY;AAAA,UACrB,qBAAqB,SAAS;;AAC5B,gBAAI,CAAC,mBAAmB,gBAAgB,EAAE,SAAS,QAAQ,IAAI,GAAG;AACzD,qBAAA;AAAA,YAAA;AAGH,kBAAA,mBAAmB,QAAQ,kBAAkB;AAEnD,gBAAI,kBAAkB;AACd,oBAAA,kBAAiBC,MAAA,KAAK,kBAAL,gBAAAA,IAAA,WAAqB;AAAA,gBAC1C,MAAM,QAAQ;AAAA,gBACd;AAAA,gBACA,SAAS,QAAQ;AAAA,cAAA;AAEnB,kBAAI,gBAAgB;AAClB,oBAAI,mBAAmB,WAAW;AACT,yCAAA,QAAQ,IAAI,QAAQ,IAAI;AAAA,gBAAA,OAC1C;AACkB,yCAAA,QAAQ,IAAI,QAAQ,IAAI;AAAA,gBAAA;AAAA,cACjD;AAGA,qBAAA,oBAAoB,oBACpB,qBAAqB;AAAA,YAAA;AAGlB,mBAAA;AAAA,UAAA;AAAA,QACT,CACD;AAEM,eAAA;AAAA,UACL,MAAM;AAAA,UACN,cAAc;AAAA,YACZ,CAAC,uBAAuB,MAAM,GAAG;AAAA,cAC/B,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,eAAe;AAAA,kBACb,OAAO;AAAA,oBACL,MAAM,mBAAmB,WAAW;AAAA,kBACtC;AAAA,kBACA,QAAQ;AAAA,oBACN,KAAK,KAAK,QAAQ,YAAY,MAAM,eAAe;AAAA,kBACrD;AAAA;AAAA,kBAEA,UAAU,CAAC,WAAW,aAAa,WAAW,aAAa;AAAA,gBAAA;AAAA,cAC7D;AAAA,YAEJ;AAAA,YACA,CAAC,uBAAuB,MAAM,GAAG;AAAA,cAC/B,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,KAAK;AAAA;AAAA;AAAA,gBAGL,OAAO;AAAA,gBACP,eAAe;AAAA,gBACf,eAAe;AAAA,kBACb,QAAQ;AAAA,oBACN,gBAAgB;AAAA,kBAClB;AAAA,kBACA,SAAS;AAAA,oBACP;AAAA,sBACE,MAAM;AAAA,sBACN,eAAe,UAAU,QAAQ;AAEnB,oCAAA;AAAA,sBAAA;AAAA,oBACd;AAAA,kBACF;AAAA,gBAEJ;AAAA,gBACA,iBAAiB;AAAA,kBACf,SAAS,CAAC,cAAc;AAAA,gBAAA;AAAA,cAC1B;AAAA,YACF;AAAA,UAEJ;AAAA,UACA,SAAS;AAAA,YACP,YAAY;AAAA,cACV;AAAA,cACA,aAAa,KAAK,SAAS;AAAA,cAC3B,GAAG,OAAO,OAAO,eAAe;AAAA,cAChC;AAAA,cACA,GAAG,OAAO,IAAI,WAAW,KAAK;AAAA,YAChC;AAAA,YACA,UAAU,CAAC,GAAG,OAAO,IAAI,SAAS,MAAM;AAAA,YACxC,QAAQ,CAAC,gBAAgB;AAAA,UAC3B;AAAA,UACA,cAAc;AAAA,YACZ,SAAS;AAAA,cACP,GAAG,OAAO,OAAO,eAAe;AAAA,cAChC;AAAA,cACA,GAAG,OAAO,aAAa,QAAQ,KAAK;AAAA,cACpC,GAAG,uBAAuB;AAAA,YAC5B;AAAA,YACA,SAAS,CAAC,GAAG,uBAAuB,OAAO;AAAA,UAC7C;AAAA;AAAA,UAEA,QAAQ;AAAA;AAAA;AAAA;AAAA,YAKN,GAAG,iBAAiB,sBAAsB,YAAY,UAAU,IAAI;AAAA,YACpE,GAAG,iBAAiB,yBAAyB,oBAAoB;AAAA,YACjE,GAAG,iBAAiB,gBAAgB,WAAW;AAAA,YAC/C,GAAI,YAAY,UAAU,iBAAiB,eAAa,iBAAY,QAAZ,mBAAiB,WAAU,SAAS,OAAO,IAAI,CAAA;AAAA,UAAC;AAAA,QAE5G;AAAA,MAAA;AAAA,IAEJ;AAAA;AAAA,IAEA,oBAAoB,KAAK,WAAW;AAAA,MAClC,QAAQ,EAAE,SAAS,uBAAuB,OAAO;AAAA,MACjD,QAAQ,EAAE,SAAS,uBAAuB,OAAO;AAAA,IAAA,CAClD;AAAA,IACD,0BAA0B;AAAA;AAAA;AAAA,MAGxB,yBAAyB,gBAAgB;AAAA,MACzC,QAAQ;AAAA,QACN,gBAAgB,MACd,8CAA8C,KAAK,SAAS;AAAA,QAC9D,UAAU,CAAC,MACT,oBAAoB,EAAE,UAAU,OAAO,YAAY,UAAU,IAAI;AAAA,QACnE,SAAS,uBAAuB;AAAA,MAClC;AAAA,MACA,QAAQ;AAAA,QACN,gBAAgB,MACd,8CAA8C,KAAK,SAAS;AAAA,QAC9D,UAAU,CAAC,MACT,oBAAoB,EAAE,UAAU,OAAO,YAAY,UAAU,IAAI,MAAM,EAAE,EAAE;AAAA,QAC7E,SAAS,uBAAuB;AAAA,MAAA;AAAA,IAClC,CACD;AAAA,IACD,cAAc,WAAW;AAAA,IACzB,oBAAoB,EAAE,aAAa,mBAAmB,WAAW,GAAG;AAAA,IACpE,gBAAgB;AAAA,IAChB,YAAY,aAAa,MAAM,SAAS;AAAA,IACxC;AAAA,MACE,MAAM;AAAA,MACN,mBAAmB,GAAG;AACb,eAAA,EAAE,SAAS,uBAAuB;AAAA,MAC3C;AAAA,MACA,SAAS;AAAA,MACT,eAAe,UAAU,QAAQ;AAC/B,mBAAW,oBAAoB;AAAA,MAAA;AAAA,IACjC;AAAA,EAEJ;AACF;AAEA,SAAS,iBACP,KACA,OACsE;AAC/D,SAAA;AAAA,IACL,CAAC,eAAe,GAAG,EAAE,GAAG,KAAK,UAAU,KAAK;AAAA,IAC5C,CAAC,mBAAmB,GAAG,EAAE,GAAG,KAAK,UAAU,KAAK;AAAA,EAClD;AACF;AAEA,MAAM,qBAAqB,CAAC,gBAA2C;AAK/D,QAAA,QAAQ,YAAY,gBAAgB;AAAA,IACxC;AAAA,EAAA,IAEE,YAAY,kBACZ,KAAK;AAAA,IACH,KAAK;AAAA,MACH;AAAA,MACA,KAAK,QAAQ,YAAY,MAAM,YAAY,eAAe;AAAA,IAAA;AAAA,EAE9D;AAEG,SAAA;AACT;"}
1
+ {"version":3,"file":"plugin.js","sources":["../../src/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { trimPathRight } from '@tanstack/router-core'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { TanStackServerFnPluginEnv } from '@tanstack/server-functions-plugin'\nimport * as vite from 'vite'\nimport { crawlFrameworkPkgs } from 'vitefu'\nimport { join } from 'pathe'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin'\nimport { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from './constants'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { parseStartConfig } from './schema'\nimport { resolveEntry } from './resolve-entries'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport type { ViteEnvironmentNames } from './constants'\nimport type { TanStackStartInputConfig } from './schema'\nimport type { PluginOption } from 'vite'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nexport interface TanStackStartVitePluginCoreOptions {\n framework: CompileStartFrameworkOptions\n defaultEntryPaths: {\n client: string\n server: string\n }\n crawlPackages?: (opts: {\n name: string\n peerDependencies: Record<string, any>\n exports?: Record<string, any> | string\n }) => 'include' | 'exclude' | undefined\n}\n\nexport function TanStackStartVitePluginCore(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartInputConfig,\n): Array<PluginOption> {\n const startConfig = parseStartConfig(startPluginOpts)\n\n const capturedBundle: Partial<\n Record<ViteEnvironmentNames, vite.Rollup.OutputBundle>\n > = {}\n\n function getBundle(envName: ViteEnvironmentNames): vite.Rollup.OutputBundle {\n const bundle = capturedBundle[envName]\n if (!bundle) {\n throw new Error(`No bundle captured for environment: ${envName}`)\n }\n return bundle\n }\n\n return [\n tanStackStartRouter({\n ...startConfig.tsr,\n target: corePluginOpts.framework,\n autoCodeSplitting: true,\n }),\n {\n name: 'tanstack-start-core:config',\n async config(viteConfig, { command }) {\n const viteAppBase = trimPathRight(viteConfig.base || '/')\n globalThis.TSS_APP_BASE = viteAppBase\n\n const root = viteConfig.root || process.cwd()\n const resolvedSrcDirectory = join(root, startConfig.tsr.srcDirectory)\n\n const routerFilePath = resolveEntry({\n type: 'router entry',\n configuredEntry: startConfig.router.entry,\n defaultEntry: 'router',\n root,\n resolvedSrcDirectory,\n required: true,\n })\n const clientEntryPath = resolveEntry({\n type: 'client entry',\n configuredEntry: startConfig.client.entry,\n defaultEntry: 'client',\n root,\n resolvedSrcDirectory,\n required: false,\n })\n\n const serverEntryPath = resolveEntry({\n type: 'server entry',\n configuredEntry: startConfig.server.entry,\n defaultEntry: 'server',\n root,\n resolvedSrcDirectory,\n required: false,\n })\n\n let clientAlias: string\n if (clientEntryPath) {\n clientAlias = vite.normalizePath(\n path.join('/@fs', path.resolve(root, clientEntryPath)),\n )\n } else {\n clientAlias = corePluginOpts.defaultEntryPaths.client\n }\n let serverAlias: string\n if (serverEntryPath) {\n serverAlias = vite.normalizePath(path.resolve(root, serverEntryPath))\n } else {\n serverAlias = corePluginOpts.defaultEntryPaths.server\n }\n const entryAliasConfiguration: Record<\n (typeof ENTRY_POINTS)[keyof typeof ENTRY_POINTS],\n string\n > = {\n [ENTRY_POINTS.router]: routerFilePath,\n [ENTRY_POINTS.client]: clientAlias,\n [ENTRY_POINTS.server]: serverAlias,\n }\n\n // TODO\n /* const nitroOutputPublicDir = await (async () => {\n // Create a dummy nitro app to get the resolved public output path\n const dummyNitroApp = await createNitro({\n preset: startConfig.target,\n compatibilityDate: '2024-12-01',\n })\n\n const nitroOutputPublicDir = dummyNitroApp.options.output.publicDir\n await dummyNitroApp.close()\n\n return nitroOutputPublicDir\n })()*/\n\n const startPackageName = `@tanstack/${corePluginOpts.framework}-start`\n const routerPackageName = `@tanstack/${corePluginOpts.framework}-router`\n\n const additionalOptimizeDeps = {\n include: new Set<string>(),\n exclude: new Set<string>(),\n }\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const result = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n if ([routerPackageName, startPackageName].includes(pkgJson.name)) {\n return false\n }\n\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n const internalResult = corePluginOpts.crawlPackages?.({\n name: pkgJson.name,\n peerDependencies,\n exports: pkgJson.exports,\n })\n if (internalResult) {\n if (internalResult === 'exclude') {\n additionalOptimizeDeps.exclude.add(pkgJson.name)\n } else {\n additionalOptimizeDeps.include.add(pkgJson.name)\n }\n }\n return (\n startPackageName in peerDependencies ||\n routerPackageName in peerDependencies\n )\n }\n return false\n },\n })\n\n return {\n base: viteAppBase,\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: {\n [VITE_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: {\n emptyOutDir:\n viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.client]\n ?.build?.emptyOutDir ?? true,\n rollupOptions: {\n input: {\n main: ENTRY_POINTS.client,\n },\n },\n outDir: getClientOutputDirectory(viteConfig),\n },\n },\n [VITE_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n emptyOutDir:\n viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]\n ?.build?.emptyOutDir ?? false,\n ssr: true,\n rollupOptions: {\n input:\n viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]\n ?.build?.rollupOptions?.input ?? ENTRY_POINTS.server,\n },\n outDir: getServerOutputDirectory(viteConfig),\n commonjsOptions: {\n include: [/node_modules/],\n },\n copyPublicDir:\n viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]\n ?.build?.copyPublicDir ?? false,\n },\n },\n },\n resolve: {\n noExternal: [\n '@tanstack/start**',\n `@tanstack/${corePluginOpts.framework}-start**`,\n ...Object.values(VIRTUAL_MODULES),\n startPackageName,\n ...result.ssr.noExternal.sort(),\n ],\n dedupe: [startPackageName],\n alias: {\n ...entryAliasConfiguration,\n },\n },\n optimizeDeps: {\n exclude: [\n ...Object.values(VIRTUAL_MODULES),\n startPackageName,\n ...result.optimizeDeps.exclude.sort(),\n ...additionalOptimizeDeps.exclude,\n ],\n include: [...additionalOptimizeDeps.include],\n },\n /* prettier-ignore */\n define: {\n // define is an esbuild function that replaces the any instances of given keys with the given values\n // i.e: __FRAMEWORK_NAME__ can be replaced with JSON.stringify(\"TanStack Start\")\n // This is not the same as injecting environment variables.\n\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', startConfig.serverFns.base),\n ...defineReplaceEnv('TSS_OUTPUT_PUBLIC_DIR', getClientOutputDirectory(viteConfig)),\n ...defineReplaceEnv('TSS_APP_BASE', viteAppBase),\n ...(command === 'serve' ? defineReplaceEnv('TSS_SHELL', startConfig.spa?.enabled ? 'true' : 'false') : {}),\n ...defineReplaceEnv('TSS_DEV_SERVER', command === 'serve' ? 'true' : 'false'),\n },\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n const client = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const server = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!client) {\n throw new Error('Client environment not found')\n }\n\n if (!server) {\n throw new Error('SSR environment not found')\n }\n\n if (!client.isBuilt) {\n // Build the client bundle first\n await builder.build(client)\n }\n if (!server.isBuilt) {\n // Build the SSR bundle\n await builder.build(server)\n }\n const serverBundle = getBundle(VITE_ENVIRONMENT_NAMES.server)\n await postServerBuild({ builder, startConfig, serverBundle })\n },\n },\n }\n },\n },\n // N.B. TanStackStartCompilerPlugin must be before the TanStackServerFnPluginEnv\n startCompilerPlugin(corePluginOpts.framework, {\n client: { envName: VITE_ENVIRONMENT_NAMES.client },\n server: { envName: VITE_ENVIRONMENT_NAMES.server },\n }),\n TanStackServerFnPluginEnv({\n // This is the ID that will be available to look up and import\n // our server function manifest and resolve its module\n manifestVirtualImportId: VIRTUAL_MODULES.serverFnManifest,\n client: {\n getRuntimeCode: () =>\n `import { createClientRpc } from '@tanstack/${corePluginOpts.framework}-start/server-functions-client'`,\n replacer: (d) =>\n `createClientRpc('${d.functionId}', '${startConfig.serverFns.base}')`,\n envName: VITE_ENVIRONMENT_NAMES.client,\n },\n server: {\n getRuntimeCode: () =>\n `import { createServerRpc } from '@tanstack/${corePluginOpts.framework}-start/server-functions-server'`,\n replacer: (d) =>\n `createServerRpc('${d.functionId}', '${startConfig.serverFns.base}', ${d.fn})`,\n envName: VITE_ENVIRONMENT_NAMES.server,\n },\n }),\n loadEnvPlugin(),\n startManifestPlugin({\n getClientBundle: () => getBundle(VITE_ENVIRONMENT_NAMES.client),\n }),\n devServerPlugin({ startConfig }),\n {\n name: 'tanstack-start:core:capture-bundle',\n applyToEnvironment(e) {\n return (\n e.name === VITE_ENVIRONMENT_NAMES.client ||\n e.name === VITE_ENVIRONMENT_NAMES.server\n )\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n const environment = this.environment.name as ViteEnvironmentNames\n if (!Object.values(VITE_ENVIRONMENT_NAMES).includes(environment)) {\n throw new Error(`Unknown environment: ${environment}`)\n }\n capturedBundle[environment] = bundle\n },\n },\n ]\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { TanStackStartOutputConfig } from './schema.js';
2
+ import { Rollup, ViteBuilder } from 'vite';
3
+ export declare function postServerBuild({ builder, startConfig, serverBundle, }: {
4
+ builder: ViteBuilder;
5
+ startConfig: TanStackStartOutputConfig;
6
+ serverBundle: Rollup.OutputBundle;
7
+ }): Promise<void>;
@@ -0,0 +1,55 @@
1
+ import { HEADERS } from "@tanstack/start-server-core";
2
+ import { buildSitemap } from "./build-sitemap.js";
3
+ import { VITE_ENVIRONMENT_NAMES } from "./constants.js";
4
+ import { prerender } from "./prerender.js";
5
+ async function postServerBuild({
6
+ builder,
7
+ startConfig,
8
+ serverBundle
9
+ }) {
10
+ if (startConfig.prerender?.enabled !== false) {
11
+ startConfig.prerender = {
12
+ ...startConfig.prerender,
13
+ enabled: startConfig.prerender?.enabled ?? startConfig.pages.some(
14
+ (d) => typeof d === "string" ? false : !!d.prerender?.enabled
15
+ )
16
+ };
17
+ }
18
+ if (startConfig.spa?.enabled) {
19
+ startConfig.prerender = {
20
+ ...startConfig.prerender,
21
+ enabled: true
22
+ };
23
+ const maskUrl = new URL(startConfig.spa.maskPath, "http://localhost");
24
+ startConfig.pages.push({
25
+ path: maskUrl.toString().replace("http://localhost", ""),
26
+ prerender: {
27
+ ...startConfig.spa.prerender,
28
+ headers: {
29
+ ...startConfig.spa.prerender.headers,
30
+ [HEADERS.TSS_SHELL]: "true"
31
+ }
32
+ },
33
+ sitemap: {
34
+ exclude: true
35
+ }
36
+ });
37
+ }
38
+ if (startConfig.prerender.enabled) {
39
+ await prerender({
40
+ startConfig,
41
+ builder,
42
+ serverBundle
43
+ });
44
+ }
45
+ if (startConfig.pages.length) {
46
+ buildSitemap({
47
+ startConfig,
48
+ publicDir: builder.environments[VITE_ENVIRONMENT_NAMES.client]?.config.build.outDir ?? builder.config.build.outDir
49
+ });
50
+ }
51
+ }
52
+ export {
53
+ postServerBuild
54
+ };
55
+ //# sourceMappingURL=post-server-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-server-build.js","sources":["../../src/post-server-build.ts"],"sourcesContent":["import { HEADERS } from '@tanstack/start-server-core'\nimport { buildSitemap } from './build-sitemap'\nimport { VITE_ENVIRONMENT_NAMES } from './constants'\nimport { prerender } from './prerender'\nimport type { TanStackStartOutputConfig } from './schema'\nimport type { Rollup, ViteBuilder } from 'vite'\n\nexport async function postServerBuild({\n builder,\n startConfig,\n serverBundle,\n}: {\n builder: ViteBuilder\n startConfig: TanStackStartOutputConfig\n serverBundle: Rollup.OutputBundle\n}) {\n // If the user has not set a prerender option, we need to set it to true\n // if the pages array is not empty and has sub options requiring for prerendering\n // If the user has explicitly set prerender.enabled, this should be respected\n if (startConfig.prerender?.enabled !== false) {\n startConfig.prerender = {\n ...startConfig.prerender,\n enabled:\n startConfig.prerender?.enabled ??\n startConfig.pages.some((d) =>\n typeof d === 'string' ? false : !!d.prerender?.enabled,\n ),\n }\n }\n\n // Setup the options for prerendering the SPA shell (i.e `src/routes/__root.tsx`)\n if (startConfig.spa?.enabled) {\n startConfig.prerender = {\n ...startConfig.prerender,\n enabled: true,\n }\n\n const maskUrl = new URL(startConfig.spa.maskPath, 'http://localhost')\n\n startConfig.pages.push({\n path: maskUrl.toString().replace('http://localhost', ''),\n prerender: {\n ...startConfig.spa.prerender,\n headers: {\n ...startConfig.spa.prerender.headers,\n [HEADERS.TSS_SHELL]: 'true',\n },\n },\n sitemap: {\n exclude: true,\n },\n })\n }\n\n // Run the prerendering process\n if (startConfig.prerender.enabled) {\n await prerender({\n startConfig,\n builder,\n serverBundle,\n })\n }\n\n // Run the sitemap build process\n if (startConfig.pages.length) {\n buildSitemap({\n startConfig,\n publicDir:\n builder.environments[VITE_ENVIRONMENT_NAMES.client]?.config.build\n .outDir ?? builder.config.build.outDir,\n })\n }\n}\n"],"names":[],"mappings":";;;;AAOA,eAAsB,gBAAgB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AAID,MAAI,YAAY,WAAW,YAAY,OAAO;AAC5C,gBAAY,YAAY;AAAA,MACtB,GAAG,YAAY;AAAA,MACf,SACE,YAAY,WAAW,WACvB,YAAY,MAAM;AAAA,QAAK,CAAC,MACtB,OAAO,MAAM,WAAW,QAAQ,CAAC,CAAC,EAAE,WAAW;AAAA,MAAA;AAAA,IACjD;AAAA,EAEN;AAGA,MAAI,YAAY,KAAK,SAAS;AAC5B,gBAAY,YAAY;AAAA,MACtB,GAAG,YAAY;AAAA,MACf,SAAS;AAAA,IAAA;AAGX,UAAM,UAAU,IAAI,IAAI,YAAY,IAAI,UAAU,kBAAkB;AAEpE,gBAAY,MAAM,KAAK;AAAA,MACrB,MAAM,QAAQ,SAAA,EAAW,QAAQ,oBAAoB,EAAE;AAAA,MACvD,WAAW;AAAA,QACT,GAAG,YAAY,IAAI;AAAA,QACnB,SAAS;AAAA,UACP,GAAG,YAAY,IAAI,UAAU;AAAA,UAC7B,CAAC,QAAQ,SAAS,GAAG;AAAA,QAAA;AAAA,MACvB;AAAA,MAEF,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,IACX,CACD;AAAA,EACH;AAGA,MAAI,YAAY,UAAU,SAAS;AACjC,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAGA,MAAI,YAAY,MAAM,QAAQ;AAC5B,iBAAa;AAAA,MACX;AAAA,MACA,WACE,QAAQ,aAAa,uBAAuB,MAAM,GAAG,OAAO,MACzD,UAAU,QAAQ,OAAO,MAAM;AAAA,IAAA,CACrC;AAAA,EACH;AACF;"}
@@ -0,0 +1,11 @@
1
+ import { Rollup, ViteBuilder } from 'vite';
2
+ import { TanStackStartOutputConfig } from './schema.js';
3
+ export declare function prerender({ startConfig, builder, serverBundle, }: {
4
+ startConfig: TanStackStartOutputConfig;
5
+ builder: ViteBuilder;
6
+ serverBundle: Rollup.OutputBundle;
7
+ }): Promise<void>;
8
+ export declare function writeBundleToDisk({ bundle, outDir, }: {
9
+ bundle: Rollup.OutputBundle;
10
+ outDir: string;
11
+ }): Promise<void>;
@@ -1,23 +1,20 @@
1
- import { promises } from "node:fs";
1
+ import { existsSync, rmSync, promises } from "node:fs";
2
2
  import { pathToFileURL } from "node:url";
3
3
  import os from "node:os";
4
- import path from "node:path";
5
- import { getRollupConfig } from "nitropack/rollup";
6
- import { createNitro, build } from "nitropack";
4
+ import path from "pathe";
7
5
  import { withBase, joinURL, withoutBase } from "ufo";
8
- import { VITE_ENVIRONMENT_NAMES } from "../constants.js";
9
- import { createLogger } from "../utils.js";
6
+ import { VITE_ENVIRONMENT_NAMES } from "./constants.js";
7
+ import { createLogger } from "./utils.js";
10
8
  import { Queue } from "./queue.js";
11
9
  async function prerender({
12
- options,
13
- nitro,
14
- builder
10
+ startConfig,
11
+ builder,
12
+ serverBundle
15
13
  }) {
16
- var _a;
17
14
  const logger = createLogger("prerender");
18
15
  logger.info("Prerendering pages...");
19
- if (((_a = options.prerender) == null ? void 0 : _a.enabled) && !options.pages.length) {
20
- options.pages = [
16
+ if (startConfig.prerender?.enabled && !startConfig.pages.length) {
17
+ startConfig.pages = [
21
18
  {
22
19
  path: "/"
23
20
  }
@@ -29,52 +26,40 @@ async function prerender({
29
26
  `Vite's "${VITE_ENVIRONMENT_NAMES.server}" environment not found`
30
27
  );
31
28
  }
32
- const prerenderOutputDir = path.resolve(
33
- options.root,
34
- ".tanstack",
35
- "start",
36
- "build",
37
- "prerenderer"
38
- );
39
- const nodeNitro = await createNitro({
40
- ...nitro.options._config,
41
- preset: "nitro-prerender",
42
- logLevel: 0,
43
- output: {
44
- dir: prerenderOutputDir,
45
- serverDir: path.resolve(prerenderOutputDir, "server"),
46
- publicDir: path.resolve(prerenderOutputDir, "public")
47
- }
48
- });
49
- const nodeNitroRollupOptions = getRollupConfig(nodeNitro);
50
- const build$1 = serverEnv.config.build;
51
- build$1.outDir = prerenderOutputDir;
52
- build$1.rollupOptions = {
53
- ...build$1.rollupOptions,
54
- ...nodeNitroRollupOptions,
55
- output: {
56
- ...build$1.rollupOptions.output,
57
- ...nodeNitroRollupOptions.output,
58
- sourcemap: void 0
59
- }
60
- };
61
- await build(nodeNitro);
62
- const serverFilename = typeof nodeNitroRollupOptions.output.entryFileNames === "string" ? nodeNitroRollupOptions.output.entryFileNames : "index.mjs";
63
- const serverEntrypoint = pathToFileURL(
64
- path.resolve(path.join(nodeNitro.options.output.serverDir, serverFilename))
65
- ).toString();
29
+ const clientEnv = builder.environments[VITE_ENVIRONMENT_NAMES.client];
30
+ if (!clientEnv) {
31
+ throw new Error(
32
+ `Vite's "${VITE_ENVIRONMENT_NAMES.client}" environment not found`
33
+ );
34
+ }
35
+ const outputDir = clientEnv.config.build.outDir;
36
+ const entryFile = findEntryFileInBundle(serverBundle);
37
+ let fullEntryFilePath = path.join(serverEnv.config.build.outDir, entryFile);
66
38
  process.env.TSS_PRERENDERING = "true";
67
- const { closePrerenderer, localFetch } = await import(serverEntrypoint);
39
+ if (!existsSync(fullEntryFilePath)) {
40
+ const bundleOutputDir = path.resolve(
41
+ serverEnv.config.root,
42
+ ".tanstack",
43
+ "start",
44
+ "prerender"
45
+ );
46
+ rmSync(bundleOutputDir, { recursive: true, force: true });
47
+ await writeBundleToDisk({ bundle: serverBundle, outDir: bundleOutputDir });
48
+ fullEntryFilePath = path.join(bundleOutputDir, entryFile);
49
+ }
50
+ const { default: serverEntrypoint } = await import(pathToFileURL(fullEntryFilePath).toString());
51
+ function localFetch(path2, options) {
52
+ const url = new URL(`http://localhost${path2}`);
53
+ return serverEntrypoint.fetch(new Request(url, options));
54
+ }
68
55
  try {
69
- const pages = await prerenderPages();
56
+ const pages = await prerenderPages({ outputDir });
70
57
  logger.info(`Prerendered ${pages.length} pages:`);
71
58
  pages.forEach((page) => {
72
59
  logger.info(`- ${page}`);
73
60
  });
74
61
  } catch (error) {
75
62
  logger.error(error);
76
- } finally {
77
- closePrerenderer();
78
63
  }
79
64
  function extractLinks(html) {
80
65
  const linkRegex = /<a[^>]+href=["']([^"']+)["'][^>]*>/g;
@@ -88,44 +73,38 @@ async function prerender({
88
73
  }
89
74
  return links;
90
75
  }
91
- async function prerenderPages() {
92
- var _a2;
76
+ async function prerenderPages({ outputDir: outputDir2 }) {
93
77
  const seen = /* @__PURE__ */ new Set();
94
78
  const retriesByPath = /* @__PURE__ */ new Map();
95
- const concurrency = ((_a2 = options.prerender) == null ? void 0 : _a2.concurrency) ?? os.cpus().length;
79
+ const concurrency = startConfig.prerender?.concurrency ?? os.cpus().length;
96
80
  logger.info(`Concurrency: ${concurrency}`);
97
81
  const queue = new Queue({ concurrency });
98
- options.pages.forEach((page) => addCrawlPageTask(page));
82
+ startConfig.pages.forEach((page) => addCrawlPageTask(page));
99
83
  await queue.start();
100
84
  return Array.from(seen);
101
85
  function addCrawlPageTask(page) {
102
- var _a3, _b;
103
86
  if (seen.has(page.path)) return;
104
87
  seen.add(page.path);
105
88
  if (page.fromCrawl) {
106
- options.pages.push(page);
89
+ startConfig.pages.push(page);
107
90
  }
108
- if (!(((_a3 = page.prerender) == null ? void 0 : _a3.enabled) ?? true)) return;
109
- if (((_b = options.prerender) == null ? void 0 : _b.filter) && !options.prerender.filter(page)) return;
91
+ if (!(page.prerender?.enabled ?? true)) return;
92
+ if (startConfig.prerender?.filter && !startConfig.prerender.filter(page))
93
+ return;
110
94
  const prerenderOptions = {
111
- ...options.prerender,
95
+ ...startConfig.prerender,
112
96
  ...page.prerender
113
97
  };
114
98
  queue.add(async () => {
115
- var _a4;
116
99
  logger.info(`Crawling: ${page.path}`);
117
100
  const retries = retriesByPath.get(page.path) || 0;
118
101
  try {
119
102
  const encodedRoute = encodeURI(page.path);
120
- const res = await localFetch(
121
- withBase(encodedRoute, nodeNitro.options.baseURL),
122
- {
123
- headers: {
124
- ...prerenderOptions.headers,
125
- "x-nitro-prerender": encodedRoute
126
- }
103
+ const res = await localFetch(withBase(encodedRoute, TSS_APP_BASE), {
104
+ headers: {
105
+ ...prerenderOptions.headers
127
106
  }
128
- );
107
+ });
129
108
  if (!res.ok) {
130
109
  throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {
131
110
  cause: res
@@ -138,15 +117,15 @@ async function prerender({
138
117
  const htmlPath = cleanPagePath.endsWith("/") || prerenderOptions.autoSubfolderIndex ? joinURL(cleanPagePath, "index.html") : cleanPagePath + ".html";
139
118
  const filename = withoutBase(
140
119
  isImplicitHTML ? htmlPath : routeWithIndex,
141
- nitro.options.baseURL
120
+ TSS_APP_BASE
142
121
  );
143
122
  const html = await res.text();
144
- const filepath = path.join(nitro.options.output.publicDir, filename);
123
+ const filepath = path.join(outputDir2, filename);
145
124
  await promises.mkdir(path.dirname(filepath), {
146
125
  recursive: true
147
126
  });
148
127
  await promises.writeFile(filepath, html);
149
- const newPage = await ((_a4 = prerenderOptions.onSuccess) == null ? void 0 : _a4.call(prerenderOptions, { page, html }));
128
+ const newPage = await prerenderOptions.onSuccess?.({ page, html });
150
129
  if (newPage) {
151
130
  Object.assign(page, newPage);
152
131
  }
@@ -165,14 +144,47 @@ async function prerender({
165
144
  retriesByPath.set(page.path, retries + 1);
166
145
  addCrawlPageTask(page);
167
146
  } else {
168
- throw error;
147
+ if (prerenderOptions.failOnError ?? true) {
148
+ throw error;
149
+ }
169
150
  }
170
151
  }
171
152
  });
172
153
  }
173
154
  }
174
155
  }
156
+ function findEntryFileInBundle(bundle) {
157
+ let entryFile;
158
+ for (const [_name, file] of Object.entries(bundle)) {
159
+ if (file.type === "chunk") {
160
+ if (file.isEntry) {
161
+ if (entryFile !== void 0) {
162
+ throw new Error(
163
+ `Multiple entry points found. Only one entry point is allowed.`
164
+ );
165
+ }
166
+ entryFile = file.fileName;
167
+ }
168
+ }
169
+ }
170
+ if (entryFile === void 0) {
171
+ throw new Error(`No entry point found in the bundle.`);
172
+ }
173
+ return entryFile;
174
+ }
175
+ async function writeBundleToDisk({
176
+ bundle,
177
+ outDir
178
+ }) {
179
+ for (const [fileName, asset] of Object.entries(bundle)) {
180
+ const fullPath = path.join(outDir, fileName);
181
+ const content = asset.type === "asset" ? asset.source : asset.code;
182
+ await promises.mkdir(path.dirname(fullPath), { recursive: true });
183
+ await promises.writeFile(fullPath, content);
184
+ }
185
+ }
175
186
  export {
176
- prerender
187
+ prerender,
188
+ writeBundleToDisk
177
189
  };
178
190
  //# sourceMappingURL=prerender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerender.js","sources":["../../src/prerender.ts"],"sourcesContent":["import { existsSync, promises as fsp, rmSync } from 'node:fs'\nimport { pathToFileURL } from 'node:url'\nimport os from 'node:os'\nimport path from 'pathe'\nimport { joinURL, withBase, withoutBase } from 'ufo'\nimport { VITE_ENVIRONMENT_NAMES } from './constants'\nimport { createLogger } from './utils'\nimport { Queue } from './queue'\nimport type { Rollup, ViteBuilder } from 'vite'\nimport type { Page, TanStackStartOutputConfig } from './schema'\n\nexport async function prerender({\n startConfig,\n builder,\n serverBundle,\n}: {\n startConfig: TanStackStartOutputConfig\n builder: ViteBuilder\n serverBundle: Rollup.OutputBundle\n}) {\n const logger = createLogger('prerender')\n logger.info('Prerendering pages...')\n\n // If prerender is enabled but no pages are provided, default to prerendering the root page\n if (startConfig.prerender?.enabled && !startConfig.pages.length) {\n startConfig.pages = [\n {\n path: '/',\n },\n ]\n }\n\n const serverEnv = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!serverEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.server}\" environment not found`,\n )\n }\n\n const clientEnv = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n if (!clientEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.client}\" environment not found`,\n )\n }\n\n const outputDir = clientEnv.config.build.outDir\n\n const entryFile = findEntryFileInBundle(serverBundle)\n let fullEntryFilePath = path.join(serverEnv.config.build.outDir, entryFile)\n process.env.TSS_PRERENDERING = 'true'\n\n if (!existsSync(fullEntryFilePath)) {\n // if the file does not exist, we need to write the bundle to a temporary directory\n // this can happen e.g. with nitro that postprocesses the bundle and thus does not write SSR build to disk\n const bundleOutputDir = path.resolve(\n serverEnv.config.root,\n '.tanstack',\n 'start',\n 'prerender',\n )\n rmSync(bundleOutputDir, { recursive: true, force: true })\n await writeBundleToDisk({ bundle: serverBundle, outDir: bundleOutputDir })\n fullEntryFilePath = path.join(bundleOutputDir, entryFile)\n }\n\n const { default: serverEntrypoint } = await import(\n pathToFileURL(fullEntryFilePath).toString()\n )\n\n function localFetch(path: string, options?: RequestInit): Promise<Response> {\n const url = new URL(`http://localhost${path}`)\n return serverEntrypoint.fetch(new Request(url, options))\n }\n\n try {\n // Crawl all pages\n const pages = await prerenderPages({ outputDir })\n\n logger.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n logger.info(`- ${page}`)\n })\n } catch (error) {\n logger.error(error)\n }\n\n function extractLinks(html: string): Array<string> {\n const linkRegex = /<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>/g\n const links: Array<string> = []\n let match\n\n while ((match = linkRegex.exec(html)) !== null) {\n const href = match[1]\n if (href && (href.startsWith('/') || href.startsWith('./'))) {\n links.push(href)\n }\n }\n\n return links\n }\n\n async function prerenderPages({ outputDir }: { outputDir: string }) {\n const seen = new Set<string>()\n const retriesByPath = new Map<string, number>()\n const concurrency = startConfig.prerender?.concurrency ?? os.cpus().length\n logger.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n startConfig.pages.forEach((page) => addCrawlPageTask(page))\n\n await queue.start()\n\n return Array.from(seen)\n\n function addCrawlPageTask(page: Page) {\n // Was the page already seen?\n if (seen.has(page.path)) return\n\n // Add the page to the seen set\n seen.add(page.path)\n\n if (page.fromCrawl) {\n startConfig.pages.push(page)\n }\n\n // If not enabled, skip\n if (!(page.prerender?.enabled ?? true)) return\n\n // If there is a filter link, check if the page should be prerendered\n if (startConfig.prerender?.filter && !startConfig.prerender.filter(page))\n return\n\n // Resolve the merged default and page-specific prerender options\n const prerenderOptions = {\n ...startConfig.prerender,\n ...page.prerender,\n }\n\n // Add the task\n queue.add(async () => {\n logger.info(`Crawling: ${page.path}`)\n const retries = retriesByPath.get(page.path) || 0\n try {\n // Fetch the route\n const encodedRoute = encodeURI(page.path)\n\n const res = await localFetch(withBase(encodedRoute, TSS_APP_BASE), {\n headers: {\n ...prerenderOptions.headers,\n },\n })\n\n if (!res.ok) {\n throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {\n cause: res,\n })\n }\n\n const cleanPagePath = (\n prerenderOptions.outputPath || page.path\n ).split(/[?#]/)[0]!\n\n // Guess route type and populate fileName\n const contentType = res.headers.get('content-type') || ''\n const isImplicitHTML =\n !cleanPagePath.endsWith('.html') && contentType.includes('html')\n // &&\n // !JsonSigRx.test(dataBuff.subarray(0, 32).toString('utf8'))\n const routeWithIndex = cleanPagePath.endsWith('/')\n ? cleanPagePath + 'index'\n : cleanPagePath\n\n const htmlPath =\n cleanPagePath.endsWith('/') || prerenderOptions.autoSubfolderIndex\n ? joinURL(cleanPagePath, 'index.html')\n : cleanPagePath + '.html'\n\n const filename = withoutBase(\n isImplicitHTML ? htmlPath : routeWithIndex,\n TSS_APP_BASE,\n )\n\n const html = await res.text()\n\n const filepath = path.join(outputDir, filename)\n\n await fsp.mkdir(path.dirname(filepath), {\n recursive: true,\n })\n\n await fsp.writeFile(filepath, html)\n\n const newPage = await prerenderOptions.onSuccess?.({ page, html })\n\n if (newPage) {\n Object.assign(page, newPage)\n }\n\n // Find new links\n if (prerenderOptions.crawlLinks ?? true) {\n const links = extractLinks(html)\n for (const link of links) {\n addCrawlPageTask({ path: link, fromCrawl: true })\n }\n }\n } catch (error) {\n if (retries < (prerenderOptions.retryCount ?? 0)) {\n logger.warn(`Encountered error, retrying: ${page.path} in 500ms`)\n await new Promise((resolve) =>\n setTimeout(resolve, prerenderOptions.retryDelay),\n )\n retriesByPath.set(page.path, retries + 1)\n addCrawlPageTask(page)\n } else {\n if (prerenderOptions.failOnError ?? true) {\n throw error\n }\n }\n }\n })\n }\n }\n}\n\nfunction findEntryFileInBundle(bundle: Rollup.OutputBundle): string {\n let entryFile: string | undefined\n\n for (const [_name, file] of Object.entries(bundle)) {\n if (file.type === 'chunk') {\n if (file.isEntry) {\n if (entryFile !== undefined) {\n throw new Error(\n `Multiple entry points found. Only one entry point is allowed.`,\n )\n }\n entryFile = file.fileName\n }\n }\n }\n if (entryFile === undefined) {\n throw new Error(`No entry point found in the bundle.`)\n }\n return entryFile\n}\n\nexport async function writeBundleToDisk({\n bundle,\n outDir,\n}: {\n bundle: Rollup.OutputBundle\n outDir: string\n}) {\n for (const [fileName, asset] of Object.entries(bundle)) {\n const fullPath = path.join(outDir, fileName)\n const content = asset.type === 'asset' ? asset.source : asset.code\n await fsp.mkdir(path.dirname(fullPath), { recursive: true })\n await fsp.writeFile(fullPath, content)\n }\n}\n"],"names":["path","outputDir","fsp"],"mappings":";;;;;;;;AAWA,eAAsB,UAAU;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,SAAS,aAAa,WAAW;AACvC,SAAO,KAAK,uBAAuB;AAGnC,MAAI,YAAY,WAAW,WAAW,CAAC,YAAY,MAAM,QAAQ;AAC/D,gBAAY,QAAQ;AAAA,MAClB;AAAA,QACE,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAEJ;AAEA,QAAM,YAAY,QAAQ,aAAa,uBAAuB,MAAM;AAEpE,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR,WAAW,uBAAuB,MAAM;AAAA,IAAA;AAAA,EAE5C;AAEA,QAAM,YAAY,QAAQ,aAAa,uBAAuB,MAAM;AACpE,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR,WAAW,uBAAuB,MAAM;AAAA,IAAA;AAAA,EAE5C;AAEA,QAAM,YAAY,UAAU,OAAO,MAAM;AAEzC,QAAM,YAAY,sBAAsB,YAAY;AACpD,MAAI,oBAAoB,KAAK,KAAK,UAAU,OAAO,MAAM,QAAQ,SAAS;AAC1E,UAAQ,IAAI,mBAAmB;AAE/B,MAAI,CAAC,WAAW,iBAAiB,GAAG;AAGlC,UAAM,kBAAkB,KAAK;AAAA,MAC3B,UAAU,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO,iBAAiB,EAAE,WAAW,MAAM,OAAO,MAAM;AACxD,UAAM,kBAAkB,EAAE,QAAQ,cAAc,QAAQ,iBAAiB;AACzE,wBAAoB,KAAK,KAAK,iBAAiB,SAAS;AAAA,EAC1D;AAEA,QAAM,EAAE,SAAS,qBAAqB,MAAM,OAC1C,cAAc,iBAAiB,EAAE;AAGnC,WAAS,WAAWA,OAAc,SAA0C;AAC1E,UAAM,MAAM,IAAI,IAAI,mBAAmBA,KAAI,EAAE;AAC7C,WAAO,iBAAiB,MAAM,IAAI,QAAQ,KAAK,OAAO,CAAC;AAAA,EACzD;AAEA,MAAI;AAEF,UAAM,QAAQ,MAAM,eAAe,EAAE,WAAW;AAEhD,WAAO,KAAK,eAAe,MAAM,MAAM,SAAS;AAChD,UAAM,QAAQ,CAAC,SAAS;AACtB,aAAO,KAAK,KAAK,IAAI,EAAE;AAAA,IACzB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,MAAM,KAAK;AAAA,EACpB;AAEA,WAAS,aAAa,MAA6B;AACjD,UAAM,YAAY;AAClB,UAAM,QAAuB,CAAA;AAC7B,QAAI;AAEJ,YAAQ,QAAQ,UAAU,KAAK,IAAI,OAAO,MAAM;AAC9C,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,SAAS,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,IAAI,IAAI;AAC3D,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,eAAe,EAAE,WAAAC,cAAoC;AAClE,UAAM,2BAAW,IAAA;AACjB,UAAM,oCAAoB,IAAA;AAC1B,UAAM,cAAc,YAAY,WAAW,eAAe,GAAG,OAAO;AACpE,WAAO,KAAK,gBAAgB,WAAW,EAAE;AACzC,UAAM,QAAQ,IAAI,MAAM,EAAE,aAAa;AAEvC,gBAAY,MAAM,QAAQ,CAAC,SAAS,iBAAiB,IAAI,CAAC;AAE1D,UAAM,MAAM,MAAA;AAEZ,WAAO,MAAM,KAAK,IAAI;AAEtB,aAAS,iBAAiB,MAAY;AAEpC,UAAI,KAAK,IAAI,KAAK,IAAI,EAAG;AAGzB,WAAK,IAAI,KAAK,IAAI;AAElB,UAAI,KAAK,WAAW;AAClB,oBAAY,MAAM,KAAK,IAAI;AAAA,MAC7B;AAGA,UAAI,EAAE,KAAK,WAAW,WAAW,MAAO;AAGxC,UAAI,YAAY,WAAW,UAAU,CAAC,YAAY,UAAU,OAAO,IAAI;AACrE;AAGF,YAAM,mBAAmB;AAAA,QACvB,GAAG,YAAY;AAAA,QACf,GAAG,KAAK;AAAA,MAAA;AAIV,YAAM,IAAI,YAAY;AACpB,eAAO,KAAK,aAAa,KAAK,IAAI,EAAE;AACpC,cAAM,UAAU,cAAc,IAAI,KAAK,IAAI,KAAK;AAChD,YAAI;AAEF,gBAAM,eAAe,UAAU,KAAK,IAAI;AAExC,gBAAM,MAAM,MAAM,WAAW,SAAS,cAAc,YAAY,GAAG;AAAA,YACjE,SAAS;AAAA,cACP,GAAG,iBAAiB;AAAA,YAAA;AAAA,UACtB,CACD;AAED,cAAI,CAAC,IAAI,IAAI;AACX,kBAAM,IAAI,MAAM,mBAAmB,KAAK,IAAI,KAAK,IAAI,UAAU,IAAI;AAAA,cACjE,OAAO;AAAA,YAAA,CACR;AAAA,UACH;AAEA,gBAAM,iBACJ,iBAAiB,cAAc,KAAK,MACpC,MAAM,MAAM,EAAE,CAAC;AAGjB,gBAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,gBAAM,iBACJ,CAAC,cAAc,SAAS,OAAO,KAAK,YAAY,SAAS,MAAM;AAGjE,gBAAM,iBAAiB,cAAc,SAAS,GAAG,IAC7C,gBAAgB,UAChB;AAEJ,gBAAM,WACJ,cAAc,SAAS,GAAG,KAAK,iBAAiB,qBAC5C,QAAQ,eAAe,YAAY,IACnC,gBAAgB;AAEtB,gBAAM,WAAW;AAAA,YACf,iBAAiB,WAAW;AAAA,YAC5B;AAAA,UAAA;AAGF,gBAAM,OAAO,MAAM,IAAI,KAAA;AAEvB,gBAAM,WAAW,KAAK,KAAKA,YAAW,QAAQ;AAE9C,gBAAMC,SAAI,MAAM,KAAK,QAAQ,QAAQ,GAAG;AAAA,YACtC,WAAW;AAAA,UAAA,CACZ;AAED,gBAAMA,SAAI,UAAU,UAAU,IAAI;AAElC,gBAAM,UAAU,MAAM,iBAAiB,YAAY,EAAE,MAAM,MAAM;AAEjE,cAAI,SAAS;AACX,mBAAO,OAAO,MAAM,OAAO;AAAA,UAC7B;AAGA,cAAI,iBAAiB,cAAc,MAAM;AACvC,kBAAM,QAAQ,aAAa,IAAI;AAC/B,uBAAW,QAAQ,OAAO;AACxB,+BAAiB,EAAE,MAAM,MAAM,WAAW,MAAM;AAAA,YAClD;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,cAAI,WAAW,iBAAiB,cAAc,IAAI;AAChD,mBAAO,KAAK,gCAAgC,KAAK,IAAI,WAAW;AAChE,kBAAM,IAAI;AAAA,cAAQ,CAAC,YACjB,WAAW,SAAS,iBAAiB,UAAU;AAAA,YAAA;AAEjD,0BAAc,IAAI,KAAK,MAAM,UAAU,CAAC;AACxC,6BAAiB,IAAI;AAAA,UACvB,OAAO;AACL,gBAAI,iBAAiB,eAAe,MAAM;AACxC,oBAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,QAAqC;AAClE,MAAI;AAEJ,aAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,QAAI,KAAK,SAAS,SAAS;AACzB,UAAI,KAAK,SAAS;AAChB,YAAI,cAAc,QAAW;AAC3B,gBAAM,IAAI;AAAA,YACR;AAAA,UAAA;AAAA,QAEJ;AACA,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc,QAAW;AAC3B,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,SAAO;AACT;AAEA,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AACF,GAGG;AACD,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACtD,UAAM,WAAW,KAAK,KAAK,QAAQ,QAAQ;AAC3C,UAAM,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,MAAM;AAC9D,UAAMA,SAAI,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,MAAM;AAC3D,UAAMA,SAAI,UAAU,UAAU,OAAO;AAAA,EACvC;AACF;"}
@@ -1,20 +1,17 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
1
  const defaultConfig = {
5
2
  concurrency: 5,
6
3
  started: false,
7
4
  tasks: []
8
5
  };
9
6
  class Queue {
7
+ onSettles = [];
8
+ onErrors = [];
9
+ onSuccesses = [];
10
+ running;
11
+ active = [];
12
+ pending;
13
+ currentConcurrency;
10
14
  constructor(config = defaultConfig) {
11
- __publicField(this, "onSettles", []);
12
- __publicField(this, "onErrors", []);
13
- __publicField(this, "onSuccesses", []);
14
- __publicField(this, "running");
15
- __publicField(this, "active", []);
16
- __publicField(this, "pending");
17
- __publicField(this, "currentConcurrency");
18
15
  const { concurrency, started, tasks } = {
19
16
  ...defaultConfig,
20
17
  ...config
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sources":["../../src/queue.ts"],"sourcesContent":["interface PoolConfig {\n concurrency?: number\n started?: boolean\n tasks?: Array<() => Promise<any>>\n}\n\nconst defaultConfig: PoolConfig = {\n concurrency: 5,\n started: false,\n tasks: [],\n}\n\nexport class Queue<T> {\n private onSettles: Array<(res: any, error: any) => void> = []\n private onErrors: Array<(error: any, task: () => Promise<any>) => void> = []\n private onSuccesses: Array<(result: any, task: () => Promise<any>) => void> =\n []\n private running: boolean\n private active: Array<() => Promise<any>> = []\n private pending: Array<() => Promise<any>>\n private currentConcurrency: number\n\n constructor(config: PoolConfig = defaultConfig) {\n const { concurrency, started, tasks } = {\n ...defaultConfig,\n ...config,\n }\n this.running = started!\n this.pending = tasks as Array<() => Promise<any>>\n this.currentConcurrency = concurrency!\n }\n\n private tick() {\n if (!this.running) {\n return\n }\n while (\n this.active.length < this.currentConcurrency &&\n this.pending.length\n ) {\n const nextFn = this.pending.shift()\n if (!nextFn) {\n throw new Error('Found task that is not a function')\n }\n this.active.push(nextFn)\n ;(async () => {\n let success = false\n let res!: T\n let error: any\n try {\n res = await nextFn()\n success = true\n } catch (e) {\n error = e\n }\n this.active = this.active.filter((d) => d !== nextFn)\n if (success) {\n this.onSuccesses.forEach((d) => d(res, nextFn))\n } else {\n this.onErrors.forEach((d) => d(error, nextFn))\n }\n this.onSettles.forEach((d) => d(res, error))\n this.tick()\n })()\n }\n }\n\n add(fn: () => Promise<T> | T, { priority }: { priority?: boolean } = {}) {\n return new Promise<any>((resolve, reject) => {\n const task = () =>\n Promise.resolve(fn())\n .then((res) => {\n resolve(res)\n return res\n })\n .catch((err) => {\n reject(err)\n throw err\n })\n if (priority) {\n this.pending.unshift(task)\n } else {\n this.pending.push(task)\n }\n this.tick()\n })\n }\n\n throttle(n: number) {\n this.currentConcurrency = n\n }\n\n onSettled(cb: () => void) {\n this.onSettles.push(cb)\n return () => {\n this.onSettles = this.onSettles.filter((d) => d !== cb)\n }\n }\n\n onError(cb: (error: any, task: () => Promise<any>) => void) {\n this.onErrors.push(cb)\n return () => {\n this.onErrors = this.onErrors.filter((d) => d !== cb)\n }\n }\n\n onSuccess(cb: (result: any, task: () => Promise<any>) => void) {\n this.onSuccesses.push(cb)\n return () => {\n this.onSuccesses = this.onSuccesses.filter((d) => d !== cb)\n }\n }\n\n stop() {\n this.running = false\n }\n\n start() {\n this.running = true\n this.tick()\n return new Promise<void>((resolve) => {\n this.onSettled(() => {\n if (this.isSettled()) {\n resolve()\n }\n })\n })\n }\n\n clear() {\n this.pending = []\n }\n\n getActive() {\n return this.active\n }\n\n getPending() {\n return this.pending\n }\n\n getAll() {\n return [...this.active, ...this.pending]\n }\n\n isRunning() {\n return this.running\n }\n\n isSettled() {\n return !this.active.length && !this.pending.length\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function resolveEntry<TRequired extends boolean, TReturn = TRequired extends true ? string : string | undefined>(opts: {
2
+ type: string;
3
+ configuredEntry?: string;
4
+ defaultEntry: string;
5
+ resolvedSrcDirectory: string;
6
+ root: string;
7
+ required: TRequired;
8
+ }): TReturn;
@@ -0,0 +1,37 @@
1
+ import { resolveModulePath } from "exsolve";
2
+ function resolveModule(opts) {
3
+ let baseName = opts.baseName;
4
+ if (!baseName.startsWith("./")) {
5
+ baseName = `./${baseName}`;
6
+ }
7
+ return resolveModulePath(baseName, {
8
+ from: opts.from,
9
+ extensions: [".ts", ".js", ".mts", ".mjs", ".tsx", ".jsx"],
10
+ try: true
11
+ });
12
+ }
13
+ function resolveEntry(opts) {
14
+ let resolveOptions;
15
+ if (!opts.configuredEntry) {
16
+ resolveOptions = {
17
+ baseName: opts.defaultEntry,
18
+ from: opts.resolvedSrcDirectory
19
+ };
20
+ } else {
21
+ resolveOptions = {
22
+ baseName: opts.configuredEntry,
23
+ from: opts.root
24
+ };
25
+ }
26
+ const resolvedEntry = resolveModule(resolveOptions);
27
+ if (opts.required && !resolvedEntry) {
28
+ throw new Error(
29
+ `Could not resolve entry for ${opts.type}: ${resolveOptions.baseName} in ${resolveOptions.from}`
30
+ );
31
+ }
32
+ return resolvedEntry;
33
+ }
34
+ export {
35
+ resolveEntry
36
+ };
37
+ //# sourceMappingURL=resolve-entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-entries.js","sources":["../../src/resolve-entries.ts"],"sourcesContent":["import { resolveModulePath } from 'exsolve'\n\ninterface ResolveModuleOptions {\n baseName: string\n from: string\n}\nfunction resolveModule(opts: ResolveModuleOptions): string | undefined {\n let baseName = opts.baseName\n if (!baseName.startsWith('./')) {\n baseName = `./${baseName}`\n }\n return resolveModulePath(baseName, {\n from: opts.from,\n extensions: ['.ts', '.js', '.mts', '.mjs', '.tsx', '.jsx'],\n try: true,\n })\n}\n\nexport function resolveEntry<\n TRequired extends boolean,\n TReturn = TRequired extends true ? string : string | undefined,\n>(opts: {\n type: string\n configuredEntry?: string\n defaultEntry: string\n resolvedSrcDirectory: string\n root: string\n required: TRequired\n}): TReturn {\n let resolveOptions: ResolveModuleOptions\n\n // if entry was not configured, use default relative to srcDirectory\n if (!opts.configuredEntry) {\n resolveOptions = {\n baseName: opts.defaultEntry,\n from: opts.resolvedSrcDirectory,\n }\n } else {\n resolveOptions = {\n baseName: opts.configuredEntry,\n from: opts.root,\n }\n }\n\n const resolvedEntry = resolveModule(resolveOptions)\n if (opts.required && !resolvedEntry) {\n throw new Error(\n `Could not resolve entry for ${opts.type}: ${resolveOptions.baseName} in ${resolveOptions.from}`,\n )\n }\n return resolvedEntry as TReturn\n}\n"],"names":[],"mappings":";AAMA,SAAS,cAAc,MAAgD;AACrE,MAAI,WAAW,KAAK;AACpB,MAAI,CAAC,SAAS,WAAW,IAAI,GAAG;AAC9B,eAAW,KAAK,QAAQ;AAAA,EAC1B;AACA,SAAO,kBAAkB,UAAU;AAAA,IACjC,MAAM,KAAK;AAAA,IACX,YAAY,CAAC,OAAO,OAAO,QAAQ,QAAQ,QAAQ,MAAM;AAAA,IACzD,KAAK;AAAA,EAAA,CACN;AACH;AAEO,SAAS,aAGd,MAOU;AACV,MAAI;AAGJ,MAAI,CAAC,KAAK,iBAAiB;AACzB,qBAAiB;AAAA,MACf,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,IAAA;AAAA,EAEf,OAAO;AACL,qBAAiB;AAAA,MACf,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,IAAA;AAAA,EAEf;AAEA,QAAM,gBAAgB,cAAc,cAAc;AAClD,MAAI,KAAK,YAAY,CAAC,eAAe;AACnC,UAAM,IAAI;AAAA,MACR,+BAA+B,KAAK,IAAI,KAAK,eAAe,QAAQ,OAAO,eAAe,IAAI;AAAA,IAAA;AAAA,EAElG;AACA,SAAO;AACT;"}