@squadbase/vantage 0.6.2-dev1.ac99e02 → 0.6.2-dev1.d7c0911

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 (141) hide show
  1. package/dist/{build-MFWRPYKW.js → build-X5NVCQKT.js} +4 -4
  2. package/dist/{build-MFWRPYKW.js.map → build-X5NVCQKT.js.map} +1 -1
  3. package/dist/{chunk-IBGOCWJB.js → chunk-2ICNHUG6.js} +186 -82
  4. package/dist/chunk-2ICNHUG6.js.map +1 -0
  5. package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
  6. package/dist/chunk-2N72FKLB.js.map +1 -0
  7. package/dist/{chunk-PXRX5PEC.js → chunk-PDOBHMUQ.js} +3 -3
  8. package/dist/chunk-PDOBHMUQ.js.map +1 -0
  9. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  10. package/dist/chunk-U736PVHY.js.map +1 -0
  11. package/dist/{chunk-QEWCYW3I.js → chunk-WAMZWZJB.js} +13 -3
  12. package/dist/chunk-WAMZWZJB.js.map +1 -0
  13. package/dist/chunk-WRSX2MDK.js +7866 -0
  14. package/dist/chunk-WRSX2MDK.js.map +1 -0
  15. package/dist/{chunk-OB6UBJXF.js → chunk-XPQSTZUU.js} +125 -35
  16. package/dist/chunk-XPQSTZUU.js.map +1 -0
  17. package/dist/cli.js +3 -3
  18. package/dist/components/index.d.ts +1831 -99
  19. package/dist/components/index.js +4 -4
  20. package/dist/{dev-DCTOHQ6W.js → dev-4XEDTELV.js} +4 -4
  21. package/dist/{dev-DCTOHQ6W.js.map → dev-4XEDTELV.js.map} +1 -1
  22. package/dist/doc/index.js +2 -2
  23. package/dist/doc/index.js.map +1 -1
  24. package/dist/markdown/index.js +1 -1
  25. package/dist/markdown/index.js.map +1 -1
  26. package/dist/table/index.js +5 -5
  27. package/dist/table/index.js.map +1 -1
  28. package/dist/ui/index.d.ts +4 -1
  29. package/dist/ui/index.js +21 -111
  30. package/dist/ui/index.js.map +1 -1
  31. package/dist/{upgrade-DBBE6GIR.js → upgrade-JHXZBGQS.js} +3 -3
  32. package/dist/{upgrade-DBBE6GIR.js.map → upgrade-JHXZBGQS.js.map} +1 -1
  33. package/dist/vite/index.js +2 -2
  34. package/docs/en/components.md +29 -15
  35. package/docs/en/parts/data-table.md +22 -0
  36. package/docs/en/parts/delta.md +50 -0
  37. package/docs/en/parts/format.md +43 -0
  38. package/docs/en/parts/kpi-card.md +57 -0
  39. package/docs/en/parts/metric-value.md +3 -2
  40. package/docs/en/parts/sparkline.md +1 -1
  41. package/docs/en/parts/trend-indicator.md +17 -1
  42. package/docs/en/ui-and-theming.md +1 -1
  43. package/docs/index.json +92 -32
  44. package/docs/ja/changelog.md +5 -0
  45. package/docs/ja/components.md +27 -15
  46. package/docs/ja/parts/data-table.md +22 -0
  47. package/docs/ja/parts/delta.md +50 -0
  48. package/docs/ja/parts/format.md +44 -0
  49. package/docs/ja/parts/kpi-card.md +55 -0
  50. package/docs/ja/parts/metric-value.md +3 -2
  51. package/docs/ja/parts/sparkline.md +1 -1
  52. package/docs/ja/parts/trend-indicator.md +17 -1
  53. package/docs/ja/ui-and-theming.md +2 -2
  54. package/package.json +2 -1
  55. package/registry/ui/accordion.tsx +4 -2
  56. package/registry/ui/alert-dialog.tsx +3 -3
  57. package/registry/ui/alert.tsx +3 -1
  58. package/registry/ui/app-shell.tsx +7 -1
  59. package/registry/ui/area-chart.tsx +2781 -157
  60. package/registry/ui/avatar.tsx +1 -1
  61. package/registry/ui/badge.tsx +3 -1
  62. package/registry/ui/bar-chart.tsx +2780 -157
  63. package/registry/ui/bar-list.tsx +3471 -93
  64. package/registry/ui/breadcrumb.tsx +3 -1
  65. package/registry/ui/button.tsx +3 -1
  66. package/registry/ui/calendar.tsx +3 -1
  67. package/registry/ui/card.tsx +4 -2
  68. package/registry/ui/category-bar.tsx +990 -16
  69. package/registry/ui/chart-frame.tsx +1358 -0
  70. package/registry/ui/checkbox.tsx +3 -1
  71. package/registry/ui/collapsible.tsx +3 -1
  72. package/registry/ui/combobox.tsx +2 -2
  73. package/registry/ui/command.tsx +3 -1
  74. package/registry/ui/dashboard-card.tsx +69 -26
  75. package/registry/ui/data-table.tsx +678 -56
  76. package/registry/ui/date-range-picker.tsx +245 -64
  77. package/registry/ui/delta.tsx +188 -0
  78. package/registry/ui/dialog.tsx +5 -3
  79. package/registry/ui/donut-chart.tsx +2857 -173
  80. package/registry/ui/drawer.tsx +1 -1
  81. package/registry/ui/dropdown-menu.tsx +5 -3
  82. package/registry/ui/echart.tsx +448 -44
  83. package/registry/ui/field.tsx +1 -1
  84. package/registry/ui/filter-bar.tsx +33 -6
  85. package/registry/ui/funnel-steps.tsx +3316 -49
  86. package/registry/ui/heatmap.tsx +1752 -0
  87. package/registry/ui/hover-card.tsx +2 -2
  88. package/registry/ui/input-group.tsx +3 -1
  89. package/registry/ui/input.tsx +3 -1
  90. package/registry/ui/kbd.tsx +3 -1
  91. package/registry/ui/kpi-card.tsx +677 -0
  92. package/registry/ui/label.tsx +3 -1
  93. package/registry/ui/legend.tsx +3500 -0
  94. package/registry/ui/line-chart.tsx +2781 -151
  95. package/registry/ui/metric-value.tsx +9 -1
  96. package/registry/ui/multi-select.tsx +11 -5
  97. package/registry/ui/page-shell.tsx +104 -49
  98. package/registry/ui/pagination.tsx +3 -1
  99. package/registry/ui/placeholder.tsx +8 -2
  100. package/registry/ui/popover.tsx +4 -2
  101. package/registry/ui/progress-circle.tsx +607 -12
  102. package/registry/ui/progress.tsx +3 -1
  103. package/registry/ui/radio-group.tsx +1 -1
  104. package/registry/ui/sample-data.tsx +86 -0
  105. package/registry/ui/scatter-chart.tsx +4150 -0
  106. package/registry/ui/scroll-area.tsx +3 -2
  107. package/registry/ui/searchable-select.tsx +8 -3
  108. package/registry/ui/section-header.tsx +4 -2
  109. package/registry/ui/segmented-control.tsx +7 -2
  110. package/registry/ui/select.tsx +4 -2
  111. package/registry/ui/separator.tsx +3 -1
  112. package/registry/ui/sheet.tsx +4 -2
  113. package/registry/ui/sidebar.tsx +4 -2
  114. package/registry/ui/skeleton.tsx +4 -2
  115. package/registry/ui/slider.tsx +3 -1
  116. package/registry/ui/sparkline.tsx +84 -9
  117. package/registry/ui/spinner.tsx +3 -1
  118. package/registry/ui/states.tsx +34 -5
  119. package/registry/ui/status-badge.tsx +81 -39
  120. package/registry/ui/switch.tsx +3 -1
  121. package/registry/ui/table.tsx +4 -2
  122. package/registry/ui/tabs.tsx +5 -3
  123. package/registry/ui/textarea.tsx +3 -1
  124. package/registry/ui/toast.tsx +2 -2
  125. package/registry/ui/toggle-group.tsx +3 -1
  126. package/registry/ui/toggle.tsx +3 -1
  127. package/registry/ui/tooltip.tsx +4 -2
  128. package/registry/ui/tracker.tsx +624 -17
  129. package/registry/ui/trend-indicator.tsx +13 -1
  130. package/registry/ui/updated-at.tsx +122 -0
  131. package/registry/ui/waterfall-chart.tsx +4186 -0
  132. package/templates/AGENTS.md +13 -1
  133. package/theme.css +237 -136
  134. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  135. package/dist/chunk-A2UUGASH.js.map +0 -1
  136. package/dist/chunk-AG6RZ2RR.js +0 -3208
  137. package/dist/chunk-AG6RZ2RR.js.map +0 -1
  138. package/dist/chunk-IBGOCWJB.js.map +0 -1
  139. package/dist/chunk-OB6UBJXF.js.map +0 -1
  140. package/dist/chunk-PXRX5PEC.js.map +0 -1
  141. package/dist/chunk-QEWCYW3I.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { runDiagnostics } from './chunk-7DZGJQ3P.js';
2
2
  import './chunk-JKLLFVEU.js';
3
- import { vantagePlugin } from './chunk-IBGOCWJB.js';
4
- import { generateArtifacts } from './chunk-QEWCYW3I.js';
3
+ import { vantagePlugin } from './chunk-2ICNHUG6.js';
4
+ import { generateArtifacts } from './chunk-WAMZWZJB.js';
5
5
  import './chunk-CEXAQQ5W.js';
6
6
  import { scanProject, timedAsync } from './chunk-RNTDBX6S.js';
7
7
  import './chunk-46QI6GFC.js';
@@ -104,5 +104,5 @@ function writeDeployManifest(root, model) {
104
104
  }
105
105
 
106
106
  export { build };
107
- //# sourceMappingURL=build-MFWRPYKW.js.map
108
- //# sourceMappingURL=build-MFWRPYKW.js.map
107
+ //# sourceMappingURL=build-X5NVCQKT.js.map
108
+ //# sourceMappingURL=build-X5NVCQKT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/build.ts"],"names":["viteBuild"],"mappings":"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","file":"build-MFWRPYKW.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { build as viteBuild, loadEnv } from \"vite\"\nimport { MANIFEST_SCHEMA_VERSION, VANTAGE_DIR } from \"../core/constants\"\nimport { runDiagnostics } from \"../core/diagnostics\"\nimport { generateArtifacts } from \"../core/generate\"\nimport { timedAsync } from \"../core/profile\"\nimport { scanProject } from \"../core/scan\"\nimport type { RouteModel } from \"../core/types\"\nimport { vantagePlugin } from \"../vite/index\"\nimport { applyApiBaseUrlFlag, log, printDiagnostics, type ParsedArgs } from \"./util\"\n\nconst SERVER_ENTRY = `// AUTO-GENERATED by @squadbase/vantage.\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { startNodeServer } from \"@squadbase/vantage/server/node\"\nimport { apiRoutes } from \"./server-routes.gen\"\n\nconst clientDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../client\")\nstartNodeServer({ apiRoutes, clientDir })\n`\n\n/** `vantage build` — build client and (optionally) server into dist/. */\nexport async function build(root: string, args: ParsedArgs): Promise<number> {\n const model = scanProject(root)\n const errors = runDiagnostics(root, model).filter((d) => d.severity === \"error\")\n if (errors.length) {\n printDiagnostics(errors)\n log.error(\"Fix the errors above before building.\")\n return 1\n }\n\n const mode = \"production\"\n // `--api-base-url` feeds the client's PUBLIC_API_BASE_URL. Setting it on\n // process.env (before loadEnv/Vite read env) makes the flag win over any .env\n // value and keeps the single env-prefix mechanism — no Vite `define`.\n applyApiBaseUrlFlag(args)\n const env = { ...process.env, ...loadEnv(mode, root, \"\") }\n const quiet = Boolean(args.flags.json)\n\n // Write .vantage/ up front instead of letting the plugin do it at\n // configResolved: the server bundle reads server-routes.gen.ts, so once the\n // artifacts exist the two builds no longer depend on each other and can run\n // at the same time (they write to dist/client and dist/server respectively).\n generateArtifacts({ root, model })\n\n if (!quiet) log.step(model.hasServer ? \"Building client and server…\" : \"Building client…\")\n\n const clientBuild = timedAsync(\"build:client\", async () => {\n await viteBuild({\n configFile: false,\n root,\n mode,\n plugins: [vantagePlugin({ root, env, model, artifactsWritten: true })],\n logLevel: quiet ? \"silent\" : args.flags.verbose ? \"info\" : \"warn\",\n })\n // The HTML input lives in .vantage/, so Vite emits it to dist/client/.vantage/.\n // Hoist it to dist/client/index.html (asset URLs are already root-absolute).\n relocateClientHtml(root)\n })\n\n const serverBuild = model.hasServer\n ? timedAsync(\"build:server\", () => buildServer(root))\n : Promise.resolve()\n\n await Promise.all([clientBuild, serverBuild])\n\n writeDeployManifest(root, model)\n if (!quiet) log.ok(`Build complete → ${path.relative(process.cwd(), path.join(root, \"dist\")) || \"dist\"}/`)\n\n if (args.flags.json) {\n process.stdout.write(\n JSON.stringify({\n ok: true,\n mode: model.hasServer ? \"fullstack\" : \"spa\",\n output: \"dist\",\n pages: model.pages.length,\n apis: model.apis.length,\n }) + \"\\n\",\n )\n }\n return 0\n}\n\nfunction relocateClientHtml(root: string): void {\n const clientDir = path.join(root, \"dist\", \"client\")\n const nested = path.join(clientDir, VANTAGE_DIR, \"index.html\")\n const target = path.join(clientDir, \"index.html\")\n if (fs.existsSync(nested)) {\n fs.mkdirSync(clientDir, { recursive: true })\n fs.renameSync(nested, target)\n fs.rmSync(path.join(clientDir, VANTAGE_DIR), { recursive: true, force: true })\n }\n}\n\nasync function buildServer(root: string): Promise<void> {\n // Loaded here, not at module scope: an SPA project never builds a server and\n // should not pay for esbuild's binary being brought up.\n const { build: esbuildBuild } = await import(\"esbuild\")\n const vantageDir = path.join(root, VANTAGE_DIR)\n const entry = path.join(vantageDir, \"server-entry.ts\")\n fs.writeFileSync(entry, SERVER_ENTRY)\n await esbuildBuild({\n entryPoints: [entry],\n outfile: path.join(root, \"dist\", \"server\", \"index.mjs\"),\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n target: \"node20\",\n logLevel: \"warning\",\n banner: { js: \"// @squadbase/vantage server bundle\" },\n })\n}\n\nfunction writeDeployManifest(root: string, model: RouteModel): void {\n const dist = path.join(root, \"dist\")\n fs.mkdirSync(dist, { recursive: true })\n const manifest = {\n schemaVersion: MANIFEST_SCHEMA_VERSION,\n mode: model.hasServer ? \"fullstack\" : \"spa\",\n client: \"./client\",\n ...(model.hasServer ? { server: \"./server/index.mjs\" } : {}),\n spaFallback: \"./client/index.html\",\n runtime: \"node\",\n }\n fs.writeFileSync(path.join(dist, \"vantage-manifest.json\"), JSON.stringify(manifest, null, 2) + \"\\n\")\n}\n"]}
1
+ {"version":3,"sources":["../src/cli/build.ts"],"names":["viteBuild"],"mappings":"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","file":"build-X5NVCQKT.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { build as viteBuild, loadEnv } from \"vite\"\nimport { MANIFEST_SCHEMA_VERSION, VANTAGE_DIR } from \"../core/constants\"\nimport { runDiagnostics } from \"../core/diagnostics\"\nimport { generateArtifacts } from \"../core/generate\"\nimport { timedAsync } from \"../core/profile\"\nimport { scanProject } from \"../core/scan\"\nimport type { RouteModel } from \"../core/types\"\nimport { vantagePlugin } from \"../vite/index\"\nimport { applyApiBaseUrlFlag, log, printDiagnostics, type ParsedArgs } from \"./util\"\n\nconst SERVER_ENTRY = `// AUTO-GENERATED by @squadbase/vantage.\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { startNodeServer } from \"@squadbase/vantage/server/node\"\nimport { apiRoutes } from \"./server-routes.gen\"\n\nconst clientDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../client\")\nstartNodeServer({ apiRoutes, clientDir })\n`\n\n/** `vantage build` — build client and (optionally) server into dist/. */\nexport async function build(root: string, args: ParsedArgs): Promise<number> {\n const model = scanProject(root)\n const errors = runDiagnostics(root, model).filter((d) => d.severity === \"error\")\n if (errors.length) {\n printDiagnostics(errors)\n log.error(\"Fix the errors above before building.\")\n return 1\n }\n\n const mode = \"production\"\n // `--api-base-url` feeds the client's PUBLIC_API_BASE_URL. Setting it on\n // process.env (before loadEnv/Vite read env) makes the flag win over any .env\n // value and keeps the single env-prefix mechanism — no Vite `define`.\n applyApiBaseUrlFlag(args)\n const env = { ...process.env, ...loadEnv(mode, root, \"\") }\n const quiet = Boolean(args.flags.json)\n\n // Write .vantage/ up front instead of letting the plugin do it at\n // configResolved: the server bundle reads server-routes.gen.ts, so once the\n // artifacts exist the two builds no longer depend on each other and can run\n // at the same time (they write to dist/client and dist/server respectively).\n generateArtifacts({ root, model })\n\n if (!quiet) log.step(model.hasServer ? \"Building client and server…\" : \"Building client…\")\n\n const clientBuild = timedAsync(\"build:client\", async () => {\n await viteBuild({\n configFile: false,\n root,\n mode,\n plugins: [vantagePlugin({ root, env, model, artifactsWritten: true })],\n logLevel: quiet ? \"silent\" : args.flags.verbose ? \"info\" : \"warn\",\n })\n // The HTML input lives in .vantage/, so Vite emits it to dist/client/.vantage/.\n // Hoist it to dist/client/index.html (asset URLs are already root-absolute).\n relocateClientHtml(root)\n })\n\n const serverBuild = model.hasServer\n ? timedAsync(\"build:server\", () => buildServer(root))\n : Promise.resolve()\n\n await Promise.all([clientBuild, serverBuild])\n\n writeDeployManifest(root, model)\n if (!quiet) log.ok(`Build complete → ${path.relative(process.cwd(), path.join(root, \"dist\")) || \"dist\"}/`)\n\n if (args.flags.json) {\n process.stdout.write(\n JSON.stringify({\n ok: true,\n mode: model.hasServer ? \"fullstack\" : \"spa\",\n output: \"dist\",\n pages: model.pages.length,\n apis: model.apis.length,\n }) + \"\\n\",\n )\n }\n return 0\n}\n\nfunction relocateClientHtml(root: string): void {\n const clientDir = path.join(root, \"dist\", \"client\")\n const nested = path.join(clientDir, VANTAGE_DIR, \"index.html\")\n const target = path.join(clientDir, \"index.html\")\n if (fs.existsSync(nested)) {\n fs.mkdirSync(clientDir, { recursive: true })\n fs.renameSync(nested, target)\n fs.rmSync(path.join(clientDir, VANTAGE_DIR), { recursive: true, force: true })\n }\n}\n\nasync function buildServer(root: string): Promise<void> {\n // Loaded here, not at module scope: an SPA project never builds a server and\n // should not pay for esbuild's binary being brought up.\n const { build: esbuildBuild } = await import(\"esbuild\")\n const vantageDir = path.join(root, VANTAGE_DIR)\n const entry = path.join(vantageDir, \"server-entry.ts\")\n fs.writeFileSync(entry, SERVER_ENTRY)\n await esbuildBuild({\n entryPoints: [entry],\n outfile: path.join(root, \"dist\", \"server\", \"index.mjs\"),\n bundle: true,\n platform: \"node\",\n format: \"esm\",\n target: \"node20\",\n logLevel: \"warning\",\n banner: { js: \"// @squadbase/vantage server bundle\" },\n })\n}\n\nfunction writeDeployManifest(root: string, model: RouteModel): void {\n const dist = path.join(root, \"dist\")\n fs.mkdirSync(dist, { recursive: true })\n const manifest = {\n schemaVersion: MANIFEST_SCHEMA_VERSION,\n mode: model.hasServer ? \"fullstack\" : \"spa\",\n client: \"./client\",\n ...(model.hasServer ? { server: \"./server/index.mjs\" } : {}),\n spaFallback: \"./client/index.html\",\n runtime: \"node\",\n }\n fs.writeFileSync(path.join(dist, \"vantage-manifest.json\"), JSON.stringify(manifest, null, 2) + \"\\n\")\n}\n"]}
@@ -1,16 +1,16 @@
1
- import { generateArtifacts, setDraftArtifacts } from './chunk-QEWCYW3I.js';
1
+ import { generateArtifacts, setDraftArtifacts, restoreClientEntry } from './chunk-WAMZWZJB.js';
2
2
  import { scanProject, resolvePageRoot, stripExt, splitPageVariant, fileToSegments, displayPath } from './chunk-RNTDBX6S.js';
3
3
  import { corsMiddleware, matchApiRoute, dispatchApi, sortApiRoutes } from './chunk-46QI6GFC.js';
4
4
  import { VANTAGE_DIR, NON_ROUTE_DIRS, FILE_PAGE_EXTENSIONS, PAGE_EXTENSIONS, RESERVED_PAGE_NAMES } from './chunk-C2CX6GLX.js';
5
5
  import fs3 from 'fs';
6
- import path5 from 'path';
6
+ import path6 from 'path';
7
7
  import react from '@vitejs/plugin-react';
8
8
  import tailwindcss from '@tailwindcss/vite';
9
9
  import { Hono } from 'hono';
10
10
  import { getRequestListener } from '@hono/node-server';
11
11
  import { createHash, timingSafeEqual } from 'crypto';
12
12
  import { createRequire } from 'module';
13
- import { pathToFileURL } from 'url';
13
+ import { pathToFileURL, fileURLToPath } from 'url';
14
14
 
15
15
  // @squadbase/vantage — generated build. Do not edit.
16
16
  function createApiDevMiddleware(opts) {
@@ -50,8 +50,8 @@ function createApiDevMiddleware(opts) {
50
50
  const listener = getRequestListener(app.fetch);
51
51
  return (req, res, next) => {
52
52
  const url = req.url ?? "/";
53
- const path6 = url.split("?")[0];
54
- if (path6 === "/api" || path6.startsWith("/api/")) {
53
+ const path7 = url.split("?")[0];
54
+ if (path7 === "/api" || path7.startsWith("/api/")) {
55
55
  Promise.resolve(listener(req, res)).catch((err) => {
56
56
  console.error("[vantage] API middleware failure:", err);
57
57
  if (!res.headersSent) {
@@ -126,7 +126,7 @@ var BorrowedVersions = class {
126
126
  var loaded;
127
127
  async function loadTypeScript(root) {
128
128
  try {
129
- const entry = createRequire(path5.join(path5.resolve(root), "package.json")).resolve("typescript");
129
+ const entry = createRequire(path6.join(path6.resolve(root), "package.json")).resolve("typescript");
130
130
  const mod = await import(pathToFileURL(entry).href);
131
131
  const compiler = mod.default ?? mod;
132
132
  if (typeof compiler.createSourceFile !== "function") return null;
@@ -415,11 +415,11 @@ function needsBreak(head) {
415
415
  const lastLine = head.slice(head.lastIndexOf("\n") + 1);
416
416
  return lastLine.includes("//");
417
417
  }
418
- function isPageModule(path6, pageDir = "") {
419
- return /\.tsx$/i.test(path6) && isPagePath(path6, pageDir);
418
+ function isPageModule(path7, pageDir = "") {
419
+ return /\.tsx$/i.test(path7) && isPagePath(path7, pageDir);
420
420
  }
421
- function isPagePath(path6, pageDir) {
422
- let rel = path6.replace(/\\/g, "/");
421
+ function isPagePath(path7, pageDir) {
422
+ let rel = path7.replace(/\\/g, "/");
423
423
  if (pageDir !== "") {
424
424
  if (!rel.startsWith(`${pageDir}/`)) return false;
425
425
  rel = rel.slice(pageDir.length + 1);
@@ -427,8 +427,8 @@ function isPagePath(path6, pageDir) {
427
427
  const dirs = rel.split("/").slice(0, -1);
428
428
  return dirs.every((d) => d !== "" && !d.startsWith(".") && !NON_ROUTE_DIRS.has(d));
429
429
  }
430
- function parsesWithExport(code, path6, kind, needDefault, needExport) {
431
- const sf = ts.createSourceFile(path6, code, ts.ScriptTarget.Latest, false, kind);
430
+ function parsesWithExport(code, path7, kind, needDefault, needExport) {
431
+ const sf = ts.createSourceFile(path7, code, ts.ScriptTarget.Latest, false, kind);
432
432
  const diagnostics = sf.parseDiagnostics;
433
433
  if (diagnostics && diagnostics.length > 0) return false;
434
434
  const exports = !needExport || sf.statements.some((s) => {
@@ -438,7 +438,7 @@ function parsesWithExport(code, path6, kind, needDefault, needExport) {
438
438
  const flags = ts.getCombinedModifierFlags(s);
439
439
  return needDefault ? (flags & ts.ModifierFlags.ExportDefault) === ts.ModifierFlags.ExportDefault : (flags & ts.ModifierFlags.Export) !== 0;
440
440
  });
441
- return exports && bodilessFunctions(code, path6).length === 0;
441
+ return exports && bodilessFunctions(code, path7).length === 0;
442
442
  }
443
443
  var ID_START = /[A-Za-z_$]/;
444
444
  var ID_PART = /[A-Za-z0-9_$]/;
@@ -641,20 +641,20 @@ function getDraftRoutes(server) {
641
641
  return instances.get(server);
642
642
  }
643
643
  function createDraftRoutes(server, _model) {
644
- const root = path5.resolve(server.config.root);
645
- const vantageDir = path5.join(root, VANTAGE_DIR);
644
+ const root = path6.resolve(server.config.root);
645
+ const vantageDir = path6.join(root, VANTAGE_DIR);
646
646
  const pages = /* @__PURE__ */ new Map();
647
647
  const committed = /* @__PURE__ */ new Map();
648
648
  setDraftArtifacts(root, { hmr: true, pages: [] });
649
649
  generateArtifacts({ root, model: scanProject(root) });
650
650
  const toRel = (file) => {
651
- const abs = path5.isAbsolute(file) ? file : path5.resolve(root, file);
652
- return path5.relative(root, abs).split(path5.sep).join("/");
651
+ const abs = path6.isAbsolute(file) ? file : path6.resolve(root, file);
652
+ return path6.relative(root, abs).split(path6.sep).join("/");
653
653
  };
654
654
  const describe = (rel) => {
655
- if (rel === "" || rel.startsWith("../") || path5.isAbsolute(rel)) return null;
655
+ if (rel === "" || rel.startsWith("../") || path6.isAbsolute(rel)) return null;
656
656
  const pageRoot = resolvePageRoot(root);
657
- const fromPageRoot = pageRoot.dir === "" ? rel : path5.posix.relative(pageRoot.dir, rel);
657
+ const fromPageRoot = pageRoot.dir === "" ? rel : path6.posix.relative(pageRoot.dir, rel);
658
658
  if (fromPageRoot.startsWith("../") || fromPageRoot === "") return null;
659
659
  const parts = fromPageRoot.split("/");
660
660
  if (parts.some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith("."))) return null;
@@ -668,10 +668,10 @@ function createDraftRoutes(server, _model) {
668
668
  const relNoExt = stripExt(fromPageRoot, PAGE_EXTENSIONS);
669
669
  const forSegments = variant ? relNoExt.slice(0, -(variant.length + 1)) : relNoExt;
670
670
  const segments = fileToSegments(forSegments);
671
- const dir = path5.posix.dirname(fromPageRoot);
671
+ const dir = path6.posix.dirname(fromPageRoot);
672
672
  return {
673
673
  file: rel,
674
- absFile: path5.join(root, ...rel.split("/")),
674
+ absFile: path6.join(root, ...rel.split("/")),
675
675
  routePath: displayPath(segments),
676
676
  segments,
677
677
  dir: dir === "." ? "" : dir,
@@ -700,7 +700,7 @@ function createDraftRoutes(server, _model) {
700
700
  const container = server.environments?.client?.pluginContainer;
701
701
  if (!container) return true;
702
702
  try {
703
- const importer = path5.join(vantageDir, "route-tree.gen.ts");
703
+ const importer = path6.join(vantageDir, "route-tree.gen.ts");
704
704
  return await container.resolveId(`../${rel}`, importer) != null;
705
705
  } catch {
706
706
  return false;
@@ -802,12 +802,12 @@ function usedComponents(sf) {
802
802
  return used;
803
803
  }
804
804
  function draftTailwind(root) {
805
- const dir = path5.join(root, VANTAGE_DIR, "draft-tailwind");
806
- const runtimeCss = path5.join(root, VANTAGE_DIR, "runtime.css");
807
- const mirrorOf = (file) => path5.join(dir, path5.relative(root, file).split(path5.sep).join("__"));
805
+ const dir = path6.join(root, VANTAGE_DIR, "draft-tailwind");
806
+ const runtimeCss = path6.join(root, VANTAGE_DIR, "runtime.css");
807
+ const mirrorOf = (file) => path6.join(dir, path6.relative(root, file).split(path6.sep).join("__"));
808
808
  return {
809
809
  stylesheet: runtimeCss,
810
- owns: (file) => file.startsWith(dir + path5.sep),
810
+ owns: (file) => file.startsWith(dir + path6.sep),
811
811
  reset() {
812
812
  fs3.rmSync(dir, { recursive: true, force: true });
813
813
  fs3.mkdirSync(dir, { recursive: true });
@@ -920,7 +920,7 @@ var ROLLBACK_DEBOUNCE_MS = 150;
920
920
  var PREV_QUERY = "vantage-draft-prev";
921
921
  var SKELETON_PREFIX = "\0vantage-draft-skeleton:";
922
922
  function draftPreviewPlugin(options) {
923
- const root = path5.resolve(options.root);
923
+ const root = path6.resolve(options.root);
924
924
  const token = options.token ?? process.env.VANTAGE_DRAFT_TOKEN;
925
925
  const createRoutes = options.createRoutes ?? createDraftRoutes;
926
926
  const idleDiscardMs = options.idleDiscardMs ?? DRAFT_IDLE_DISCARD_MS;
@@ -950,7 +950,7 @@ function draftPreviewPlugin(options) {
950
950
  const isDraftRequest = (req) => !req.final && !req.discard;
951
951
  const SUPERSEDED = { applied: false, reason: "superseded" };
952
952
  const submit = (req) => new Promise((resolve, reject) => {
953
- const key = typeof req.path === "string" && req.path !== "" ? path5.resolve(root, req.path) : void 0;
953
+ const key = typeof req.path === "string" && req.path !== "" ? path6.resolve(root, req.path) : void 0;
954
954
  if (key !== void 0) {
955
955
  if (!isDraftRequest(req)) {
956
956
  for (let i = waiting.length - 1; i >= 0; i--) {
@@ -984,7 +984,7 @@ function draftPreviewPlugin(options) {
984
984
  }
985
985
  });
986
986
  });
987
- const relOf = (file) => path5.relative(root, file).split(path5.sep).join("/");
987
+ const relOf = (file) => path6.relative(root, file).split(path6.sep).join("/");
988
988
  const shown = (file) => drafts.get(file)?.at(-1);
989
989
  const diskText = (file) => {
990
990
  try {
@@ -996,10 +996,10 @@ function draftPreviewPlugin(options) {
996
996
  const candidatesOf = (base) => [
997
997
  base,
998
998
  ...DRAFT_EXTENSIONS.map((ext) => base + ext),
999
- ...DRAFT_EXTENSIONS.map((ext) => path5.join(base, "index" + ext))
999
+ ...DRAFT_EXTENSIONS.map((ext) => path6.join(base, "index" + ext))
1000
1000
  ];
1001
1001
  const skeletonId = (base) => {
1002
- const ext = path5.extname(base);
1002
+ const ext = path6.extname(base);
1003
1003
  return SKELETON_PREFIX + (DRAFT_EXTENSIONS.includes(ext) ? base.slice(0, -ext.length) : base);
1004
1004
  };
1005
1005
  const isWritten = (base) => candidatesOf(base).some((c) => newFiles.has(c) || fs3.existsSync(c));
@@ -1007,9 +1007,9 @@ function draftPreviewPlugin(options) {
1007
1007
  const grown = [];
1008
1008
  const before = /* @__PURE__ */ new Map();
1009
1009
  for (const [specifier, names] of relativeImports(source, rel)) {
1010
- const ext = path5.extname(specifier);
1010
+ const ext = path6.extname(specifier);
1011
1011
  if (ext !== "" && !DRAFT_EXTENSIONS.includes(ext)) continue;
1012
- const base = path5.resolve(path5.dirname(file), specifier);
1012
+ const base = path6.resolve(path6.dirname(file), specifier);
1013
1013
  if (isWritten(base)) continue;
1014
1014
  const id = skeletonId(base);
1015
1015
  const known = skeletons.get(id);
@@ -1033,13 +1033,13 @@ function draftPreviewPlugin(options) {
1033
1033
  };
1034
1034
  const resolveTarget = (rel) => {
1035
1035
  if (typeof rel !== "string" || rel === "") return "path is required";
1036
- const file = path5.resolve(root, rel);
1037
- const relPath = path5.relative(root, file);
1038
- if (relPath === "" || relPath.startsWith("..") || path5.isAbsolute(relPath)) return "path is outside the project";
1039
- const segments = relPath.split(path5.sep);
1036
+ const file = path6.resolve(root, rel);
1037
+ const relPath = path6.relative(root, file);
1038
+ if (relPath === "" || relPath.startsWith("..") || path6.isAbsolute(relPath)) return "path is outside the project";
1039
+ const segments = relPath.split(path6.sep);
1040
1040
  if (segments[0] === "server") return "server/ is not previewed";
1041
1041
  if (segments.some((s) => s === "node_modules" || s.startsWith("."))) return "path is not a project source";
1042
- if (!DRAFTABLE_EXTENSIONS.includes(path5.extname(file))) return "only .ts and .tsx script modules are previewed";
1042
+ if (!DRAFTABLE_EXTENSIONS.includes(path6.extname(file))) return "only .ts and .tsx script modules are previewed";
1043
1043
  const exists = fs3.existsSync(file);
1044
1044
  if (exists && fs3.statSync(file).isDirectory()) return "path is a directory";
1045
1045
  if (exists && !isInside(fs3.realpathSync(root), fs3.realpathSync(file))) return "path is outside the project";
@@ -1260,7 +1260,7 @@ function draftPreviewPlugin(options) {
1260
1260
  };
1261
1261
  const locate = (name) => {
1262
1262
  const clean = name.split("?")[0];
1263
- const candidates = [path5.resolve(root, clean.replace(/^\//, "")), clean];
1263
+ const candidates = [path6.resolve(root, clean.replace(/^\//, "")), clean];
1264
1264
  return candidates.find((c) => drafts.has(c));
1265
1265
  };
1266
1266
  const authorized = (req) => {
@@ -1344,8 +1344,8 @@ function draftPreviewPlugin(options) {
1344
1344
  if (newFiles.size === 0 && skeletons.size === 0) return null;
1345
1345
  const clean = source.split("?")[0];
1346
1346
  let base;
1347
- if (clean.startsWith("/")) base = clean.startsWith(root + "/") ? clean : path5.join(root, clean);
1348
- else if (clean.startsWith(".") && importer) base = path5.resolve(path5.dirname(importer.split("?")[0]), clean);
1347
+ if (clean.startsWith("/")) base = clean.startsWith(root + "/") ? clean : path6.join(root, clean);
1348
+ else if (clean.startsWith(".") && importer) base = path6.resolve(path6.dirname(importer.split("?")[0]), clean);
1349
1349
  else return null;
1350
1350
  const written = candidatesOf(base);
1351
1351
  const draftFile = written.find((c) => newFiles.has(c));
@@ -1373,6 +1373,10 @@ function draftPreviewPlugin(options) {
1373
1373
  // The borrowed versions share the drafted file but are not what changed.
1374
1374
  hotUpdate({ modules, file }) {
1375
1375
  if (tailwind?.owns(file)) return [];
1376
+ if (enabled && file === path6.join(root, VANTAGE_DIR, "client-entry.tsx")) {
1377
+ restoreClientEntry(root);
1378
+ return [];
1379
+ }
1376
1380
  const kept = modules.filter(
1377
1381
  (mod) => mod.id !== null && !mod.url.includes(`${PREV_QUERY}=`) && (!drafted.has(file) || reachable(mod))
1378
1382
  );
@@ -1408,8 +1412,8 @@ function stubExports(source, expected, prevUrl, fileName) {
1408
1412
  ` : source;
1409
1413
  }
1410
1414
  function isInside(dir, file) {
1411
- const rel = path5.relative(dir, file);
1412
- return rel !== ".." && !rel.startsWith(".." + path5.sep) && !path5.isAbsolute(rel);
1415
+ const rel = path6.relative(dir, file);
1416
+ return rel !== ".." && !rel.startsWith(".." + path6.sep) && !path6.isAbsolute(rel);
1413
1417
  }
1414
1418
  var REFUSED_PATH = /^path is a directory$/;
1415
1419
  function isDynamicRoute(route) {
@@ -1455,6 +1459,119 @@ function firstLine(err) {
1455
1459
  const message = err instanceof Error ? err.message : String(err);
1456
1460
  return message.split("\n").find((l) => l.trim() !== "")?.trim() ?? "transform failed";
1457
1461
  }
1462
+ var PACKAGE_NAME = "@squadbase/vantage";
1463
+ var NOT_PREBUNDLED = /* @__PURE__ */ new Set([
1464
+ "./server",
1465
+ "./server/node",
1466
+ "./vite",
1467
+ "./theme.css",
1468
+ "./package.json",
1469
+ "./markdown",
1470
+ "./table",
1471
+ "./slide",
1472
+ "./doc"
1473
+ ]);
1474
+ function ownPackageDir() {
1475
+ let dir = path6.dirname(fileURLToPath(import.meta.url));
1476
+ for (; ; ) {
1477
+ const manifest = path6.join(dir, "package.json");
1478
+ if (fs3.existsSync(manifest)) {
1479
+ try {
1480
+ if (JSON.parse(fs3.readFileSync(manifest, "utf8")).name === PACKAGE_NAME) return dir;
1481
+ } catch {
1482
+ }
1483
+ }
1484
+ const parent = path6.dirname(dir);
1485
+ if (parent === dir) return null;
1486
+ dir = parent;
1487
+ }
1488
+ }
1489
+ function packageName(spec) {
1490
+ const parts = spec.split("/");
1491
+ return spec.startsWith("@") ? parts.slice(0, 2).join("/") : parts[0];
1492
+ }
1493
+ function findPackageDir(fromDir, pkg) {
1494
+ let dir = fromDir;
1495
+ for (; ; ) {
1496
+ const candidate = path6.join(dir, "node_modules", pkg);
1497
+ if (fs3.existsSync(candidate)) return candidate;
1498
+ const parent = path6.dirname(dir);
1499
+ if (parent === dir) return null;
1500
+ dir = parent;
1501
+ }
1502
+ }
1503
+ function resolvesFrom(root, spec) {
1504
+ const pkg = packageName(spec);
1505
+ const dir = findPackageDir(root, pkg);
1506
+ if (!dir) return false;
1507
+ const sub = spec.slice(pkg.length);
1508
+ if (sub === "") return true;
1509
+ let exportsField;
1510
+ try {
1511
+ exportsField = JSON.parse(fs3.readFileSync(path6.join(dir, "package.json"), "utf8")).exports;
1512
+ } catch {
1513
+ return false;
1514
+ }
1515
+ if (exportsField && typeof exportsField === "object" && !Array.isArray(exportsField)) {
1516
+ const keys = Object.keys(exportsField);
1517
+ if (!keys.some((k) => k.startsWith("."))) return false;
1518
+ const wanted = `.${sub}`;
1519
+ return keys.some((key) => {
1520
+ if (key === wanted) return true;
1521
+ const star = key.indexOf("*");
1522
+ if (star < 0) return false;
1523
+ return wanted.startsWith(key.slice(0, star)) && wanted.endsWith(key.slice(star + 1));
1524
+ });
1525
+ }
1526
+ const file = path6.join(dir, sub);
1527
+ return [file, `${file}.js`, `${file}.mjs`, path6.join(file, "index.js")].some((f) => fs3.existsSync(f));
1528
+ }
1529
+ function isInstalled(root) {
1530
+ const dir = findPackageDir(root, PACKAGE_NAME);
1531
+ if (!dir) return false;
1532
+ try {
1533
+ return fs3.realpathSync(dir).split(path6.sep).includes("node_modules");
1534
+ } catch {
1535
+ return false;
1536
+ }
1537
+ }
1538
+ function frameworkSubpaths(exportsField) {
1539
+ return Object.keys(exportsField).filter((key) => key.startsWith(".") && !key.includes("*") && !NOT_PREBUNDLED.has(key)).map((key) => key === "." ? PACKAGE_NAME : `${PACKAGE_NAME}${key.slice(1)}`);
1540
+ }
1541
+ function bareImports(source) {
1542
+ const out = /* @__PURE__ */ new Set();
1543
+ const re = /(?:^|[\n;])\s*(?:import|export)\s+(type\s)?(?:[^'";]*?\sfrom\s*)?['"]([^'"\n]+)['"]/g;
1544
+ for (const m of source.matchAll(re)) {
1545
+ const [, typeOnly, spec] = m;
1546
+ if (typeOnly || !spec || /^(\.|\/|node:|@\/|~|#)/.test(spec)) continue;
1547
+ out.add(spec);
1548
+ }
1549
+ return [...out];
1550
+ }
1551
+ function registryDeps(registryDir) {
1552
+ if (!fs3.existsSync(registryDir)) return [];
1553
+ const out = /* @__PURE__ */ new Set();
1554
+ for (const name of fs3.readdirSync(registryDir)) {
1555
+ if (!/\.(tsx?|jsx?)$/.test(name)) continue;
1556
+ for (const spec of bareImports(fs3.readFileSync(path6.join(registryDir, name), "utf8"))) {
1557
+ if (packageName(spec) !== PACKAGE_NAME) out.add(spec);
1558
+ }
1559
+ }
1560
+ return [...out].sort();
1561
+ }
1562
+ function derivedDeps(root) {
1563
+ const pkgDir = ownPackageDir();
1564
+ if (!pkgDir) return [];
1565
+ const out = registryDeps(path6.join(pkgDir, "registry", "ui"));
1566
+ if (isInstalled(root)) {
1567
+ try {
1568
+ const manifest = JSON.parse(fs3.readFileSync(path6.join(pkgDir, "package.json"), "utf8"));
1569
+ if (manifest.exports && typeof manifest.exports === "object") out.push(...frameworkSubpaths(manifest.exports));
1570
+ } catch {
1571
+ }
1572
+ }
1573
+ return out;
1574
+ }
1458
1575
 
1459
1576
  // src/vite/index.ts
1460
1577
  var DEDUPE = ["react", "react-dom", "@tanstack/react-router", "@tanstack/react-query"];
@@ -1498,22 +1615,9 @@ var KIT_DEPS = [
1498
1615
  "@base-ui/react/tooltip",
1499
1616
  "@base-ui/react/use-render"
1500
1617
  ];
1501
- function packageName(spec) {
1502
- const parts = spec.split("/");
1503
- return spec.startsWith("@") ? parts.slice(0, 2).join("/") : parts[0];
1504
- }
1505
- function hasPackage(fromDir, pkg) {
1506
- let dir = fromDir;
1507
- for (; ; ) {
1508
- if (fs3.existsSync(path5.join(dir, "node_modules", pkg))) return true;
1509
- const parent = path5.dirname(dir);
1510
- if (parent === dir) return false;
1511
- dir = parent;
1512
- }
1513
- }
1514
1618
  function optimizeInclude(root, extra) {
1515
- return [...RUNTIME_DEPS, ...KIT_DEPS, ...extra].filter(
1516
- (spec) => hasPackage(root, packageName(spec))
1619
+ return [.../* @__PURE__ */ new Set([...RUNTIME_DEPS, ...KIT_DEPS, ...derivedDeps(root), ...extra])].filter(
1620
+ (spec) => resolvesFrom(root, spec)
1517
1621
  );
1518
1622
  }
1519
1623
  var FILE_PAGE_DEPS = ["papaparse", "read-excel-file/browser"];
@@ -1525,9 +1629,9 @@ function conditionalDeps(model) {
1525
1629
  ];
1526
1630
  }
1527
1631
  function underPageRoot(pageRoot, file) {
1528
- const rel = path5.relative(pageRoot, file);
1632
+ const rel = path6.relative(pageRoot, file);
1529
1633
  if (rel.startsWith("..")) return false;
1530
- const segments = rel.split(path5.sep);
1634
+ const segments = rel.split(path6.sep);
1531
1635
  return !segments.some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith(".") && s !== "..");
1532
1636
  }
1533
1637
  function isPageModuleFile(pageRoot, file) {
@@ -1541,20 +1645,20 @@ function isFilePageFile(pageRoot, file) {
1541
1645
  return underPageRoot(pageRoot, file) && FILE_PAGE_EXTENSIONS.some((ext) => lower.endsWith(ext));
1542
1646
  }
1543
1647
  function isApiFile(root, file) {
1544
- const rel = path5.relative(root, file);
1545
- return rel.startsWith(`server${path5.sep}api${path5.sep}`) && /\.(ts|tsx|js)$/.test(file) && !file.endsWith(".d.ts");
1648
+ const rel = path6.relative(root, file);
1649
+ return rel.startsWith(`server${path6.sep}api${path6.sep}`) && /\.(ts|tsx|js)$/.test(file) && !file.endsWith(".d.ts");
1546
1650
  }
1547
1651
  function isServerFile(root, file) {
1548
- const rel = path5.relative(root, file);
1549
- return rel === "server" || rel.startsWith(`server${path5.sep}`);
1652
+ const rel = path6.relative(root, file);
1653
+ return rel === "server" || rel.startsWith(`server${path6.sep}`);
1550
1654
  }
1551
1655
  function vantagePlugin(options) {
1552
- const root = path5.resolve(options.root);
1553
- const vantageDir = path5.join(root, VANTAGE_DIR);
1656
+ const root = path6.resolve(options.root);
1657
+ const vantageDir = path6.join(root, VANTAGE_DIR);
1554
1658
  let model = options.model ?? scanProject(root);
1555
1659
  let generated = Boolean(options.artifactsWritten);
1556
1660
  let shellHtml = null;
1557
- const pageRoot = () => model.pageDir === "" ? root : path5.join(root, model.pageDir);
1661
+ const pageRoot = () => model.pageDir === "" ? root : path6.join(root, model.pageDir);
1558
1662
  const emit = () => {
1559
1663
  generateArtifacts({ root, model });
1560
1664
  generated = true;
@@ -1588,10 +1692,10 @@ function vantagePlugin(options) {
1588
1692
  forwardConsole: { unhandledErrors: true, logLevels: ["warn", "error"] }
1589
1693
  },
1590
1694
  build: {
1591
- outDir: path5.join(root, "dist", "client"),
1695
+ outDir: path6.join(root, "dist", "client"),
1592
1696
  emptyOutDir: true,
1593
1697
  rollupOptions: {
1594
- input: path5.join(vantageDir, "index.html")
1698
+ input: path6.join(vantageDir, "index.html")
1595
1699
  }
1596
1700
  }
1597
1701
  };
@@ -1608,17 +1712,17 @@ function vantagePlugin(options) {
1608
1712
  if (!importer) return null;
1609
1713
  const imp = importer.split("?")[0];
1610
1714
  if (!imp.startsWith(root)) return null;
1611
- const relImp = path5.relative(root, imp);
1612
- if (relImp.startsWith(`server${path5.sep}`) || relImp.startsWith(VANTAGE_DIR) || relImp.includes("node_modules")) {
1715
+ const relImp = path6.relative(root, imp);
1716
+ if (relImp.startsWith(`server${path6.sep}`) || relImp.startsWith(VANTAGE_DIR) || relImp.includes("node_modules")) {
1613
1717
  return null;
1614
1718
  }
1615
1719
  let target = null;
1616
- if (source.startsWith(".")) target = path5.resolve(path5.dirname(imp), source);
1617
- else if (source.startsWith("/")) target = path5.join(root, source.slice(1));
1618
- else if (source === "server" || source.startsWith("server/")) target = path5.join(root, source);
1720
+ if (source.startsWith(".")) target = path6.resolve(path6.dirname(imp), source);
1721
+ else if (source.startsWith("/")) target = path6.join(root, source.slice(1));
1722
+ else if (source === "server" || source.startsWith("server/")) target = path6.join(root, source);
1619
1723
  if (!target) return null;
1620
- const relTarget = path5.relative(root, target);
1621
- if (relTarget === "server" || relTarget.startsWith(`server${path5.sep}`)) {
1724
+ const relTarget = path6.relative(root, target);
1725
+ if (relTarget === "server" || relTarget.startsWith(`server${path6.sep}`)) {
1622
1726
  this.error(
1623
1727
  `Client module "${relImp}" imports from server/ ("${source}"). server/ code must never reach the client bundle \u2014 move shared code to lib/.`
1624
1728
  );
@@ -1650,7 +1754,7 @@ function vantagePlugin(options) {
1650
1754
  if (model.hasServer) return apiMw(req, res, next);
1651
1755
  return next();
1652
1756
  });
1653
- const isStylesFile = (file) => path5.relative(pageRoot(), file) === "styles.css";
1757
+ const isStylesFile = (file) => path6.relative(pageRoot(), file) === "styles.css";
1654
1758
  const rootMoved = () => resolvePageRoot(root).dir !== model.pageDir;
1655
1759
  const onStructural = (file) => {
1656
1760
  const moved = rootMoved();
@@ -1662,9 +1766,9 @@ function vantagePlugin(options) {
1662
1766
  };
1663
1767
  const isRouteDir = (dir) => {
1664
1768
  if (isServerFile(root, dir)) return true;
1665
- const rel = path5.relative(pageRoot(), dir);
1769
+ const rel = path6.relative(pageRoot(), dir);
1666
1770
  if (rel === "" || rel.startsWith("..")) return false;
1667
- return !rel.split(path5.sep).some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith("."));
1771
+ return !rel.split(path6.sep).some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith("."));
1668
1772
  };
1669
1773
  server.watcher.on("add", onStructural);
1670
1774
  server.watcher.on("unlink", onStructural);
@@ -1689,7 +1793,7 @@ function vantagePlugin(options) {
1689
1793
  if (req.method !== "GET" && req.method !== "HEAD") return next();
1690
1794
  try {
1691
1795
  if (shellHtml === null) {
1692
- const raw = fs3.readFileSync(path5.join(vantageDir, "index.html"), "utf8");
1796
+ const raw = fs3.readFileSync(path6.join(vantageDir, "index.html"), "utf8");
1693
1797
  const shellUrl = `/${VANTAGE_DIR}/index.html`;
1694
1798
  shellHtml = await server.transformIndexHtml(shellUrl, raw, req.originalUrl);
1695
1799
  }
@@ -1712,5 +1816,5 @@ function vantagePlugin(options) {
1712
1816
  }
1713
1817
 
1714
1818
  export { vantagePlugin };
1715
- //# sourceMappingURL=chunk-IBGOCWJB.js.map
1716
- //# sourceMappingURL=chunk-IBGOCWJB.js.map
1819
+ //# sourceMappingURL=chunk-2ICNHUG6.js.map
1820
+ //# sourceMappingURL=chunk-2ICNHUG6.js.map