@tanstack/start-plugin-core 1.20.3-alpha.1

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/dist/cjs/compilers.cjs +402 -0
  4. package/dist/cjs/compilers.cjs.map +1 -0
  5. package/dist/cjs/compilers.d.cts +21 -0
  6. package/dist/cjs/extractHtmlScripts.cjs +35 -0
  7. package/dist/cjs/extractHtmlScripts.cjs.map +1 -0
  8. package/dist/cjs/extractHtmlScripts.d.cts +4 -0
  9. package/dist/cjs/index.cjs +15 -0
  10. package/dist/cjs/index.cjs.map +1 -0
  11. package/dist/cjs/index.d.cts +7 -0
  12. package/dist/cjs/nitro/build-nitro.cjs +18 -0
  13. package/dist/cjs/nitro/build-nitro.cjs.map +1 -0
  14. package/dist/cjs/nitro/build-nitro.d.cts +2 -0
  15. package/dist/cjs/nitro/build-sitemap.cjs +54 -0
  16. package/dist/cjs/nitro/build-sitemap.cjs.map +1 -0
  17. package/dist/cjs/nitro/build-sitemap.d.cts +9 -0
  18. package/dist/cjs/nitro/dev-server-plugin.cjs +128 -0
  19. package/dist/cjs/nitro/dev-server-plugin.cjs.map +1 -0
  20. package/dist/cjs/nitro/dev-server-plugin.d.cts +5 -0
  21. package/dist/cjs/nitro/nitro-plugin.cjs +128 -0
  22. package/dist/cjs/nitro/nitro-plugin.cjs.map +1 -0
  23. package/dist/cjs/nitro/nitro-plugin.d.cts +3 -0
  24. package/dist/cjs/plugin.cjs +117 -0
  25. package/dist/cjs/plugin.cjs.map +1 -0
  26. package/dist/cjs/plugin.d.cts +2713 -0
  27. package/dist/cjs/prerender.cjs +171 -0
  28. package/dist/cjs/prerender.cjs.map +1 -0
  29. package/dist/cjs/prerender.d.cts +8 -0
  30. package/dist/cjs/queue.cjs +131 -0
  31. package/dist/cjs/queue.cjs.map +1 -0
  32. package/dist/cjs/queue.d.cts +32 -0
  33. package/dist/cjs/routesManifestPlugin.cjs +165 -0
  34. package/dist/cjs/routesManifestPlugin.cjs.map +1 -0
  35. package/dist/cjs/routesManifestPlugin.d.cts +3 -0
  36. package/dist/cjs/schema.cjs +136 -0
  37. package/dist/cjs/schema.cjs.map +1 -0
  38. package/dist/cjs/schema.d.cts +8128 -0
  39. package/dist/cjs/start-compiler-plugin.cjs +72 -0
  40. package/dist/cjs/start-compiler-plugin.cjs.map +1 -0
  41. package/dist/cjs/start-compiler-plugin.d.cts +13 -0
  42. package/dist/cjs/start-server-routes-plugin/config.d.cts +49 -0
  43. package/dist/cjs/start-server-routes-plugin/plugin.cjs +608 -0
  44. package/dist/cjs/start-server-routes-plugin/plugin.cjs.map +1 -0
  45. package/dist/cjs/start-server-routes-plugin/plugin.d.cts +3 -0
  46. package/dist/cjs/start-server-routes-plugin/template.cjs +111 -0
  47. package/dist/cjs/start-server-routes-plugin/template.cjs.map +1 -0
  48. package/dist/cjs/start-server-routes-plugin/template.d.cts +34 -0
  49. package/dist/esm/compilers.d.ts +21 -0
  50. package/dist/esm/compilers.js +384 -0
  51. package/dist/esm/compilers.js.map +1 -0
  52. package/dist/esm/extractHtmlScripts.d.ts +4 -0
  53. package/dist/esm/extractHtmlScripts.js +18 -0
  54. package/dist/esm/extractHtmlScripts.js.map +1 -0
  55. package/dist/esm/index.d.ts +7 -0
  56. package/dist/esm/index.js +15 -0
  57. package/dist/esm/index.js.map +1 -0
  58. package/dist/esm/nitro/build-nitro.d.ts +2 -0
  59. package/dist/esm/nitro/build-nitro.js +18 -0
  60. package/dist/esm/nitro/build-nitro.js.map +1 -0
  61. package/dist/esm/nitro/build-sitemap.d.ts +9 -0
  62. package/dist/esm/nitro/build-sitemap.js +54 -0
  63. package/dist/esm/nitro/build-sitemap.js.map +1 -0
  64. package/dist/esm/nitro/dev-server-plugin.d.ts +5 -0
  65. package/dist/esm/nitro/dev-server-plugin.js +128 -0
  66. package/dist/esm/nitro/dev-server-plugin.js.map +1 -0
  67. package/dist/esm/nitro/nitro-plugin.d.ts +3 -0
  68. package/dist/esm/nitro/nitro-plugin.js +128 -0
  69. package/dist/esm/nitro/nitro-plugin.js.map +1 -0
  70. package/dist/esm/plugin.d.ts +2713 -0
  71. package/dist/esm/plugin.js +117 -0
  72. package/dist/esm/plugin.js.map +1 -0
  73. package/dist/esm/prerender.d.ts +8 -0
  74. package/dist/esm/prerender.js +171 -0
  75. package/dist/esm/prerender.js.map +1 -0
  76. package/dist/esm/queue.d.ts +32 -0
  77. package/dist/esm/queue.js +131 -0
  78. package/dist/esm/queue.js.map +1 -0
  79. package/dist/esm/routesManifestPlugin.d.ts +3 -0
  80. package/dist/esm/routesManifestPlugin.js +165 -0
  81. package/dist/esm/routesManifestPlugin.js.map +1 -0
  82. package/dist/esm/schema.d.ts +8128 -0
  83. package/dist/esm/schema.js +136 -0
  84. package/dist/esm/schema.js.map +1 -0
  85. package/dist/esm/start-compiler-plugin.d.ts +13 -0
  86. package/dist/esm/start-compiler-plugin.js +72 -0
  87. package/dist/esm/start-compiler-plugin.js.map +1 -0
  88. package/dist/esm/start-server-routes-plugin/config.d.ts +49 -0
  89. package/dist/esm/start-server-routes-plugin/plugin.d.ts +3 -0
  90. package/dist/esm/start-server-routes-plugin/plugin.js +608 -0
  91. package/dist/esm/start-server-routes-plugin/plugin.js.map +1 -0
  92. package/dist/esm/start-server-routes-plugin/template.d.ts +34 -0
  93. package/dist/esm/start-server-routes-plugin/template.js +111 -0
  94. package/dist/esm/start-server-routes-plugin/template.js.map +1 -0
  95. package/package.json +72 -0
  96. package/src/compilers.ts +759 -0
  97. package/src/extractHtmlScripts.ts +19 -0
  98. package/src/index.ts +15 -0
  99. package/src/nitro/build-nitro.ts +27 -0
  100. package/src/nitro/build-sitemap.ts +79 -0
  101. package/src/nitro/dev-server-plugin.ts +159 -0
  102. package/src/nitro/nitro-plugin.ts +161 -0
  103. package/src/plugin.ts +145 -0
  104. package/src/prerender.ts +245 -0
  105. package/src/queue.ts +153 -0
  106. package/src/routesManifestPlugin.ts +216 -0
  107. package/src/schema.ts +193 -0
  108. package/src/start-compiler-plugin.ts +111 -0
  109. package/src/start-server-routes-plugin/config.ts +8 -0
  110. package/src/start-server-routes-plugin/plugin.ts +890 -0
  111. package/src/start-server-routes-plugin/template.ts +164 -0
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const fs = require("node:fs");
4
+ const path = require("node:path");
5
+ const xmlbuilder2 = require("xmlbuilder2");
6
+ async function buildSitemap({
7
+ host,
8
+ routes,
9
+ outputDir
10
+ }) {
11
+ const routeList = await optionHasRoutes(routes);
12
+ if (routeList.length) {
13
+ const slash = checkSlash(host);
14
+ const sitemapData = routeList.map((page) => ({
15
+ page: `${host}${slash}${page.replace(/^\/+/g, "")}`,
16
+ lastMod: (/* @__PURE__ */ new Date()).toISOString().split("T")[0]
17
+ }));
18
+ const sitemap = createXml("urlset");
19
+ for (const item of sitemapData) {
20
+ const page = sitemap.ele("url");
21
+ page.ele("loc").txt(item.page);
22
+ page.ele("lastmod").txt(item.lastMod);
23
+ }
24
+ const mapPath = `${path.resolve(outputDir)}/sitemap.xml`;
25
+ try {
26
+ console.log(`Writing sitemap at ${mapPath}`);
27
+ fs.writeFileSync(mapPath, sitemap.end({ prettyPrint: true }));
28
+ } catch (e) {
29
+ console.error(`Unable to write file at ${mapPath}`, e);
30
+ }
31
+ }
32
+ }
33
+ function createXml(elementName) {
34
+ return xmlbuilder2.create({ version: "1.0", encoding: "UTF-8" }).ele(elementName, {
35
+ xmlns: "https://www.sitemaps.org/schemas/sitemap/0.9"
36
+ }).com(`This file was automatically generated by Analog.`);
37
+ }
38
+ function checkSlash(host) {
39
+ const finalChar = host.slice(-1);
40
+ return finalChar === "/" ? "" : "/";
41
+ }
42
+ async function optionHasRoutes(routes) {
43
+ let routeList;
44
+ if (typeof routes === "function") {
45
+ routeList = await routes();
46
+ } else if (Array.isArray(routes)) {
47
+ routeList = routes;
48
+ } else {
49
+ routeList = [];
50
+ }
51
+ return routeList.filter(Boolean);
52
+ }
53
+ exports.buildSitemap = buildSitemap;
54
+ //# sourceMappingURL=build-sitemap.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-sitemap.cjs","sources":["../../../src/nitro/build-sitemap.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { create } from 'xmlbuilder2'\nimport type { XMLBuilder } from 'xmlbuilder2/lib/interfaces'\n\nexport type PagesJson = {\n page: string\n lastMod: string\n}\n\nexport async function buildSitemap({\n host,\n routes,\n outputDir,\n}: {\n host: string\n routes: Array<string | undefined> | (() => Promise<Array<string | undefined>>)\n outputDir: string\n}) {\n const routeList: Array<string> = await optionHasRoutes(routes)\n\n if (routeList.length) {\n const slash = checkSlash(host)\n const sitemapData: Array<PagesJson> = routeList.map((page: string) => ({\n page: `${host}${slash}${page.replace(/^\\/+/g, '')}`,\n lastMod: new Date().toISOString().split('T')[0]!,\n }))\n\n const sitemap = createXml('urlset')\n\n for (const item of sitemapData) {\n const page = sitemap.ele('url')\n page.ele('loc').txt(item.page)\n page.ele('lastmod').txt(item.lastMod)\n }\n\n const mapPath = `${resolve(outputDir)}/sitemap.xml`\n try {\n console.log(`Writing sitemap at ${mapPath}`)\n writeFileSync(mapPath, sitemap.end({ prettyPrint: true }))\n } catch (e) {\n console.error(`Unable to write file at ${mapPath}`, e)\n }\n }\n}\n\nfunction createXml(elementName: 'urlset' | 'sitemapindex'): XMLBuilder {\n return create({ version: '1.0', encoding: 'UTF-8' })\n .ele(elementName, {\n xmlns: 'https://www.sitemaps.org/schemas/sitemap/0.9',\n })\n .com(`This file was automatically generated by Analog.`)\n}\n\nfunction checkSlash(host: string): string {\n const finalChar = host.slice(-1)\n return finalChar === '/' ? '' : '/'\n}\n\nasync function optionHasRoutes(\n routes:\n | Array<string | undefined>\n | (() => Promise<Array<string | undefined>>),\n): Promise<Array<string>> {\n let routeList: Array<string | undefined>\n\n if (typeof routes === 'function') {\n // returns an array or undefined\n routeList = await routes()\n } else if (Array.isArray(routes)) {\n // returns an array of strings\n routeList = routes\n } else {\n // default it to an empty of array\n routeList = []\n }\n\n return routeList.filter(Boolean) as Array<string>\n}\n"],"names":["resolve","writeFileSync","create"],"mappings":";;;;;AAUA,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACK,QAAA,YAA2B,MAAM,gBAAgB,MAAM;AAE7D,MAAI,UAAU,QAAQ;AACd,UAAA,QAAQ,WAAW,IAAI;AAC7B,UAAM,cAAgC,UAAU,IAAI,CAAC,UAAkB;AAAA,MACrE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,MACjD,8BAAa,KAAK,GAAE,cAAc,MAAM,GAAG,EAAE,CAAC;AAAA,IAAA,EAC9C;AAEI,UAAA,UAAU,UAAU,QAAQ;AAElC,eAAW,QAAQ,aAAa;AACxB,YAAA,OAAO,QAAQ,IAAI,KAAK;AAC9B,WAAK,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI;AAC7B,WAAK,IAAI,SAAS,EAAE,IAAI,KAAK,OAAO;AAAA,IAAA;AAGtC,UAAM,UAAU,GAAGA,KAAQ,QAAA,SAAS,CAAC;AACjC,QAAA;AACM,cAAA,IAAI,sBAAsB,OAAO,EAAE;AAC3CC,SAAA,cAAc,SAAS,QAAQ,IAAI,EAAE,aAAa,KAAA,CAAM,CAAC;AAAA,aAClD,GAAG;AACV,cAAQ,MAAM,2BAA2B,OAAO,IAAI,CAAC;AAAA,IAAA;AAAA,EACvD;AAEJ;AAEA,SAAS,UAAU,aAAoD;AAC9D,SAAAC,YAAA,OAAO,EAAE,SAAS,OAAO,UAAU,QAAS,CAAA,EAChD,IAAI,aAAa;AAAA,IAChB,OAAO;AAAA,EAAA,CACR,EACA,IAAI,kDAAkD;AAC3D;AAEA,SAAS,WAAW,MAAsB;AAClC,QAAA,YAAY,KAAK,MAAM,EAAE;AACxB,SAAA,cAAc,MAAM,KAAK;AAClC;AAEA,eAAe,gBACb,QAGwB;AACpB,MAAA;AAEA,MAAA,OAAO,WAAW,YAAY;AAEhC,gBAAY,MAAM,OAAO;AAAA,EAChB,WAAA,MAAM,QAAQ,MAAM,GAAG;AAEpB,gBAAA;AAAA,EAAA,OACP;AAEL,gBAAY,CAAC;AAAA,EAAA;AAGR,SAAA,UAAU,OAAO,OAAO;AACjC;;"}
@@ -0,0 +1,9 @@
1
+ export type PagesJson = {
2
+ page: string;
3
+ lastMod: string;
4
+ };
5
+ export declare function buildSitemap({ host, routes, outputDir, }: {
6
+ host: string;
7
+ routes: Array<string | undefined> | (() => Promise<Array<string | undefined>>);
8
+ outputDir: string;
9
+ }): Promise<void>;
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const h3 = require("h3");
4
+ const vite = require("vite");
5
+ const extractHtmlScripts = require("../extractHtmlScripts.cjs");
6
+ function devServerPlugin() {
7
+ let isTest = false;
8
+ return {
9
+ name: "start-dev-ssr-plugin",
10
+ config(userConfig, { mode }) {
11
+ isTest = isTest ? isTest : mode === "test";
12
+ },
13
+ configureServer(viteDevServer) {
14
+ if (isTest) {
15
+ return;
16
+ }
17
+ globalThis.viteDevServer = viteDevServer;
18
+ return () => {
19
+ remove_html_middlewares(viteDevServer.middlewares);
20
+ let cachedScripts;
21
+ viteDevServer.middlewares.use(async (req, res) => {
22
+ var _a;
23
+ const event = h3.createEvent(req, res);
24
+ const serverEnv = viteDevServer.environments["server"];
25
+ try {
26
+ if (!serverEnv || !vite.isRunnableDevEnvironment(serverEnv)) {
27
+ throw new Error("Server environment not found");
28
+ }
29
+ if (cachedScripts === void 0) {
30
+ const templateHtml = `<html><head></head><body></body></html>`;
31
+ const transformedHtml = await viteDevServer.transformIndexHtml(
32
+ req.url || "/",
33
+ templateHtml
34
+ );
35
+ const scripts = extractHtmlScripts.extractHtmlScripts(transformedHtml);
36
+ globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts.map((script) => script.content ?? "").join(";");
37
+ }
38
+ const serverEntry = await serverEnv.runner.import(
39
+ "/~start/server-entry"
40
+ );
41
+ const response = await serverEntry["default"](event);
42
+ return h3.sendWebResponse(event, response);
43
+ } catch (e) {
44
+ console.error(e);
45
+ viteDevServer.ssrFixStacktrace(e);
46
+ if ((_a = h3.getHeader(event, "content-type")) == null ? void 0 : _a.includes("application/json")) {
47
+ return h3.sendWebResponse(
48
+ event,
49
+ new Response(
50
+ JSON.stringify(
51
+ {
52
+ status: 500,
53
+ error: "Internal Server Error",
54
+ message: "An unexpected error occurred. Please try again later.",
55
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
56
+ },
57
+ null,
58
+ 2
59
+ ),
60
+ {
61
+ status: 500,
62
+ headers: {
63
+ "Content-Type": "application/json"
64
+ }
65
+ }
66
+ )
67
+ );
68
+ }
69
+ return h3.sendWebResponse(
70
+ event,
71
+ new Response(
72
+ `
73
+ <!DOCTYPE html>
74
+ <html lang="en">
75
+ <head>
76
+ <meta charset="UTF-8" />
77
+ <title>Error</title>
78
+ <script type="module">
79
+ import { ErrorOverlay } from '/@vite/client'
80
+ document.body.appendChild(new ErrorOverlay(${JSON.stringify(
81
+ prepareError(req, e)
82
+ ).replace(/</g, "\\u003c")}))
83
+ <\/script>
84
+ </head>
85
+ <body>
86
+ </body>
87
+ </html>
88
+ `,
89
+ {
90
+ status: 500,
91
+ headers: {
92
+ "Content-Type": "text/html"
93
+ }
94
+ }
95
+ )
96
+ );
97
+ }
98
+ });
99
+ };
100
+ }
101
+ };
102
+ }
103
+ function remove_html_middlewares(server) {
104
+ const html_middlewares = [
105
+ "viteIndexHtmlMiddleware",
106
+ "vite404Middleware",
107
+ "viteSpaFallbackMiddleware"
108
+ ];
109
+ for (let i = server.stack.length - 1; i > 0; i--) {
110
+ if (html_middlewares.includes(
111
+ // @ts-expect-error
112
+ server.stack[i].handle.name
113
+ )) {
114
+ server.stack.splice(i, 1);
115
+ }
116
+ }
117
+ }
118
+ function prepareError(req, error) {
119
+ const e = error;
120
+ return {
121
+ message: `An error occured while server rendering ${req.url}:
122
+
123
+ ${typeof e === "string" ? e : e.message} `,
124
+ stack: typeof e === "string" ? "" : e.stack
125
+ };
126
+ }
127
+ exports.devServerPlugin = devServerPlugin;
128
+ //# sourceMappingURL=dev-server-plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-server-plugin.cjs","sources":["../../../src/nitro/dev-server-plugin.ts"],"sourcesContent":["import { createEvent, getHeader, sendWebResponse } from 'h3'\nimport { isRunnableDevEnvironment } from 'vite'\nimport { extractHtmlScripts } from '../extractHtmlScripts'\nimport type { Connect, Plugin, ViteDevServer } from 'vite'\n\ndeclare global {\n // eslint-disable-next-line no-var\n var TSS_INJECTED_HEAD_SCRIPTS: string | undefined\n}\n\nexport function devServerPlugin(): Plugin {\n // let config: UserConfig\n let isTest = false\n\n return {\n name: 'start-dev-ssr-plugin',\n config(userConfig, { mode }) {\n // config = userConfig\n isTest = isTest ? isTest : mode === 'test'\n },\n configureServer(viteDevServer) {\n if (isTest) {\n return\n }\n\n ;(globalThis as any).viteDevServer = viteDevServer\n\n return () => {\n remove_html_middlewares(viteDevServer.middlewares)\n let cachedScripts: string | undefined\n viteDevServer.middlewares.use(async (req, res) => {\n const event = createEvent(req, res)\n const serverEnv = viteDevServer.environments['server']\n\n try {\n if (!serverEnv || !isRunnableDevEnvironment(serverEnv)) {\n throw new Error('Server environment not found')\n }\n if (cachedScripts === undefined) {\n const templateHtml = `<html><head></head><body></body></html>`\n const transformedHtml = await viteDevServer.transformIndexHtml(\n req.url || '/',\n templateHtml,\n )\n const scripts = extractHtmlScripts(transformedHtml)\n globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts\n .map((script) => script.content ?? '')\n .join(';')\n }\n const serverEntry = await serverEnv.runner.import(\n '/~start/server-entry',\n )\n const response = await serverEntry['default'](event)\n\n return sendWebResponse(event, response)\n } catch (e) {\n console.error(e)\n viteDevServer.ssrFixStacktrace(e as Error)\n\n if (\n getHeader(event, 'content-type')?.includes('application/json')\n ) {\n return sendWebResponse(\n event,\n new Response(\n JSON.stringify(\n {\n status: 500,\n error: 'Internal Server Error',\n message:\n 'An unexpected error occurred. Please try again later.',\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ),\n )\n }\n\n return sendWebResponse(\n event,\n new Response(\n `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>Error</title>\n <script type=\"module\">\n import { ErrorOverlay } from '/@vite/client'\n document.body.appendChild(new ErrorOverlay(${JSON.stringify(\n prepareError(req, e),\n ).replace(/</g, '\\\\u003c')}))\n </script>\n </head>\n <body>\n </body>\n </html>\n `,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n },\n ),\n )\n }\n })\n }\n },\n }\n}\n\n/**\n * Removes Vite internal middleware\n *\n * @param server\n */\nfunction remove_html_middlewares(server: ViteDevServer['middlewares']) {\n const html_middlewares = [\n 'viteIndexHtmlMiddleware',\n 'vite404Middleware',\n 'viteSpaFallbackMiddleware',\n ]\n for (let i = server.stack.length - 1; i > 0; i--) {\n if (\n html_middlewares.includes(\n // @ts-expect-error\n server.stack[i].handle.name,\n )\n ) {\n server.stack.splice(i, 1)\n }\n }\n}\n\n/**\n * Formats error for SSR message in error overlay\n * @param req\n * @param error\n * @returns\n */\nfunction prepareError(req: Connect.IncomingMessage, error: unknown) {\n const e = error as Error\n return {\n message: `An error occured while server rendering ${req.url}:\\n\\n\\t${\n typeof e === 'string' ? e : e.message\n } `,\n stack: typeof e === 'string' ? '' : e.stack,\n }\n}\n"],"names":["createEvent","isRunnableDevEnvironment","extractHtmlScripts","sendWebResponse","getHeader"],"mappings":";;;;;AAUO,SAAS,kBAA0B;AAExC,MAAI,SAAS;AAEN,SAAA;AAAA,IACL,MAAM;AAAA,IACN,OAAO,YAAY,EAAE,QAAQ;AAElB,eAAA,SAAS,SAAS,SAAS;AAAA,IACtC;AAAA,IACA,gBAAgB,eAAe;AAC7B,UAAI,QAAQ;AACV;AAAA,MAAA;AAGA,iBAAmB,gBAAgB;AAErC,aAAO,MAAM;AACX,gCAAwB,cAAc,WAAW;AAC7C,YAAA;AACJ,sBAAc,YAAY,IAAI,OAAO,KAAK,QAAQ;;AAC1C,gBAAA,QAAQA,GAAAA,YAAY,KAAK,GAAG;AAC5B,gBAAA,YAAY,cAAc,aAAa,QAAQ;AAEjD,cAAA;AACF,gBAAI,CAAC,aAAa,CAACC,KAAA,yBAAyB,SAAS,GAAG;AAChD,oBAAA,IAAI,MAAM,8BAA8B;AAAA,YAAA;AAEhD,gBAAI,kBAAkB,QAAW;AAC/B,oBAAM,eAAe;AACf,oBAAA,kBAAkB,MAAM,cAAc;AAAA,gBAC1C,IAAI,OAAO;AAAA,gBACX;AAAA,cACF;AACM,oBAAA,UAAUC,sCAAmB,eAAe;AACvC,yBAAA,4BAA4B,QACpC,IAAI,CAAC,WAAW,OAAO,WAAW,EAAE,EACpC,KAAK,GAAG;AAAA,YAAA;AAEP,kBAAA,cAAc,MAAM,UAAU,OAAO;AAAA,cACzC;AAAA,YACF;AACA,kBAAM,WAAW,MAAM,YAAY,SAAS,EAAE,KAAK;AAE5C,mBAAAC,GAAA,gBAAgB,OAAO,QAAQ;AAAA,mBAC/B,GAAG;AACV,oBAAQ,MAAM,CAAC;AACf,0BAAc,iBAAiB,CAAU;AAEzC,iBACEC,QAAAA,UAAU,OAAO,cAAc,MAA/BA,mBAAkC,SAAS,qBAC3C;AACO,qBAAAD,GAAA;AAAA,gBACL;AAAA,gBACA,IAAI;AAAA,kBACF,KAAK;AAAA,oBACH;AAAA,sBACE,QAAQ;AAAA,sBACR,OAAO;AAAA,sBACP,SACE;AAAA,sBACF,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,oBACpC;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA;AAAA,oBACE,QAAQ;AAAA,oBACR,SAAS;AAAA,sBACP,gBAAgB;AAAA,oBAAA;AAAA,kBAClB;AAAA,gBACF;AAAA,cAEJ;AAAA,YAAA;AAGK,mBAAAA,GAAA;AAAA,cACL;AAAA,cACA,IAAI;AAAA,gBACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAQiD,KAAK;AAAA,kBAChD,aAAa,KAAK,CAAC;AAAA,gBAAA,EACnB,QAAQ,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAO9B;AAAA,kBACE,QAAQ;AAAA,kBACR,SAAS;AAAA,oBACP,gBAAgB;AAAA,kBAAA;AAAA,gBAClB;AAAA,cACF;AAAA,YAEJ;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MACH;AAAA,IAAA;AAAA,EAEJ;AACF;AAOA,SAAS,wBAAwB,QAAsC;AACrE,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,WAAS,IAAI,OAAO,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK;AAChD,QACE,iBAAiB;AAAA;AAAA,MAEf,OAAO,MAAM,CAAC,EAAE,OAAO;AAAA,IAAA,GAEzB;AACO,aAAA,MAAM,OAAO,GAAG,CAAC;AAAA,IAAA;AAAA,EAC1B;AAEJ;AAQA,SAAS,aAAa,KAA8B,OAAgB;AAClE,QAAM,IAAI;AACH,SAAA;AAAA,IACL,SAAS,2CAA2C,IAAI,GAAG;AAAA;AAAA,GACzD,OAAO,MAAM,WAAW,IAAI,EAAE,OAChC;AAAA,IACA,OAAO,OAAO,MAAM,WAAW,KAAK,EAAE;AAAA,EACxC;AACF;;"}
@@ -0,0 +1,5 @@
1
+ import { Plugin } from 'vite';
2
+ declare global {
3
+ var TSS_INJECTED_HEAD_SCRIPTS: string | undefined;
4
+ }
5
+ export declare function devServerPlugin(): Plugin;
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const path = require("node:path");
4
+ const fs = require("node:fs");
5
+ const nitropack = require("nitropack");
6
+ const pathe = require("pathe");
7
+ const plugin = require("../plugin.cjs");
8
+ const prerender = require("../prerender.cjs");
9
+ const devServerPlugin = require("./dev-server-plugin.cjs");
10
+ const buildNitro = require("./build-nitro.cjs");
11
+ function nitroPlugin(options, getSsrBundle) {
12
+ const buildPreset = process.env["START_TARGET"] ?? options.target;
13
+ return [
14
+ devServerPlugin.devServerPlugin(),
15
+ {
16
+ name: "tanstack-vite-plugin-nitro",
17
+ configEnvironment(name) {
18
+ if (name === "server") {
19
+ return {
20
+ build: {
21
+ commonjsOptions: {
22
+ include: []
23
+ },
24
+ ssr: true,
25
+ sourcemap: true,
26
+ rollupOptions: {
27
+ input: "/~start/server-entry"
28
+ }
29
+ }
30
+ };
31
+ }
32
+ return null;
33
+ },
34
+ config() {
35
+ return {
36
+ builder: {
37
+ sharedPlugins: true,
38
+ async buildApp(builder) {
39
+ var _a;
40
+ const clientEnv = builder.environments["client"];
41
+ const serverEnv = builder.environments["server"];
42
+ if (!clientEnv) {
43
+ throw new Error("Client environment not found");
44
+ }
45
+ if (!serverEnv) {
46
+ throw new Error("SSR environment not found");
47
+ }
48
+ const clientOutputDir = pathe.resolve(options.root, plugin.clientDistDir);
49
+ fs.rmSync(clientOutputDir, { recursive: true, force: true });
50
+ await builder.build(clientEnv);
51
+ await builder.build(serverEnv);
52
+ const nitroConfig = {
53
+ dev: false,
54
+ // TODO do we need this? should this be made configurable?
55
+ compatibilityDate: "2024-11-19",
56
+ logLevel: 3,
57
+ preset: buildPreset,
58
+ publicAssets: [
59
+ {
60
+ dir: path.resolve(options.root, plugin.clientDistDir)
61
+ }
62
+ ],
63
+ typescript: {
64
+ generateTsConfig: false
65
+ },
66
+ prerender: void 0,
67
+ renderer: plugin.ssrEntryFile,
68
+ rollupConfig: {
69
+ plugins: [virtualBundlePlugin(getSsrBundle())]
70
+ }
71
+ };
72
+ const nitro = await nitropack.createNitro(nitroConfig);
73
+ await buildNitro.buildNitroEnvironment(nitro, () => nitropack.build(nitro));
74
+ if ((_a = options.prerender) == null ? void 0 : _a.enabled) {
75
+ await prerender.prerender({
76
+ options,
77
+ nitro,
78
+ builder
79
+ });
80
+ }
81
+ }
82
+ }
83
+ };
84
+ }
85
+ }
86
+ ];
87
+ }
88
+ function virtualBundlePlugin(ssrBundle) {
89
+ const _modules = /* @__PURE__ */ new Map();
90
+ for (const [fileName, content] of Object.entries(ssrBundle)) {
91
+ if (content.type === "chunk") {
92
+ const virtualModule = {
93
+ code: content.code,
94
+ map: null
95
+ };
96
+ const maybeMap = ssrBundle[`${fileName}.map`];
97
+ if (maybeMap && maybeMap.type === "asset") {
98
+ virtualModule.map = maybeMap.source;
99
+ }
100
+ _modules.set(fileName, virtualModule);
101
+ _modules.set(pathe.resolve(fileName), virtualModule);
102
+ }
103
+ }
104
+ return {
105
+ name: "virtual-bundle",
106
+ resolveId(id, importer) {
107
+ if (_modules.has(id)) {
108
+ return pathe.resolve(id);
109
+ }
110
+ if (importer) {
111
+ const resolved = pathe.resolve(pathe.dirname(importer), id);
112
+ if (_modules.has(resolved)) {
113
+ return resolved;
114
+ }
115
+ }
116
+ return null;
117
+ },
118
+ load(id) {
119
+ const m = _modules.get(id);
120
+ if (!m) {
121
+ return null;
122
+ }
123
+ return m;
124
+ }
125
+ };
126
+ }
127
+ exports.nitroPlugin = nitroPlugin;
128
+ //# sourceMappingURL=nitro-plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nitro-plugin.cjs","sources":["../../../src/nitro/nitro-plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { rmSync } from 'node:fs'\nimport { build, createNitro } from 'nitropack'\nimport { dirname, resolve } from 'pathe'\nimport { clientDistDir, ssrEntryFile } from '../plugin'\nimport { prerender } from '../prerender'\nimport { devServerPlugin } from './dev-server-plugin'\nimport { buildNitroEnvironment } from './build-nitro'\nimport type { EnvironmentOptions, PluginOption, Rollup } from 'vite'\nimport type { NitroConfig } from 'nitropack'\nimport type { TanStackStartOutputConfig } from '../plugin'\n\nexport function nitroPlugin(\n options: TanStackStartOutputConfig,\n getSsrBundle: () => Rollup.OutputBundle,\n): Array<PluginOption> {\n const buildPreset =\n process.env['START_TARGET'] ?? (options.target as string | undefined)\n\n return [\n devServerPlugin(),\n {\n name: 'tanstack-vite-plugin-nitro',\n configEnvironment(name) {\n if (name === 'server') {\n return {\n build: {\n commonjsOptions: {\n include: [],\n },\n ssr: true,\n sourcemap: true,\n rollupOptions: {\n input: '/~start/server-entry',\n },\n },\n } satisfies EnvironmentOptions\n }\n\n return null\n },\n config() {\n return {\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n const clientEnv = builder.environments['client']\n const serverEnv = builder.environments['server']\n\n if (!clientEnv) {\n throw new Error('Client environment not found')\n }\n\n if (!serverEnv) {\n throw new Error('SSR environment not found')\n }\n\n const clientOutputDir = resolve(options.root, clientDistDir)\n rmSync(clientOutputDir, { recursive: true, force: true })\n await builder.build(clientEnv)\n\n await builder.build(serverEnv)\n\n const nitroConfig: NitroConfig = {\n dev: false,\n // TODO do we need this? should this be made configurable?\n compatibilityDate: '2024-11-19',\n logLevel: 3,\n preset: buildPreset,\n publicAssets: [\n {\n dir: path.resolve(options.root, clientDistDir),\n },\n ],\n typescript: {\n generateTsConfig: false,\n },\n prerender: undefined,\n renderer: ssrEntryFile,\n rollupConfig: {\n plugins: [virtualBundlePlugin(getSsrBundle())],\n },\n }\n\n const nitro = await createNitro(nitroConfig)\n\n await buildNitroEnvironment(nitro, () => build(nitro))\n\n if (options.prerender?.enabled) {\n await prerender({\n options,\n nitro,\n builder,\n })\n }\n\n // if (nitroConfig.prerender?.routes?.length && options.sitemap) {\n // console.log('Building Sitemap...')\n // // sitemap needs to be built after all directories are built\n // await buildSitemap({\n // host: options.sitemap.host,\n // routes: nitroConfig.prerender.routes,\n // outputDir: resolve(options.root, 'dist/public'),\n // })\n // }\n\n // console.log(\n // `\\n\\n✅ Client and server bundles successfully built.`,\n // )\n },\n },\n }\n },\n },\n ]\n}\n\nfunction virtualBundlePlugin(ssrBundle: Rollup.OutputBundle): Rollup.Plugin {\n type VirtualModule = { code: string; map: string | null }\n const _modules = new Map<string, VirtualModule>()\n\n // group chunks and source maps\n for (const [fileName, content] of Object.entries(ssrBundle)) {\n if (content.type === 'chunk') {\n const virtualModule: VirtualModule = {\n code: content.code,\n map: null,\n }\n const maybeMap = ssrBundle[`${fileName}.map`]\n if (maybeMap && maybeMap.type === 'asset') {\n virtualModule.map = maybeMap.source as string\n }\n _modules.set(fileName, virtualModule)\n _modules.set(resolve(fileName), virtualModule)\n }\n }\n\n return {\n name: 'virtual-bundle',\n resolveId(id, importer) {\n if (_modules.has(id)) {\n return resolve(id)\n }\n\n if (importer) {\n const resolved = resolve(dirname(importer), id)\n if (_modules.has(resolved)) {\n return resolved\n }\n }\n return null\n },\n load(id) {\n const m = _modules.get(id)\n if (!m) {\n return null\n }\n return m\n },\n }\n}\n"],"names":["devServerPlugin","resolve","clientDistDir","rmSync","ssrEntryFile","createNitro","buildNitroEnvironment","build","prerender","dirname"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { PluginOption, Rollup } from 'vite';
2
+ import { TanStackStartOutputConfig } from '../plugin.cjs';
3
+ export declare function nitroPlugin(options: TanStackStartOutputConfig, getSsrBundle: () => Rollup.OutputBundle): Array<PluginOption>;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const path = require("node:path");
4
+ const nitropack = require("nitropack");
5
+ const schema = require("./schema.cjs");
6
+ const nitroPlugin = require("./nitro/nitro-plugin.cjs");
7
+ const routesManifestPlugin = require("./routesManifestPlugin.cjs");
8
+ const startCompilerPlugin = require("./start-compiler-plugin.cjs");
9
+ schema.createTanStackStartOptionsSchema();
10
+ schema.createTanStackConfig();
11
+ const clientDistDir = ".tanstack-start/build/client-dist";
12
+ const ssrEntryFile = "ssr.mjs";
13
+ let ssrBundle;
14
+ function TanStackStartVitePluginCore(framework, opts) {
15
+ return [
16
+ {
17
+ name: "tanstack-start-core:config-client",
18
+ async config() {
19
+ const nitroOutputPublicDir = await (async () => {
20
+ const dummyNitroApp = await nitropack.createNitro({
21
+ preset: opts.target,
22
+ compatibilityDate: "2024-12-01"
23
+ });
24
+ const nitroOutputPublicDir2 = dummyNitroApp.options.output.publicDir;
25
+ await dummyNitroApp.close();
26
+ return nitroOutputPublicDir2;
27
+ })();
28
+ return {
29
+ environments: {
30
+ client: {
31
+ consumer: "client",
32
+ build: {
33
+ manifest: true,
34
+ rollupOptions: {
35
+ input: {
36
+ main: opts.clientEntryPath
37
+ },
38
+ output: {
39
+ dir: path.resolve(opts.root, clientDistDir)
40
+ },
41
+ // TODO this should be removed
42
+ external: ["node:fs", "node:path", "node:os", "node:crypto"]
43
+ }
44
+ }
45
+ },
46
+ server: {
47
+ consumer: "server",
48
+ build: {
49
+ ssr: true,
50
+ // we don't write to the file system as the below 'capture-output' plugin will
51
+ // capture the output and write it to the virtual file system
52
+ write: false,
53
+ copyPublicDir: false,
54
+ rollupOptions: {
55
+ output: {
56
+ entryFileNames: ssrEntryFile
57
+ },
58
+ plugins: [
59
+ {
60
+ name: "capture-output",
61
+ generateBundle(options, bundle) {
62
+ ssrBundle = bundle;
63
+ }
64
+ }
65
+ ]
66
+ },
67
+ commonjsOptions: {
68
+ include: [/node_modules/]
69
+ }
70
+ }
71
+ }
72
+ },
73
+ resolve: {
74
+ noExternal: [
75
+ "@tanstack/start-client",
76
+ "@tanstack/start-client-core",
77
+ "@tanstack/start-server",
78
+ "@tanstack/start-server-core",
79
+ "@tanstack/start-server-functions-fetcher",
80
+ "@tanstack/start-server-functions-client",
81
+ "@tanstack/start-server-functions-server",
82
+ "@tanstack/start-router-manifest",
83
+ "@tanstack/start-config",
84
+ "@tanstack/server-functions-plugin",
85
+ "tanstack:start-manifest",
86
+ "tanstack:server-fn-manifest",
87
+ "nitropack",
88
+ "@tanstack/**"
89
+ ],
90
+ external: ["undici"]
91
+ },
92
+ /* prettier-ignore */
93
+ define: {
94
+ ...injectDefineEnv("TSS_PUBLIC_BASE", opts.public.base),
95
+ ...injectDefineEnv("TSS_CLIENT_BASE", opts.client.base),
96
+ ...injectDefineEnv("TSS_CLIENT_ENTRY", opts.clientEntryPath),
97
+ ...injectDefineEnv("TSS_SERVER_FN_BASE", opts.serverFns.base),
98
+ ...injectDefineEnv("TSS_OUTPUT_PUBLIC_DIR", nitroOutputPublicDir)
99
+ }
100
+ };
101
+ }
102
+ },
103
+ startCompilerPlugin.TanStackStartCompilerPlugin(framework),
104
+ routesManifestPlugin.startManifestPlugin(opts),
105
+ nitroPlugin.nitroPlugin(opts, () => ssrBundle)
106
+ ];
107
+ }
108
+ function injectDefineEnv(key, value) {
109
+ return {
110
+ [`process.env.${key}`]: JSON.stringify(value),
111
+ [`import.meta.env.${key}`]: JSON.stringify(value)
112
+ };
113
+ }
114
+ exports.TanStackStartVitePluginCore = TanStackStartVitePluginCore;
115
+ exports.clientDistDir = clientDistDir;
116
+ exports.ssrEntryFile = ssrEntryFile;
117
+ //# sourceMappingURL=plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs","sources":["../../src/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { createNitro } from 'nitropack'\nimport {\n createTanStackConfig,\n createTanStackStartOptionsSchema,\n} from './schema'\nimport { nitroPlugin } from './nitro/nitro-plugin'\nimport { startManifestPlugin } from './routesManifestPlugin'\nimport { TanStackStartCompilerPlugin } from './start-compiler-plugin'\nimport type { PluginOption, Rollup } from 'vite'\nimport type { z } from 'zod'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nconst TanStackStartOptionsSchema = createTanStackStartOptionsSchema()\nexport type TanStackStartInputConfig = z.input<\n typeof TanStackStartOptionsSchema\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 const clientDistDir = '.tanstack-start/build/client-dist'\nexport const ssrEntryFile = 'ssr.mjs'\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 framework: CompileStartFrameworkOptions,\n opts: TanStackStartOutputConfig,\n): Array<PluginOption> {\n return [\n {\n name: 'tanstack-start-core:config-client',\n async config() {\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: opts.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 return {\n environments: {\n client: {\n consumer: 'client',\n build: {\n manifest: true,\n rollupOptions: {\n input: {\n main: opts.clientEntryPath,\n },\n output: {\n dir: path.resolve(opts.root, clientDistDir),\n },\n // TODO this should be removed\n external: ['node:fs', 'node:path', 'node:os', 'node:crypto'],\n },\n },\n },\n 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: ssrEntryFile,\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-client',\n '@tanstack/start-client-core',\n '@tanstack/start-server',\n '@tanstack/start-server-core',\n '@tanstack/start-server-functions-fetcher',\n '@tanstack/start-server-functions-client',\n '@tanstack/start-server-functions-server',\n '@tanstack/start-router-manifest',\n '@tanstack/start-config',\n '@tanstack/server-functions-plugin',\n 'tanstack:start-manifest',\n 'tanstack:server-fn-manifest',\n 'nitropack',\n '@tanstack/**',\n ],\n external: ['undici'],\n },\n /* prettier-ignore */\n define: {\n ...injectDefineEnv('TSS_PUBLIC_BASE', opts.public.base),\n ...injectDefineEnv('TSS_CLIENT_BASE', opts.client.base),\n ...injectDefineEnv('TSS_CLIENT_ENTRY', opts.clientEntryPath),\n ...injectDefineEnv('TSS_SERVER_FN_BASE', opts.serverFns.base),\n ...injectDefineEnv('TSS_OUTPUT_PUBLIC_DIR', nitroOutputPublicDir),\n },\n }\n },\n },\n TanStackStartCompilerPlugin(framework),\n startManifestPlugin(opts),\n nitroPlugin(opts, () => ssrBundle),\n ]\n}\n\nfunction injectDefineEnv<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":["createTanStackStartOptionsSchema","createTanStackConfig","createNitro","nitroOutputPublicDir","TanStackStartCompilerPlugin","startManifestPlugin","nitroPlugin"],"mappings":";;;;;;;;AAamCA,OAAiC,iCAAA;AAK9CC,OAAqB,qBAAA;AASpC,MAAM,gBAAgB;AACtB,MAAM,eAAe;AAG5B,IAAI;AAEY,SAAA,4BACd,WACA,MACqB;AACd,SAAA;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM,SAAS;AACP,cAAA,uBAAuB,OAAO,YAAY;AAExC,gBAAA,gBAAgB,MAAMC,sBAAY;AAAA,YACtC,QAAQ,KAAK;AAAA,YACb,mBAAmB;AAAA,UAAA,CACpB;AAEKC,gBAAAA,wBAAuB,cAAc,QAAQ,OAAO;AAC1D,gBAAM,cAAc,MAAM;AAEnBA,iBAAAA;AAAAA,QAAAA,GACN;AAEI,eAAA;AAAA,UACL,cAAc;AAAA,YACZ,QAAQ;AAAA,cACN,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,eAAe;AAAA,kBACb,OAAO;AAAA,oBACL,MAAM,KAAK;AAAA,kBACb;AAAA,kBACA,QAAQ;AAAA,oBACN,KAAK,KAAK,QAAQ,KAAK,MAAM,aAAa;AAAA,kBAC5C;AAAA;AAAA,kBAEA,UAAU,CAAC,WAAW,aAAa,WAAW,aAAa;AAAA,gBAAA;AAAA,cAC7D;AAAA,YAEJ;AAAA,YACA,QAAQ;AAAA,cACN,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,SAAS,QAAQ;AAElB,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,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ;AAAA,UACrB;AAAA;AAAA,UAEA,QAAQ;AAAA,YACN,GAAG,gBAAgB,mBAAmB,KAAK,OAAO,IAAI;AAAA,YACtD,GAAG,gBAAgB,mBAAmB,KAAK,OAAO,IAAI;AAAA,YACtD,GAAG,gBAAgB,oBAAoB,KAAK,eAAe;AAAA,YAC3D,GAAG,gBAAgB,sBAAsB,KAAK,UAAU,IAAI;AAAA,YAC5D,GAAG,gBAAgB,yBAAyB,oBAAoB;AAAA,UAAA;AAAA,QAEpE;AAAA,MAAA;AAAA,IAEJ;AAAA,IACAC,oBAAAA,4BAA4B,SAAS;AAAA,IACrCC,qBAAAA,oBAAoB,IAAI;AAAA,IACxBC,YAAA,YAAY,MAAM,MAAM,SAAS;AAAA,EACnC;AACF;AAEA,SAAS,gBACP,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;;;;"}