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

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 (186) hide show
  1. package/dist/add-4GHF2TX2.js +6 -0
  2. package/dist/add-4GHF2TX2.js.map +1 -0
  3. package/dist/{build-JB4VOMUI.js → build-MFWRPYKW.js} +9 -9
  4. package/dist/{build-JB4VOMUI.js.map → build-MFWRPYKW.js.map} +1 -1
  5. package/dist/{check-ZJYK6RLG.js → check-ZBIH422T.js} +7 -7
  6. package/dist/{check-ZJYK6RLG.js.map → check-ZBIH422T.js.map} +1 -1
  7. package/dist/{chunk-BCE22JSM.js → chunk-7DZGJQ3P.js} +33 -14
  8. package/dist/chunk-7DZGJQ3P.js.map +1 -0
  9. package/dist/{chunk-U2M6HGKQ.js → chunk-AABMKHEU.js} +4 -4
  10. package/dist/{chunk-U2M6HGKQ.js.map → chunk-AABMKHEU.js.map} +1 -1
  11. package/dist/{chunk-MP3QSOXL.js → chunk-AG6RZ2RR.js} +992 -16
  12. package/dist/chunk-AG6RZ2RR.js.map +1 -0
  13. package/dist/{chunk-KLEIVDUV.js → chunk-CEXAQQ5W.js} +150 -11
  14. package/dist/chunk-CEXAQQ5W.js.map +1 -0
  15. package/dist/{chunk-QI3XQKHS.js → chunk-GNXCX4WE.js} +10 -3
  16. package/dist/chunk-GNXCX4WE.js.map +1 -0
  17. package/dist/chunk-IBGOCWJB.js +1716 -0
  18. package/dist/chunk-IBGOCWJB.js.map +1 -0
  19. package/dist/{chunk-JGRMRXXZ.js → chunk-JKLLFVEU.js} +3 -3
  20. package/dist/{chunk-JGRMRXXZ.js.map → chunk-JKLLFVEU.js.map} +1 -1
  21. package/dist/{chunk-RPZAALCX.js → chunk-OB6UBJXF.js} +153 -153
  22. package/dist/{chunk-RPZAALCX.js.map → chunk-OB6UBJXF.js.map} +1 -1
  23. package/dist/{chunk-EP6JHXSR.js → chunk-QEWCYW3I.js} +44 -9
  24. package/dist/chunk-QEWCYW3I.js.map +1 -0
  25. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  26. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  27. package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
  28. package/dist/chunk-V3LF7BE7.js.map +1 -0
  29. package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
  30. package/dist/chunk-XQUSGIDG.js.map +1 -0
  31. package/dist/cli.js +12 -11
  32. package/dist/cli.js.map +1 -1
  33. package/dist/client/index.d.ts +32 -3
  34. package/dist/client/index.js +205 -12
  35. package/dist/client/index.js.map +1 -1
  36. package/dist/components/index.d.ts +216 -1
  37. package/dist/components/index.js +2 -2
  38. package/dist/{dev-FCEC3UKQ.js → dev-DCTOHQ6W.js} +10 -10
  39. package/dist/dev-DCTOHQ6W.js.map +1 -0
  40. package/dist/{docs-EJJ3BECT.js → docs-JVP4RPKT.js} +3 -3
  41. package/dist/{docs-EJJ3BECT.js.map → docs-JVP4RPKT.js.map} +1 -1
  42. package/dist/{doctor-WHZXPERA.js → doctor-5E2VEZPK.js} +7 -7
  43. package/dist/{doctor-WHZXPERA.js.map → doctor-5E2VEZPK.js.map} +1 -1
  44. package/dist/{preview-OGMCNQUO.js → preview-T6CLSQVX.js} +3 -3
  45. package/dist/{preview-OGMCNQUO.js.map → preview-T6CLSQVX.js.map} +1 -1
  46. package/dist/query/index.d.ts +0 -11
  47. package/dist/query/index.js +2 -2
  48. package/dist/{routes-GTFO5PUF.js → routes-3SGAFDMC.js} +6 -6
  49. package/dist/{routes-GTFO5PUF.js.map → routes-3SGAFDMC.js.map} +1 -1
  50. package/dist/{search-6Y422SV6.js → search-5LC4XPB5.js} +3 -3
  51. package/dist/{search-6Y422SV6.js.map → search-5LC4XPB5.js.map} +1 -1
  52. package/dist/slide/index.js +47 -10
  53. package/dist/slide/index.js.map +1 -1
  54. package/dist/table/index.js +8 -7
  55. package/dist/table/index.js.map +1 -1
  56. package/dist/ui/index.d.ts +140 -10
  57. package/dist/ui/index.js +1405 -63
  58. package/dist/ui/index.js.map +1 -1
  59. package/dist/{upgrade-AL4KZZR4.js → upgrade-DBBE6GIR.js} +7 -7
  60. package/dist/{upgrade-AL4KZZR4.js.map → upgrade-DBBE6GIR.js.map} +1 -1
  61. package/dist/vite/index.d.ts +10 -0
  62. package/dist/vite/index.js +4 -4
  63. package/docs/index.json +291 -61
  64. package/docs/ja/changelog.md +26 -0
  65. package/docs/ja/components.md +33 -89
  66. package/docs/ja/page-types/csv.md +83 -0
  67. package/docs/ja/page-types/doc.md +83 -0
  68. package/docs/ja/page-types/excel.md +82 -0
  69. package/docs/ja/page-types/slide.md +132 -0
  70. package/docs/ja/page-types.md +47 -0
  71. package/docs/ja/parts/area-chart.md +61 -0
  72. package/docs/ja/parts/bar-chart.md +69 -0
  73. package/docs/ja/parts/bar-list.md +35 -0
  74. package/docs/ja/parts/category-bar.md +36 -0
  75. package/docs/ja/parts/donut-chart.md +47 -0
  76. package/docs/ja/parts/echart.md +3 -0
  77. package/docs/ja/parts/line-chart.md +58 -0
  78. package/docs/ja/parts/progress-circle.md +34 -0
  79. package/docs/ja/parts/sparkline.md +1 -1
  80. package/docs/ja/parts/tracker.md +32 -0
  81. package/docs/ja/routing.md +8 -86
  82. package/docs/ja/ui/alert-dialog.md +41 -0
  83. package/docs/ja/ui/avatar.md +31 -0
  84. package/docs/ja/ui/combobox.md +74 -0
  85. package/docs/ja/ui/drawer.md +41 -0
  86. package/docs/ja/ui/field.md +42 -0
  87. package/docs/ja/ui/hover-card.md +21 -0
  88. package/docs/ja/ui/kbd.md +16 -0
  89. package/docs/ja/ui/pagination.md +36 -0
  90. package/docs/ja/ui/radio-group.md +21 -0
  91. package/docs/ja/ui/toast.md +46 -0
  92. package/docs/ja/ui-and-theming.md +14 -7
  93. package/package.json +25 -13
  94. package/registry/ui/accordion.tsx +74 -0
  95. package/registry/ui/alert-dialog.tsx +189 -0
  96. package/registry/ui/alert.tsx +78 -0
  97. package/registry/ui/app-shell.tsx +281 -0
  98. package/registry/ui/area-chart.tsx +1015 -0
  99. package/registry/ui/avatar.tsx +110 -0
  100. package/registry/ui/badge.tsx +54 -0
  101. package/registry/ui/bar-chart.tsx +1013 -0
  102. package/registry/ui/bar-list.tsx +302 -0
  103. package/registry/ui/breadcrumb.tsx +126 -0
  104. package/registry/ui/button.tsx +60 -0
  105. package/registry/ui/calendar.tsx +221 -0
  106. package/registry/ui/card.tsx +105 -0
  107. package/registry/ui/category-bar.tsx +281 -0
  108. package/registry/ui/checkbox.tsx +28 -0
  109. package/registry/ui/collapsible.tsx +21 -0
  110. package/registry/ui/combobox.tsx +310 -0
  111. package/registry/ui/command.tsx +196 -0
  112. package/registry/ui/dashboard-card.tsx +174 -0
  113. package/registry/ui/data-table.tsx +16 -91
  114. package/registry/ui/date-range-picker.tsx +209 -0
  115. package/registry/ui/dialog.tsx +159 -0
  116. package/registry/ui/donut-chart.tsx +1004 -0
  117. package/registry/ui/drawer.tsx +229 -0
  118. package/registry/ui/dropdown-menu.tsx +272 -0
  119. package/registry/ui/echart.tsx +486 -0
  120. package/registry/ui/field.tsx +240 -0
  121. package/registry/ui/filter-bar.tsx +365 -0
  122. package/registry/ui/funnel-steps.tsx +274 -0
  123. package/registry/ui/hover-card.tsx +52 -0
  124. package/registry/ui/input-group.tsx +158 -0
  125. package/registry/ui/input.tsx +22 -0
  126. package/registry/ui/kbd.tsx +28 -0
  127. package/registry/ui/label.tsx +20 -0
  128. package/registry/ui/line-chart.tsx +1007 -0
  129. package/registry/ui/metric-value.tsx +54 -0
  130. package/registry/ui/multi-select.tsx +226 -0
  131. package/registry/ui/page-shell.tsx +227 -0
  132. package/registry/ui/pagination.tsx +138 -0
  133. package/registry/ui/placeholder.tsx +30 -0
  134. package/registry/ui/popover.tsx +90 -0
  135. package/registry/ui/progress-circle.tsx +272 -0
  136. package/registry/ui/progress.tsx +83 -0
  137. package/registry/ui/radio-group.tsx +39 -0
  138. package/registry/ui/scroll-area.tsx +55 -0
  139. package/registry/ui/searchable-select.tsx +209 -0
  140. package/registry/ui/section-header.tsx +41 -0
  141. package/registry/ui/segmented-control.tsx +71 -0
  142. package/registry/ui/select.tsx +253 -0
  143. package/registry/ui/separator.tsx +25 -0
  144. package/registry/ui/sheet.tsx +137 -0
  145. package/registry/ui/sidebar.tsx +723 -0
  146. package/registry/ui/skeleton.tsx +15 -0
  147. package/registry/ui/slider.tsx +54 -0
  148. package/registry/ui/sparkline.tsx +155 -0
  149. package/registry/ui/spinner.tsx +12 -0
  150. package/registry/ui/states.tsx +61 -0
  151. package/registry/ui/status-badge.tsx +79 -0
  152. package/registry/ui/switch.tsx +32 -0
  153. package/registry/ui/table.tsx +116 -0
  154. package/registry/ui/tabs.tsx +82 -0
  155. package/registry/ui/textarea.tsx +20 -0
  156. package/registry/ui/toast.tsx +250 -0
  157. package/registry/ui/toggle-group.tsx +89 -0
  158. package/registry/ui/toggle.tsx +45 -0
  159. package/registry/ui/tooltip.tsx +66 -0
  160. package/registry/ui/tracker.tsx +236 -0
  161. package/registry/ui/trend-indicator.tsx +62 -0
  162. package/skills/vantage-add-feature/SKILL.md +9 -7
  163. package/skills/vantage-design/SKILL.md +3 -1
  164. package/skills/vantage-design/references/format.md +1 -1
  165. package/skills/vantage-pitfalls/SKILL.md +5 -1
  166. package/skills/vantage-slide/SKILL.md +17 -0
  167. package/templates/AGENTS.md +10 -1
  168. package/templates/agents/api.md +29 -0
  169. package/templates/agents/csv.md +2 -1
  170. package/templates/agents/doc.md +4 -3
  171. package/templates/agents/page.md +22 -8
  172. package/templates/agents/slide.md +13 -1
  173. package/templates/agents/xlsx.md +2 -1
  174. package/theme.css +7 -1
  175. package/dist/add-DY4AXANK.js +0 -6
  176. package/dist/add-DY4AXANK.js.map +0 -1
  177. package/dist/chunk-BCE22JSM.js.map +0 -1
  178. package/dist/chunk-DTDVSFRY.js.map +0 -1
  179. package/dist/chunk-EP6JHXSR.js.map +0 -1
  180. package/dist/chunk-KLEIVDUV.js.map +0 -1
  181. package/dist/chunk-MP3QSOXL.js.map +0 -1
  182. package/dist/chunk-PVTHHV7X.js.map +0 -1
  183. package/dist/chunk-QI3XQKHS.js.map +0 -1
  184. package/dist/chunk-T3FLAGI6.js +0 -316
  185. package/dist/chunk-T3FLAGI6.js.map +0 -1
  186. package/dist/dev-FCEC3UKQ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/dev.ts","../src/client/draft-skeleton-source.ts","../src/vite/draft/borrow.ts","../src/vite/draft/typescript.ts","../src/vite/draft/names.ts","../src/vite/draft/complete.ts","../src/vite/draft/routes.ts","../src/vite/draft/skeleton.ts","../src/vite/draft/tailwind.ts","../src/vite/draft/visible.ts","../src/vite/draft/plugin.ts","../src/vite/index.ts"],"names":["path","i","fs","job","mod","createHash"],"mappings":"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","file":"chunk-IBGOCWJB.js","sourcesContent":["import { Hono } from \"hono\"\nimport { getRequestListener } from \"@hono/node-server\"\nimport type { IncomingMessage, ServerResponse } from \"node:http\"\nimport type { ViteDevServer } from \"vite\"\nimport type { RouteModel } from \"../core/types\"\nimport { corsMiddleware } from \"./cors\"\nimport {\n dispatchApi,\n matchApiRoute,\n sortApiRoutes,\n type ApiRouteEntry,\n} from \"./dispatch\"\nimport type { ApiModule } from \"./index\"\n\ntype Middleware = (req: IncomingMessage, res: ServerResponse, next: () => void) => void\n\n/**\n * Build a connect-style middleware that serves `server/api/**` in dev. Modules\n * are loaded through Vite's SSR pipeline so edits hot-reload, and the route list\n * is read fresh on every request so added/removed API files take effect without\n * a restart.\n */\nexport function createApiDevMiddleware(opts: {\n server: ViteDevServer\n getModel: () => RouteModel\n getEnv: () => Record<string, string | undefined>\n}): Middleware {\n const { server, getModel, getEnv } = opts\n\n const buildRoutes = (): ApiRouteEntry[] =>\n sortApiRoutes(\n getModel().apis.map((a) => ({\n routePath: a.routePath,\n segments: a.segments,\n hasCatchall: a.segments.some((s) => s.kind === \"catchall\"),\n staticCount: a.segments.filter((s) => s.kind === \"static\").length,\n load: () => server.ssrLoadModule(a.absFile) as Promise<ApiModule>,\n })),\n )\n\n const app = new Hono()\n\n // CORS for split deployments, matching prod. Off unless CORS_ORIGIN is set;\n // read once here from the current env (dev's CORS config is deploy-level).\n const cors = corsMiddleware(getEnv())\n if (cors) {\n app.use(\"/api\", cors)\n app.use(\"/api/*\", cors)\n }\n\n const handle = async (c: { req: { url: string; raw: Request } }) => {\n const url = new URL(c.req.url)\n const match = matchApiRoute(buildRoutes(), url.pathname)\n if (!match) {\n return Response.json({ error: \"Not Found\", path: url.pathname }, { status: 404 })\n }\n let mod: ApiModule\n try {\n mod = await match.route.load()\n } catch (err) {\n if (err instanceof Error) server.ssrFixStacktrace(err)\n throw err\n }\n return dispatchApi(mod, c.req.raw, match.params, getEnv())\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n app.all(\"/api\", handle as any)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n app.all(\"/api/*\", handle as any)\n\n const listener = getRequestListener(app.fetch)\n\n return (req, res, next) => {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0]!\n if (path === \"/api\" || path.startsWith(\"/api/\")) {\n Promise.resolve(listener(req, res)).catch((err) => {\n console.error(\"[vantage] API middleware failure:\", err)\n if (!res.headersSent) {\n res.statusCode = 500\n res.setHeader(\"content-type\", \"application/json\")\n res.end(JSON.stringify({ error: \"Internal Server Error\" }))\n }\n })\n } else {\n next()\n }\n }\n}\n","/**\n * Source of the module that stands in for an import that does not exist yet.\n * A page written top-down imports `./revenue-table` before that file has been\n * written; resolving the import to this module lets the page render, with a\n * placeholder where the part will be.\n *\n * React-free on purpose: the Vite plugin generates this text and must not pull\n * the client runtime into the dev server.\n */\n\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/\n\n/**\n * The module text. `default` is always provided; `names` are the named exports\n * the importer asked for. A capitalised name is a component and draws the\n * skeleton; any other name is a function that does nothing, so a call like\n * `formatYen(x)` or a hook stays callable.\n */\nexport function draftSkeletonModuleSource(names: readonly string[] = []): string {\n const lines = [\n 'import { createElement } from \"react\"',\n 'import { DraftSkeleton } from \"@squadbase/vantage/client\"',\n \"const Skeleton = () => createElement(DraftSkeleton)\",\n \"const noop = () => undefined\",\n \"export default Skeleton\",\n ]\n for (const name of new Set(names)) {\n if (name === \"default\" || !IDENTIFIER.test(name)) continue\n lines.push(`export const ${name} = ${/^[A-Z]/.test(name) ? \"Skeleton\" : \"noop\"}`)\n }\n return lines.join(\"\\n\") + \"\\n\"\n}\n","import { createHash } from \"node:crypto\"\n\n/** Keep this many borrowed versions per file: the one in use and the one just before it. */\nconst KEEP_PER_FILE = 2\n\n/**\n * The earlier versions a part's draft borrows its not-yet-written exports from,\n * served at `<file>?<query>=<hash>`.\n *\n * The key is a hash of the borrowed content, so the same content always gets\n * the same URL: the browser keeps the module it already evaluated, the wrapped\n * component keeps its identity, and React does not remount it (a chart would\n * otherwise animate from zero on every draft).\n */\nexport class BorrowedVersions {\n /** Hash → content. Immutable per hash. */\n private readonly versions = new Map<string, { file: string; content: string }>()\n /** Absolute file path → the content the shown draft borrows from. */\n private readonly sources = new Map<string, string>()\n\n constructor(private readonly query: string) {}\n\n /**\n * The content a new draft of `file` should borrow from. While the shown draft\n * itself borrows, that is the same source again (not the shown draft, whose\n * text changes every time and would chain wrappers); otherwise the version\n * shown before (`shown`).\n */\n sourceFor(file: string, shown: string): string {\n return this.sources.get(file) ?? shown\n }\n\n /** Register `content` as borrowed by `file`'s next draft and return its URL. */\n urlFor(file: string, url: string, content: string): string {\n const hash = createHash(\"sha1\").update(content).digest(\"hex\").slice(0, 12)\n // Re-insert so the map's order is most recently used last.\n this.versions.delete(hash)\n this.versions.set(hash, { file, content })\n const ofFile = [...this.versions].filter(([, v]) => v.file === file)\n for (const [h] of ofFile.slice(0, Math.max(0, ofFile.length - KEEP_PER_FILE))) this.versions.delete(h)\n return `${url}?${this.query}=${hash}`\n }\n\n /** Record what the draft now shown borrows from; `undefined` when it borrows nothing. */\n shown(file: string, source: string | undefined): void {\n if (source === undefined) this.sources.delete(file)\n else this.sources.set(file, source)\n }\n\n get(hash: string): string | undefined {\n return this.versions.get(hash)?.content\n }\n\n drop(file: string): void {\n this.sources.delete(file)\n for (const [h, v] of this.versions) if (v.file === file) this.versions.delete(h)\n }\n}\n","import { createRequire } from \"node:module\"\nimport path from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport type TS from \"typescript\"\n\nexport type TypeScript = typeof TS\n\nlet loaded: TypeScript | undefined\n\n/**\n * Draft preview reads the project's own `typescript` (an optional peer: only a\n * dev server started with the flag needs it), so the framework neither bundles\n * nor depends on a compiler. Resolves from `root`; `null` when the project has\n * none, in which case the caller turns the feature off.\n */\nexport async function loadTypeScript(root: string): Promise<TypeScript | null> {\n try {\n const entry = createRequire(path.join(path.resolve(root), \"package.json\")).resolve(\"typescript\")\n const mod = (await import(pathToFileURL(entry).href)) as { default?: TypeScript } & TypeScript\n const compiler = mod.default ?? mod\n // TypeScript 7 and later (the native compiler) has no JS API to read a source with.\n if (typeof compiler.createSourceFile !== \"function\") return null\n loaded = compiler\n return loaded\n } catch {\n return null\n }\n}\n\n/** The compiler in use: the one `loadTypeScript` found, else whatever resolves from here (tests). */\nfunction api(): TypeScript {\n loaded ??= createRequire(import.meta.url)(\"typescript\") as TypeScript\n return loaded\n}\n\n/**\n * `typescript` as a value, resolved on first use. Importing a module that uses\n * it costs nothing; the compiler is only read when a draft is analysed.\n */\nexport const ts: TypeScript = new Proxy({} as TypeScript, {\n get: (_target, key) => Reflect.get(api(), key),\n})\n","import type TS from \"typescript\"\nimport { ts } from \"./typescript\"\n\n/** Parse as the file's own flavour (`.tsx` reads `<` as JSX), keeping parent links for the walkers below. */\nexport function parseSource(source: string, fileName: string): TS.SourceFile {\n const kind = /\\.[jt]sx$/i.test(fileName) ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n return ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, kind)\n}\n\n/**\n * A function (or class method) that has a signature but no body and no\n * implementation after it. TypeScript reads it as an overload, so it parses;\n * the compiler then erases it. A cut-off `export function Card({ title })`\n * ends up like this when the body (`{`) is the part not written yet.\n */\nexport function bodilessFunctions(source: string, fileName: string): string[] {\n const found: string[] = []\n const hasBody = (n: TS.Node): boolean =>\n (ts.isFunctionDeclaration(n) || ts.isMethodDeclaration(n) || ts.isConstructorDeclaration(n)) && n.body !== undefined\n const nameOf = (n: TS.Node): string => {\n if (ts.isConstructorDeclaration(n)) return \"constructor\"\n const name = (n as TS.FunctionDeclaration | TS.MethodDeclaration).name\n return name === undefined ? \"default\" : ts.isIdentifier(name) || ts.isStringLiteral(name) ? name.text : name.getText()\n }\n const check = (siblings: readonly TS.Node[]): void => {\n siblings.forEach((node, i) => {\n if (!(ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isConstructorDeclaration(node))) return\n if (node.body !== undefined) return\n if (hasModifier(node, ts.SyntaxKind.AbstractKeyword) || inAmbientContext(node)) return\n const name = nameOf(node)\n // An overload is followed by its implementation (the overloads in between share the name).\n if (siblings.slice(i + 1).some((next) => hasBody(next) && nameOf(next) === name)) return\n found.push(name)\n })\n }\n const visit = (node: TS.Node): void => {\n if (ts.isSourceFile(node) || ts.isBlock(node) || ts.isModuleBlock(node)) check(node.statements)\n else if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) check(node.members)\n ts.forEachChild(node, visit)\n }\n visit(parseSource(source, fileName))\n return found\n}\n\n/**\n * The names a module exports as values (`default` included), read from the\n * syntax tree. Types are erased and never break an importer at runtime, so they\n * are left out; so is a function signature without a body (see `bodilessFunctions`).\n * Good enough to compare two versions of one file.\n */\nexport function exportNames(source: string, fileName: string): Set<string> {\n const names = new Set<string>()\n for (const stmt of parseSource(source, fileName).statements) {\n if (ts.isExportAssignment(stmt)) {\n if (!stmt.isExportEquals) names.add(\"default\")\n } else if (ts.isExportDeclaration(stmt)) {\n if (stmt.isTypeOnly) continue\n const clause = stmt.exportClause\n if (clause && ts.isNamedExports(clause)) {\n for (const spec of clause.elements) if (!spec.isTypeOnly) names.add(spec.name.text)\n } else if (clause && ts.isNamespaceExport(clause)) {\n names.add(clause.name.text)\n }\n } else if (hasModifier(stmt, ts.SyntaxKind.ExportKeyword) && !hasModifier(stmt, ts.SyntaxKind.DeclareKeyword)) {\n if (isSignature(stmt)) continue\n if (hasModifier(stmt, ts.SyntaxKind.DefaultKeyword)) names.add(\"default\")\n else if (ts.isVariableStatement(stmt)) {\n for (const decl of stmt.declarationList.declarations) bindingNames(decl.name, names)\n } else if (\n (ts.isFunctionDeclaration(stmt) || ts.isClassDeclaration(stmt) || ts.isEnumDeclaration(stmt)) &&\n stmt.name\n ) {\n names.add(stmt.name.text)\n }\n }\n }\n return names\n}\n\n/** Names declared at the top level of the module, exported or not. */\nexport function topLevelNames(source: string, fileName: string): Set<string> {\n const names = new Set<string>()\n for (const stmt of parseSource(source, fileName).statements) {\n if (isSignature(stmt)) continue\n if (ts.isVariableStatement(stmt)) {\n for (const decl of stmt.declarationList.declarations) bindingNames(decl.name, names)\n } else if (\n (ts.isFunctionDeclaration(stmt) || ts.isClassDeclaration(stmt) || ts.isEnumDeclaration(stmt)) &&\n stmt.name\n ) {\n names.add(stmt.name.text)\n }\n }\n return names\n}\n\n/**\n * Every name bound anywhere in the file: imports, declarations, parameters,\n * catch variables. Deliberately over-inclusive (scopes are ignored) — it is used\n * to decide that a name is *not* defined, and a wrong \"defined\" only means a\n * missing placeholder, while a wrong \"undefined\" would shadow real code.\n */\nexport function boundNames(sf: TS.SourceFile): Set<string> {\n const names = new Set<string>()\n const visit = (node: TS.Node): void => {\n if (ts.isImportClause(node) && node.name) names.add(node.name.text)\n else if (ts.isNamespaceImport(node) || ts.isImportSpecifier(node)) names.add(node.name.text)\n else if (ts.isImportEqualsDeclaration(node)) names.add(node.name.text)\n else if (ts.isVariableDeclaration(node) || ts.isParameter(node) || ts.isBindingElement(node))\n bindingNames(node.name, names)\n else if (\n (ts.isFunctionDeclaration(node) ||\n ts.isFunctionExpression(node) ||\n ts.isClassDeclaration(node) ||\n ts.isClassExpression(node) ||\n ts.isEnumDeclaration(node)) &&\n node.name\n )\n names.add(node.name.text)\n ts.forEachChild(node, visit)\n }\n visit(sf)\n return names\n}\n\n/** Globals a browser module may use that the dev server's own `globalThis` does not have. */\nconst BROWSER_GLOBALS = new Set([\n \"window\", \"document\", \"navigator\", \"location\", \"history\", \"localStorage\", \"sessionStorage\", \"screen\",\n \"alert\", \"confirm\", \"prompt\", \"matchMedia\", \"getComputedStyle\", \"requestAnimationFrame\",\n \"cancelAnimationFrame\", \"requestIdleCallback\", \"cancelIdleCallback\", \"ResizeObserver\",\n \"IntersectionObserver\", \"MutationObserver\", \"Image\", \"Audio\", \"Node\", \"Element\", \"DOMParser\", \"FileReader\",\n \"File\", \"WebSocket\", \"Worker\", \"Notification\", \"indexedDB\", \"caches\", \"innerWidth\", \"innerHeight\",\n \"scrollTo\", \"open\", \"print\", \"self\", \"top\", \"parent\", \"frames\", \"CSS\", \"Option\", \"customElements\",\n \"DOMRect\", \"DOMException\", \"ClipboardItem\", \"SpeechSynthesisUtterance\", \"speechSynthesis\",\n \"JSX\", \"React\",\n // Window members the dev server's own `globalThis` (Node) does not have.\n \"devicePixelRatio\", \"scrollX\", \"scrollY\", \"pageXOffset\", \"pageYOffset\", \"addEventListener\",\n \"removeEventListener\", \"dispatchEvent\", \"postMessage\", \"visualViewport\", \"getSelection\",\n \"XMLHttpRequest\", \"AudioContext\", \"Range\", \"Text\", \"Document\", \"Storage\", \"outerWidth\", \"outerHeight\",\n \"screenX\", \"screenY\", \"status\", \"name\", \"length\", \"closed\", \"opener\", \"event\",\n])\nconst BROWSER_GLOBAL_PATTERN = /^(HTML|SVG|CSS|DOM)\\w*|Event$|Observer$/\n\nconst isGlobal = (name: string): boolean =>\n name === \"undefined\" ||\n name === \"arguments\" ||\n BROWSER_GLOBALS.has(name) ||\n BROWSER_GLOBAL_PATTERN.test(name) ||\n name in globalThis\n\n/**\n * Names the module reads as values that nothing in it declares or imports and\n * that are not globals: `CUSTOMERS` in a page whose data is written below the\n * component, or an identifier cut off half way (`const rows = fo`). Rendered,\n * each throws a ReferenceError, so a draft with any is held back until they\n * exist. Types, property names, labels and `typeof x` are not references.\n */\nexport function undeclaredNames(source: string, fileName: string): string[] {\n const sf = parseSource(source, fileName)\n const bound = boundNames(sf)\n const missing = new Set<string>()\n const visit = (node: TS.Node): void => {\n if (ts.isTypeNode(node) && !ts.isExpressionWithTypeArguments(node)) return\n if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) return\n if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) return\n if (ts.isIdentifier(node)) {\n const parent = node.parent\n const name = node.text\n if (!bound.has(name) && !isGlobal(name) && isValueReference(node, parent)) missing.add(name)\n return\n }\n ts.forEachChild(node, visit)\n }\n visit(sf)\n return [...missing]\n}\n\nfunction isValueReference(node: TS.Identifier, parent: TS.Node): boolean {\n if (ts.isPropertyAccessExpression(parent)) return parent.expression === node\n if (ts.isQualifiedName(parent) || ts.isMetaProperty(parent)) return false\n if (ts.isTypeOfExpression(parent)) return false\n if (ts.isJsxAttribute(parent)) return false\n if (ts.isJsxOpeningElement(parent) || ts.isJsxSelfClosingElement(parent) || ts.isJsxClosingElement(parent))\n return parent.tagName === node && /^[A-Z]/.test(node.text)\n if (ts.isLabeledStatement(parent) || ts.isBreakStatement(parent) || ts.isContinueStatement(parent)) return false\n if (ts.isBindingElement(parent)) return parent.propertyName !== node && parent.name !== node\n if (ts.isPropertyAssignment(parent)) return parent.name !== node\n if (\n ts.isMethodDeclaration(parent) ||\n ts.isPropertyDeclaration(parent) ||\n ts.isGetAccessorDeclaration(parent) ||\n ts.isSetAccessorDeclaration(parent) ||\n ts.isPropertySignature(parent) ||\n ts.isEnumMember(parent)\n )\n return parent.name !== node\n return true\n}\n\nfunction bindingNames(name: TS.BindingName, into: Set<string>): void {\n if (ts.isIdentifier(name)) {\n into.add(name.text)\n return\n }\n for (const el of name.elements) if (ts.isBindingElement(el)) bindingNames(el.name, into)\n}\n\n/** `declare` on the node or on something around it: nothing of it is compiled anyway. */\nfunction inAmbientContext(node: TS.Node): boolean {\n for (let n: TS.Node | undefined = node; n; n = n.parent) if (hasModifier(n, ts.SyntaxKind.DeclareKeyword)) return true\n return false\n}\n\n/** An overload signature: no body, so nothing of it is left once compiled. */\nfunction isSignature(node: TS.Node): boolean {\n return ts.isFunctionDeclaration(node) && node.body === undefined\n}\n\nfunction hasModifier(node: TS.Node, kind: TS.SyntaxKind): boolean {\n return ts.canHaveModifiers(node) && (ts.getModifiers(node)?.some((m) => m.kind === kind) ?? false)\n}\n","import type TS from \"typescript\"\nimport { NON_ROUTE_DIRS } from \"../../core/constants\"\nimport { bodilessFunctions } from \"./names\"\nimport { ts } from \"./typescript\"\n\n/**\n * Turn a half-written `.tsx` / `.ts` file into something that parses, so the\n * preview can render the part that is already written.\n *\n * Strategy (simple over clever):\n * 1. A small hand-written lexer walks the source and keeps a stack of open\n * constructs (brackets, template literals, JSX tags / elements, JSX\n * expressions). It snapshots that stack at the end and at every line break.\n * 2. Candidate cut points are tried from the end backwards (the exact end,\n * then each line break). At a cut point, anything that cannot be closed\n * cleanly — an unfinished open tag with its attributes, a template literal,\n * a string or a comment — is dropped by moving the cut to where it started.\n * Everything still open is then closed (`)`, `]`, `}`, `</Name>`, `</>`).\n * The exact end is skipped when it stops inside a word in code (`export\n * default fu`): the word may be a prefix of another name or keyword, and a\n * version that parses but names something that does not exist would throw\n * at runtime. The line breaks before it are complete tokens.\n * 3. The first candidate that the TypeScript parser accepts without syntax\n * errors, has no function without a body (an overload signature the compiler\n * would drop: a function cut off before its `{`), and still exports something wins: a page (a `.tsx` under a route\n * directory) needs its default export, any other module at least one\n * export — unless `requireExport: false`, which a caller that supplies the\n * exports itself passes for non-page modules. Otherwise `null`. Whether the exports match what importers use is\n * the caller's call — this function has no state.\n *\n * Pure: no I/O, no globals.\n */\nexport function completeDraft(\n source: string,\n opts: { path: string; pageDir?: string; requireExport?: boolean },\n): string | null {\n const isTsx = /\\.tsx$/i.test(opts.path)\n if (!isTsx && !/\\.ts$/i.test(opts.path)) return null\n if (/\\.d\\.ts$/i.test(opts.path)) return null\n const page = isPageModule(opts.path, opts.pageDir)\n const needExport = page || opts.requireExport !== false\n // Not worth trying before the export the module exists for has started to appear.\n if (needExport && !(page ? /\\bexport\\s+default\\b/ : /\\bexport\\b/).test(source)) return null\n const kind = isTsx ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n\n const snapshots = lex(source, isTsx)\n // Bounded: a draft is only interesting near its end, and each try is a parse. The bound is\n // on the text parsed, so a huge file that never completes costs a few parses, not 200.\n const MAX_TRIES = 200\n const MAX_PARSED_CHARS = 4_000_000\n let tries = 0\n let parsedChars = 0\n for (let i = snapshots.length - 1; i >= 0 && tries < MAX_TRIES && parsedChars < MAX_PARSED_CHARS; i--) {\n if (endsMidWord(source, snapshots[i]!)) continue\n const candidate = close(source, snapshots[i]!)\n if (candidate === null) continue\n tries++\n parsedChars += candidate.length\n if (parsesWithExport(candidate, opts.path, kind, page, needExport)) return candidate\n }\n return null\n}\n\ntype FrameKind =\n | \"paren\"\n | \"bracket\"\n | \"brace\"\n | \"tplExpr\" // `${ ... }` inside a template literal\n | \"template\"\n | \"jsxTag\" // `<Name attr=...` before its `>`\n | \"jsxClose\" // `</Name` before its `>`\n | \"jsxElem\" // children of `<Name>` / `<>`\n | \"jsxExpr\" // `{ ... }` in JSX children or attributes\n\ntype Frame = { kind: FrameKind; start: number; name?: string }\n\ntype Snapshot = {\n pos: number\n stack: Frame[]\n /** Start of a string / comment the position is inside of, if any. */\n openTokenStart: number | null\n}\n\nconst CLOSERS: Record<string, string> = { paren: \")\", bracket: \"]\", brace: \"}\", tplExpr: \"}\", jsxExpr: \"}\" }\n\nfunction close(source: string, snap: Snapshot): string | null {\n let cut = snap.pos\n let stack = snap.stack\n if (snap.openTokenStart !== null) cut = Math.min(cut, snap.openTokenStart)\n // Drop the outermost construct that cannot be closed cleanly, with everything inside it.\n const dropAt = stack.findIndex((f) => f.kind === \"jsxTag\" || f.kind === \"jsxClose\" || f.kind === \"template\")\n if (dropAt !== -1) {\n cut = Math.min(cut, stack[dropAt]!.start)\n stack = stack.slice(0, dropAt)\n }\n let suffix = \"\"\n for (let i = stack.length - 1; i >= 0; i--) {\n const f = stack[i]!\n suffix += f.kind === \"jsxElem\" ? `</${f.name ?? \"\"}>` : CLOSERS[f.kind]\n }\n const head = source.slice(0, cut)\n if (!head.trim()) return null\n return suffix ? `${head}${needsBreak(head) ? \"\\n\" : \"\"}${suffix}\\n` : head\n}\n\n/** The snapshot is the end of the source, which stops inside a word in code (not JSX text). */\nfunction endsMidWord(source: string, snap: Snapshot): boolean {\n if (snap.pos !== source.length || snap.openTokenStart !== null) return false\n if (!ID_PART.test(source.charAt(source.length - 1))) return false\n const kind = snap.stack[snap.stack.length - 1]?.kind\n return kind !== \"jsxElem\" && kind !== \"jsxTag\" && kind !== \"jsxClose\" && kind !== \"template\"\n}\n\n/** A trailing `// comment` would swallow the closers. */\nfunction needsBreak(head: string): boolean {\n const lastLine = head.slice(head.lastIndexOf(\"\\n\") + 1)\n return lastLine.includes(\"//\")\n}\n\n/**\n * Project-root-relative path → is it a routed `.tsx` page (which must keep its\n * default export)? `pageDir` is the model's page root (`\"\"` or `\"src\"`): only a\n * file under it can be a page, the same rule the scanner applies.\n */\nexport function isPageModule(path: string, pageDir = \"\"): boolean {\n return /\\.tsx$/i.test(path) && isPagePath(path, pageDir)\n}\n\n/** Project-root-relative path → is it a routed page (rather than a component / lib module)? */\nfunction isPagePath(path: string, pageDir: string): boolean {\n let rel = path.replace(/\\\\/g, \"/\")\n if (pageDir !== \"\") {\n if (!rel.startsWith(`${pageDir}/`)) return false\n rel = rel.slice(pageDir.length + 1)\n }\n const dirs = rel.split(\"/\").slice(0, -1)\n return dirs.every((d) => d !== \"\" && !d.startsWith(\".\") && !NON_ROUTE_DIRS.has(d))\n}\n\nfunction parsesWithExport(\n code: string,\n path: string,\n kind: TS.ScriptKind,\n needDefault: boolean,\n needExport: boolean,\n): boolean {\n const sf = ts.createSourceFile(path, code, ts.ScriptTarget.Latest, false, kind)\n const diagnostics = (sf as unknown as { parseDiagnostics?: readonly TS.Diagnostic[] }).parseDiagnostics\n if (diagnostics && diagnostics.length > 0) return false\n const exports =\n !needExport ||\n sf.statements.some((s) => {\n if (ts.isExportAssignment(s)) return true\n if (!needDefault && ts.isExportDeclaration(s)) return true\n if (!ts.canHaveModifiers(s)) return false\n const flags = ts.getCombinedModifierFlags(s as TS.Declaration)\n return needDefault\n ? (flags & ts.ModifierFlags.ExportDefault) === ts.ModifierFlags.ExportDefault\n : (flags & ts.ModifierFlags.Export) !== 0\n })\n // A function cut off before its body (`export function Card({ title })`) parses as an overload\n // and then vanishes from the compiled module, taking its export with it.\n return exports && bodilessFunctions(code, path).length === 0\n}\n\nconst ID_START = /[A-Za-z_$]/\nconst ID_PART = /[A-Za-z0-9_$]/\nconst JSX_NAME_PART = /[A-Za-z0-9_$.:-]/\n// After these, `/` starts a regex and `<` may start JSX.\nconst EXPR_START_CHARS = new Set([\"\", \"(\", \",\", \"=\", \":\", \"?\", \"[\", \"{\", \"}\", \"!\", \"&\", \"|\", \";\", \">\", \"+\", \"-\", \"*\", \"%\", \"~\", \"^\"])\nconst EXPR_START_WORDS = new Set([\"return\", \"typeof\", \"case\", \"do\", \"else\", \"in\", \"of\", \"new\", \"delete\", \"void\", \"throw\", \"yield\", \"await\", \"default\"])\n\n/**\n * Walk the source once; return a snapshot at every line break and at the end.\n * Heuristic, not a full grammar: it only needs to be right about nesting.\n */\nfunction lex(src: string, jsx: boolean): Snapshot[] {\n const stack: Frame[] = []\n const snaps: Snapshot[] = []\n // Last significant token in code context: a punctuation char or a word.\n let prev = \"\"\n const top = () => stack[stack.length - 1]\n const snap = (pos: number, openTokenStart: number | null = null) =>\n snaps.push({ pos, stack: stack.slice(), openTokenStart })\n const exprCanStart = () => EXPR_START_CHARS.has(prev) || EXPR_START_WORDS.has(prev)\n\n // Skip a quoted string starting at i; returns the index after it, or -1 if unterminated.\n const skipString = (i: number, quote: string, multiline: boolean): number => {\n for (let j = i + 1; j < src.length; j++) {\n const c = src[j]\n if (c === \"\\\\\") j++\n else if (c === quote) return j + 1\n else if (c === \"\\n\") {\n if (!multiline) return -1\n snap(j, i)\n }\n }\n return -1\n }\n\n let i = 0\n while (i < src.length) {\n const c = src.charAt(i)\n const t = top()\n const kind = t?.kind\n\n if (c === \"\\n\" && kind !== \"template\") snap(i)\n\n if (kind === \"template\") {\n if (c === \"\\n\") snap(i)\n if (c === \"\\\\\") i += 2\n else if (c === \"`\") {\n stack.pop()\n prev = \"x\"\n i++\n } else if (c === \"$\" && src[i + 1] === \"{\") {\n stack.push({ kind: \"tplExpr\", start: i })\n prev = \"{\"\n i += 2\n } else i++\n continue\n }\n\n if (kind === \"jsxClose\") {\n if (c === \">\") {\n stack.pop() // jsxClose\n if (top()?.kind === \"jsxElem\") stack.pop()\n afterJsxElement()\n }\n i++\n continue\n }\n\n if (kind === \"jsxTag\") {\n if (c === \"\\\"\" || c === \"'\") {\n const end = skipString(i, c, true)\n if (end === -1) break\n i = end\n } else if (c === \"{\") {\n stack.push({ kind: \"jsxExpr\", start: i })\n prev = \"{\"\n i++\n } else if (c === \"/\" && src[i + 1] === \">\") {\n stack.pop()\n afterJsxElement()\n i += 2\n } else if (c === \">\") {\n const tag = stack.pop()!\n stack.push({ kind: \"jsxElem\", start: tag.start, name: tag.name })\n i++\n } else i++\n continue\n }\n\n if (kind === \"jsxElem\") {\n if (c === \"{\") {\n stack.push({ kind: \"jsxExpr\", start: i })\n prev = \"{\"\n i++\n } else if (c === \"<\") {\n i = openJsx(i)\n } else i++\n continue\n }\n\n // Code context (top level, brackets, `${}`, JSX `{}`).\n if (c === \"/\" && src[i + 1] === \"/\") {\n const nl = src.indexOf(\"\\n\", i)\n if (nl === -1) {\n snap(src.length, i)\n return snaps\n }\n i = nl\n continue\n }\n if (c === \"/\" && src[i + 1] === \"*\") {\n const endC = src.indexOf(\"*/\", i + 2)\n const stop = endC === -1 ? src.length : endC\n for (let j = src.indexOf(\"\\n\", i); j !== -1 && j < stop; j = src.indexOf(\"\\n\", j + 1)) snap(j, i)\n if (endC === -1) {\n snap(src.length, i)\n return snaps\n }\n i = endC + 2\n continue\n }\n if (c === \"\\\"\" || c === \"'\") {\n const end = skipString(i, c, false)\n if (end === -1) {\n const nl = src.indexOf(\"\\n\", i)\n snap(nl === -1 ? src.length : nl, i)\n if (nl === -1) return snaps\n i = nl + 1\n prev = \"x\"\n continue\n }\n i = end\n prev = \"x\"\n continue\n }\n if (c === \"`\") {\n stack.push({ kind: \"template\", start: i })\n i++\n continue\n }\n if (c === \"/\" && exprCanStart()) {\n // Regex literal: skip to the closing slash on this line.\n let j = i + 1\n let inClass = false\n for (; j < src.length && src[j] !== \"\\n\"; j++) {\n if (src[j] === \"\\\\\") j++\n else if (src[j] === \"[\") inClass = true\n else if (src[j] === \"]\") inClass = false\n else if (src[j] === \"/\" && !inClass) break\n }\n if (src[j] !== \"/\") {\n snap(j, i)\n if (j >= src.length) return snaps\n i = j\n continue\n }\n i = j + 1\n while (i < src.length && ID_PART.test(src.charAt(i))) i++\n prev = \"x\"\n continue\n }\n if (c === \"<\" && jsx && exprCanStart() && (ID_START.test(src[i + 1] ?? \"\") || src[i + 1] === \">\")) {\n i = openJsx(i)\n continue\n }\n if (c === \"(\" || c === \"[\" || c === \"{\") {\n stack.push({ kind: c === \"(\" ? \"paren\" : c === \"[\" ? \"bracket\" : \"brace\", start: i })\n prev = c\n i++\n continue\n }\n if (c === \")\" || c === \"]\" || c === \"}\") {\n if (t && (kind === \"paren\" || kind === \"bracket\" || kind === \"brace\" || kind === \"tplExpr\" || kind === \"jsxExpr\")) {\n stack.pop()\n }\n // `}` closing a JSX expression returns to children / attributes, where `prev` is irrelevant.\n prev = c === \"}\" && kind === \"brace\" ? \"}\" : \"x\"\n i++\n continue\n }\n if (ID_START.test(c)) {\n let j = i + 1\n while (j < src.length && ID_PART.test(src.charAt(j))) j++\n prev = src.slice(i, j)\n i = j\n continue\n }\n if (/\\s/.test(c)) {\n i++\n continue\n }\n if (/[0-9]/.test(c)) {\n while (i < src.length && /[0-9A-Za-z_.]/.test(src.charAt(i))) i++\n prev = \"x\"\n continue\n }\n prev = c\n i++\n }\n snap(src.length)\n return snaps\n\n // `<` at i in a position where JSX may start (code or children). Returns the next index.\n function openJsx(at: number): number {\n if (src[at + 1] === \"/\") {\n stack.push({ kind: \"jsxClose\", start: at })\n return at + 2\n }\n let j = at + 1\n while (j < src.length && JSX_NAME_PART.test(src.charAt(j))) j++\n stack.push({ kind: \"jsxTag\", start: at, name: src.slice(at + 1, j) })\n return j\n }\n\n function afterJsxElement() {\n // A finished element is an expression value; `<` after it is a comparison.\n prev = \"x\"\n }\n}\n","/**\n * Draft routes — pages that exist only as a draft (nothing on disk yet) but\n * must already be reachable in the preview.\n *\n * A page the agent has just started writing is not in any scan, so it has no\n * route and navigating to it would show \"not found\". This keeps such pages in\n * the generated route tree (`generate.ts` merges them in) without touching the\n * project: the tree is rewritten, the client picks it up through an HMR update\n * of `route-tree.gen.ts` (see `client/bootstrap.tsx`), and nothing reloads.\n *\n * `release` takes the page back out. When the draft was committed the file is\n * on disk by then and the next scan finds it; the watcher's `add` for it must\n * not full-reload the preview, which is what `isSuppressed` is for.\n */\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport type { ViteDevServer } from \"vite\"\nimport { NON_ROUTE_DIRS, PAGE_EXTENSIONS, RESERVED_PAGE_NAMES, VANTAGE_DIR } from \"../../core/constants\"\nimport { generateArtifacts, setDraftArtifacts } from \"../../core/generate\"\nimport {\n displayPath,\n fileToSegments,\n resolvePageRoot,\n scanProject,\n splitPageVariant,\n stripExt,\n} from \"../../core/scan\"\nimport type { PageRoute, RouteModel } from \"../../core/types\"\n\nexport interface DraftRoutes {\n /** A page module under the page root that is not on disk (yet). */\n isNewPage(file: string): boolean\n /**\n * Put a provisional route for `file` into the route tree. Resolves to its\n * display route (`/reports/new`), or null when `file` is not a new page, its\n * route is taken, or the module would not resolve (adding it would break the\n * whole manifest, so it is refused). Idempotent.\n *\n * The module must already be resolvable by the time this is called — the\n * generated manifest imports it, and Vite rejects the manifest if it cannot\n * resolve that import.\n */\n ensure(file: string): Promise<{ route: string } | null>\n /**\n * Take the provisional route out. `committed: true` means the file has been\n * written for real, so the tree is rebuilt from disk; `false` drops the page.\n */\n release(file: string, opts: { committed: boolean }): Promise<void>\n /** The watcher's `add` for this file is already accounted for: do not full-reload. */\n isSuppressed(file: string): boolean\n}\n\n/** How long after a commit the file's own `add` event is still expected. */\nconst COMMIT_WINDOW_MS = 10_000\n\nconst instances = new WeakMap<ViteDevServer, DraftRoutes>()\n\n/** The routes created for `server`, if the draft layer is on. */\nexport function getDraftRoutes(server: ViteDevServer): DraftRoutes | undefined {\n return instances.get(server)\n}\n\n/**\n * `model` is accepted for symmetry with the plugin wiring but not relied on:\n * the project is rescanned whenever a route is added or removed, so a model\n * captured at startup cannot go stale here.\n */\nexport function createDraftRoutes(server: ViteDevServer, _model?: RouteModel): DraftRoutes {\n const root = path.resolve(server.config.root)\n const vantageDir = path.join(root, VANTAGE_DIR)\n\n /** Project-relative POSIX path → its provisional page. */\n const pages = new Map<string, PageRoute>()\n /** Project-relative POSIX path → when its `add` event stops being expected. */\n const committed = new Map<string, number>()\n\n // The client entry has to accept route-tree updates for a new route to appear\n // without a reload. The entry was written before this existed, so rewrite it.\n setDraftArtifacts(root, { hmr: true, pages: [] })\n generateArtifacts({ root, model: scanProject(root) })\n\n const toRel = (file: string): string => {\n const abs = path.isAbsolute(file) ? file : path.resolve(root, file)\n return path.relative(root, abs).split(path.sep).join(\"/\")\n }\n\n /** The page a new file would become, or null when it is not a routed module. */\n const describe = (rel: string): PageRoute | null => {\n if (rel === \"\" || rel.startsWith(\"../\") || path.isAbsolute(rel)) return null\n const pageRoot = resolvePageRoot(root)\n const fromPageRoot = pageRoot.dir === \"\" ? rel : path.posix.relative(pageRoot.dir, rel)\n if (fromPageRoot.startsWith(\"../\") || fromPageRoot === \"\") return null\n const parts = fromPageRoot.split(\"/\")\n if (parts.some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith(\".\"))) return null\n const base = parts[parts.length - 1]!\n const ext = PAGE_EXTENSIONS.find((e) => base.endsWith(e))\n if (!ext) return null\n const nameNoExt = stripExt(base, PAGE_EXTENSIONS)\n // Reserved modules and private (`_`) files are not pages — see `scanPages`.\n if ((Object.values(RESERVED_PAGE_NAMES) as string[]).includes(nameNoExt)) return null\n const { base: pageName, variant } = splitPageVariant(nameNoExt)\n if (pageName.startsWith(\"_\")) return null\n const relNoExt = stripExt(fromPageRoot, PAGE_EXTENSIONS)\n const forSegments = variant ? relNoExt.slice(0, -(variant.length + 1)) : relNoExt\n const segments = fileToSegments(forSegments)\n const dir = path.posix.dirname(fromPageRoot)\n return {\n file: rel,\n absFile: path.join(root, ...rel.split(\"/\")),\n routePath: displayPath(segments),\n segments,\n dir: dir === \".\" ? \"\" : dir,\n dynamic: segments.some((s) => s.kind !== \"static\"),\n kind: \"module\",\n ...(variant ? { variant } : {}),\n }\n }\n\n const isNewPage = (file: string): boolean => {\n const page = describe(toRel(file))\n return page !== null && !fs.existsSync(page.absFile)\n }\n\n /** Rewrite the tree for the current scan plus the provisional pages. */\n const rewrite = (): void => {\n setDraftArtifacts(root, { hmr: true, pages: [...pages.values()] })\n generateArtifacts({ root, model: scanProject(root) })\n }\n\n // A server that stops with provisional pages in the tree would leave a route-tree that imports\n // files which never got written; put it back to what is on disk.\n server.httpServer?.once(\"close\", () => {\n if (pages.size === 0) return\n pages.clear()\n try {\n rewrite()\n } catch {\n /* the next generation (dev or build) rewrites the tree anyway */\n }\n })\n\n const resolvable = async (rel: string): Promise<boolean> => {\n const container = server.environments?.client?.pluginContainer\n if (!container) return true\n try {\n const importer = path.join(vantageDir, \"route-tree.gen.ts\")\n return (await container.resolveId(`../${rel}`, importer)) != null\n } catch {\n return false\n }\n }\n\n const routes: DraftRoutes = {\n isNewPage,\n\n async ensure(file) {\n const rel = toRel(file)\n const page = describe(rel)\n if (!page || fs.existsSync(page.absFile)) return null\n if (pages.has(rel)) return { route: pages.get(rel)!.routePath }\n // Two pages on one route would make the router ambiguous.\n const taken = [...scanProject(root).pages, ...pages.values()].some(\n (p) => p.routePath === page.routePath && p.file !== rel,\n )\n if (taken) return null\n if (!(await resolvable(rel))) return null\n pages.set(rel, page)\n rewrite()\n return { route: page.routePath }\n },\n\n async release(file, { committed: wasCommitted }) {\n const rel = toRel(file)\n if (wasCommitted) committed.set(rel, Date.now() + COMMIT_WINDOW_MS)\n if (!pages.delete(rel) && !wasCommitted) return\n rewrite()\n },\n\n isSuppressed(file) {\n const rel = toRel(file)\n if (pages.has(rel)) return true\n const until = committed.get(rel)\n if (until === undefined) return false\n if (Date.now() <= until) return true\n committed.delete(rel)\n return false\n },\n }\n instances.set(server, routes)\n return routes\n}\n","import type TS from \"typescript\"\nimport { boundNames, parseSource } from \"./names\"\nimport { ts } from \"./typescript\"\n\n/** The placeholder a missing component draws. Inline so a draft needs nothing from the framework. */\nconst SKELETON =\n '<div data-vantage-skeleton className=\"animate-pulse rounded-md bg-muted\" style={{ minHeight: \"4rem\", width: \"100%\" }} />'\n\n/**\n * Declare the capitalised JSX components a draft uses before it has written (or\n * imported) them, each as a placeholder that draws a skeleton. A page written\n * top-down names `<RevenueTable />` long before the component below it exists;\n * without a declaration the render throws `ReferenceError` and the screen shows\n * the error instead of the part already written.\n *\n * Names that are bound anywhere in the file — imported, declared, a parameter —\n * are left alone, so a finished file passes through unchanged. Only `.tsx` /\n * `.jsx` have JSX to scan.\n */\nexport function declareMissingComponents(source: string, fileName: string): string {\n if (!/\\.[jt]sx$/i.test(fileName)) return source\n const sf = parseSource(source, fileName)\n const used = usedComponents(sf)\n if (used.size === 0) return source\n const bound = boundNames(sf)\n // `.jsx` takes no type annotations.\n const typed = /\\.tsx$/i.test(fileName)\n const lines: string[] = []\n for (const [name, member] of used) {\n if (bound.has(name)) continue\n lines.push(\n member\n ? // `<Card.Header>`: every property of the placeholder is the placeholder.\n `const ${name}${typed ? \": any\" : \"\"} = new Proxy(function ${name}() { return ${SKELETON} }, { get: (target, key) => (typeof key === \"string\" ? target : undefined) })`\n : `function ${name}(_props${typed ? \": any\" : \"\"}) { return ${SKELETON} }`,\n )\n }\n if (lines.length === 0) return source\n return `${source}${source.endsWith(\"\\n\") ? \"\" : \"\\n\"}${lines.join(\"\\n\")}\\n`\n}\n\n/**\n * The relative imports of a module and the names each one asks for (`default`\n * for a default import). A namespace import asks for nothing by name, and a\n * type-only import is erased, so neither adds a name. Used to give an import of\n * a file that is not written yet something to resolve to.\n */\nexport function relativeImports(source: string, fileName: string): Map<string, Set<string>> {\n const found = new Map<string, Set<string>>()\n for (const stmt of parseSource(source, fileName).statements) {\n if (!ts.isImportDeclaration(stmt) || !ts.isStringLiteral(stmt.moduleSpecifier)) continue\n const specifier = stmt.moduleSpecifier.text\n if (!specifier.startsWith(\".\")) continue\n const names = found.get(specifier) ?? new Set<string>()\n found.set(specifier, names)\n const clause = stmt.importClause\n if (!clause || clause.isTypeOnly) continue\n if (clause.name) names.add(\"default\")\n if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const el of clause.namedBindings.elements) {\n if (!el.isTypeOnly) names.add((el.propertyName ?? el.name).text)\n }\n }\n }\n return found\n}\n\n/** Capitalised tag roots in the file → whether any use of it is `<Name.member>`. */\nfunction usedComponents(sf: TS.SourceFile): Map<string, boolean> {\n const used = new Map<string, boolean>()\n const visit = (node: TS.Node): void => {\n if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {\n let tag: TS.Node = node.tagName\n let member = false\n while (ts.isPropertyAccessExpression(tag)) {\n tag = tag.expression\n member = true\n }\n if (ts.isIdentifier(tag) && /^[A-Z]/.test(tag.text)) used.set(tag.text, member || (used.get(tag.text) ?? false))\n }\n ts.forEachChild(node, visit)\n }\n visit(sf)\n return used\n}\n","/**\n * Tailwind class candidates for drafts.\n *\n * @tailwindcss/vite (v4) never looks at the code Vite serves: it collects\n * candidates by scanning files on disk (the project root plus each `@source`)\n * whenever the root stylesheet is transformed. A class that only exists in a\n * draft — a three-column grid in a part being rewritten — therefore never becomes\n * CSS, and the layout is wrong until the file is saved.\n *\n * So each applied draft is mirrored, for scanning only, into a directory under\n * `.vantage/` (generated, and ignored by git through its own `*` .gitignore) that\n * is registered as an extra `@source` of `.vantage/runtime.css`.\n * Nothing imports these copies; the project files are never touched. The mirror\n * is written before the HMR update goes out, and the plugin re-transforms the\n * stylesheet itself right after (the file watcher is not relied on: its event\n * races with the stylesheet's own re-transform, and a mirror that has no importer\n * at that moment makes Vite reload the whole page).\n *\n * Tailwind's dev server only ever adds candidates, so dropping a draft deletes\n * its mirror but does not take its classes out of the CSS until a restart —\n * the same as deleting a class from a file on disk. Unused rules change nothing\n * on screen.\n */\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport { VANTAGE_DIR } from \"../../core/constants\"\n\nexport interface DraftTailwind {\n /** Empty the mirror directory (it has to exist before Tailwind sets up its scanner). */\n reset(): void\n /** `transform` hook body for the root stylesheet: registers the mirror directory. */\n transformCss(code: string, id: string): string | null\n /** Mirror `content` (a draft of `file`) for the scanner. True when the mirror changed. */\n write(file: string, content: string): boolean\n /** `file` is one of the mirrors (or the mirror directory's own churn). */\n owns(file: string): boolean\n /** The root stylesheet, which has to be re-transformed to pick the mirror up. */\n stylesheet: string\n /** Forget the mirror of `file`. */\n remove(file: string): void\n}\n\nexport function draftTailwind(root: string): DraftTailwind {\n const dir = path.join(root, VANTAGE_DIR, \"draft-tailwind\")\n const runtimeCss = path.join(root, VANTAGE_DIR, \"runtime.css\")\n\n // Keep the extension so the scanner picks the same extractor as for the real file.\n const mirrorOf = (file: string) => path.join(dir, path.relative(root, file).split(path.sep).join(\"__\"))\n\n return {\n stylesheet: runtimeCss,\n owns: (file) => file.startsWith(dir + path.sep),\n reset() {\n // Mirrors from an earlier dev server are stale drafts: start empty.\n fs.rmSync(dir, { recursive: true, force: true })\n fs.mkdirSync(dir, { recursive: true })\n },\n transformCss(code, id) {\n if (id.split(\"?\")[0] !== runtimeCss) return null\n return `${code}${code.endsWith(\"\\n\") ? \"\" : \"\\n\"}@source ${JSON.stringify(dir)};\\n`\n },\n write(file, content) {\n const mirror = mirrorOf(file)\n if (fs.existsSync(mirror) && fs.readFileSync(mirror, \"utf8\") === content) return false\n fs.writeFileSync(mirror, content)\n return true\n },\n remove(file) {\n fs.rmSync(mirrorOf(file), { force: true })\n },\n }\n}\n","import type TS from \"typescript\"\nimport { ts } from \"./typescript\"\n\n/**\n * How much a page's default export puts on screen, judged from its source: the\n * number of content leaves in the JSX its component returns — non-blank text,\n * `{expressions}`, and components given props (a `<Chart data={…} />` or a\n * `<Card title=\"…\">` draws something even with no children).\n *\n * A draft cut off inside a list (`{rows.map((r) => <Row …` ) is completed by\n * dropping the unfinished expression, which can leave only empty wrappers\n * (`<div className=\"grid\"></div>`). Shown, that version blanks the page that was\n * on screen until the next chunk arrives, so the plugin keeps the previous one\n * while this returns 0.\n *\n * A component that has no `return` yet renders nothing and counts 0. `null` when\n * there is nothing to judge (no default export function, or it returns something\n * other than JSX): the caller should not hold anything back on a guess.\n */\nexport function renderedContent(source: string, fileName = \"draft.tsx\"): number | null {\n const sf = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX)\n const component = defaultComponent(sf)\n if (!component?.body) return null\n const roots: TS.Node[] = []\n if (ts.isBlock(component.body)) {\n const visit = (node: TS.Node): void => {\n // Returns of nested functions (a `.map` callback) are counted where they sit in the JSX.\n if (ts.isFunctionLike(node)) return\n if (ts.isReturnStatement(node) && node.expression) roots.push(node.expression)\n ts.forEachChild(node, visit)\n }\n ts.forEachChild(component.body, visit)\n } else {\n roots.push(component.body)\n }\n // Not written down to its `return` yet: the component renders nothing.\n if (roots.length === 0) return 0\n const jsxRoots = roots.map(unwrap).filter(isJsx)\n if (jsxRoots.length < roots.length) return null\n let leaves = 0\n const count = (node: TS.Node): void => {\n if (ts.isJsxText(node)) {\n if (node.text.trim() !== \"\") leaves++\n return\n }\n if (ts.isJsxExpression(node)) {\n // `{/* comment */}` is empty; an attribute value is not a child.\n if (node.expression && !ts.isJsxAttribute(node.parent)) leaves++\n return\n }\n if (ts.isJsxSelfClosingElement(node) || ts.isJsxOpeningElement(node)) {\n if (isComponentTag(node.tagName) && node.attributes.properties.length > 0) leaves++\n return\n }\n ts.forEachChild(node, count)\n }\n for (const root of jsxRoots) count(root)\n return leaves\n}\n\n/**\n * Whether showing `next` in place of `shown` would empty a screen that had\n * something on it. A page that is itself empty on screen is not held back.\n */\nexport function blanksScreen(next: string, shown: string): boolean {\n return renderedContent(next) === 0 && renderedContent(shown) !== 0\n}\n\ntype FunctionNode = TS.FunctionDeclaration | TS.FunctionExpression | TS.ArrowFunction\n\nfunction defaultComponent(sf: TS.SourceFile): FunctionNode | undefined {\n const functions = new Map<string, FunctionNode>()\n let exported: FunctionNode | string | undefined\n for (const stmt of sf.statements) {\n if (ts.isFunctionDeclaration(stmt)) {\n const isDefault = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword)\n if (isDefault) exported = stmt\n else if (stmt.name) functions.set(stmt.name.text, stmt)\n } else if (ts.isVariableStatement(stmt)) {\n for (const decl of stmt.declarationList.declarations) {\n const init = decl.initializer && unwrap(decl.initializer)\n if (ts.isIdentifier(decl.name) && init && (ts.isArrowFunction(init) || ts.isFunctionExpression(init)))\n functions.set(decl.name.text, init)\n }\n } else if (ts.isExportAssignment(stmt) && !stmt.isExportEquals) {\n const expr = unwrap(stmt.expression)\n if (ts.isArrowFunction(expr) || ts.isFunctionExpression(expr)) exported = expr\n else if (ts.isIdentifier(expr)) exported = expr.text\n }\n }\n return typeof exported === \"string\" ? functions.get(exported) : exported\n}\n\nfunction unwrap(node: TS.Node): TS.Node {\n while (ts.isParenthesizedExpression(node) || ts.isAsExpression(node) || ts.isSatisfiesExpression(node))\n node = node.expression\n return node\n}\n\nfunction isJsx(node: TS.Node): boolean {\n return ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node)\n}\n\nfunction isComponentTag(tag: TS.JsxTagNameExpression): boolean {\n // `<Card>` and `<Tabs.List>` are components; `<div>` is markup.\n return !ts.isIdentifier(tag) || /^[A-Z]/.test(tag.text)\n}\n","/**\n * Draft preview — an in-memory layer over the project files so a half-written\n * page can be shown in the preview before the author (usually an agent) has\n * finished writing it. Dev only, and only when `vantage dev --draft-preview`\n * (or `VANTAGE_DRAFT_PREVIEW=1`) asks for it; otherwise this plugin is not\n * registered at all.\n *\n * POST /__vantage_draft { path, content?, final?, discard?, seq? }\n * → 200 { applied, reason?, route?, created? } 401 on a wrong token, 400 on a malformed request\n *\n * `seq` (per path, increasing) lets the caller fire requests without waiting for\n * each other: one older than the newest seen for its path is dropped as `stale`.\n *\n * - `path` is project-root relative (`src/index.tsx`). `server/`, `node_modules/`,\n * dot directories (`.vantage/`) and anything outside the project are refused:\n * server code never reaches the client, and the rest is not a project source.\n * - Each draft goes through `completeDraft` (close what the cut-off left open),\n * then through Vite's real transform pipeline for that module (oxc, React\n * Refresh, import analysis). Only a version that transforms is kept and sent\n * as an HMR update — the same update a save on disk would produce, so React\n * Fast Refresh boundaries are untouched. A version that does not transform is\n * dropped and the previous one stays on screen. A client that fails to render\n * a draft reports it (`vantage:draft-render-error`) and the server steps back\n * to the last version that went through.\n * - Requests are applied one at a time. A draft still queued when a newer draft\n * of the same file arrives is replaced by it, and `final` / `discard` drop the\n * queued drafts of their file. A draft that is not followed by anything for\n * `DRAFT_IDLE_DISCARD_MS` is discarded (the author is gone).\n * - `final: true` discards the draft and serves the file on disk again. It always\n * sends the update, even when the last draft equals the disk file: the screen\n * may still show an older version if that draft failed to render.\n * `discard: true` drops the draft without any new content (the write failed or\n * was cancelled); the file on disk is served again.\n * - A draft that reads a name nothing declares yet (the data of a page written\n * body-first, an identifier cut off half way) waits: rendered, it would throw.\n * - A new file is accepted too. A new page goes through `DraftRoutes` (a\n * provisional route, no full reload); a new part is made resolvable for the\n * modules that import it.\n * - A part cut off above some of its exports borrows them from the version\n * shown before it (or the disk file), so a chart stays up while it is rewritten.\n * - A file nothing imports yet (a helper written before the page that uses it) is kept\n * and served to whoever imports it later, but sends no update: an update with no\n * importer to take it is a full reload of the page on screen.\n *\n * Nothing is ever written to disk outside `.vantage/`, and the plugin is\n * `apply: \"serve\"`, so a build never sees it.\n */\nimport { createHash, timingSafeEqual } from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport type { IncomingMessage, ServerResponse } from \"node:http\"\nimport type { EnvironmentModuleNode, Plugin, ViteDevServer } from \"vite\"\nimport { draftSkeletonModuleSource } from \"../../client/draft-skeleton-source\"\nimport type { RouteModel } from \"../../core/types\"\nimport { BorrowedVersions } from \"./borrow\"\nimport { completeDraft, isPageModule } from \"./complete\"\nimport { exportNames, topLevelNames, undeclaredNames } from \"./names\"\nimport { createDraftRoutes, type DraftRoutes } from \"./routes\"\nimport { declareMissingComponents, relativeImports } from \"./skeleton\"\nimport { draftTailwind, type DraftTailwind } from \"./tailwind\"\nimport { loadTypeScript } from \"./typescript\"\nimport { blanksScreen } from \"./visible\"\n\nexport const DRAFT_ENDPOINT = \"/__vantage_draft\"\nexport const DRAFT_TOKEN_HEADER = \"x-vantage-draft-token\"\n/** server → client: the set of files shown from a draft changed. */\nexport const DRAFT_STATE_EVENT = \"vantage:draft-state\"\n/** server → client: a new page got a provisional route. */\nexport const DRAFT_PAGE_EVENT = \"vantage:draft-page\"\n/** server → client: the provisional route of a new page was taken out without the file being written. */\nexport const DRAFT_PAGE_CLOSED_EVENT = \"vantage:draft-page-closed\"\n/** client → server: a draft threw while rendering. */\nexport const DRAFT_RENDER_ERROR_EVENT = \"vantage:draft-render-error\"\n/** client → server: the page loaded (or reloaded) and wants the current `vantage:draft-state`. */\nexport const DRAFT_SYNC_EVENT = \"vantage:draft-sync\"\n\n/** Modules a draft may resolve to (what an import can name). */\nconst DRAFT_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mts\", \".mjs\"]\n/** Modules a draft can be made of: what `completeDraft` is able to close. */\nconst DRAFTABLE_EXTENSIONS = [\".ts\", \".tsx\"]\n/** A source file is never this large; past it the request is refused rather than parsed. */\nconst MAX_BODY_BYTES = 1024 * 1024\n/**\n * A draft file the author stops sending for this long is discarded. The agent\n * streams a new version every few hundred ms while it writes, so a silence this\n * long means the `final` / `discard` was lost (or the file was changed some other way).\n */\nexport const DRAFT_IDLE_DISCARD_MS = 60_000\n/** Versions kept per file to step back to after a render error. */\nconst MAX_HISTORY = 8\n/** A render error that arrives this soon after a step back is the same failure reported again. */\nconst ROLLBACK_DEBOUNCE_MS = 150\nconst PREV_QUERY = \"vantage-draft-prev\"\n/** Id prefix of the module standing in for an import of a file that is not written yet. */\nconst SKELETON_PREFIX = \"\\0vantage-draft-skeleton:\"\n\nexport interface DraftPreviewOptions {\n root: string\n /** The route model as of now (`pageDir` tells which files are pages). */\n getModel: () => RouteModel\n /**\n * Shared secret the caller must send as `x-vantage-draft-token`. Defaults to\n * `VANTAGE_DRAFT_TOKEN`; without either, only loopback callers are served.\n */\n token?: string\n /** How long a draft may go without a newer one before it is discarded. Defaults to `DRAFT_IDLE_DISCARD_MS`. */\n idleDiscardMs?: number\n /** Replaces `createDraftRoutes` (tests). */\n createRoutes?: (server: ViteDevServer, model: RouteModel) => DraftRoutes\n}\n\ninterface DraftRequest {\n path: string\n content?: string\n final?: boolean\n discard?: boolean\n /** Per path, increasing; lets a request that overtook an older one be told apart. */\n seq?: number\n}\n\ninterface DraftResult {\n applied: boolean\n reason?: string\n route?: string\n created?: boolean\n}\n\n/** One version of a file that was served. */\ninterface Version {\n /** What `load()` returns: the completed draft plus whatever supplies its missing exports. */\n served: string\n /** The completed draft before exports were supplied; two drafts that complete the same are one version. */\n completed: string\n /** Content the exports of this version were borrowed from, if any. */\n borrowSource?: string\n}\n\ninterface Target {\n file: string\n /** Project-relative, posix. */\n rel: string\n /** Dev-server URL of the module. */\n url: string\n exists: boolean\n}\n\nexport interface DraftPreviewApi {\n /** What the client reports through `vantage:draft-render-error`. */\n renderError(data: { file?: string; message?: string }): Promise<void>\n}\n\nexport function draftPreviewPlugin(options: DraftPreviewOptions): Plugin & { api: DraftPreviewApi } {\n const root = path.resolve(options.root)\n const token = options.token ?? process.env.VANTAGE_DRAFT_TOKEN\n const createRoutes = options.createRoutes ?? createDraftRoutes\n const idleDiscardMs = options.idleDiscardMs ?? DRAFT_IDLE_DISCARD_MS\n /** Set once the compiler was found; without it the plugin does nothing. */\n let enabled = false\n let tailwind: DraftTailwind | undefined\n let routes: DraftRoutes | undefined\n let server: ViteDevServer | undefined\n\n /** Absolute file path → the versions served, oldest first; the last one is on screen. */\n const drafts = new Map<string, Version[]>()\n /** Drafted files that do not exist on disk: resolvable for the modules that import them. */\n const newFiles = new Set<string>()\n /** Every file a draft was applied to since the server started (see `reachable`). */\n const drafted = new Set<string>()\n /** New pages whose provisional route was made (file → route), so the next draft does not make it again. */\n const ensuredPages = new Map<string, string>()\n /** Newest `seq` seen per file; kept after final / discard so a late older draft is still dropped. */\n const lastSeq = new Map<string, number>()\n /** Per drafted file: the timer that discards it when the author goes quiet. */\n const idleTimers = new Map<string, NodeJS.Timeout>()\n const rolledBackAt = new Map<string, number>()\n /**\n * Imports of files that exist neither on disk nor as a draft, as the id of\n * the placeholder module they resolve to → the names asked of it. A page\n * written top-down imports its parts long before they are written.\n */\n const skeletons = new Map<string, Set<string>>()\n /**\n * Earlier versions of parts, served at `<file>?vantage-draft-prev=<hash>` so a\n * draft can re-export the names it has not reached yet from them (see\n * `borrow.ts`). Dropped when the file's draft is finalised.\n */\n const borrowed = new BorrowedVersions(PREV_QUERY)\n let lastApplied: string | undefined\n let lastStateKey = \"\"\n /** Requests are applied one at a time so a slow transform cannot interleave. */\n let queue: Promise<unknown> = Promise.resolve()\n const enqueue = <T>(task: () => Promise<T>): Promise<T> => {\n const run = queue.then(task)\n queue = run.catch(() => {})\n return run\n }\n\n /** A request waiting for its turn. */\n interface Job {\n /** Absolute path, when the request names one. */\n key: string | undefined\n req: DraftRequest\n settle(result: DraftResult): void\n fail(err: unknown): void\n }\n const waiting: Job[] = []\n const isDraftRequest = (req: DraftRequest): boolean => !req.final && !req.discard\n const SUPERSEDED: DraftResult = { applied: false, reason: \"superseded\" }\n /**\n * Queue a request. Drafts are sent faster than a transform can follow, so a\n * draft still waiting is replaced by the next draft of the same file (the\n * older caller is told `superseded`), and `final` / `discard` drop the drafts\n * of their file that are still waiting: they would only be undone.\n */\n const submit = (req: DraftRequest): Promise<DraftResult> =>\n new Promise<DraftResult>((resolve, reject) => {\n const key = typeof req.path === \"string\" && req.path !== \"\" ? path.resolve(root, req.path) : undefined\n if (key !== undefined) {\n if (!isDraftRequest(req)) {\n for (let i = waiting.length - 1; i >= 0; i--) {\n const job = waiting[i]!\n if (job.key !== key || !isDraftRequest(job.req)) continue\n waiting.splice(i, 1)\n job.settle(SUPERSEDED)\n }\n } else {\n const last = waiting.findLast((job) => job.key === key)\n if (last !== undefined && isDraftRequest(last.req)) {\n if (isOlder(req, last.req)) return resolve({ applied: false, reason: \"stale\" })\n last.settle(SUPERSEDED)\n last.req = req\n last.settle = resolve\n last.fail = reject\n return\n }\n }\n }\n const job: Job = { key, req, settle: resolve, fail: reject }\n waiting.push(job)\n void enqueue(async () => {\n const at = waiting.indexOf(job)\n if (at === -1) return // taken over by a newer request\n waiting.splice(at, 1)\n try {\n job.settle(await apply(job.req))\n } catch (err) {\n job.fail(err)\n }\n })\n })\n\n const relOf = (file: string) => path.relative(root, file).split(path.sep).join(\"/\")\n const shown = (file: string): Version | undefined => drafts.get(file)?.at(-1)\n const diskText = (file: string): string | undefined => {\n try {\n return fs.readFileSync(file, \"utf8\")\n } catch {\n return undefined\n }\n }\n\n const candidatesOf = (base: string): string[] => [\n base,\n ...DRAFT_EXTENSIONS.map((ext) => base + ext),\n ...DRAFT_EXTENSIONS.map((ext) => path.join(base, \"index\" + ext)),\n ]\n /** `./x` and `./x.tsx` name the same module. */\n const skeletonId = (base: string): string => {\n const ext = path.extname(base)\n return SKELETON_PREFIX + (DRAFT_EXTENSIONS.includes(ext) ? base.slice(0, -ext.length) : base)\n }\n const isWritten = (base: string): boolean => candidatesOf(base).some((c) => newFiles.has(c) || fs.existsSync(c))\n\n /**\n * Note which relative imports of a drafted module point at nothing, and the\n * names asked of them. Returns the placeholders whose export list grew (their\n * importers hold the old one and have to be told), and `undo` for a draft that\n * is then refused: an import that really is missing must go back to failing.\n */\n const registerSkeletons = (file: string, source: string, rel: string): { grown: string[]; undo(): void } => {\n const grown: string[] = []\n const before = new Map<string, Set<string> | undefined>()\n for (const [specifier, names] of relativeImports(source, rel)) {\n const ext = path.extname(specifier)\n if (ext !== \"\" && !DRAFT_EXTENSIONS.includes(ext)) continue\n const base = path.resolve(path.dirname(file), specifier)\n if (isWritten(base)) continue\n const id = skeletonId(base)\n const known = skeletons.get(id)\n if (!known) {\n before.set(id, undefined)\n skeletons.set(id, new Set(names))\n grown.push(id)\n } else if ([...names].some((n) => !known.has(n))) {\n if (!before.has(id)) before.set(id, new Set(known))\n for (const n of names) known.add(n)\n grown.push(id)\n }\n }\n const undo = (): void => {\n for (const [id, names] of before) {\n if (names === undefined) skeletons.delete(id)\n else skeletons.set(id, names)\n }\n }\n return { grown, undo }\n }\n\n const resolveTarget = (rel: unknown): Target | string => {\n if (typeof rel !== \"string\" || rel === \"\") return \"path is required\"\n const file = path.resolve(root, rel)\n const relPath = path.relative(root, file)\n if (relPath === \"\" || relPath.startsWith(\"..\") || path.isAbsolute(relPath)) return \"path is outside the project\"\n const segments = relPath.split(path.sep)\n if (segments[0] === \"server\") return \"server/ is not previewed\"\n if (segments.some((s) => s === \"node_modules\" || s.startsWith(\".\"))) return \"path is not a project source\"\n if (!DRAFTABLE_EXTENSIONS.includes(path.extname(file))) return \"only .ts and .tsx script modules are previewed\"\n const exists = fs.existsSync(file)\n if (exists && fs.statSync(file).isDirectory()) return \"path is a directory\"\n // A symlink must not lead out of the project either.\n if (exists && !isInside(fs.realpathSync(root), fs.realpathSync(file))) return \"path is outside the project\"\n return { file, rel: segments.join(\"/\"), url: \"/\" + segments.join(\"/\"), exists }\n }\n\n // The borrowed earlier versions share the file but never change: leave them out. So\n // is a node that was never loaded (`id` null), which a file that came and went leaves\n // behind: the client has nothing of it to update, and Vite answers with a full reload.\n const modulesOf = (file: string): EnvironmentModuleNode[] => [\n ...(server!.environments.client.moduleGraph.getModulesByFile(file) ?? []),\n ].filter((mod) => mod.id !== null && !mod.url.includes(`${PREV_QUERY}=`))\n\n /** Drop the cached transform so the next request runs `load()` again. */\n const invalidate = (file: string): void => {\n const graph = server!.environments.client.moduleGraph\n for (const mod of modulesOf(file)) graph.invalidateModule(mod)\n }\n\n /** Re-transform the root stylesheet so Tailwind scans the mirrors again. */\n const restyle = async (): Promise<void> => {\n const client = server!.environments.client\n for (const mod of client.moduleGraph.getModulesByFile(tailwind!.stylesheet) ?? []) await client.reloadModule(mod)\n }\n\n /**\n * An update needs a module to take it: an importer, or the module itself accepting it. A\n * helper that nothing imports yet has neither, and Vite turns its update into a full reload.\n */\n const reachable = (mod: EnvironmentModuleNode): boolean => mod.importers.size > 0 || mod.isSelfAccepting === true\n\n /** Same HMR update a save on disk would send. */\n const pushUpdate = async (file: string): Promise<void> => {\n for (const mod of modulesOf(file)) if (reachable(mod)) await server!.environments.client.reloadModule(mod)\n }\n\n const draftState = (): { active: boolean; files: string[] } => {\n const files = [...drafts.keys()].map(relOf).sort()\n return { active: files.length > 0, files }\n }\n\n /** Tell the client which files are shown from a draft, whenever that set changes. */\n const notifyState = (): void => {\n const state = draftState()\n const key = state.files.join(\"\\n\")\n if (key === lastStateKey) return\n lastStateKey = key\n server!.environments.client.hot.send(DRAFT_STATE_EVENT, state)\n }\n\n /** A page that loads (or reloads, or reconnects) has missed every earlier announcement: tell it now. */\n const sendState = (client?: { send(event: string, data?: unknown): void }): void => {\n ;(client ?? server!.environments.client.hot).send(DRAFT_STATE_EVENT, draftState())\n }\n\n /** Forget everything about a file's draft (not the module graph: callers invalidate). */\n const forget = async (file: string, opts: { committed: boolean }): Promise<void> => {\n drafts.delete(file)\n rolledBackAt.delete(file)\n borrowed.drop(file)\n tailwind!.remove(file)\n newFiles.delete(file)\n clearTimeout(idleTimers.get(file))\n idleTimers.delete(file)\n const route = ensuredPages.get(file)\n if (route === undefined) return\n ensuredPages.delete(file)\n await routes!.release(file, opts)\n // The page was opened for the author and now has nothing behind it.\n if (!opts.committed && !isDynamicRoute(route)) server!.environments.client.hot.send(DRAFT_PAGE_CLOSED_EVENT, { route })\n }\n\n /** (Re)start the clock that discards `target`'s draft when nothing more arrives for it. */\n const touchIdle = (target: Target): void => {\n clearTimeout(idleTimers.get(target.file))\n const timer = setTimeout(() => {\n idleTimers.delete(target.file)\n void enqueue(() => discard(target)).catch(() => {})\n }, idleDiscardMs)\n timer.unref()\n idleTimers.set(target.file, timer)\n }\n\n const apply = async (req: DraftRequest): Promise<DraftResult> => {\n const target = resolveTarget(req.path)\n if (typeof target === \"string\") return { applied: false, reason: target }\n // A request that overtook an older one (they are fired without waiting for each other).\n if (typeof req.seq === \"number\" && Number.isFinite(req.seq)) {\n if (req.seq < (lastSeq.get(target.file) ?? -Infinity)) return { applied: false, reason: \"stale\" }\n lastSeq.set(target.file, req.seq)\n }\n if (req.discard) return discard(target)\n if (req.final) return finalize(target)\n const result = await draft(target, req)\n if (drafts.has(target.file)) touchIdle(target)\n return result\n }\n\n const finalize = async ({ file }: Target): Promise<DraftResult> => {\n if (!fs.existsSync(file)) {\n // Nothing was written: whatever was shown for it has to go.\n const had = drafts.has(file)\n await forget(file, { committed: false })\n invalidate(file)\n notifyState()\n return { applied: false, reason: had ? \"file was not written\" : \"file does not exist\" }\n }\n await forget(file, { committed: true })\n notifyState()\n invalidate(file)\n await pushUpdate(file)\n await refreshSkeletons([], file)\n return { applied: true }\n }\n\n const discard = async ({ file }: Target): Promise<DraftResult> => {\n if (!drafts.has(file)) return { applied: false, reason: \"no draft\" }\n await forget(file, { committed: false })\n notifyState()\n invalidate(file)\n // A file that is not on disk has nothing to go back to: its importers keep what they have.\n if (fs.existsSync(file)) await pushUpdate(file)\n return { applied: true }\n }\n\n const draft = async (target: Target, req: DraftRequest): Promise<DraftResult> => {\n const { file, rel, url, exists } = target\n if (typeof req.content !== \"string\") return { applied: false, reason: \"content is required\" }\n const pageDir = options.getModel().pageDir\n const previous = shown(file)\n const base = previous?.served ?? diskText(file)\n const page = isPageModule(rel, pageDir)\n const newPage = !exists && page && routes!.isNewPage(file)\n // A part usually declares its exports last, so waiting for them would show\n // nothing until the file is finished. Instead, the exports of the file on\n // disk that the draft has not reached yet are borrowed (see `stubExports`).\n const diskText0 = diskText(file)\n const diskExports = page || diskText0 === undefined ? new Set<string>() : exportNames(diskText0, rel)\n const completedDraft = completeDraft(req.content, {\n path: rel,\n pageDir,\n requireExport: page || diskExports.size === 0,\n })\n if (completedDraft === null) return { applied: false, reason: \"draft cannot be completed yet\" }\n const withSkeletons = declareMissingComponents(completedDraft, rel)\n if (withSkeletons === previous?.completed) return { applied: true, reason: \"unchanged\" }\n // A name read before anything declares it (the data of a page written body-first,\n // an identifier cut off half way) would throw when rendered: wait for it.\n const undeclared = undeclaredNames(withSkeletons, rel)\n if (undeclared.length > 0) return { applied: false, reason: `undeclared: ${undeclared.slice(0, 3).join(\", \")}` }\n // A page that renders nothing yet would blank the screen it replaces (see `renderedContent`).\n if (page && base !== undefined && blanksScreen(withSkeletons, base))\n return { applied: false, reason: \"renders nothing yet\" }\n let completed = withSkeletons\n let borrowSource: string | undefined\n if (!page) {\n const have = exportNames(withSkeletons, rel)\n const missing = [...diskExports].filter((name) => !have.has(name))\n if (missing.length > 0) {\n const source = borrowed.sourceFor(file, base!)\n const prevUrl = borrowed.urlFor(file, url, source)\n completed = stubExports(withSkeletons, diskExports, prevUrl, rel)\n if (completed.includes(prevUrl)) borrowSource = source\n }\n }\n\n if (completed === previous?.served) return { applied: true, reason: \"unchanged\" }\n // The same text as the file on disk, with nothing shown over it: nothing to send.\n if (previous === undefined && completed === diskText0) return { applied: true, reason: \"unchanged\" }\n\n // A part cut off above one of its exports would break every importer of\n // that name, so it waits until everything the shown version exports is\n // back. (Types are erased and never break an importer at runtime.)\n if (base !== undefined) {\n const next = exportNames(completed, rel)\n if ([...exportNames(base, rel)].some((name) => !next.has(name))) return { applied: false, reason: \"missing-exports\" }\n }\n\n // Try the candidate through the real pipeline before anyone sees it.\n const version: Version = { served: completed, completed: withSkeletons, borrowSource }\n drafted.add(file)\n const history = drafts.get(file) ?? []\n drafts.set(file, [...history, version].slice(-MAX_HISTORY))\n if (!exists) newFiles.add(file)\n const { grown: grownSkeletons, undo: undoSkeletons } = registerSkeletons(file, completed, rel)\n invalidate(file)\n const revert = (): void => {\n if (history.length === 0) {\n drafts.delete(file)\n newFiles.delete(file)\n } else drafts.set(file, history)\n undoSkeletons()\n invalidate(file)\n }\n try {\n await server!.environments.client.transformRequest(url)\n } catch (err) {\n revert()\n return { applied: false, reason: firstLine(err) }\n }\n\n await refreshSkeletons(grownSkeletons, exists ? undefined : file)\n\n let route: string | undefined\n if (newPage && !ensuredPages.has(file)) {\n const ensured = await routes!.ensure(file)\n if (!ensured) {\n revert()\n return { applied: false, reason: \"route could not be created\" }\n }\n ensuredPages.set(file, ensured.route)\n route = ensured.route\n }\n\n borrowed.shown(file, borrowSource)\n const styled = tailwind!.write(file, completed)\n lastApplied = file\n notifyState()\n if (route !== undefined) {\n // A page with parameters has no URL to open; the author's editor is not sent to one.\n if (!isDynamicRoute(route)) server!.environments.client.hot.send(DRAFT_PAGE_EVENT, { route })\n return { applied: true, route, created: true }\n }\n if (styled) await restyle()\n await pushUpdate(file)\n return { applied: true }\n }\n\n /**\n * Tell the importers of placeholders that changed. A placeholder that gained\n * names is invalidated and reloaded; the placeholder for `written` (a file that\n * has just appeared) is dropped, and whoever imported it resolves to the real\n * file from now on.\n */\n const refreshSkeletons = async (grown: string[], written: string | undefined): Promise<void> => {\n const graph = server!.environments.client.moduleGraph\n for (const id of grown) {\n const mod = graph.getModuleById(id)\n if (!mod) continue\n graph.invalidateModule(mod)\n await server!.environments.client.reloadModule(mod)\n }\n if (written === undefined) return\n const stand = skeletonId(written)\n skeletons.delete(stand)\n const mod = graph.getModuleById(stand)\n if (!mod) return\n const importers = [...mod.importers]\n graph.invalidateModule(mod)\n for (const importer of importers) {\n graph.invalidateModule(importer)\n await server!.environments.client.reloadModule(importer)\n }\n }\n\n /** The client could not render what is shown for `file`: go back to the version before it. */\n const renderError = async (data: { file?: string; message?: string }): Promise<void> => {\n if (!enabled) return\n // The module the client named; failing that (or when it is not a draft) the one applied last.\n const file = (data.file ? locate(data.file) : undefined) ?? lastApplied\n const history = file === undefined ? undefined : drafts.get(file)\n if (file === undefined || history === undefined) return\n const now = Date.now()\n if (now - (rolledBackAt.get(file) ?? 0) < ROLLBACK_DEBOUNCE_MS) return\n rolledBackAt.set(file, now)\n history.pop()\n const before = history.at(-1)\n if (before === undefined) {\n await forget(file, { committed: false })\n } else {\n borrowed.shown(file, before.borrowSource)\n if (tailwind!.write(file, before.served)) await restyle()\n }\n notifyState()\n invalidate(file)\n if (before !== undefined || fs.existsSync(file)) await pushUpdate(file)\n }\n\n /** A file as the client names it (project-relative, absolute, or a dev-server URL) → absolute path. */\n const locate = (name: string): string | undefined => {\n const clean = name.split(\"?\")[0]!\n const candidates = [path.resolve(root, clean.replace(/^\\//, \"\")), clean]\n return candidates.find((c) => drafts.has(c))\n }\n\n const authorized = (req: IncomingMessage): boolean => {\n // Without a token the caller's address is all there is. Behind a reverse proxy on this host\n // every caller looks like loopback, so a request that went through one is refused.\n if (token === undefined || token === \"\") return isLoopback(req) && !isForwarded(req)\n const sent = req.headers[DRAFT_TOKEN_HEADER]\n return typeof sent === \"string\" && sameSecret(sent, token)\n }\n\n const handle = async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const send = (status: number, result: DraftResult): void => {\n res.statusCode = status\n res.setHeader(\"Content-Type\", \"application/json\")\n res.end(JSON.stringify(result))\n }\n if (!authorized(req)) {\n const withToken = token !== undefined && token !== \"\"\n return send(withToken ? 401 : 403, { applied: false, reason: withToken ? \"invalid token\" : \"loopback only\" })\n }\n // Without a token the only check is where the caller is: a cross-site form post\n // from a page in the author's browser would pass it, a JSON body would not.\n if ((token === undefined || token === \"\") && !String(req.headers[\"content-type\"]).startsWith(\"application/json\"))\n return send(415, { applied: false, reason: \"content-type must be application/json\" })\n let body: unknown\n try {\n body = JSON.parse(await readBody(req))\n } catch (err) {\n if (err instanceof BodyTooLarge) return send(413, { applied: false, reason: err.message })\n return send(400, { applied: false, reason: firstLine(err) })\n }\n if (typeof body !== \"object\" || body === null || Array.isArray(body))\n return send(400, { applied: false, reason: \"body must be a JSON object\" })\n const request = body as DraftRequest\n if (typeof request.path !== \"string\" || request.path === \"\")\n return send(400, { applied: false, reason: \"path is required\" })\n try {\n const result = await submit(request)\n // A directory can never be drafted: the caller's mistake, not something to retry.\n send(result.applied === false && REFUSED_PATH.test(result.reason ?? \"\") ? 400 : 200, result)\n } catch (err) {\n send(500, { applied: false, reason: firstLine(err) })\n }\n }\n\n return {\n name: \"vantage:draft-preview\",\n apply: \"serve\",\n enforce: \"pre\",\n api: { renderError },\n\n async configureServer(s) {\n // Drafts are read with the compiler of the project being served.\n if (!(await loadTypeScript(root))) {\n console.warn(\n \"[vantage] draft preview is off: `typescript` was not found in this project. \" +\n \"Install it as a devDependency to preview unfinished files.\",\n )\n return\n }\n enabled = true\n server = s\n routes = createRoutes(s, options.getModel())\n tailwind = draftTailwind(root)\n tailwind.reset()\n s.middlewares.use(DRAFT_ENDPOINT, (req, res, next) => {\n if (req.method !== \"POST\") return next()\n // Mounted at the endpoint: anything after it is not ours to answer.\n if ((req.url ?? \"/\").split(\"?\")[0] !== \"/\") {\n res.statusCode = 404\n res.setHeader(\"Content-Type\", \"application/json\")\n return void res.end(JSON.stringify({ applied: false, reason: \"not found\" }))\n }\n void handle(req, res)\n })\n const hot = s.environments.client.hot\n hot.on(DRAFT_RENDER_ERROR_EVENT, (data: { file?: string; message?: string }) => {\n void enqueue(() => renderError(data ?? {})).catch(() => {})\n })\n // The state is only announced when it changes: a page that arrives later (a reload, a second\n // tab, a reconnect) asks for it. `vite:client:connect` covers a client that is already\n // listening; the entry's own request covers one whose listeners were not registered yet.\n hot.on(\"vite:client:connect\", (_data: unknown, client?: { send(event: string, data?: unknown): void }) =>\n sendState(client),\n )\n hot.on(DRAFT_SYNC_EVENT, (_data: unknown, client?: { send(event: string, data?: unknown): void }) =>\n sendState(client),\n )\n },\n\n // A draft file that is not on disk yet still has to resolve for the modules importing it.\n resolveId(source, importer) {\n if (newFiles.size === 0 && skeletons.size === 0) return null\n const clean = source.split(\"?\")[0]!\n let base: string\n if (clean.startsWith(\"/\")) base = clean.startsWith(root + \"/\") ? clean : path.join(root, clean)\n else if (clean.startsWith(\".\") && importer) base = path.resolve(path.dirname(importer.split(\"?\")[0]!), clean)\n else return null\n const written = candidatesOf(base)\n const draftFile = written.find((c) => newFiles.has(c))\n if (draftFile) return draftFile\n // An import of a file that is not written yet resolves to a placeholder. Only\n // an import a draft was seen to make: the page is saved before its parts are\n // written, and must keep rendering until they are.\n if (clean.startsWith(\".\") && importer && skeletons.size > 0) {\n const id = skeletonId(base)\n if (skeletons.has(id) && !written.some((c) => fs.existsSync(c))) return id\n }\n return null\n },\n\n // Before @tailwindcss/vite reads the root stylesheet.\n transform: {\n order: \"pre\",\n handler(code, id) {\n return tailwind?.transformCss(code, id) ?? null\n },\n },\n\n load(id) {\n if (id.startsWith(SKELETON_PREFIX)) return draftSkeletonModuleSource([...(skeletons.get(id) ?? [])])\n if (drafts.size === 0) return null\n const prev = new URLSearchParams(id.split(\"?\")[1] ?? \"\").get(PREV_QUERY)\n if (prev !== null) return borrowed.get(prev) ?? null\n return shown(id.split(\"?\")[0]!)?.served ?? null\n },\n\n // The borrowed versions share the drafted file but are not what changed.\n hotUpdate({ modules, file }) {\n // The mirrors only feed Tailwind's scanner; `restyle` refreshes the stylesheet.\n if (tailwind?.owns(file)) return []\n // Nor a node that was never loaded (see `modulesOf`): it would turn the update into a reload.\n // Nor, for a file that was drafted, one nothing imports (yet): the save that follows the\n // draft would reload the page, and whoever imports it later reads it from disk anyway.\n const kept = modules.filter(\n (mod) => mod.id !== null && !mod.url.includes(`${PREV_QUERY}=`) && (!drafted.has(file) || reachable(mod)),\n )\n if (kept.length !== modules.length) return kept\n },\n }\n}\n\n/**\n * Supply every name in `expected` that `source` does not export yet, so\n * importers keep resolving while the part is being written. A name the draft\n * already declares (just not exported yet) is exported as is; the rest are\n * re-exported from `prevUrl`, the version shown before this one.\n *\n * In a `.tsx` part, a borrowed component (a capitalized name) is wrapped in a\n * local component instead of re-exported. A module that only re-exports is not\n * a React Refresh boundary, so the update would climb to the importer, and the\n * importer re-imports this file under a `?t=` URL that later updates never\n * reach: the screen froze on the borrowed version until a reload. A local\n * component keeps this module self-accepting from the first draft on.\n */\nexport function stubExports(source: string, expected: Set<string>, prevUrl: string, fileName: string): string {\n const have = exportNames(source, fileName)\n const declared = topLevelNames(source, fileName)\n const jsx = /\\.tsx$/i.test(fileName)\n const local: string[] = []\n const borrowed: string[] = []\n for (const name of expected) {\n if (have.has(name)) continue\n if (name !== \"default\" && declared.has(name)) local.push(name)\n else borrowed.push(name)\n }\n const isComponent = (name: string) => jsx && /^[A-Z]/.test(name)\n const wrapped = borrowed.filter(isComponent)\n const reexported = borrowed.filter((name) => !isComponent(name))\n const stubs: string[] = []\n if (local.length) stubs.push(`export { ${local.join(\", \")} }`)\n if (reexported.length) stubs.push(`export { ${reexported.join(\", \")} } from ${JSON.stringify(prevUrl)}`)\n for (const name of wrapped) {\n const alias = `__vantageDraftPrev_${name}`\n stubs.push(\n `import { ${name} as ${alias} } from ${JSON.stringify(prevUrl)}`,\n `export function ${name}(props: any) { return <${alias} {...props} /> }`,\n )\n }\n return stubs.length ? `${source}${source.endsWith(\"\\n\") ? \"\" : \"\\n\"}${stubs.join(\"\\n\")}\\n` : source\n}\n\nfunction isInside(dir: string, file: string): boolean {\n const rel = path.relative(dir, file)\n return rel !== \"..\" && !rel.startsWith(\"..\" + path.sep) && !path.isAbsolute(rel)\n}\n\n/** The one refusal of `resolveTarget` that is the request's mistake rather than a path the project does not preview. */\nconst REFUSED_PATH = /^path is a directory$/\n\n/** A route with parameters has no single URL to open. */\nfunction isDynamicRoute(route: string): boolean {\n return /[:*$]/.test(route)\n}\n\n/** `a` is older than `b` for the same file: both carry a `seq`, and `a`'s is smaller. */\nfunction isOlder(a: DraftRequest, b: DraftRequest): boolean {\n return typeof a.seq === \"number\" && typeof b.seq === \"number\" && a.seq < b.seq\n}\n\n/** The request came through a reverse proxy. */\nfunction isForwarded(req: IncomingMessage): boolean {\n return Object.keys(req.headers).some((name) => name === \"forwarded\" || name.startsWith(\"x-forwarded-\"))\n}\n\nfunction isLoopback(req: IncomingMessage): boolean {\n const addr = req.socket.remoteAddress\n return addr === \"127.0.0.1\" || addr === \"::1\" || addr === \"::ffff:127.0.0.1\"\n}\n\nfunction sameSecret(a: string, b: string): boolean {\n const digest = (v: string) => createHash(\"sha256\").update(v).digest()\n return timingSafeEqual(digest(a), digest(b))\n}\n\nclass BodyTooLarge extends Error {\n constructor() {\n super(\"draft is too large\")\n }\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n let size = 0\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length\n // Past the limit the rest is read and dropped, not cut off: the caller\n // can only see the 413 once it has finished sending.\n if (size > MAX_BODY_BYTES) {\n chunks.length = 0\n reject(new BodyTooLarge())\n return\n }\n chunks.push(chunk)\n })\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")))\n req.on(\"error\", reject)\n })\n}\n\nfunction firstLine(err: unknown): string {\n const message = err instanceof Error ? err.message : String(err)\n return message.split(\"\\n\").find((l) => l.trim() !== \"\")?.trim() ?? \"transform failed\"\n}\n","import fs from \"node:fs\"\nimport path from \"node:path\"\nimport react from \"@vitejs/plugin-react\"\nimport tailwindcss from \"@tailwindcss/vite\"\nimport type { Plugin, PluginOption, ViteDevServer } from \"vite\"\nimport {\n FILE_PAGE_EXTENSIONS,\n NON_ROUTE_DIRS,\n PAGE_EXTENSIONS,\n VANTAGE_DIR,\n} from \"../core/constants\"\nimport { generateArtifacts } from \"../core/generate\"\nimport { resolvePageRoot, scanProject } from \"../core/scan\"\nimport type { RouteModel } from \"../core/types\"\nimport { createApiDevMiddleware } from \"../server/dev\"\nimport { draftPreviewPlugin } from \"./draft/plugin\"\nimport { getDraftRoutes } from \"./draft/routes\"\n\nexport interface VantagePluginOptions {\n root: string\n /** Server-side env (process.env + loaded .env), passed to API handlers. */\n env?: Record<string, string | undefined>\n /**\n * A route model the caller already scanned. `dev`/`build` run diagnostics\n * before starting Vite, so without this the project would be walked a second\n * time for an answer that is milliseconds old.\n */\n model?: RouteModel\n /**\n * Set when the caller has already written `.vantage/` for `model`. `build`\n * does, so that the server bundle — which reads `server-routes.gen.ts` — can\n * be produced at the same time as the client instead of after it.\n */\n artifactsWritten?: boolean\n /**\n * Dev only: accept unfinished files at `POST /__vantage_draft` and show them\n * in the running app before they are saved (`vantage dev --draft-preview`).\n * Off, the plugin is not registered and nothing changes. `token` is the shared\n * secret callers send as `x-vantage-draft-token` (default: env\n * `VANTAGE_DRAFT_TOKEN`; without either, only loopback callers are served).\n */\n draftPreview?: boolean | { token?: string }\n}\n\nconst DEDUPE = [\"react\", \"react-dom\", \"@tanstack/react-router\", \"@tanstack/react-query\"]\n\n/** Always prebundled: the generated client entry imports these on every start. */\nconst RUNTIME_DEPS = [\n \"react\",\n \"react-dom\",\n \"react-dom/client\",\n \"react/jsx-runtime\",\n \"@tanstack/react-router\",\n \"@tanstack/react-query\",\n]\n\n/**\n * The rest of the managed stack — everything `@squadbase/vantage/ui` and\n * `/components` pull in. Apps import framework subpaths, never these directly,\n * so Vantage knows the full set up front and Vite does not have to rediscover\n * it. Declaring them removes the second optimize wave (and the full page reload\n * it forces) the first time a page reaches for a new kit component.\n */\nconst KIT_DEPS = [\n \"@tanstack/react-table\",\n \"class-variance-authority\",\n \"clsx\",\n \"cmdk\",\n \"date-fns\",\n \"date-fns/locale\",\n \"echarts\",\n \"lucide-react\",\n \"react-day-picker\",\n \"tailwind-merge\",\n \"@base-ui/react/accordion\",\n \"@base-ui/react/button\",\n \"@base-ui/react/checkbox\",\n \"@base-ui/react/collapsible\",\n \"@base-ui/react/dialog\",\n \"@base-ui/react/input\",\n \"@base-ui/react/menu\",\n \"@base-ui/react/merge-props\",\n \"@base-ui/react/popover\",\n \"@base-ui/react/progress\",\n \"@base-ui/react/scroll-area\",\n \"@base-ui/react/select\",\n \"@base-ui/react/separator\",\n \"@base-ui/react/slider\",\n \"@base-ui/react/switch\",\n \"@base-ui/react/tabs\",\n \"@base-ui/react/toggle\",\n \"@base-ui/react/toggle-group\",\n \"@base-ui/react/tooltip\",\n \"@base-ui/react/use-render\",\n]\n\n/** The package part of a specifier: `@base-ui/react/select` → `@base-ui/react`. */\nfunction packageName(spec: string): string {\n const parts = spec.split(\"/\")\n return spec.startsWith(\"@\") ? parts.slice(0, 2).join(\"/\") : parts[0]!\n}\n\n/** Walk up `node_modules` chains looking for a package directory. */\nfunction hasPackage(fromDir: string, pkg: string): boolean {\n let dir = fromDir\n for (;;) {\n if (fs.existsSync(path.join(dir, \"node_modules\", pkg))) return true\n const parent = path.dirname(dir)\n if (parent === dir) return false\n dir = parent\n }\n}\n\n/**\n * Build `optimizeDeps.include`, keeping only specifiers that actually resolve\n * from the project root.\n *\n * Two constraints pin this down. Vite hard-errors on an include entry it cannot\n * resolve, so guessing is not an option. And Vite's own dependency discovery\n * names these packages *plainly* — so the `parent > child` form, which would\n * reach the copy inside the framework's own node_modules, does not merge with\n * what discovery finds: it prebundles a second, never-requested copy of every\n * entry (measured: 156 files instead of 78).\n *\n * The practical effect is that a hoisted install (npm/yarn, and pnpm with\n * hoisting) declares the whole managed stack up front and skips the second\n * optimize wave — the one that forces a full page reload the first time a page\n * reaches for a new kit component. Under a strict pnpm layout the kit resolves\n * only from the framework package, nothing extra is declared, and behaviour is\n * exactly what it was before.\n */\nfunction optimizeInclude(root: string, extra: string[]): string[] {\n return [...RUNTIME_DEPS, ...KIT_DEPS, ...extra].filter((spec) =>\n hasPackage(root, packageName(spec)),\n )\n}\n\n/**\n * Dependencies only some projects reach for, declared only when they do.\n * They are loaded through `await import()` at the moment a user opens a data\n * file or clicks \"export\" — late enough that an undeclared dependency would\n * wake the optimizer and full-reload the page mid-action. Prebundling them for\n * every app instead would tax dev startup for nothing.\n */\n// `read-excel-file` publishes no root export, so the subpath is the specifier\n// both here and in `table/parse.ts` — Vite hard-errors on an include entry it\n// cannot resolve, and the two have to name the same module to merge.\nconst FILE_PAGE_DEPS = [\"papaparse\", \"read-excel-file/browser\"]\nconst SLIDE_EXPORT_DEPS = [\"html-to-image\", \"fflate\"]\n\nfunction conditionalDeps(model: RouteModel): string[] {\n return [\n ...(model.pages.some((p) => p.kind === \"file\") ? FILE_PAGE_DEPS : []),\n ...(model.pages.some((p) => p.variant === \"slide\") ? SLIDE_EXPORT_DEPS : []),\n ]\n}\n\n/** Whether a path sits somewhere under the page root that is actually scanned. */\nfunction underPageRoot(pageRoot: string, file: string): boolean {\n const rel = path.relative(pageRoot, file)\n if (rel.startsWith(\"..\")) return false\n const segments = rel.split(path.sep)\n return !segments.some((s) => NON_ROUTE_DIRS.has(s) || (s.startsWith(\".\") && s !== \"..\"))\n}\n\n/**\n * A `.tsx`/`.jsx` page module — the only thing `transform` may rewrite. Kept\n * separate from `isRoutedFile` on purpose: running the `export const page`\n * regex over a `.xlsx` would mean decoding spreadsheet binary as text.\n */\nfunction isPageModuleFile(pageRoot: string, file: string): boolean {\n return underPageRoot(pageRoot, file) && PAGE_EXTENSIONS.some((ext) => file.endsWith(ext))\n}\n\n/**\n * Anything under the page root that becomes a route: modules and data files.\n * Composed from the two halves rather than matching `ROUTED_EXTENSIONS`\n * directly, so it agrees with the scanner on case — `Sales.CSV` (what Excel on\n * Windows writes) is a route, and the watcher has to regenerate for it.\n */\nfunction isRoutedFile(pageRoot: string, file: string): boolean {\n return isPageModuleFile(pageRoot, file) || isFilePageFile(pageRoot, file)\n}\n\n/** Just the data-file half of `isRoutedFile`. Case-insensitive, as scan is. */\nfunction isFilePageFile(pageRoot: string, file: string): boolean {\n const lower = file.toLowerCase()\n return underPageRoot(pageRoot, file) && FILE_PAGE_EXTENSIONS.some((ext) => lower.endsWith(ext))\n}\n\nfunction isApiFile(root: string, file: string): boolean {\n const rel = path.relative(root, file)\n return rel.startsWith(`server${path.sep}api${path.sep}`) && /\\.(ts|tsx|js)$/.test(file) && !file.endsWith(\".d.ts\")\n}\n\nfunction isServerFile(root: string, file: string): boolean {\n const rel = path.relative(root, file)\n return rel === \"server\" || rel.startsWith(`server${path.sep}`)\n}\n\n/**\n * The single plugin that turns a plain Vite instance into Vantage: file-based\n * routing, generated entry/HTML, Tailwind, the server-import boundary, route\n * HMR and the dev-server defaults (including console forwarding).\n */\nexport function vantagePlugin(options: VantagePluginOptions): PluginOption {\n const root = path.resolve(options.root)\n const vantageDir = path.join(root, VANTAGE_DIR)\n let model: RouteModel = options.model ?? scanProject(root)\n /** Written once per start: `configResolved` and `buildStart` both need it. */\n let generated = Boolean(options.artifactsWritten)\n /** Cached dev shell, invalidated whenever the artifacts are rewritten. */\n let shellHtml: string | null = null\n\n /** Absolute page-scan root, kept in step with the last scan. */\n const pageRoot = (): string => (model.pageDir === \"\" ? root : path.join(root, model.pageDir))\n\n const emit = (): void => {\n generateArtifacts({ root, model })\n generated = true\n shellHtml = null\n }\n\n /** Write the artifacts for the model we already have, at most once per start. */\n const ensureGenerated = (): void => {\n if (!generated) emit()\n }\n\n const regenerate = (): void => {\n model = scanProject(root)\n emit()\n }\n\n const core: Plugin = {\n name: \"vantage:core\",\n enforce: \"pre\",\n\n config() {\n return {\n root,\n appType: \"custom\",\n envPrefix: [\"PUBLIC_\"],\n resolve: { dedupe: DEDUPE },\n optimizeDeps: { include: optimizeInclude(root, conditionalDeps(model)) },\n server: {\n // Browser console + runtime errors belong in the dev terminal: it is\n // the feedback surface both humans and agents already watch. Vite 8\n // forwards them natively — with source-mapped stacks and code frames,\n // which the hand-rolled beacon bridge this replaces could not do — but\n // only turns itself on when it detects an agent. Vantage wants it\n // always. warn/error only: forwarding `log`/`info` too lets one chatty\n // render loop bury the server's own output.\n forwardConsole: { unhandledErrors: true, logLevels: [\"warn\", \"error\"] },\n },\n build: {\n outDir: path.join(root, \"dist\", \"client\"),\n emptyOutDir: true,\n rollupOptions: {\n input: path.join(vantageDir, \"index.html\"),\n },\n },\n }\n },\n\n configResolved() {\n // Ensure .vantage exists before dev HTML serving or the build reads input.\n ensureGenerated()\n },\n\n buildStart() {\n // configResolved already ran in the normal path; this is the safety net\n // for embedders that construct the plugin without a full config pass.\n ensureGenerated()\n },\n\n // --- Server-import boundary: client code may never import server/. ---\n resolveId(source, importer, opts) {\n if (opts?.ssr) return null\n if (!importer) return null\n const imp = importer.split(\"?\")[0]!\n if (!imp.startsWith(root)) return null\n const relImp = path.relative(root, imp)\n if (\n relImp.startsWith(`server${path.sep}`) ||\n relImp.startsWith(VANTAGE_DIR) ||\n relImp.includes(\"node_modules\")\n ) {\n return null\n }\n let target: string | null = null\n if (source.startsWith(\".\")) target = path.resolve(path.dirname(imp), source)\n else if (source.startsWith(\"/\")) target = path.join(root, source.slice(1))\n else if (source === \"server\" || source.startsWith(\"server/\")) target = path.join(root, source)\n if (!target) return null\n const relTarget = path.relative(root, target)\n if (relTarget === \"server\" || relTarget.startsWith(`server${path.sep}`)) {\n this.error(\n `Client module \"${relImp}\" imports from server/ (\"${source}\"). ` +\n `server/ code must never reach the client bundle — move shared code to lib/.`,\n )\n }\n return null\n },\n\n // --- Keep React Fast Refresh working on page modules. ---\n // `export const page = definePage(...)` is a non-component export, which\n // makes @vitejs/plugin-react bail out of Fast Refresh (full reload). The\n // runtime never reads this export (title/description are extracted at\n // generate time), so we drop the `export` keyword — turning it into a local\n // const — before the React plugin analyzes the module. Offsets are\n // preserved (6 spaces for \"export\") so sourcemaps stay accurate.\n transform(code, id) {\n const clean = id.split(\"?\")[0]!\n if (!isPageModuleFile(pageRoot(), clean)) return null\n if (!/export\\s+const\\s+page\\b/.test(code)) return null\n // Anchor to line start so `export const page` inside a string/comment is\n // not rewritten. \"export\" (6 chars) becomes 6 spaces to keep offsets.\n const out = code.replace(\n /^([ \\t]*)export(\\s+const\\s+page\\b)/gm,\n (_m, indent: string, rest: string) => indent + \" \" + rest,\n )\n if (out === code) return null\n return { code: out, map: null }\n },\n\n configureServer(server: ViteDevServer) {\n const getEnv = () => options.env ?? (process.env as Record<string, string | undefined>)\n\n // API requests handled before Vite's own middlewares.\n const apiMw = createApiDevMiddleware({ server, getModel: () => model, getEnv })\n server.middlewares.use((req, res, next) => {\n // Without server/, /api/* is a normal client route: fall through to the\n // SPA shell instead of returning API 404s (matches production).\n if (model.hasServer) return apiMw(req, res, next)\n return next()\n })\n\n // Structural route changes -> regenerate manifest + reload. Adding or\n // removing styles.css also changes the generated runtime.css.\n const isStylesFile = (file: string) => path.relative(pageRoot(), file) === \"styles.css\"\n // Creating or deleting src/ moves the page root itself, which changes\n // every generated import even though no page file was touched.\n const rootMoved = () => resolvePageRoot(root).dir !== model.pageDir\n const onStructural = (file: string) => {\n const moved = rootMoved()\n if (moved || isRoutedFile(pageRoot(), file) || isApiFile(root, file) || isStylesFile(file)) {\n regenerate()\n // A page the draft layer already routes (it exists as a draft, or was\n // just committed) is in the client's route tree: rescan, but no reload.\n if (!moved && getDraftRoutes(server)?.isSuppressed(file)) return\n server.ws.send({ type: \"full-reload\" })\n }\n }\n /**\n * A new directory can introduce route segments, so it has to be scanned —\n * but only when it could actually hold pages or API modules. Rescanning on\n * every mkdir (node_modules churn, build output, dot-dirs) walks the whole\n * project for nothing.\n */\n const isRouteDir = (dir: string) => {\n if (isServerFile(root, dir)) return true\n const rel = path.relative(pageRoot(), dir)\n if (rel === \"\" || rel.startsWith(\"..\")) return false\n return !rel.split(path.sep).some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith(\".\"))\n }\n server.watcher.on(\"add\", onStructural)\n server.watcher.on(\"unlink\", onStructural)\n server.watcher.on(\"addDir\", (dir) => {\n if (rootMoved() || isRouteDir(dir)) regenerate()\n })\n server.watcher.on(\"unlinkDir\", (dir) => {\n if (!rootMoved() && !isRouteDir(dir)) return\n regenerate()\n server.ws.send({ type: \"full-reload\" })\n })\n server.watcher.on(\"change\", (file) => {\n if (isServerFile(root, file)) {\n const mods = server.moduleGraph.getModulesByFile(file)\n if (mods) for (const m of mods) server.moduleGraph.invalidateModule(m)\n return\n }\n // A data file is fetched at runtime from a stable dev URL, so nothing\n // in the module graph changes when its bytes do — without this the\n // table keeps showing the old rows until someone reloads by hand.\n if (isFilePageFile(pageRoot(), file)) server.ws.send({ type: \"full-reload\" })\n })\n\n // SPA fallback: serve the generated index.html for navigations.\n return () => {\n server.middlewares.use(async (req, res, next) => {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") return next()\n // Standard SPA fallback: anything Vite's own middlewares didn't handle\n // (real modules, assets, /@vite, /@id) resolves to the app shell.\n try {\n // The shell is generated, not authored, and the plugin set that\n // transforms it is fixed — so the result only changes when the\n // artifacts are rewritten. Caching it keeps every navigation from\n // re-running the whole HTML transform chain.\n if (shellHtml === null) {\n const raw = fs.readFileSync(path.join(vantageDir, \"index.html\"), \"utf8\")\n // The first argument is the URL of the shell *document*, not of the\n // navigation being answered: Vite derives the ids of the scripts it\n // injects (the React Refresh preamble) from it, emitting\n // `<src>?html-proxy&index=0.js`. Passing `req.url` would make a page\n // load of /sales request \"/sales?html-proxy&index=0.js\", which\n // resolves to sales/index.tsx and errors. `originalUrl` still carries\n // the real navigation for plugins that want it.\n const shellUrl = `/${VANTAGE_DIR}/index.html`\n shellHtml = await server.transformIndexHtml(shellUrl, raw, req.originalUrl)\n }\n res.statusCode = 200\n res.setHeader(\"Content-Type\", \"text/html\")\n res.end(shellHtml)\n } catch (err) {\n next(err as Error)\n }\n })\n }\n },\n }\n\n // The draft layer goes right after `core`: its stylesheet hook has to run\n // before Tailwind reads the root stylesheet.\n const draft = options.draftPreview\n ? draftPreviewPlugin({\n root,\n getModel: () => model,\n token: typeof options.draftPreview === \"object\" ? options.draftPreview.token : undefined,\n })\n : undefined\n\n // React Fast Refresh + Tailwind are owned by Vantage, never by the user.\n return [core, ...(draft ? [draft] : []), react(), tailwindcss() as PluginOption]\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { filePageMeta, extractPageMeta } from './chunk-KLEIVDUV.js';
1
+ import { filePageMeta, extractPageMeta } from './chunk-CEXAQQ5W.js';
2
2
  import { API_METHODS } from './chunk-C2CX6GLX.js';
3
3
  import fs from 'fs';
4
4
 
@@ -237,5 +237,5 @@ function extractApiSpec(api) {
237
237
  }
238
238
 
239
239
  export { detectApiMethods, extractApiSpec, extractPageSpec, maskSource, stripComments };
240
- //# sourceMappingURL=chunk-JGRMRXXZ.js.map
241
- //# sourceMappingURL=chunk-JGRMRXXZ.js.map
240
+ //# sourceMappingURL=chunk-JKLLFVEU.js.map
241
+ //# sourceMappingURL=chunk-JKLLFVEU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/source.ts","../src/core/route-spec.ts"],"names":[],"mappings":"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","file":"chunk-JGRMRXXZ.js","sourcesContent":["/**\n * Low-level source scanning helpers shared by the static analyzers\n * (`diagnostics.ts`, `route-spec.ts`). Everything here is text-only — user code\n * is never imported or executed.\n */\n\n/**\n * Strip block and line comments so commented-out code doesn't produce false\n * positives (or hide real issues). Naive but adequate for presence checks:\n * URLs (`http://`) are preserved via the `[^:]` guard before `//`.\n */\nexport function stripComments(src: string): string {\n return src.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").replace(/(^|[^:\"'`\\\\])\\/\\/[^\\n]*/g, \"$1\")\n}\n\nconst OPENERS: Record<string, string> = { \"(\": \")\", \"[\": \"]\", \"{\": \"}\" }\n\n/**\n * Read a balanced bracketed region starting at `openIndex` (which must hold\n * `(`, `[` or `{`), returning the raw text *between* the brackets. Quote- and\n * nesting-aware so brackets inside string literals don't unbalance the scan.\n * Returns null when the region is never closed.\n */\nexport function readBracketBody(src: string, openIndex: number): string | null {\n const open = src[openIndex]\n if (!open || !OPENERS[open]) return null\n let depth = 0\n let quote: string | null = null\n for (let i = openIndex; i < src.length; i++) {\n const c = src[i]!\n if (quote) {\n if (c === \"\\\\\") i++\n else if (c === quote) quote = null\n continue\n }\n if (c === '\"' || c === \"'\" || c === \"`\") {\n quote = c\n continue\n }\n if (OPENERS[c]) depth++\n else if (c === \")\" || c === \"]\" || c === \"}\") {\n if (--depth === 0) return src.slice(openIndex + 1, i)\n }\n }\n return null\n}\n\n/**\n * Split an argument list or object body on top-level commas, ignoring commas\n * nested inside brackets or string literals. Empty parts are dropped.\n */\nexport function splitTopLevel(body: string): string[] {\n const parts: string[] = []\n let depth = 0\n let quote: string | null = null\n let start = 0\n for (let i = 0; i < body.length; i++) {\n const c = body[i]!\n if (quote) {\n if (c === \"\\\\\") i++\n else if (c === quote) quote = null\n continue\n }\n if (c === '\"' || c === \"'\" || c === \"`\") {\n quote = c\n continue\n }\n if (OPENERS[c]) depth++\n else if (c === \")\" || c === \"]\" || c === \"}\") depth--\n else if (c === \",\" && depth === 0) {\n parts.push(body.slice(start, i))\n start = i + 1\n }\n }\n parts.push(body.slice(start))\n return parts.map((p) => p.trim()).filter(Boolean)\n}\n\n/**\n * Lex a module just far enough to tell code, comments and string literals\n * apart, *without* moving anything: comments come back blanked to spaces\n * (newlines kept) so offsets and line numbers still match the raw file, and\n * `inString[i]` is 1 where offset `i` sits inside a `'…'`, `\"…\"` or `` `…` ``\n * literal (template `${…}` bodies count as string — close enough for literal\n * scans). `'`/`\"` literals end at a newline, so an apostrophe in JSX text\n * cannot swallow more than the rest of its own line.\n */\nexport function maskSource(src: string): { code: string; inString: Uint8Array } {\n const out = src.split(\"\")\n const inString = new Uint8Array(src.length)\n let i = 0\n while (i < src.length) {\n const c = src[i]!\n const next = src[i + 1]\n if (c === \"/\" && next === \"/\" && src[i - 1] !== \":\") {\n while (i < src.length && src[i] !== \"\\n\") out[i++] = \" \"\n continue\n }\n if (c === \"/\" && next === \"*\") {\n const end = src.indexOf(\"*/\", i + 2)\n const stop = end === -1 ? src.length : end + 2\n for (; i < stop; i++) if (src[i] !== \"\\n\") out[i] = \" \"\n continue\n }\n if (c === '\"' || c === \"'\" || c === \"`\") {\n i++\n while (i < src.length) {\n const d = src[i]!\n if (d === \"\\\\\") {\n inString[i] = 1\n inString[i + 1] = 1\n i += 2\n continue\n }\n if (d === c) break\n if (d === \"\\n\" && c !== \"`\") break\n inString[i++] = 1\n }\n i++\n continue\n }\n i++\n }\n return { code: out.join(\"\"), inString }\n}\n","import fs from \"node:fs\"\nimport { API_METHODS, type ApiMethod } from \"./constants\"\nimport { filePageMeta } from \"./file-page\"\nimport { extractPageMeta } from \"./route-tree\"\nimport { readBracketBody, splitTopLevel, stripComments } from \"./source\"\nimport type { ApiRoute, PageRoute, Segment } from \"./types\"\n\n/**\n * Best-effort *static* specs for the routes `vantage routes --detail` prints:\n * what a page takes in its path, and what an API route accepts and answers\n * with. Like `diagnostics.ts` this only reads text — user modules are never\n * imported or executed — so every field is a hint derived from the source, not\n * a guarantee. Callers pass sources through {@link stripComments} first.\n */\n\n/** A dynamic segment of a route path. */\nexport interface RouteParam {\n name: string\n kind: \"param\" | \"catchall\"\n}\n\n/** Static spec of a page route. */\nexport interface PageSpec {\n params: RouteParam[]\n title?: string\n description?: string\n navLabel?: string\n}\n\n/** The request body an API handler reads, when detectable. */\nexport interface ApiBodySpec {\n format: \"json\" | \"formData\" | \"text\" | \"binary\"\n /** Top-level keys, when the handler destructures them. */\n keys?: string[]\n}\n\n/** A response an API handler returns. */\nexport interface ApiResponseSpec {\n status: number\n /** Response content type, omitted when it can't be derived. */\n contentType?: string\n /** Top-level keys, when the payload is an object literal. */\n keys?: string[]\n}\n\n/** An `HttpError` an API handler throws. */\nexport interface ApiErrorSpec {\n status: number\n message?: string\n}\n\n/** Static spec of one HTTP method handler. */\nexport interface ApiMethodSpec {\n method: ApiMethod\n /** Query string keys read via `searchParams`. */\n query: string[]\n body?: ApiBodySpec\n responses: ApiResponseSpec[]\n errors: ApiErrorSpec[]\n}\n\n/** Static spec of an API route module. */\nexport interface ApiSpec {\n params: RouteParam[]\n methods: ApiMethodSpec[]\n}\n\n/**\n * HTTP method handlers a module exports (direct declaration or export list).\n * `src` must be comment-stripped. Shared with the `INVALID_API_EXPORT`\n * diagnostic so both agree on what counts as a handler.\n */\nexport function detectApiMethods(src: string): ApiMethod[] {\n return API_METHODS.filter(\n (m) =>\n new RegExp(`export\\\\s+(async\\\\s+)?(function|const|let|var)\\\\s+${m}\\\\b`).test(src) ||\n new RegExp(`export\\\\s*\\\\{[^}]*\\\\b${m}\\\\b[^}]*\\\\}`).test(src),\n )\n}\n\n/**\n * Slice the module into one source region per handler: from a handler's export\n * declaration to the next one (or EOF). Coarse on purpose — matching a function\n * body would have to cope with arrow bodies, overloads and trailing helpers —\n * and good enough because handlers are written one after another. A method\n * exported only through an export list gets the whole module as its region.\n */\nfunction methodRegions(src: string): Map<ApiMethod, string> {\n const re = new RegExp(\n `export\\\\s+(?:async\\\\s+)?(?:function|const|let|var)\\\\s+(${API_METHODS.join(\"|\")})\\\\b`,\n \"g\",\n )\n const decls: { method: ApiMethod; index: number }[] = []\n let m: RegExpExecArray | null\n while ((m = re.exec(src))) decls.push({ method: m[1] as ApiMethod, index: m.index })\n\n const regions = new Map<ApiMethod, string>()\n decls.forEach((d, i) => {\n regions.set(d.method, src.slice(d.index, decls[i + 1]?.index ?? src.length))\n })\n for (const method of detectApiMethods(src)) {\n if (!regions.has(method)) regions.set(method, src)\n }\n return regions\n}\n\n/** Top-level keys of an object literal expression, `…` standing in for spreads. */\nfunction objectKeys(expr: string): string[] | undefined {\n const trimmed = expr.trim()\n if (!trimmed.startsWith(\"{\")) return undefined\n const body = readBracketBody(trimmed, 0)\n if (body == null) return undefined\n const keys: string[] = []\n for (const part of splitTopLevel(body)) {\n if (part.startsWith(\"...\")) {\n keys.push(\"…\")\n continue\n }\n const name = part.match(/^[\"'`]?([A-Za-z0-9_$]+)/)\n if (name) keys.push(name[1]!)\n }\n return keys.length ? keys : undefined\n}\n\n/** Read `status: 201` out of a `ResponseInit` literal. */\nfunction initStatus(init: string | undefined): number | undefined {\n const m = init?.match(/\\bstatus\\s*:\\s*(\\d{3})\\b/)\n return m ? Number(m[1]) : undefined\n}\n\n/** Read a content-type header out of a `ResponseInit` literal. */\nfunction initContentType(init: string | undefined): string | undefined {\n const m = init?.match(/[\"']?content-type[\"']?\\s*:\\s*[\"']([^\"';]+)/i)\n return m ? m[1]!.trim() : undefined\n}\n\n/** Every `Response.json(…)` / `json(…)` / `new Response(…)` in a handler region. */\nfunction extractResponses(region: string): ApiResponseSpec[] {\n const re = /\\bnew\\s+Response\\s*\\(|\\bResponse\\s*\\.\\s*json\\s*\\(|(?<![.\\w$])json\\s*\\(/g\n const out: ApiResponseSpec[] = []\n const seen = new Set<string>()\n let m: RegExpExecArray | null\n while ((m = re.exec(region))) {\n const isJson = !m[0].startsWith(\"new\")\n const args = readBracketBody(region, m.index + m[0].length - 1)\n if (args == null) continue\n const [payload, init] = splitTopLevel(args)\n const contentType = isJson\n ? \"application/json\"\n : (initContentType(init) ??\n (payload?.startsWith(\"JSON.stringify\") ? \"application/json\" : undefined))\n const keys = isJson && payload ? objectKeys(payload) : undefined\n const spec: ApiResponseSpec = {\n status: initStatus(init) ?? 200,\n ...(contentType ? { contentType } : {}),\n ...(keys ? { keys } : {}),\n }\n const key = JSON.stringify(spec)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(spec)\n }\n return out\n}\n\n/** Every `new HttpError(status, \"message\")` in a handler region. */\nfunction extractErrors(region: string): ApiErrorSpec[] {\n const re = /\\bHttpError\\s*\\(\\s*(\\d{3})\\s*(?:,\\s*(?:([\"'`])((?:\\\\.|(?!\\2)[\\s\\S])*)\\2))?/g\n const out: ApiErrorSpec[] = []\n const seen = new Set<string>()\n let m: RegExpExecArray | null\n while ((m = re.exec(region))) {\n const message = m[3]?.replace(/\\\\(.)/g, \"$1\")\n const spec: ApiErrorSpec = { status: Number(m[1]), ...(message ? { message } : {}) }\n const key = JSON.stringify(spec)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(spec)\n }\n return out\n}\n\n/** Query keys read through `searchParams.get/getAll/has(\"x\")`. */\nfunction extractQuery(region: string): string[] {\n const re = /searchParams\\s*\\.\\s*(?:get|getAll|has)\\s*\\(\\s*[\"'`]([^\"'`]+)[\"'`]/g\n const out = new Set<string>()\n let m: RegExpExecArray | null\n while ((m = re.exec(region))) out.add(m[1]!)\n return [...out]\n}\n\n/** The request body a handler reads, plus destructured keys when present. */\nfunction extractBody(region: string): ApiBodySpec | undefined {\n const read = region.match(/\\b(?:request|req)\\s*\\.\\s*(json|formData|text|arrayBuffer|blob)\\s*\\(/)\n if (!read) return undefined\n const method = read[1]!\n const format: ApiBodySpec[\"format\"] =\n method === \"json\" || method === \"formData\" || method === \"text\" ? method : \"binary\"\n\n const destructured = region.match(\n /(?:const|let|var)\\s*(\\{[\\s\\S]*?\\})\\s*=\\s*(?:await\\s+)?[\\w.]*\\.json\\s*\\(/,\n )\n const keys = format === \"json\" && destructured ? objectKeys(destructured[1]!) : undefined\n return { format, ...(keys ? { keys } : {}) }\n}\n\nfunction toParams(segments: Segment[]): RouteParam[] {\n const out: RouteParam[] = []\n for (const s of segments) {\n if (s.kind === \"static\") continue\n out.push({ name: s.name, kind: s.kind })\n }\n return out\n}\n\n/** Static spec of a page: its path params and its `definePage` metadata. */\nexport function extractPageSpec(page: PageRoute): PageSpec {\n // A data file has no `definePage` to read, and reading it as UTF-8 would\n // decode megabytes of spreadsheet binary; its title is derived from the name.\n const meta = page.kind === \"file\" ? filePageMeta(page) : extractPageMeta(page.absFile)\n return { params: toParams(page.segments), ...meta }\n}\n\n/** Static spec of an API route: path params and a per-method request/response sketch. */\nexport function extractApiSpec(api: ApiRoute): ApiSpec {\n const params = toParams(api.segments)\n let src: string\n try {\n src = stripComments(fs.readFileSync(api.absFile, \"utf8\"))\n } catch {\n return { params, methods: [] }\n }\n const regions = methodRegions(src)\n const methods = API_METHODS.filter((m) => regions.has(m)).map((method) => {\n const region = regions.get(method)!\n const body = extractBody(region)\n return {\n method,\n query: extractQuery(region),\n ...(body ? { body } : {}),\n responses: extractResponses(region),\n errors: extractErrors(region),\n }\n })\n return { params, methods }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/source.ts","../src/core/route-spec.ts"],"names":[],"mappings":"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","file":"chunk-JKLLFVEU.js","sourcesContent":["/**\n * Low-level source scanning helpers shared by the static analyzers\n * (`diagnostics.ts`, `route-spec.ts`). Everything here is text-only — user code\n * is never imported or executed.\n */\n\n/**\n * Strip block and line comments so commented-out code doesn't produce false\n * positives (or hide real issues). Naive but adequate for presence checks:\n * URLs (`http://`) are preserved via the `[^:]` guard before `//`.\n */\nexport function stripComments(src: string): string {\n return src.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").replace(/(^|[^:\"'`\\\\])\\/\\/[^\\n]*/g, \"$1\")\n}\n\nconst OPENERS: Record<string, string> = { \"(\": \")\", \"[\": \"]\", \"{\": \"}\" }\n\n/**\n * Read a balanced bracketed region starting at `openIndex` (which must hold\n * `(`, `[` or `{`), returning the raw text *between* the brackets. Quote- and\n * nesting-aware so brackets inside string literals don't unbalance the scan.\n * Returns null when the region is never closed.\n */\nexport function readBracketBody(src: string, openIndex: number): string | null {\n const open = src[openIndex]\n if (!open || !OPENERS[open]) return null\n let depth = 0\n let quote: string | null = null\n for (let i = openIndex; i < src.length; i++) {\n const c = src[i]!\n if (quote) {\n if (c === \"\\\\\") i++\n else if (c === quote) quote = null\n continue\n }\n if (c === '\"' || c === \"'\" || c === \"`\") {\n quote = c\n continue\n }\n if (OPENERS[c]) depth++\n else if (c === \")\" || c === \"]\" || c === \"}\") {\n if (--depth === 0) return src.slice(openIndex + 1, i)\n }\n }\n return null\n}\n\n/**\n * Split an argument list or object body on top-level commas, ignoring commas\n * nested inside brackets or string literals. Empty parts are dropped.\n */\nexport function splitTopLevel(body: string): string[] {\n const parts: string[] = []\n let depth = 0\n let quote: string | null = null\n let start = 0\n for (let i = 0; i < body.length; i++) {\n const c = body[i]!\n if (quote) {\n if (c === \"\\\\\") i++\n else if (c === quote) quote = null\n continue\n }\n if (c === '\"' || c === \"'\" || c === \"`\") {\n quote = c\n continue\n }\n if (OPENERS[c]) depth++\n else if (c === \")\" || c === \"]\" || c === \"}\") depth--\n else if (c === \",\" && depth === 0) {\n parts.push(body.slice(start, i))\n start = i + 1\n }\n }\n parts.push(body.slice(start))\n return parts.map((p) => p.trim()).filter(Boolean)\n}\n\n/**\n * Lex a module just far enough to tell code, comments and string literals\n * apart, *without* moving anything: comments come back blanked to spaces\n * (newlines kept) so offsets and line numbers still match the raw file, and\n * `inString[i]` is 1 where offset `i` sits inside a `'…'`, `\"…\"` or `` `…` ``\n * literal (template `${…}` bodies count as string — close enough for literal\n * scans). `'`/`\"` literals end at a newline, so an apostrophe in JSX text\n * cannot swallow more than the rest of its own line.\n */\nexport function maskSource(src: string): { code: string; inString: Uint8Array } {\n const out = src.split(\"\")\n const inString = new Uint8Array(src.length)\n let i = 0\n while (i < src.length) {\n const c = src[i]!\n const next = src[i + 1]\n if (c === \"/\" && next === \"/\" && src[i - 1] !== \":\") {\n while (i < src.length && src[i] !== \"\\n\") out[i++] = \" \"\n continue\n }\n if (c === \"/\" && next === \"*\") {\n const end = src.indexOf(\"*/\", i + 2)\n const stop = end === -1 ? src.length : end + 2\n for (; i < stop; i++) if (src[i] !== \"\\n\") out[i] = \" \"\n continue\n }\n if (c === '\"' || c === \"'\" || c === \"`\") {\n i++\n while (i < src.length) {\n const d = src[i]!\n if (d === \"\\\\\") {\n inString[i] = 1\n inString[i + 1] = 1\n i += 2\n continue\n }\n if (d === c) break\n if (d === \"\\n\" && c !== \"`\") break\n inString[i++] = 1\n }\n i++\n continue\n }\n i++\n }\n return { code: out.join(\"\"), inString }\n}\n","import fs from \"node:fs\"\nimport { API_METHODS, type ApiMethod } from \"./constants\"\nimport { filePageMeta } from \"./file-page\"\nimport { extractPageMeta } from \"./route-tree\"\nimport { readBracketBody, splitTopLevel, stripComments } from \"./source\"\nimport type { ApiRoute, PageRoute, Segment } from \"./types\"\n\n/**\n * Best-effort *static* specs for the routes `vantage routes --detail` prints:\n * what a page takes in its path, and what an API route accepts and answers\n * with. Like `diagnostics.ts` this only reads text — user modules are never\n * imported or executed — so every field is a hint derived from the source, not\n * a guarantee. Callers pass sources through {@link stripComments} first.\n */\n\n/** A dynamic segment of a route path. */\nexport interface RouteParam {\n name: string\n kind: \"param\" | \"catchall\"\n}\n\n/** Static spec of a page route. */\nexport interface PageSpec {\n params: RouteParam[]\n title?: string\n description?: string\n navLabel?: string\n}\n\n/** The request body an API handler reads, when detectable. */\nexport interface ApiBodySpec {\n format: \"json\" | \"formData\" | \"text\" | \"binary\"\n /** Top-level keys, when the handler destructures them. */\n keys?: string[]\n}\n\n/** A response an API handler returns. */\nexport interface ApiResponseSpec {\n status: number\n /** Response content type, omitted when it can't be derived. */\n contentType?: string\n /** Top-level keys, when the payload is an object literal. */\n keys?: string[]\n}\n\n/** An `HttpError` an API handler throws. */\nexport interface ApiErrorSpec {\n status: number\n message?: string\n}\n\n/** Static spec of one HTTP method handler. */\nexport interface ApiMethodSpec {\n method: ApiMethod\n /** Query string keys read via `searchParams`. */\n query: string[]\n body?: ApiBodySpec\n responses: ApiResponseSpec[]\n errors: ApiErrorSpec[]\n}\n\n/** Static spec of an API route module. */\nexport interface ApiSpec {\n params: RouteParam[]\n methods: ApiMethodSpec[]\n}\n\n/**\n * HTTP method handlers a module exports (direct declaration or export list).\n * `src` must be comment-stripped. Shared with the `INVALID_API_EXPORT`\n * diagnostic so both agree on what counts as a handler.\n */\nexport function detectApiMethods(src: string): ApiMethod[] {\n return API_METHODS.filter(\n (m) =>\n new RegExp(`export\\\\s+(async\\\\s+)?(function|const|let|var)\\\\s+${m}\\\\b`).test(src) ||\n new RegExp(`export\\\\s*\\\\{[^}]*\\\\b${m}\\\\b[^}]*\\\\}`).test(src),\n )\n}\n\n/**\n * Slice the module into one source region per handler: from a handler's export\n * declaration to the next one (or EOF). Coarse on purpose — matching a function\n * body would have to cope with arrow bodies, overloads and trailing helpers —\n * and good enough because handlers are written one after another. A method\n * exported only through an export list gets the whole module as its region.\n */\nfunction methodRegions(src: string): Map<ApiMethod, string> {\n const re = new RegExp(\n `export\\\\s+(?:async\\\\s+)?(?:function|const|let|var)\\\\s+(${API_METHODS.join(\"|\")})\\\\b`,\n \"g\",\n )\n const decls: { method: ApiMethod; index: number }[] = []\n let m: RegExpExecArray | null\n while ((m = re.exec(src))) decls.push({ method: m[1] as ApiMethod, index: m.index })\n\n const regions = new Map<ApiMethod, string>()\n decls.forEach((d, i) => {\n regions.set(d.method, src.slice(d.index, decls[i + 1]?.index ?? src.length))\n })\n for (const method of detectApiMethods(src)) {\n if (!regions.has(method)) regions.set(method, src)\n }\n return regions\n}\n\n/** Top-level keys of an object literal expression, `…` standing in for spreads. */\nfunction objectKeys(expr: string): string[] | undefined {\n const trimmed = expr.trim()\n if (!trimmed.startsWith(\"{\")) return undefined\n const body = readBracketBody(trimmed, 0)\n if (body == null) return undefined\n const keys: string[] = []\n for (const part of splitTopLevel(body)) {\n if (part.startsWith(\"...\")) {\n keys.push(\"…\")\n continue\n }\n const name = part.match(/^[\"'`]?([A-Za-z0-9_$]+)/)\n if (name) keys.push(name[1]!)\n }\n return keys.length ? keys : undefined\n}\n\n/** Read `status: 201` out of a `ResponseInit` literal. */\nfunction initStatus(init: string | undefined): number | undefined {\n const m = init?.match(/\\bstatus\\s*:\\s*(\\d{3})\\b/)\n return m ? Number(m[1]) : undefined\n}\n\n/** Read a content-type header out of a `ResponseInit` literal. */\nfunction initContentType(init: string | undefined): string | undefined {\n const m = init?.match(/[\"']?content-type[\"']?\\s*:\\s*[\"']([^\"';]+)/i)\n return m ? m[1]!.trim() : undefined\n}\n\n/** Every `Response.json(…)` / `json(…)` / `new Response(…)` in a handler region. */\nfunction extractResponses(region: string): ApiResponseSpec[] {\n const re = /\\bnew\\s+Response\\s*\\(|\\bResponse\\s*\\.\\s*json\\s*\\(|(?<![.\\w$])json\\s*\\(/g\n const out: ApiResponseSpec[] = []\n const seen = new Set<string>()\n let m: RegExpExecArray | null\n while ((m = re.exec(region))) {\n const isJson = !m[0].startsWith(\"new\")\n const args = readBracketBody(region, m.index + m[0].length - 1)\n if (args == null) continue\n const [payload, init] = splitTopLevel(args)\n const contentType = isJson\n ? \"application/json\"\n : (initContentType(init) ??\n (payload?.startsWith(\"JSON.stringify\") ? \"application/json\" : undefined))\n const keys = isJson && payload ? objectKeys(payload) : undefined\n const spec: ApiResponseSpec = {\n status: initStatus(init) ?? 200,\n ...(contentType ? { contentType } : {}),\n ...(keys ? { keys } : {}),\n }\n const key = JSON.stringify(spec)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(spec)\n }\n return out\n}\n\n/** Every `new HttpError(status, \"message\")` in a handler region. */\nfunction extractErrors(region: string): ApiErrorSpec[] {\n const re = /\\bHttpError\\s*\\(\\s*(\\d{3})\\s*(?:,\\s*(?:([\"'`])((?:\\\\.|(?!\\2)[\\s\\S])*)\\2))?/g\n const out: ApiErrorSpec[] = []\n const seen = new Set<string>()\n let m: RegExpExecArray | null\n while ((m = re.exec(region))) {\n const message = m[3]?.replace(/\\\\(.)/g, \"$1\")\n const spec: ApiErrorSpec = { status: Number(m[1]), ...(message ? { message } : {}) }\n const key = JSON.stringify(spec)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(spec)\n }\n return out\n}\n\n/** Query keys read through `searchParams.get/getAll/has(\"x\")`. */\nfunction extractQuery(region: string): string[] {\n const re = /searchParams\\s*\\.\\s*(?:get|getAll|has)\\s*\\(\\s*[\"'`]([^\"'`]+)[\"'`]/g\n const out = new Set<string>()\n let m: RegExpExecArray | null\n while ((m = re.exec(region))) out.add(m[1]!)\n return [...out]\n}\n\n/** The request body a handler reads, plus destructured keys when present. */\nfunction extractBody(region: string): ApiBodySpec | undefined {\n const read = region.match(/\\b(?:request|req)\\s*\\.\\s*(json|formData|text|arrayBuffer|blob)\\s*\\(/)\n if (!read) return undefined\n const method = read[1]!\n const format: ApiBodySpec[\"format\"] =\n method === \"json\" || method === \"formData\" || method === \"text\" ? method : \"binary\"\n\n const destructured = region.match(\n /(?:const|let|var)\\s*(\\{[\\s\\S]*?\\})\\s*=\\s*(?:await\\s+)?[\\w.]*\\.json\\s*\\(/,\n )\n const keys = format === \"json\" && destructured ? objectKeys(destructured[1]!) : undefined\n return { format, ...(keys ? { keys } : {}) }\n}\n\nfunction toParams(segments: Segment[]): RouteParam[] {\n const out: RouteParam[] = []\n for (const s of segments) {\n if (s.kind === \"static\") continue\n out.push({ name: s.name, kind: s.kind })\n }\n return out\n}\n\n/** Static spec of a page: its path params and its `definePage` metadata. */\nexport function extractPageSpec(page: PageRoute): PageSpec {\n // A data file has no `definePage` to read, and reading it as UTF-8 would\n // decode megabytes of spreadsheet binary; its title is derived from the name.\n const meta = page.kind === \"file\" ? filePageMeta(page) : extractPageMeta(page.absFile)\n return { params: toParams(page.segments), ...meta }\n}\n\n/** Static spec of an API route: path params and a per-method request/response sketch. */\nexport function extractApiSpec(api: ApiRoute): ApiSpec {\n const params = toParams(api.segments)\n let src: string\n try {\n src = stripComments(fs.readFileSync(api.absFile, \"utf8\"))\n } catch {\n return { params, methods: [] }\n }\n const regions = methodRegions(src)\n const methods = API_METHODS.filter((m) => regions.has(m)).map((method) => {\n const region = regions.get(method)!\n const body = extractBody(region)\n return {\n method,\n query: extractQuery(region),\n ...(body ? { body } : {}),\n responses: extractResponses(region),\n errors: extractErrors(region),\n }\n })\n return { params, methods }\n}\n"]}