vite-plugin-html-pages 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/plugin.ts
2
- import fs5 from "fs";
3
- import path8 from "path";
2
+ import fs6 from "fs";
3
+ import path9 from "path";
4
4
  import { fileURLToPath, pathToFileURL } from "url";
5
5
  import { transform as esbuildTransform } from "esbuild";
6
6
  import pLimit from "p-limit";
@@ -213,6 +213,97 @@ async function writePageTypeDeclarations(args) {
213
213
  });
214
214
  }
215
215
 
216
+ // src/format-dev-error.ts
217
+ import fs2 from "fs";
218
+ import path3 from "path";
219
+ import pc from "picocolors";
220
+ function extractSourceLocation(error, root) {
221
+ const stack = error.stack ?? "";
222
+ for (const line of stack.split("\n")) {
223
+ const match = line.match(
224
+ /(?:at\s+.*?\s+\()?((?:file:\/\/)?[^():\n]+):(\d+):(\d+)\)?$/
225
+ );
226
+ if (!match) continue;
227
+ const rawFile = match[1].replace(/^file:\/\//, "");
228
+ const file = decodeURIComponent(rawFile);
229
+ if (file.includes("/node_modules/")) continue;
230
+ if (!path3.isAbsolute(file)) continue;
231
+ const relative = path3.relative(root, file);
232
+ if (relative.startsWith("..")) continue;
233
+ return {
234
+ file,
235
+ line: Number(match[2]),
236
+ column: Number(match[3])
237
+ };
238
+ }
239
+ return null;
240
+ }
241
+ function createSourceFrame(location, root, contextLines = 3) {
242
+ if (!fs2.existsSync(location.file)) return null;
243
+ const lines = fs2.readFileSync(location.file, "utf8").split(/\r?\n/);
244
+ const errorIndex = location.line - 1;
245
+ const start = Math.max(0, errorIndex - contextLines);
246
+ const end = Math.min(lines.length - 1, errorIndex + contextLines);
247
+ const lineNumberWidth = String(end + 1).length;
248
+ const output = [];
249
+ for (let index = start; index <= end; index++) {
250
+ const number = String(index + 1).padStart(lineNumberWidth, " ");
251
+ const isErrorLine = index === errorIndex;
252
+ const marker = isErrorLine ? pc.red(">") : " ";
253
+ output.push(
254
+ `${marker} ${pc.dim(number)} ${pc.dim("\u2502")} ${isErrorLine ? pc.red(lines[index]) : lines[index]}`
255
+ );
256
+ if (isErrorLine) {
257
+ const indentation = " ".repeat(
258
+ Math.max(0, location.column - 1)
259
+ );
260
+ output.push(
261
+ ` ${" ".repeat(lineNumberWidth)} ${pc.dim("\u2502")} ${indentation}${pc.red(
262
+ "^"
263
+ )}`
264
+ );
265
+ }
266
+ }
267
+ return [
268
+ pc.dim(path3.relative(root, location.file)),
269
+ "",
270
+ ...output
271
+ ].join("\n");
272
+ }
273
+ function formatDevPageError(args) {
274
+ const { root, phase, debug = false } = args;
275
+ const error = args.error instanceof Error ? args.error : new Error(String(args.error));
276
+ const location = extractSourceLocation(error, root);
277
+ const sourceFrame = location ? createSourceFrame(location, root) : null;
278
+ const heading = phase === "load" ? "PAGE LOAD ERROR" : "PAGE RELOAD ERROR";
279
+ const fileLabel = location ? ` ${path3.relative(root, location.file)}` : "";
280
+ const separatorLength = Math.max(
281
+ 12,
282
+ 64 - heading.length - fileLabel.length
283
+ );
284
+ const output = [
285
+ "",
286
+ pc.cyan(
287
+ `\u2500\u2500 ${heading} ${"\u2500".repeat(separatorLength)}${fileLabel}`
288
+ ),
289
+ "",
290
+ `${pc.red(error.name + ":")} ${error.message}`
291
+ ];
292
+ if (sourceFrame) {
293
+ output.push("", sourceFrame);
294
+ }
295
+ if (debug && error.stack) {
296
+ output.push("", pc.dim(error.stack));
297
+ }
298
+ output.push(
299
+ "",
300
+ pc.yellow("Fix the error and save again."),
301
+ pc.dim("Watching for file changes..."),
302
+ ""
303
+ );
304
+ return output.join("\n");
305
+ }
306
+
216
307
  // src/constants.ts
217
308
  var PLUGIN_NAME = "vite-plugin-html-pages";
218
309
  var VIRTUAL_BUILD_ENTRY_ID = `\0${PLUGIN_NAME}:build-entry`;
@@ -227,7 +318,7 @@ var RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;
227
318
  var VIRTUAL_LOCAL_TYPES_PREFIX = `\0${PLUGIN_NAME}:local-types:`;
228
319
 
229
320
  // src/discover.ts
230
- import path3 from "path";
321
+ import path4 from "path";
231
322
 
232
323
  // src/route-utils.ts
233
324
  var DYNAMIC_SEGMENT_RE = /\[([A-Za-z0-9_]+)\]/g;
@@ -382,7 +473,7 @@ async function discoverEntryPages(root, options) {
382
473
  const pageExtensions = options.pageExtensions?.length ? options.pageExtensions : [".ht.js", ".html.js", ".ht.ts", ".html.ts", ".ht.jsx", ".html.jsx", ".ht.tsx", ".html.tsx"];
383
474
  const include = Array.isArray(options.include) ? options.include : options.include ? [options.include] : buildDefaultIncludeGlobs(pagesDir, pageExtensions);
384
475
  const exclude = Array.isArray(options.exclude) ? options.exclude : options.exclude ? [options.exclude] : [];
385
- const pagesRoot = normalizeFsPath(path3.join(root, pagesDir));
476
+ const pagesRoot = normalizeFsPath(path4.join(root, pagesDir));
386
477
  const files = await fg2.glob(include, {
387
478
  cwd: root,
388
479
  ignore: exclude,
@@ -390,8 +481,8 @@ async function discoverEntryPages(root, options) {
390
481
  });
391
482
  return files.sort().map((absolutePath) => {
392
483
  const entryPath = normalizeFsPath(absolutePath);
393
- const relativePath = toPosix(path3.relative(root, entryPath));
394
- const relativeFromPagesDir = toPosix(path3.relative(pagesRoot, entryPath));
484
+ const relativePath = toPosix(path4.relative(root, entryPath));
485
+ const relativeFromPagesDir = toPosix(path4.relative(pagesRoot, entryPath));
395
486
  if (relativeFromPagesDir.startsWith("../") || relativeFromPagesDir === "..") {
396
487
  throw new Error(
397
488
  `[${PLUGIN_NAME}] Page is outside pagesDir: ${entryPath} (pagesDir: ${pagesDir})`
@@ -417,8 +508,8 @@ async function discoverEntryPages(root, options) {
417
508
  }
418
509
 
419
510
  // src/dev-server.ts
420
- import fs2 from "fs";
421
- import path5 from "path";
511
+ import fs3 from "fs";
512
+ import path6 from "path";
422
513
 
423
514
  // src/errors.ts
424
515
  function invalidHtmlReturn(page, value) {
@@ -588,7 +679,7 @@ async function renderPage(page, mod, dev = false) {
588
679
  }
589
680
 
590
681
  // src/module-loader.ts
591
- import path4 from "path";
682
+ import path5 from "path";
592
683
  import {
593
684
  createServer,
594
685
  isRunnableDevEnvironment
@@ -750,9 +841,9 @@ export {
750
841
  RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length
751
842
  );
752
843
  const pages = await getPages();
753
- const normalizedImporter = path4.resolve(importer);
844
+ const normalizedImporter = path5.resolve(importer);
754
845
  const page = pages.find(
755
- (candidate) => path4.resolve(candidate.absolutePath) === normalizedImporter
846
+ (candidate) => path5.resolve(candidate.absolutePath) === normalizedImporter
756
847
  );
757
848
  return generateTypedPageHelper(page);
758
849
  }
@@ -762,7 +853,7 @@ export {
762
853
  buildServer = await createServer(config);
763
854
  }
764
855
  return async (entryPath) => {
765
- const relativePath = "/" + path4.relative(root, entryPath).replace(/\\/g, "/");
856
+ const relativePath = "/" + path5.relative(root, entryPath).replace(/\\/g, "/");
766
857
  return importPageModule(buildServer, relativePath);
767
858
  };
768
859
  }
@@ -793,8 +884,8 @@ function tryRewriteRootAssetToSrc(root, pagesDir, url) {
793
884
  if (!url.startsWith("/")) return null;
794
885
  if (!isStaticAssetRequest(url)) return null;
795
886
  if (url.startsWith(`/${pagesDir}/`)) return null;
796
- const candidate = path5.join(root, pagesDir, url.slice(1));
797
- if (fs2.existsSync(candidate)) {
887
+ const candidate = path6.join(root, pagesDir, url.slice(1));
888
+ if (fs3.existsSync(candidate)) {
798
889
  return `/${pagesDir}/${url.slice(1)}`;
799
890
  }
800
891
  return null;
@@ -805,8 +896,8 @@ function rewriteRootAssetUrlsInDevHtml(html, root, pagesDir) {
805
896
  (full, attr, url) => {
806
897
  if (!isStaticAssetRequest(url)) return full;
807
898
  if (url.startsWith(`/${pagesDir}/`)) return full;
808
- const candidate = path5.join(root, pagesDir, url.slice(1));
809
- if (!fs2.existsSync(candidate)) return full;
899
+ const candidate = path6.join(root, pagesDir, url.slice(1));
900
+ if (!fs3.existsSync(candidate)) return full;
810
901
  return `${attr}="/${pagesDir}/${url.slice(1)}"`;
811
902
  }
812
903
  );
@@ -866,8 +957,8 @@ function installDevServer(args) {
866
957
  }
867
958
 
868
959
  // src/html-asset-validator.ts
869
- import fs3 from "fs";
870
- import path6 from "path";
960
+ import fs4 from "fs";
961
+ import path7 from "path";
871
962
  function stripQueryAndHash(url) {
872
963
  return url.split("#")[0].split("?")[0];
873
964
  }
@@ -876,10 +967,10 @@ function isLocalRootUrl(url) {
876
967
  }
877
968
  function fileExistsForPublicUrl(root, pagesDir, url) {
878
969
  const clean = stripQueryAndHash(url).slice(1);
879
- const fromSrc = path6.join(root, pagesDir, clean);
880
- if (fs3.existsSync(fromSrc)) return true;
881
- const fromPublic = path6.join(root, "public", clean);
882
- if (fs3.existsSync(fromPublic)) return true;
970
+ const fromSrc = path7.join(root, pagesDir, clean);
971
+ if (fs4.existsSync(fromSrc)) return true;
972
+ const fromPublic = path7.join(root, "public", clean);
973
+ if (fs4.existsSync(fromPublic)) return true;
883
974
  return false;
884
975
  }
885
976
  function collectScriptSrcs(html) {
@@ -921,8 +1012,8 @@ function missingAssetMessage(args) {
921
1012
  const pageSuffix = formatPageLabel(pageLabel);
922
1013
  return `[${pluginName}] Missing ${kind}${pageSuffix}: ${url}
923
1014
  Expected one of:
924
- - ${path6.join(root, pagesDir, clean)}
925
- - ${path6.join(root, "public", clean)}`;
1015
+ - ${path7.join(root, pagesDir, clean)}
1016
+ - ${path7.join(root, "public", clean)}`;
926
1017
  }
927
1018
  function reportMissing(args) {
928
1019
  const message = missingAssetMessage(args);
@@ -1036,8 +1127,8 @@ async function buildPageIndex(args) {
1036
1127
  }
1037
1128
 
1038
1129
  // src/static-assets.ts
1039
- import fs4 from "fs/promises";
1040
- import path7 from "path";
1130
+ import fs5 from "fs/promises";
1131
+ import path8 from "path";
1041
1132
  import fg from "fast-glob";
1042
1133
  import * as esbuild from "esbuild";
1043
1134
  import fsSync from "fs";
@@ -1061,7 +1152,7 @@ function toOutputFileName(relativePathFromSrc) {
1061
1152
  }
1062
1153
  async function collectStaticAssets(args) {
1063
1154
  const { root, pagesDir, pageExtensions } = args;
1064
- const srcDir = path7.join(root, pagesDir);
1155
+ const srcDir = path8.join(root, pagesDir);
1065
1156
  const entries = await fg("**/*", {
1066
1157
  cwd: srcDir,
1067
1158
  onlyFiles: true,
@@ -1073,7 +1164,7 @@ async function collectStaticAssets(args) {
1073
1164
  const rel = normalizeSlashes(entry);
1074
1165
  if (shouldIgnoreFile(rel)) continue;
1075
1166
  if (hasAnySuffix(rel, pageExtensions)) continue;
1076
- const absolutePath = path7.join(srcDir, rel);
1167
+ const absolutePath = path8.join(srcDir, rel);
1077
1168
  assets.push({
1078
1169
  absolutePath,
1079
1170
  relativePathFromSrc: rel,
@@ -1084,7 +1175,7 @@ async function collectStaticAssets(args) {
1084
1175
  return assets;
1085
1176
  }
1086
1177
  async function copyStaticAssetSource(asset) {
1087
- return fs4.readFile(asset.absolutePath);
1178
+ return fs5.readFile(asset.absolutePath);
1088
1179
  }
1089
1180
  async function buildProcessedStaticAssets(args) {
1090
1181
  const { root, pagesDir, assets, minify = true, sourcemap = false } = args;
@@ -1093,8 +1184,8 @@ async function buildProcessedStaticAssets(args) {
1093
1184
  if (processable.length === 0) {
1094
1185
  return out;
1095
1186
  }
1096
- const srcDir = path7.join(root, pagesDir);
1097
- const distDir = path7.join(root, "dist");
1187
+ const srcDir = path8.join(root, pagesDir);
1188
+ const distDir = path8.join(root, "dist");
1098
1189
  const warnedMissingAssets = /* @__PURE__ */ new Set();
1099
1190
  const result = await esbuild.build({
1100
1191
  entryPoints: processable.map((a) => a.absolutePath),
@@ -1130,15 +1221,15 @@ async function buildProcessedStaticAssets(args) {
1130
1221
  name: "html-pages-root-url-resolver",
1131
1222
  setup(build2) {
1132
1223
  build2.onResolve({ filter: /^\// }, (resolveArgs) => {
1133
- if (path7.isAbsolute(resolveArgs.path) && fsSync.existsSync(resolveArgs.path)) {
1224
+ if (path8.isAbsolute(resolveArgs.path) && fsSync.existsSync(resolveArgs.path)) {
1134
1225
  return { path: resolveArgs.path };
1135
1226
  }
1136
1227
  const cleanPath = resolveArgs.path.slice(1);
1137
- const fromSrc = path7.join(srcDir, cleanPath);
1228
+ const fromSrc = path8.join(srcDir, cleanPath);
1138
1229
  if (fsSync.existsSync(fromSrc)) {
1139
1230
  return { path: fromSrc };
1140
1231
  }
1141
- const fromPublic = path7.join(root, "public", cleanPath);
1232
+ const fromPublic = path8.join(root, "public", cleanPath);
1142
1233
  if (fsSync.existsSync(fromPublic)) {
1143
1234
  return {
1144
1235
  path: resolveArgs.path,
@@ -1170,7 +1261,7 @@ async function buildProcessedStaticAssets(args) {
1170
1261
  ]
1171
1262
  });
1172
1263
  for (const file of result.outputFiles) {
1173
- const rel = normalizeSlashes(path7.relative(distDir, file.path));
1264
+ const rel = normalizeSlashes(path8.relative(distDir, file.path));
1174
1265
  out.set(rel, file.text ?? file.contents);
1175
1266
  }
1176
1267
  return out;
@@ -1178,12 +1269,12 @@ async function buildProcessedStaticAssets(args) {
1178
1269
 
1179
1270
  // src/plugin.ts
1180
1271
  var hasWarnedESM = false;
1181
- var pluginDir = path8.dirname(fileURLToPath(import.meta.url));
1272
+ var pluginDir = path9.dirname(fileURLToPath(import.meta.url));
1182
1273
  function warnIfNotESM(root) {
1183
1274
  try {
1184
- const pkgPath = path8.join(root, "package.json");
1185
- if (!fs5.existsSync(pkgPath)) return;
1186
- const pkg = JSON.parse(fs5.readFileSync(pkgPath, "utf8"));
1275
+ const pkgPath = path9.join(root, "package.json");
1276
+ if (!fs6.existsSync(pkgPath)) return;
1277
+ const pkg = JSON.parse(fs6.readFileSync(pkgPath, "utf8"));
1187
1278
  if (pkg.type !== "module") {
1188
1279
  console.warn(
1189
1280
  `[${PLUGIN_NAME}] \u26A0\uFE0F It is recommended to add "type": "module" to your package.json for optimal performance and to avoid Node ESM warnings.`
@@ -1340,23 +1431,23 @@ function htPages(options = {}) {
1340
1431
  if (id === RESOLVED_VIRTUAL_JSX_RUNTIME_ID) {
1341
1432
  return `
1342
1433
  export { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(
1343
- pathToFileURL(path8.join(pluginDir, "jsx-runtime.js")).href
1434
+ pathToFileURL(path9.join(pluginDir, "jsx-runtime.js")).href
1344
1435
  )};
1345
1436
  `;
1346
1437
  }
1347
1438
  if (id === RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID) {
1348
1439
  return `
1349
1440
  export { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(
1350
- pathToFileURL(path8.join(pluginDir, "jsx-dev-runtime.js")).href
1441
+ pathToFileURL(path9.join(pluginDir, "jsx-dev-runtime.js")).href
1351
1442
  )};
1352
1443
  `;
1353
1444
  }
1354
1445
  if (id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {
1355
1446
  const importer = id.slice(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length);
1356
1447
  const { pages } = await buildPagesPipeline();
1357
- const normalizedImporter = path8.resolve(importer);
1448
+ const normalizedImporter = path9.resolve(importer);
1358
1449
  const page = pages.find(
1359
- (candidate) => path8.resolve(candidate.absolutePath) === normalizedImporter
1450
+ (candidate) => path9.resolve(candidate.absolutePath) === normalizedImporter
1360
1451
  );
1361
1452
  return generateTypedPageHelper(page);
1362
1453
  }
@@ -1392,7 +1483,7 @@ export {
1392
1483
  };
1393
1484
  },
1394
1485
  configResolved(resolved) {
1395
- root = options.root ? path8.resolve(resolved.root, options.root) : resolved.root;
1486
+ root = options.root ? path9.resolve(resolved.root, options.root) : resolved.root;
1396
1487
  if (!hasWarnedESM) {
1397
1488
  warnIfNotESM(root);
1398
1489
  hasWarnedESM = true;
@@ -1443,14 +1534,22 @@ export {
1443
1534
  type: "full-reload",
1444
1535
  path: "*"
1445
1536
  });
1446
- } catch {
1447
- server?.config.logger.info(
1448
- `[${PLUGIN_NAME}] Page reload failed \u2014 watching for file changes...`
1537
+ } catch (error) {
1538
+ if (error instanceof Error) {
1539
+ server?.ssrFixStacktrace(error);
1540
+ }
1541
+ server?.config.logger.error(
1542
+ formatDevPageError({
1543
+ error,
1544
+ root,
1545
+ phase: "reload",
1546
+ debug: options.debug
1547
+ })
1449
1548
  );
1450
1549
  }
1451
1550
  };
1452
1551
  const reload = (file) => {
1453
- if (!file.includes(`${path8.sep}${pagesDir}${path8.sep}`) && !file.includes(`/${pagesDir}/`)) {
1552
+ if (!file.includes(`${path9.sep}${pagesDir}${path9.sep}`) && !file.includes(`/${pagesDir}/`)) {
1454
1553
  return;
1455
1554
  }
1456
1555
  void reloadAfterChange(file);
@@ -1460,19 +1559,16 @@ export {
1460
1559
  server.watcher.on("unlink", reload);
1461
1560
  }
1462
1561
  void loadDevPages().catch((error) => {
1463
- const err = error instanceof Error ? error : new Error(String(error));
1464
- const firstRelevantStackLine = err.stack?.split("\n").map((line) => line.trim()).find(
1465
- (line) => line.startsWith("at ") && !line.includes("/node_modules/") && !line.includes("node:internal")
1466
- );
1562
+ if (error instanceof Error) {
1563
+ server?.ssrFixStacktrace(error);
1564
+ }
1467
1565
  server?.config.logger.error(
1468
- [
1469
- `[${PLUGIN_NAME}] Page load failed`,
1470
- "",
1471
- `${err.name}: ${err.message}`,
1472
- ...firstRelevantStackLine ? [firstRelevantStackLine] : [],
1473
- "",
1474
- "Watching for file changes..."
1475
- ].join("\n")
1566
+ formatDevPageError({
1567
+ error,
1568
+ root,
1569
+ phase: "load",
1570
+ debug: options.debug
1571
+ })
1476
1572
  );
1477
1573
  });
1478
1574
  },
@@ -1684,8 +1780,8 @@ ${rssItems}
1684
1780
  }
1685
1781
 
1686
1782
  // src/fetch-cache.ts
1687
- import fs6 from "fs/promises";
1688
- import path9 from "path";
1783
+ import fs7 from "fs/promises";
1784
+ import path10 from "path";
1689
1785
  import { createHash } from "crypto";
1690
1786
  var memoryCache = /* @__PURE__ */ new Map();
1691
1787
  function createDefaultCacheKey(input, init) {
@@ -1698,7 +1794,7 @@ function createDefaultCacheKey(input, init) {
1698
1794
  return createHash("sha256").update(raw).digest("hex");
1699
1795
  }
1700
1796
  function getCacheFilePath(cacheKey) {
1701
- return path9.join(process.cwd(), CACHE_DIR_NAME, "fetch", `${cacheKey}.json`);
1797
+ return path10.join(process.cwd(), CACHE_DIR_NAME, "fetch", `${cacheKey}.json`);
1702
1798
  }
1703
1799
  function getEffectiveCacheMode(mode) {
1704
1800
  if (mode === "memory" || mode === "fs" || mode === "none") {
@@ -1736,10 +1832,10 @@ async function fetchWithCache(input, init, options = {}) {
1736
1832
  }
1737
1833
  const filePath = getCacheFilePath(cacheKey);
1738
1834
  if (cacheMode === "fs") {
1739
- await fs6.mkdir(path9.dirname(filePath), { recursive: true });
1835
+ await fs7.mkdir(path10.dirname(filePath), { recursive: true });
1740
1836
  if (!options.forceRefresh) {
1741
1837
  try {
1742
- const raw = await fs6.readFile(filePath, "utf8");
1838
+ const raw = await fs7.readFile(filePath, "utf8");
1743
1839
  const cached = JSON.parse(raw);
1744
1840
  if (isFresh(cached, maxAge)) {
1745
1841
  return toResponse(cached);
@@ -1760,7 +1856,7 @@ async function fetchWithCache(input, init, options = {}) {
1760
1856
  if (cacheMode === "memory") {
1761
1857
  memoryCache.set(cacheKey, record);
1762
1858
  } else if (cacheMode === "fs") {
1763
- await fs6.writeFile(filePath, JSON.stringify(record), "utf8");
1859
+ await fs7.writeFile(filePath, JSON.stringify(record), "utf8");
1764
1860
  }
1765
1861
  return new Response(body, {
1766
1862
  status: res.status,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts","../src/typegen.ts","../src/path-utils.ts","../src/constants.ts","../src/discover.ts","../src/route-utils.ts","../src/route-params.ts","../src/dev-server.ts","../src/errors.ts","../src/react-static-validation.ts","../src/render-runtime.ts","../src/module-loader.ts","../src/page-helper-generator.ts","../src/html-asset-validator.ts","../src/page-index.ts","../src/static-assets.ts","../src/fetch-cache.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { transform as esbuildTransform } from 'esbuild';\nimport pLimit from 'p-limit';\nimport type { Plugin, ViteDevServer } from 'vite';\n\nimport { writePageTypeDeclarations } from './typegen';\n\nimport {\n PLUGIN_NAME,\n VIRTUAL_BUILD_ENTRY_ID,\n VIRTUAL_PAGE_HELPER_ID,\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX,\n VIRTUAL_JSX_RUNTIME_ID,\n VIRTUAL_JSX_DEV_RUNTIME_ID,\n RESOLVED_VIRTUAL_JSX_RUNTIME_ID,\n RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID,\n VIRTUAL_LOCAL_TYPES_PREFIX,\n} from './constants';\nimport { discoverEntryPages } from './discover';\nimport { installDevServer } from './dev-server';\nimport { validateHtmlAssetReferences } from './html-asset-validator';\nimport { createPageModuleLoader, closePageModuleLoader } from './module-loader';\nimport { buildPageIndex } from './page-index';\nimport { generateTypedPageHelper } from './page-helper-generator';\nimport { renderPage } from './render-runtime';\nimport {\n buildProcessedStaticAssets,\n collectStaticAssets,\n copyStaticAssetSource,\n} from './static-assets';\nimport type { HtPageInfo, HtPageModule, HtPagesPluginOptions } from './types';\n\nlet hasWarnedESM = false;\n\nconst pluginDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction warnIfNotESM(root: string) {\n try {\n const pkgPath = path.join(root, 'package.json');\n\n if (!fs.existsSync(pkgPath)) return;\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n\n if (pkg.type !== 'module') {\n console.warn(\n `[${PLUGIN_NAME}] ⚠️ It is recommended to add \"type\": \"module\" to your package.json for optimal performance and to avoid Node ESM warnings.`,\n );\n }\n } catch {\n // silent — never break build\n }\n}\n\nfunction isLocalPageTypesImport(id: string): boolean {\n return /^\\.\\/\\$types(?:\\.[A-Za-z0-9_.-]+)?$/.test(id);\n}\n\nfunction chunkArray<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n out.push(items.slice(i, i + size));\n }\n return out;\n}\n\nfunction isHtJsxFile(id: string): boolean {\n return (\n id.endsWith('.ht.jsx') ||\n id.endsWith('.html.jsx') ||\n id.endsWith('.ht.tsx') ||\n id.endsWith('.html.tsx')\n );\n}\n\nfunction isHtTsxFile(id: string): boolean {\n return id.endsWith('.ht.tsx') || id.endsWith('.html.tsx');\n}\n\nfunction isHtJsxImporter(importer: string | undefined): boolean {\n if (!importer) return false;\n\n const normalized = importer.split('?')[0].replace(/\\\\/g, '/');\n\n return isHtJsxFile(normalized);\n}\n\nexport function htPages(options: HtPagesPluginOptions = {}): Plugin {\n let root = process.cwd();\n let server: ViteDevServer | null = null;\n let devPages: HtPageInfo[] = [];\n let watcherAttached = false;\n\n const cleanUrls = options.cleanUrls ?? true;\n const pagesDir = options.pagesDir ?? 'src';\n const pageExtensions = options.pageExtensions?.length\n ? options.pageExtensions\n : [\n '.ht.js',\n '.html.js',\n '.ht.ts',\n '.html.ts',\n '.ht.jsx',\n '.html.jsx',\n '.ht.tsx',\n '.html.tsx',\n ];\n\n function logDebug(enabled: boolean | undefined, ...args: unknown[]) {\n if (!enabled) return;\n console.log(`[${PLUGIN_NAME}]`, ...args);\n }\n\n async function loadDevPages(): Promise<HtPageInfo[]> {\n const entries = await discoverEntryPages(root, options);\n \n // 🔥 generate types for editor\n await writePageTypeDeclarations({\n root,\n pagesDir,\n entries,\n });\n \n const modulesByEntry = new Map<string, HtPageModule>();\n\n logDebug(\n options.debug,\n 'discovered entries',\n entries.map((e) => e.relativePath),\n );\n\n if (!server) return [];\n\n const loadModule = await createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n for (const entry of entries) {\n const mod = await loadModule(entry.entryPath, entry.relativePath);\n modulesByEntry.set(entry.entryPath, mod);\n }\n\n devPages = await buildPageIndex({\n entries,\n modulesByEntry,\n cleanUrls,\n });\n\n logDebug(\n options.debug,\n 'dev pages',\n devPages.map((p) => `${p.routePath} -> ${p.relativePath}`),\n );\n\n return devPages;\n }\n\n async function buildPagesPipeline() {\n const entries = await discoverEntryPages(root, options);\n \n // 🔥 generate types for build (also ensures fresh output)\n await writePageTypeDeclarations({\n root,\n pagesDir,\n entries,\n });\n \n const modulesByEntry = new Map<string, HtPageModule>();\n\n const loadModule = await createPageModuleLoader({\n mode: 'build',\n root,\n getPages: async () => entries,\n });\n\n for (const entry of entries) {\n const mod = await loadModule(entry.entryPath, entry.relativePath);\n modulesByEntry.set(entry.entryPath, mod);\n }\n\n const pages = await buildPageIndex({\n entries,\n modulesByEntry,\n cleanUrls,\n });\n\n return { entries, modulesByEntry, pages };\n }\n\n return {\n name: PLUGIN_NAME,\n\n config(userConfig, env) {\n if (env.command !== 'build') return;\n\n const hasExplicitInput = userConfig.build?.rollupOptions?.input != null;\n if (hasExplicitInput) return;\n\n return {\n build: {\n rollupOptions: {\n input: VIRTUAL_BUILD_ENTRY_ID,\n },\n },\n };\n },\n\n resolveId(id, importer) {\n if (id === VIRTUAL_BUILD_ENTRY_ID) {\n return id;\n }\n\n if (id === VIRTUAL_PAGE_HELPER_ID && importer) {\n return `${RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX}${importer}`;\n }\n\n if (id === VIRTUAL_JSX_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_JSX_RUNTIME_ID;\n }\n\n if (id === VIRTUAL_JSX_DEV_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID;\n }\n\n if (isHtJsxImporter(importer)) {\n if (id === 'react/jsx-runtime') {\n return RESOLVED_VIRTUAL_JSX_RUNTIME_ID;\n }\n\n if (id === 'react/jsx-dev-runtime') {\n return RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID;\n }\n }\n\n if (importer && isLocalPageTypesImport(id)) {\n return `${VIRTUAL_LOCAL_TYPES_PREFIX}${importer}::${id}`;\n } \n\n return null;\n },\n\n async load(id) {\n if (id === VIRTUAL_BUILD_ENTRY_ID) {\n return 'export default {};';\n }\n\n if (id === RESOLVED_VIRTUAL_JSX_RUNTIME_ID) {\n return `\nexport { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(\n pathToFileURL(path.join(pluginDir, 'jsx-runtime.js')).href,\n )};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID) {\n return `\nexport { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(\n pathToFileURL(path.join(pluginDir, 'jsx-dev-runtime.js')).href,\n )};\n`;\n }\n\n if (id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {\n const importer = id.slice(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length);\n const { pages } = await buildPagesPipeline();\n\n const normalizedImporter = path.resolve(importer);\n\n const page = pages.find(\n (candidate) =>\n path.resolve(candidate.absolutePath) === normalizedImporter,\n );\n\n return generateTypedPageHelper(page);\n }\n\n if (id.startsWith(VIRTUAL_LOCAL_TYPES_PREFIX)) {\n return `\nexport {\n definePage,\n defineData,\n defineStaticParams,\n definePageModule\n} from 'vite-plugin-html-pages/page';\n`;\n } \n\n return null;\n },\n\n async transform(code, id) {\n const normalizedId = id.split('?')[0].replace(/\\\\/g, '/');\n\n if (!isHtJsxFile(normalizedId)) {\n return null;\n }\n\n const result = await esbuildTransform(code, {\n loader: isHtTsxFile(normalizedId) ? 'tsx' : 'jsx',\n format: 'esm',\n jsx: 'automatic',\n jsxImportSource: 'vite-plugin-html-pages',\n sourcemap: true,\n sourcefile: normalizedId,\n target: 'esnext',\n });\n\n return {\n code: result.code,\n map: result.map,\n };\n },\n\n configResolved(resolved) {\n root = options.root ? path.resolve(resolved.root, options.root) : resolved.root;\n\n if (!hasWarnedESM) {\n warnIfNotESM(root);\n hasWarnedESM = true;\n }\n },\n\n async buildStart() {\n const entries = await discoverEntryPages(root, options);\n\n for (const entry of entries) {\n this.addWatchFile(entry.entryPath);\n }\n\n const staticAssets = await collectStaticAssets({\n root,\n pagesDir,\n pageExtensions,\n });\n\n for (const asset of staticAssets) {\n this.addWatchFile(asset.absolutePath);\n }\n\n logDebug(\n options.debug,\n 'static assets',\n staticAssets.map((asset) => ({\n kind: asset.kind,\n input: asset.relativePathFromSrc,\n output: asset.outputFileName,\n })),\n );\n },\n\n configureServer(_server) {\n server = _server;\n\n installDevServer({\n server,\n root,\n pagesDir,\n getPages: async () => {\n if (devPages.length > 0) return devPages;\n return loadDevPages();\n },\n getEntries: async () => discoverEntryPages(root, options),\n });\n\n if (!watcherAttached) {\n watcherAttached = true;\n\n const reloadAfterChange = async (file: string): Promise<void> => {\n logDebug(options.debug, 'file changed', file);\n\n try {\n await loadDevPages();\n\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n } catch {\n server?.config.logger.info(\n `[${PLUGIN_NAME}] Page reload failed — watching for file changes...`,\n );\n // Do not rethrow. The next save retries automatically. \n }\n };\n\n const reload = (file: string): void => {\n if (\n !file.includes(`${path.sep}${pagesDir}${path.sep}`) &&\n !file.includes(`/${pagesDir}/`)\n ) {\n return;\n }\n\n void reloadAfterChange(file);\n };\n\n server.watcher.on('add', reload);\n server.watcher.on('change', reload);\n server.watcher.on('unlink', reload);\n }\n\n void loadDevPages().catch((error) => {\n const err =\n error instanceof Error ? error : new Error(String(error));\n\n const firstRelevantStackLine = err.stack \n ?.split('\\n')\n .map((line) => line.trim())\n .find(\n (line) =>\n line.startsWith('at ') &&\n !line.includes('/node_modules/') &&\n !line.includes('node:internal'),\n );\n \n server?.config.logger.error(\n [\n `[${PLUGIN_NAME}] Page load failed`,\n '',\n `${err.name}: ${err.message}`,\n ...(firstRelevantStackLine ? [firstRelevantStackLine] : []),\n '',\n 'Watching for file changes...',\n ].join('\\n'),\n );\n }); \n\n\n },\n\n async generateBundle(_, bundle) {\n try {\n const { modulesByEntry, pages } = await buildPagesPipeline();\n\n const staticAssets = await collectStaticAssets({\n root,\n pagesDir,\n pageExtensions,\n });\n\n logDebug(\n options.debug,\n 'emitting pages',\n pages.map((p) => p.fileName),\n );\n\n logDebug(\n options.debug,\n 'emitting static assets',\n staticAssets.map((asset) => ({\n kind: asset.kind,\n input: asset.relativePathFromSrc,\n output: asset.outputFileName,\n })),\n );\n\n const limit = pLimit(options.renderConcurrency ?? 8);\n const batchSize =\n options.renderBatchSize ??\n Math.max(options.renderConcurrency ?? 8, 32);\n\n const processedOutputs = await buildProcessedStaticAssets({\n root,\n pagesDir,\n assets: staticAssets,\n minify: true,\n sourcemap: false,\n });\n\n for (const [fileName, source] of processedOutputs) {\n this.emitFile({\n type: 'asset',\n fileName,\n source,\n });\n }\n\n for (const asset of staticAssets) {\n if (asset.kind !== 'copy') continue;\n\n const source = await copyStaticAssetSource(asset);\n\n this.emitFile({\n type: 'asset',\n fileName: asset.outputFileName,\n source,\n });\n }\n\n for (const batch of chunkArray(pages, batchSize)) {\n await Promise.all(\n batch.map((page) =>\n limit(async () => {\n const mod = modulesByEntry.get(page.entryPath);\n\n if (!mod) {\n throw new Error(\n `[${PLUGIN_NAME}] Missing module for page entry: ${page.entryPath}`,\n );\n }\n\n const html = await renderPage(page, mod, false);\n\n validateHtmlAssetReferences({\n root,\n pagesDir,\n html,\n pluginName: PLUGIN_NAME,\n pageLabel: page.relativePath,\n missingAssets: options.missingAssets ?? 'error',\n });\n\n this.emitFile({\n type: 'asset',\n fileName: options.mapOutputPath?.(page) ?? page.fileName,\n source: html,\n });\n }),\n ),\n );\n }\n\n const notFoundPage = pages.find((p) => p.routePath === '/404');\n\n if (notFoundPage) {\n const mod = modulesByEntry.get(notFoundPage.entryPath);\n\n if (!mod) {\n throw new Error(\n `[${PLUGIN_NAME}] Missing module for 404 page entry: ${notFoundPage.entryPath}`,\n );\n }\n\n const html = await renderPage(notFoundPage, mod, false);\n\n validateHtmlAssetReferences({\n root,\n pagesDir,\n html,\n pluginName: PLUGIN_NAME,\n pageLabel: notFoundPage.relativePath,\n missingAssets: options.missingAssets ?? 'error',\n });\n\n this.emitFile({\n type: 'asset',\n fileName: '404.html',\n source: html,\n });\n\n logDebug(options.debug, 'generated 404.html from user page');\n } else {\n const default404 = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>404 - Page Not Found</title>\n <style>\n :root {\n color-scheme: light dark;\n }\n body {\n margin: 0;\n font-family: system-ui, sans-serif;\n min-height: 100vh;\n display: grid;\n place-items: center;\n padding: 2rem;\n }\n main {\n max-width: 40rem;\n text-align: center;\n }\n h1 {\n font-size: 3rem;\n margin: 0 0 1rem;\n }\n p {\n margin: 0.5rem 0;\n line-height: 1.5;\n }\n a {\n color: inherit;\n }\n </style>\n </head>\n <body>\n <main>\n <h1>404</h1>\n <p>Page not found.</p>\n <p><a href=\"/\">Go back home</a></p>\n </main>\n </body>\n</html>\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: '404.html',\n source: default404,\n });\n\n logDebug(options.debug, 'generated default 404.html');\n }\n\n const sitemapBase = options.site ?? '';\n\n const sitemapRoutes = [...new Set(pages.map((p) => p.routePath))].filter(\n (route) => !route.includes(':') && !route.includes('*'),\n );\n\n if (sitemapBase && sitemapRoutes.length > 0) {\n const sitemap = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${sitemapRoutes\n .map((route) => ` <url><loc>${sitemapBase}${route}</loc></url>`)\n .join('\\n')}\\n</urlset>\\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: 'sitemap.xml',\n source: sitemap,\n });\n\n logDebug(options.debug, 'generated sitemap.xml');\n }\n\n const rss = options.rss;\n\n if (rss?.site) {\n const routePrefix = rss.routePrefix ?? '/blog';\n\n const rssItems = pages\n .filter((page) => page.routePath.startsWith(routePrefix))\n .map((page) => {\n const url = `${rss.site}${page.routePath}`;\n\n return ` <item>\\n <title>${page.routePath}</title>\\n <link>${url}</link>\\n <guid>${url}</guid>\\n </item>`;\n })\n .join('\\n');\n\n const rssXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<rss version=\"2.0\">\\n<channel>\\n <title>${rss.title ?? PLUGIN_NAME}</title>\\n <link>${rss.site}</link>\\n <description>${rss.description ?? 'RSS feed'}</description>\\n${rssItems}\\n</channel>\\n</rss>\\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: 'rss.xml',\n source: rssXml,\n });\n\n logDebug(options.debug, 'generated rss.xml');\n }\n\n for (const [fileName, output] of Object.entries(bundle)) {\n if (\n output.type === 'chunk' &&\n output.facadeModuleId === VIRTUAL_BUILD_ENTRY_ID\n ) {\n delete bundle[fileName];\n }\n }\n } finally {\n await closePageModuleLoader();\n }\n },\n };\n}\n\nexport default htPages;","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { HtPageInfo, RouteParamDefinition } from './types';\nimport { normalizeFsPath, toPosix } from './path-utils';\n\nfunction paramsTypeFromDefinitions(\n paramDefinitions: RouteParamDefinition[],\n): string {\n if (paramDefinitions.length === 0) {\n return '{}';\n }\n\n const fields = paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return `${param.name}: string`;\n }\n\n if (param.type === 'catch-all') {\n return `${param.name}: string[]`;\n }\n\n return `${param.name}?: string[]`;\n });\n\n return `{ ${fields.join('; ')} }`;\n}\n\nfunction pageHelperModuleSource(page: HtPageInfo): string {\n const paramsType = paramsTypeFromDefinitions(page.paramDefinitions ?? []);\n return `export type PageParams = ${paramsType};\n \n export type StaticParams = PageParams[];\n \n export type DataContext = {\n params: PageParams;\n dev: boolean;\n };\n \n export type RenderContext<TData = unknown> = {\n params: PageParams;\n data: TData;\n dev: boolean;\n };\n \n export type PageContext<TData = unknown> = {\n params: PageParams;\n data?: TData;\n dev: boolean;\n };\n \n export type RenderResult = unknown;\n \n export type PageModule<TData = unknown> = {\n generateStaticParams?: () => StaticParams | Promise<StaticParams>;\n data?: (ctx: DataContext) => TData | Promise<TData>;\n render: (ctx: RenderContext<TData>) => RenderResult | Promise<RenderResult>;\n };\n \n export declare function definePage<\n T extends (ctx: PageContext) => RenderResult | Promise<RenderResult>\n >(fn: T): T;\n \n export declare function defineData<\n T extends (ctx: DataContext) => unknown | Promise<unknown>\n >(fn: T): T;\n \n export declare function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n >(fn: T): T;\n \n export declare function definePageModule<TData>(\n mod: PageModule<TData>\n ): PageModule<TData>;\n `;\n}\n\nfunction stripPageExtension(filePath: string): string {\n return filePath.replace(/\\.(ht|html)\\.(js|ts|jsx|tsx)$/i, '');\n}\n\nfunction getTypesFileName(page: HtPageInfo): string {\n if (!page.dynamic || page.paramDefinitions.length === 0) {\n return '$types.d.ts';\n }\n\n const parts = page.paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return param.name;\n }\n\n if (param.type === 'catch-all') {\n return `${param.name}.all`;\n }\n\n return `${param.name}.opt`;\n });\n\n return `$types.${parts.join('.')}.d.ts`;\n}\n\nasync function listFilesRecursive(dir: string): Promise<string[]> {\n let entries;\n \n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n \n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = path.join(dir, entry.name);\n \n if (entry.isDirectory()) {\n return listFilesRecursive(fullPath);\n }\n \n return [fullPath];\n }),\n );\n \n return files.flat();\n }\n \n async function removeEmptyDirectories(dir: string, stopAt: string): Promise<void> {\n const normalizedDir = normalizeFsPath(dir);\n const normalizedStopAt = normalizeFsPath(stopAt);\n \n if (normalizedDir === normalizedStopAt) {\n return;\n }\n \n let entries;\n \n try {\n entries = await fs.readdir(normalizedDir);\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n \n if (entries.length > 0) {\n return;\n }\n \n await fs.rmdir(normalizedDir);\n await removeEmptyDirectories(path.dirname(normalizedDir), normalizedStopAt);\n }\n\nexport function getGeneratedTypesRoot(root: string): string {\n return normalizeFsPath(path.join(root, '.vite-plugin-html-pages', 'types'));\n}\n\nexport function getGeneratedHelperPath(args: {\n root: string;\n pagesDir: string;\n page: HtPageInfo;\n}): string {\n const pagesRoot = normalizeFsPath(path.join(args.root, args.pagesDir));\n const relativeFromPagesDir = toPosix(\n path.relative(pagesRoot, args.page.absolutePath),\n );\n const withoutExt = stripPageExtension(relativeFromPagesDir);\n const outRoot = getGeneratedTypesRoot(args.root);\n const fileName = getTypesFileName(args.page);\n\n return normalizeFsPath(\n path.join(outRoot, path.dirname(withoutExt), fileName),\n );\n}\n\nasync function removeStalePageTypeDeclarations(args: {\n root: string;\n expectedFiles: Set<string>;\n}): Promise<void> {\n const outRoot = getGeneratedTypesRoot(args.root);\n const existingFiles = await listFilesRecursive(outRoot);\n\n const staleFiles = existingFiles.filter((file) => {\n if (!file.endsWith('.d.ts')) {\n return false;\n }\n\n return !args.expectedFiles.has(normalizeFsPath(file));\n });\n\n await Promise.all(\n staleFiles.map(async (file) => {\n await fs.unlink(file);\n await removeEmptyDirectories(path.dirname(file), outRoot);\n }),\n );\n}\n\nexport async function writePageTypeDeclarations(args: {\n root: string;\n pagesDir: string;\n entries: HtPageInfo[];\n}): Promise<void> {\n const outRoot = getGeneratedTypesRoot(args.root);\n\n await fs.mkdir(outRoot, { recursive: true });\n\n const outputs = args.entries.map((page) => ({\n page,\n outFile: getGeneratedHelperPath({\n root: args.root,\n pagesDir: args.pagesDir,\n page,\n }),\n }));\n\n const expectedFiles = new Set(\n outputs.map(({ outFile }) => normalizeFsPath(outFile)),\n );\n\n await Promise.all(\n outputs.map(async ({ page, outFile }) => {\n await fs.mkdir(path.dirname(outFile), { recursive: true });\n await fs.writeFile(outFile, pageHelperModuleSource(page), 'utf8');\n }),\n );\n\n await removeStalePageTypeDeclarations({\n root: args.root,\n expectedFiles,\n });\n}","import path from 'node:path';\n\nexport function toPosix(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nexport function normalizeFsPath(value: string): string {\n return path.normalize(value);\n}\n\nexport function normalizeRoutePath(value: string): string {\n const normalized = toPosix(value).replace(/\\/+/g, '/');\n if (!normalized || normalized === '/') return '/';\n\n const withLeadingSlash = normalized.startsWith('/')\n ? normalized\n : `/${normalized}`;\n\n return withLeadingSlash !== '/' && withLeadingSlash.endsWith('/')\n ? withLeadingSlash.slice(0, -1)\n : withLeadingSlash;\n}\n\nexport function stripPageSuffix(\n filePath: string,\n extensions: string[],\n): string {\n const normalized = toPosix(filePath);\n\n const match = [...extensions]\n .sort((a, b) => b.length - a.length)\n .find((ext) => normalized.endsWith(ext));\n\n if (!match) return normalized;\n\n return normalized.slice(0, -match.length);\n}","export const PLUGIN_NAME = 'vite-plugin-html-pages';\nexport const VIRTUAL_BUILD_ENTRY_ID = `\\0${PLUGIN_NAME}:build-entry`;\nexport const VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;\nexport const RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX =`\\0${PLUGIN_NAME}/page:`;\nexport const VIRTUAL_MANIFEST_ID = `\\0virtual:${PLUGIN_NAME}-manifest`;\nexport const CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;\nexport const VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;\nexport const VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;\nexport const RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\\0${VIRTUAL_JSX_RUNTIME_ID}`;\nexport const RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;\nexport const VIRTUAL_LOCAL_TYPES_PREFIX = `\\0${PLUGIN_NAME}:local-types:`;","import path from 'node:path';\nimport { normalizeFsPath, toPosix } from './path-utils';\nimport { isDynamicPage, toRoutePattern } from './route-utils';\nimport { extractRouteParamDefinitions } from './route-params';\nimport type { HtPageInfo, HtPagesPluginOptions } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nfunction buildDefaultIncludeGlobs(\n pagesDir: string,\n pageExtensions: string[],\n): string[] {\n return pageExtensions.map((ext) => {\n const cleanExt = ext.startsWith('.') ? ext.slice(1) : ext;\n return `${pagesDir}/**/*.${cleanExt}`;\n });\n}\n\nexport async function discoverEntryPages(\n root: string,\n options: HtPagesPluginOptions,\n): Promise<HtPageInfo[]> {\n const fgModule = await import('fast-glob');\n const fg = (fgModule.default ?? fgModule) as typeof import('fast-glob');\n\n const pagesDir = options.pagesDir ?? 'src';\n const pageExtensions = options.pageExtensions?.length\n ? options.pageExtensions\n : ['.ht.js', '.html.js', '.ht.ts', '.html.ts', '.ht.jsx', '.html.jsx', '.ht.tsx', '.html.tsx'];\n\n const include = Array.isArray(options.include)\n ? options.include\n : options.include\n ? [options.include]\n : buildDefaultIncludeGlobs(pagesDir, pageExtensions);\n\n const exclude = Array.isArray(options.exclude)\n ? options.exclude\n : options.exclude\n ? [options.exclude]\n : [];\n\n const pagesRoot = normalizeFsPath(path.join(root, pagesDir));\n\n const files = await fg.glob(include, {\n cwd: root,\n ignore: exclude,\n absolute: true,\n });\n\n return files\n .sort()\n .map((absolutePath) => {\n const entryPath = normalizeFsPath(absolutePath);\n const relativePath = toPosix(path.relative(root, entryPath));\n const relativeFromPagesDir = toPosix(path.relative(pagesRoot, entryPath));\n\n if (\n relativeFromPagesDir.startsWith('../') ||\n relativeFromPagesDir === '..'\n ) {\n throw new Error(\n `[${PLUGIN_NAME}] Page is outside pagesDir: ${entryPath} (pagesDir: ${pagesDir})`,\n );\n }\n\n const dynamic = isDynamicPage(relativeFromPagesDir);\n const routePattern = toRoutePattern(relativeFromPagesDir, pageExtensions);\n const paramDefinitions = extractRouteParamDefinitions(routePattern);\n\n return {\n id: entryPath,\n entryPath,\n absolutePath: entryPath,\n relativePath,\n routePattern,\n routePath: routePattern,\n fileName: '',\n dynamic,\n paramNames: paramDefinitions.map((p) => p.name),\n paramDefinitions,\n params: {},\n } satisfies HtPageInfo;\n });\n}","import { normalizeRoutePath, stripPageSuffix, toPosix } from './path-utils';\nimport type {\n HtPageInfo,\n HtPageParams,\n StaticParamRecord,\n StaticParamValue,\n} from './types';\n\nconst DYNAMIC_SEGMENT_RE = /\\[([A-Za-z0-9_]+)\\]/g;\nconst CATCH_ALL_SEGMENT_RE = /\\[\\.\\.\\.([A-Za-z0-9_]+)\\]/g;\nconst OPTIONAL_CATCH_ALL_SEGMENT_RE = /\\[\\.\\.\\.([A-Za-z0-9_]+)\\]\\?/g;\nconst ANY_PARAM_RE = /\\[(?:\\.\\.\\.)?([A-Za-z0-9_]+)\\]\\??/g;\nconst ROUTE_GROUP_RE = /(^|\\/)\\(([^)]+)\\)(?=\\/|$)/g;\n\nexport function getParamNames(relativeFromPagesDir: string): string[] {\n return [...relativeFromPagesDir.matchAll(ANY_PARAM_RE)].map((m) => m[1]);\n}\n\nexport function isDynamicPage(relativeFromPagesDir: string): boolean {\n return /\\[(?:\\.\\.\\.)?[A-Za-z0-9_]+\\]\\??/.test(relativeFromPagesDir);\n}\n\nexport function toRoutePattern(\n relativeFromPagesDir: string,\n extensions: string[],\n): string {\n const noExt = stripPageSuffix(toPosix(relativeFromPagesDir), extensions);\n\n const withoutGroups = noExt.replace(ROUTE_GROUP_RE, '$1');\n const withoutIndex = withoutGroups.replace(/\\/index$/i, '').replace(/^index$/i, '');\n\n const raw = withoutIndex\n .replace(OPTIONAL_CATCH_ALL_SEGMENT_RE, '*?:$1')\n .replace(CATCH_ALL_SEGMENT_RE, '*:$1')\n .replace(DYNAMIC_SEGMENT_RE, ':$1');\n\n return normalizeRoutePath(raw || '/');\n}\n\nfunction encodePathParts(parts: string[]): string {\n return parts.map((part) => encodeURIComponent(part)).join('/');\n}\n\nfunction normalizeCatchAllValue(value: StaticParamValue): string[] {\n if (Array.isArray(value)) {\n return value.map((part) => String(part)).filter(Boolean);\n }\n\n if (value === '') {\n return [];\n }\n\n return String(value).split('/').filter(Boolean);\n}\n\nfunction normalizePageParams(params: StaticParamRecord): HtPageParams {\n const normalized: HtPageParams = {};\n\n for (const [key, value] of Object.entries(params)) {\n normalized[key] = Array.isArray(value)\n ? value.map((part) => String(part))\n : String(value);\n }\n\n return normalized;\n}\n\nexport function fillParams(\n pattern: string,\n params: StaticParamRecord,\n): string {\n const result = pattern\n .replace(/\\*\\?:([A-Za-z0-9_]+)/g, (_, key) => {\n const value = params[key];\n if (value == null) {\n return '';\n }\n\n const parts = normalizeCatchAllValue(value);\n if (parts.length === 0) {\n return '';\n }\n\n return encodePathParts(parts);\n })\n .replace(/\\*:([A-Za-z0-9_]+)/g, (_, key) => {\n if (!(key in params)) {\n throw new Error(`Missing catch-all route param \"${key}\"`);\n }\n\n const value = params[key];\n const parts = normalizeCatchAllValue(value);\n\n if (parts.length === 0) {\n throw new Error(`Catch-all route param \"${key}\" must not be empty`);\n }\n\n return encodePathParts(parts);\n })\n .replace(/:([A-Za-z0-9_]+)/g, (_, key) => {\n if (!(key in params)) {\n throw new Error(`Missing route param \"${key}\"`);\n }\n\n const value = params[key];\n if (Array.isArray(value)) {\n throw new Error(`Route param \"${key}\" must be a string, received array`);\n }\n\n return encodeURIComponent(String(value));\n });\n\n return normalizeRoutePath(result || '/');\n}\n\nexport function fileNameFromRoute(\n routePath: string,\n cleanUrls: boolean,\n): string {\n const normalized = normalizeRoutePath(routePath);\n\n if (normalized === '/') return 'index.html';\n\n const base = normalized.slice(1);\n return cleanUrls ? `${base}/index.html` : `${base}.html`;\n}\n\nexport function expandStaticPaths(\n basePage: Omit<HtPageInfo, 'routePath' | 'fileName' | 'params'>,\n rows: StaticParamRecord[],\n cleanUrls: boolean,\n): HtPageInfo[] {\n return rows.map((row) => {\n const routePath = fillParams(basePage.routePattern, row);\n const params = normalizePageParams(row);\n\n return {\n ...basePage,\n routePath,\n fileName: fileNameFromRoute(routePath, cleanUrls),\n params,\n };\n });\n}\n\nexport function routeMatch(\n pattern: string,\n urlPath: string,\n): HtPageParams | null {\n const a = normalizeRoutePath(pattern).split('/').filter(Boolean);\n const b = normalizeRoutePath(urlPath).split('/').filter(Boolean);\n const params: HtPageParams = {};\n\n for (let i = 0; i < a.length; i++) {\n const patternSeg = a[i];\n const urlSeg = b[i];\n\n if (patternSeg.startsWith('*?:')) {\n const key = patternSeg.slice(3);\n if (i < b.length) {\n params[key] = b.slice(i).map(decodeURIComponent);\n }\n return params;\n }\n\n if (patternSeg.startsWith('*:')) {\n const rest = b.slice(i);\n if (rest.length === 0) return null;\n\n params[patternSeg.slice(2)] = rest.map(decodeURIComponent);\n return params;\n }\n\n if (!urlSeg) return null;\n\n if (patternSeg.startsWith(':')) {\n params[patternSeg.slice(1)] = decodeURIComponent(urlSeg);\n continue;\n }\n\n if (patternSeg !== urlSeg) return null;\n }\n\n return a.length === b.length ? params : null;\n}\n\nexport function compareRoutePriority(a: string, b: string): number {\n const aSegs = normalizeRoutePath(a).split('/').filter(Boolean);\n const bSegs = normalizeRoutePath(b).split('/').filter(Boolean);\n const len = Math.max(aSegs.length, bSegs.length);\n\n for (let i = 0; i < len; i++) {\n const aa = aSegs[i];\n const bb = bSegs[i];\n\n if (aa == null) return 1;\n if (bb == null) return -1;\n\n const aOptionalCatchAll = aa.startsWith('*?:');\n const bOptionalCatchAll = bb.startsWith('*?:');\n if (aOptionalCatchAll !== bOptionalCatchAll) {\n return aOptionalCatchAll ? 1 : -1;\n }\n\n const aCatchAll = aa.startsWith('*:');\n const bCatchAll = bb.startsWith('*:');\n if (aCatchAll !== bCatchAll) {\n return aCatchAll ? 1 : -1;\n }\n\n const aDynamic = aa.startsWith(':');\n const bDynamic = bb.startsWith(':');\n if (aDynamic !== bDynamic) {\n return aDynamic ? 1 : -1;\n }\n }\n\n return bSegs.length - aSegs.length;\n}","import type { RouteParamDefinition } from './types';\n\nexport function parseRouteParamSegment(\n segment: string,\n): RouteParamDefinition | null {\n if (segment.startsWith('*?:')) {\n return {\n name: segment.slice(3),\n type: 'optional-catch-all',\n };\n }\n\n if (segment.startsWith('*:')) {\n return {\n name: segment.slice(2),\n type: 'catch-all',\n };\n }\n\n if (segment.startsWith(':')) {\n return {\n name: segment.slice(1),\n type: 'single',\n };\n }\n\n return null;\n}\n\nexport function extractRouteParamDefinitions(\n routePattern: string,\n): RouteParamDefinition[] {\n return routePattern\n .split('/')\n .filter(Boolean)\n .map((segment) => parseRouteParamSegment(segment))\n .filter((value): value is RouteParamDefinition => value != null);\n}","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ViteDevServer } from 'vite';\n\nimport { renderPage } from './render-runtime';\nimport type { HtPageInfo } from './types';\nimport { PLUGIN_NAME } from './constants';\nimport { createPageModuleLoader } from './module-loader';\n\nfunction isStaticAssetRequest(url: string): boolean {\n return (\n url.endsWith('.css') ||\n url.endsWith('.js') ||\n url.endsWith('.mjs') ||\n url.endsWith('.ts') ||\n url.endsWith('.png') ||\n url.endsWith('.jpg') ||\n url.endsWith('.jpeg') ||\n url.endsWith('.gif') ||\n url.endsWith('.svg') ||\n url.endsWith('.webp') ||\n url.endsWith('.ico') ||\n url.endsWith('.woff') ||\n url.endsWith('.woff2') ||\n url.endsWith('.ttf') ||\n url.endsWith('.otf')\n );\n}\n\nfunction normalizeRoutePath(input: string): string {\n let value = input.split('?')[0].split('#')[0];\n\n if (!value.startsWith('/')) value = '/' + value;\n value = value.replace(/\\/+/g, '/');\n\n if (value.length > 1 && value.endsWith('/')) {\n value = value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction shouldSkipHtmlRouting(url: string, pagesDir: string): boolean {\n return (\n url.startsWith('/@vite') ||\n url.startsWith('/@fs/') ||\n url.startsWith('/node_modules/') ||\n url.startsWith(`/${pagesDir}/`) ||\n url === '/favicon.ico' ||\n isStaticAssetRequest(url)\n );\n}\n\nfunction tryRewriteRootAssetToSrc(\n root: string,\n pagesDir: string,\n url: string,\n): string | null {\n if (!url.startsWith('/')) return null;\n if (!isStaticAssetRequest(url)) return null;\n if (url.startsWith(`/${pagesDir}/`)) return null;\n\n const candidate = path.join(root, pagesDir, url.slice(1));\n\n if (fs.existsSync(candidate)) {\n return `/${pagesDir}/${url.slice(1)}`;\n }\n\n return null;\n}\n\nfunction rewriteRootAssetUrlsInDevHtml(\n html: string,\n root: string,\n pagesDir: string,\n): string {\n return html.replace(\n /\\b(href|src)=[\"'](\\/[^\"']+)[\"']/g,\n (full, attr: string, url: string) => {\n if (!isStaticAssetRequest(url)) return full;\n if (url.startsWith(`/${pagesDir}/`)) return full;\n\n const candidate = path.join(root, pagesDir, url.slice(1));\n\n if (!fs.existsSync(candidate)) return full;\n\n return `${attr}=\"/${pagesDir}/${url.slice(1)}\"`;\n },\n );\n}\n\nexport function installDevServer(args: {\n server: ViteDevServer;\n root: string;\n pagesDir: string;\n getPages: () => Promise<HtPageInfo[]>;\n getEntries?: () => Promise<HtPageInfo[]>;\n}) {\n const { server, root, pagesDir, getPages } = args;\n const loadModulePromise = createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n server.middlewares.use(async (req, res, next) => {\n try {\n const originalUrl = req.url ?? '/';\n const url = normalizeRoutePath(originalUrl);\n\n const rewrittenAssetUrl = tryRewriteRootAssetToSrc(root, pagesDir, url);\n if (rewrittenAssetUrl) {\n req.url = rewrittenAssetUrl + originalUrl.slice(url.length);\n return next();\n }\n\n if (shouldSkipHtmlRouting(url, pagesDir)) {\n return next();\n }\n\n const pages = await getPages();\n const page = pages.find(\n (p) => normalizeRoutePath(p.routePath) === url,\n );\n\n if (!page) {\n return next();\n }\n\n const loadModule = await loadModulePromise;\n const mod = await loadModule(page.entryPath, page.relativePath);\n\n if (!mod) {\n return next();\n }\n\n const html = await renderPage(page, mod, true);\n\n const devHtml = rewriteRootAssetUrlsInDevHtml(\n html,\n root,\n pagesDir,\n );\n \n const transformedHtml = await server.transformIndexHtml(\n url,\n devHtml,\n req.originalUrl,\n );\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(transformedHtml);\n } catch (error) {\n server.config.logger.error(\n `[${PLUGIN_NAME}] dev server render failed: ${\n error instanceof Error ? error.stack ?? error.message : String(error)\n }`,\n );\n\n next(error as Error);\n }\n });\n}","import type { HtPageInfo } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nexport function invalidHtmlReturn(page: HtPageInfo, value: unknown): Error {\n const type =\n value === null\n ? 'null'\n : Array.isArray(value)\n ? 'array'\n : typeof value;\n\n return new Error(\n `[vite-plugin-html-pages] ${page.relativePath}: page render must return a string or a JSX/React renderable value, but received ${type}.`,\n );\n}\n\nexport function missingDefaultExport(page: HtPageInfo): Error {\n return new Error(\n `[${PLUGIN_NAME}] Page \"${page.relativePath}\" does not export a default renderer`,\n );\n}\n\nexport function pageError(page: HtPageInfo, cause: unknown): Error {\n const message = `[${PLUGIN_NAME}] Failed to render \"${page.relativePath}\" at route \"${page.routePath}\"`;\n\n if (cause instanceof Error) {\n const err = new Error(`${message}: ${cause.message}`);\n\n if (cause.stack) {\n err.stack = `${err.stack}\\nCaused by:\\n${cause.stack}`;\n }\n\n return err;\n }\n\n return new Error(`${message}: ${String(cause)}`);\n}","type WarnContext = {\n page: {\n routePath: string;\n relativePath?: string;\n };\n onWarn: (message: string) => void;\n };\n \n const warnedKeys = new Set<string>();\n \n function warnOnce(\n key: string,\n message: string,\n onWarn: (message: string) => void,\n ): void {\n if (warnedKeys.has(key)) return;\n warnedKeys.add(key);\n onWarn(message);\n }\n \n function isEventProp(name: string): boolean {\n return /^on[A-Z]/.test(name);\n }\n \n function getElementName(type: unknown): string {\n if (typeof type === 'string') {\n return `<${type}>`;\n }\n \n if (typeof type === 'function') {\n const maybeNamed = type as {\n displayName?: string;\n name?: string;\n };\n \n return maybeNamed.displayName || maybeNamed.name || 'AnonymousComponent';\n }\n \n return 'UnknownElement';\n }\n \n export async function validateStaticJsxTree(\n node: unknown,\n ctx: WarnContext,\n ): Promise<void> {\n const react = await import('react');\n const { isValidElement } = react;\n \n function inspectElement(el: any): void {\n const props = (el.props ?? {}) as Record<string, unknown>;\n \n for (const [key, value] of Object.entries(props)) {\n if (!isEventProp(key)) continue;\n if (typeof value !== 'function') continue;\n \n const elementName = getElementName(el.type);\n \n warnOnce(\n `${ctx.page.routePath}:${elementName}:${key}`,\n `[vite-plugin-html-pages] ${ctx.page.relativePath ?? ctx.page.routePath}: prop \"${key}\" on ${elementName} will not be interactive in static TSX/JSX output. Use a client script or future hydration/islands support instead.`,\n ctx.onWarn,\n );\n }\n }\n \n function walk(value: unknown): void {\n if (value == null || typeof value === 'boolean') return;\n if (typeof value === 'string' || typeof value === 'number') return;\n \n if (Array.isArray(value)) {\n for (const child of value) {\n walk(child);\n }\n return;\n }\n \n if (!isValidElement(value)) return;\n \n inspectElement(value);\n \n walk((value as any).props?.children);\n }\n \n walk(node);\n }","import { invalidHtmlReturn, pageError, missingDefaultExport } from './errors';\nimport { validateStaticJsxTree } from './react-static-validation';\nimport type {\n HtPageInfo,\n HtPageModule,\n HtPageRenderContext,\n HtPageRenderResult,\n HtStructuredPageModule,\n} from './types';\n\nfunction isStructuredPageModule(value: unknown): value is HtStructuredPageModule {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'render' in value &&\n typeof (value as { render?: unknown }).render === 'function'\n );\n}\n\nfunction ensureDoctype(html: string): string {\n const trimmed = html.trimStart();\n\n if (/^<!doctype html>/i.test(trimmed)) {\n return html;\n }\n\n if (/^<html[\\s>]/i.test(trimmed)) {\n return '<!DOCTYPE html>' + html;\n }\n\n return html;\n}\n\nasync function isRenderableReactResult(value: unknown): Promise<boolean> {\n try {\n const react = await import('react');\n return (\n value == null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n Array.isArray(value) ||\n react.isValidElement(value)\n );\n } catch {\n return false;\n }\n}\n\nasync function renderReactResult(value: unknown): Promise<string> {\n const { renderToStaticMarkup } = await import('react-dom/server');\n return renderToStaticMarkup(value as any);\n}\n\nasync function resolveRenderResult(\n page: HtPageInfo,\n mod: HtPageModule,\n ctx: HtPageRenderContext,\n): Promise<HtPageRenderResult> {\n const entry = mod.default;\n\n if (entry == null) {\n throw missingDefaultExport(page);\n }\n\n if (typeof entry === 'string') {\n return entry;\n }\n\n if (typeof entry === 'function') {\n return await entry(ctx);\n }\n\n if (isStructuredPageModule(entry)) {\n if (typeof entry.data === 'function') {\n ctx.data = await entry.data(ctx);\n }\n\n return await entry.render(ctx);\n }\n\n throw invalidHtmlReturn(page, entry);\n}\n\nasync function ensureReactAvailable(page: HtPageInfo): Promise<void> {\n try {\n await import('react');\n await import('react-dom/server');\n } catch {\n throw new Error(\n `[vite-plugin-html-pages] ${page.relativePath}: TSX/JSX page rendering requires \"react\" and \"react-dom\" to be installed in the consuming app.`,\n );\n }\n}\n\nexport async function renderPage(\n page: HtPageInfo,\n mod: HtPageModule,\n dev = false,\n): Promise<string> {\n const ctx: HtPageRenderContext = {\n page,\n params: page.params,\n dev,\n };\n\n try {\n if (typeof mod.data === 'function') {\n ctx.data = await mod.data(ctx);\n }\n\n const result = await resolveRenderResult(page, mod, ctx);\n\n if (typeof result === 'string') {\n return ensureDoctype(result);\n }\n \n await ensureReactAvailable(page);\n \n const looksReactRenderable = await isRenderableReactResult(result);\n\n if (!looksReactRenderable) {\n throw invalidHtmlReturn(page, result);\n }\n\n if (dev) {\n await validateStaticJsxTree(result, {\n page,\n onWarn(message) {\n console.warn(message);\n },\n });\n }\n\n const html = await renderReactResult(result);\n\n return ensureDoctype(html);\n } catch (error) {\n throw pageError(page, error);\n }\n}","import path from 'node:path';\nimport {\n createServer,\n isRunnableDevEnvironment,\n type InlineConfig,\n type ViteDevServer,\n} from 'vite';\n\nimport {\n VIRTUAL_PAGE_HELPER_ID,\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX,\n VIRTUAL_LOCAL_TYPES_PREFIX,\n} from './constants';\nimport { generateTypedPageHelper } from './page-helper-generator';\nimport type {\n HtPageInfo,\n HtPageModule,\n HtStructuredPageModule,\n} from './types';\n\nexport type PageModuleLoader = (\n entryPath: string,\n relativePath: string,\n) => Promise<HtPageModule>;\n\nlet buildServer: ViteDevServer | null = null;\n\nasync function importPageModule(\n server: ViteDevServer,\n url: string,\n): Promise<HtPageModule> {\n const environment = server.environments.ssr;\n\n if (!isRunnableDevEnvironment(environment)) {\n throw new Error(\n '[vite-plugin-html-pages] The Vite SSR environment is not runnable. ' +\n 'A RunnableDevEnvironment is required to evaluate page modules.',\n );\n }\n\n const mod = await environment.runner.import(url);\n\n return normalizeLoadedPageModule(mod);\n}\n\nfunction isStructuredPageModule(\n value: unknown,\n): value is HtStructuredPageModule {\n return (\n !!value &&\n typeof value === 'object' &&\n 'render' in value &&\n typeof (value as { render?: unknown }).render === 'function'\n );\n}\n\nfunction isLocalPageTypesImport(id: string): boolean {\n return /^\\.\\/\\$types(?:\\.[A-Za-z0-9_.-]+)?$/.test(id);\n}\n\nfunction normalizeLoadedPageModule(mod: unknown): HtPageModule {\n const pageModule = (mod ?? {}) as HtPageModule;\n\n if (isStructuredPageModule(pageModule.default)) {\n const structured = pageModule.default;\n\n return {\n default: structured.render,\n data: structured.data,\n generateStaticParams: structured.generateStaticParams,\n dynamic: structured.dynamic,\n prerender: structured.prerender,\n };\n }\n\n return pageModule;\n}\n\nexport async function createPageModuleLoader(args: {\n mode: 'dev' | 'build';\n root: string;\n server?: ViteDevServer | null;\n getPages?: () => Promise<HtPageInfo[]>;\n}): Promise<PageModuleLoader> {\n const { mode, root, server, getPages } = args;\n\n if (mode === 'dev') {\n if (!server) {\n throw new Error('[vite-plugin-html-pages] dev server not available');\n }\n\n return async (_entryPath, relativePath) =>\n importPageModule(server, `/${relativePath}`);\n }\n\n if (!getPages) {\n throw new Error(\n '[vite-plugin-html-pages] getPages is required in build mode',\n );\n }\n\n if (!buildServer) {\n const config: InlineConfig = {\n root,\n configFile: false,\n logLevel: 'error',\n appType: 'custom',\n esbuild: {\n jsx: 'automatic',\n jsxImportSource: 'vite-plugin-html-pages',\n },\n server: {\n middlewareMode: true,\n },\n plugins: [\n {\n name: 'vite-plugin-html-pages:page-helper',\n\n resolveId(id, importer) {\n if (id === VIRTUAL_PAGE_HELPER_ID && importer) {\n return `${RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX}${importer}`;\n }\n\n if (importer && isLocalPageTypesImport(id)) {\n return `${VIRTUAL_LOCAL_TYPES_PREFIX}${importer}::${id}`;\n }\n\n return null;\n },\n\n async load(id) {\n if (id.startsWith(VIRTUAL_LOCAL_TYPES_PREFIX)) {\n return `\nexport {\n definePage,\n defineData,\n defineStaticParams,\n definePageModule\n} from 'vite-plugin-html-pages/page';\n`;\n }\n\n if (!id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {\n return null;\n }\n\n const importer = id.slice(\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length,\n );\n\n const pages = await getPages();\n const normalizedImporter = path.resolve(importer);\n\n const page = pages.find(\n (candidate) =>\n path.resolve(candidate.absolutePath) === normalizedImporter,\n );\n\n return generateTypedPageHelper(page);\n },\n },\n ],\n };\n\n buildServer = await createServer(config);\n }\n\n return async (entryPath) => {\n const relativePath =\n '/' + path.relative(root, entryPath).replace(/\\\\/g, '/');\n\n return importPageModule(buildServer!, relativePath);\n };\n}\n\nexport async function closePageModuleLoader(): Promise<void> {\n if (buildServer) {\n await buildServer.close();\n buildServer = null;\n }\n}","import type { HtPageInfo, RouteParamDefinition } from './types';\n\nfunction paramsTypeFromDefinitions(\n paramDefinitions: RouteParamDefinition[],\n): string {\n if (paramDefinitions.length === 0) {\n return '{}';\n }\n\n const fields = paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return `${JSON.stringify(param.name)}: string`;\n }\n\n if (param.type === 'catch-all') {\n return `${JSON.stringify(param.name)}: string[]`;\n }\n\n return `${JSON.stringify(param.name)}?: string[]`;\n });\n\n return `{ ${fields.join('; ')} }`;\n}\n\nexport function generateTypedPageHelper(page?: HtPageInfo): string {\n const paramsType = page\n ? paramsTypeFromDefinitions(page.paramDefinitions ?? [])\n : '{}';\n\n return `\nexport type PageParams = ${paramsType};\n\nexport type StaticParams = PageParams[];\n\nexport type DataContext = {\n params: PageParams;\n dev: boolean;\n};\n\nexport type RenderContext<TData = unknown> = {\n params: PageParams;\n data: TData;\n dev: boolean;\n};\n\nexport type PageContext<TData = unknown> = {\n params: PageParams;\n data?: TData;\n dev: boolean;\n};\n\nexport type PageModule<TData = unknown> = {\n generateStaticParams?: () => StaticParams | Promise<StaticParams>;\n data?: (ctx: DataContext) => TData | Promise<TData>;\n render: (ctx: RenderContext<TData>) => any;\n};\n\nexport function definePage<T extends (ctx: PageContext) => any>(fn: T): T {\n return fn;\n}\n\nexport function defineData<T extends (ctx: DataContext) => any>(fn: T): T {\n return fn;\n}\n\nexport function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n>(fn: T): T {\n return fn;\n}\n\nexport function definePageModule<TData>(\n mod: PageModule<TData>,\n): PageModule<TData> {\n return mod;\n}\n`;\n}","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface HtmlAssetValidationOptions {\n root: string;\n pagesDir: string;\n html: string;\n pluginName: string;\n pageLabel?: string;\n missingAssets?: 'error' | 'warn';\n}\n\nfunction stripQueryAndHash(url: string): string {\n return url.split('#')[0].split('?')[0];\n}\n\nfunction isLocalRootUrl(url: string): boolean {\n return !!url && url.startsWith('/') && !url.startsWith('//');\n}\n\nfunction fileExistsForPublicUrl(root: string, pagesDir: string, url: string): boolean {\n const clean = stripQueryAndHash(url).slice(1);\n\n const fromSrc = path.join(root, pagesDir, clean);\n if (fs.existsSync(fromSrc)) return true;\n\n const fromPublic = path.join(root, 'public', clean);\n if (fs.existsSync(fromPublic)) return true;\n\n return false;\n}\n\nfunction collectScriptSrcs(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /<script\\b[^>]*\\bsrc=[\"']([^\"']+)[\"'][^>]*>/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction collectStylesheetHrefs(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /<link\\b[^>]*\\brel=[\"']stylesheet[\"'][^>]*\\bhref=[\"']([^\"']+)[\"'][^>]*>/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction collectLiteralDynamicImports(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /import\\s*\\(\\s*[\"']([^\"'`]+)[\"']\\s*\\)/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction formatPageLabel(pageLabel?: string): string {\n return pageLabel ? ` (${pageLabel})` : '';\n}\n\nfunction missingAssetMessage(args: {\n pluginName: string;\n kind: string;\n url: string;\n root: string;\n pagesDir: string;\n pageLabel?: string;\n}): string {\n const { pluginName, kind, url, root, pagesDir, pageLabel } = args;\n const clean = stripQueryAndHash(url).slice(1);\n const pageSuffix = formatPageLabel(pageLabel);\n\n return (\n `[${pluginName}] Missing ${kind}${pageSuffix}: ${url}\\n` +\n `Expected one of:\\n` +\n `- ${path.join(root, pagesDir, clean)}\\n` +\n `- ${path.join(root, 'public', clean)}`\n );\n}\n\nfunction reportMissing(args: {\n mode: 'error' | 'warn';\n pluginName: string;\n kind: string;\n url: string;\n root: string;\n pagesDir: string;\n pageLabel?: string;\n}) {\n const message = missingAssetMessage(args);\n\n if (args.mode === 'warn') {\n console.warn(`⚠️ ${message}`);\n return;\n }\n\n throw new Error(message);\n}\n\nexport function validateHtmlAssetReferences(\n options: HtmlAssetValidationOptions,\n): void {\n const {\n root,\n pagesDir,\n html,\n pluginName,\n pageLabel,\n missingAssets = 'error',\n } = options;\n\n const scriptSrcs = unique(collectScriptSrcs(html)).filter(isLocalRootUrl);\n const stylesheetHrefs = unique(collectStylesheetHrefs(html)).filter(isLocalRootUrl);\n const literalDynamicImports = unique(collectLiteralDynamicImports(html)).filter(\n isLocalRootUrl,\n );\n\n for (const url of scriptSrcs) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n reportMissing({\n mode: missingAssets,\n pluginName,\n kind: 'JavaScript asset',\n url,\n root,\n pagesDir,\n pageLabel,\n });\n }\n }\n\n for (const url of stylesheetHrefs) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n reportMissing({\n mode: missingAssets,\n pluginName,\n kind: 'stylesheet asset',\n url,\n root,\n pagesDir,\n pageLabel,\n });\n }\n }\n\n for (const url of literalDynamicImports) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n console.warn(\n `⚠️ ${missingAssetMessage({\n pluginName,\n kind: 'literal dynamic import',\n url,\n root,\n pagesDir,\n pageLabel,\n })}`,\n );\n }\n }\n}","import {\n compareRoutePriority,\n expandStaticPaths,\n fileNameFromRoute,\n} from './route-utils';\nimport type { HtPageInfo, HtPageModule } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nexport async function buildPageIndex(args: {\n entries: HtPageInfo[];\n modulesByEntry: Map<string, HtPageModule>;\n cleanUrls: boolean;\n}): Promise<HtPageInfo[]> {\n const { entries, modulesByEntry, cleanUrls } = args;\n const pages: HtPageInfo[] = [];\n\n for (const entry of entries) {\n const mod = modulesByEntry.get(entry.entryPath) ?? {};\n\n if (entry.dynamic) {\n const rows =\n (mod.generateStaticParams\n ? await mod.generateStaticParams()\n : []) ?? [];\n\n pages.push(\n ...expandStaticPaths(\n {\n id: entry.id,\n entryPath: entry.entryPath,\n absolutePath: entry.absolutePath,\n relativePath: entry.relativePath,\n routePattern: entry.routePattern,\n dynamic: entry.dynamic,\n paramNames: entry.paramNames,\n paramDefinitions: entry.paramDefinitions,\n },\n Array.isArray(rows) ? rows : [],\n cleanUrls,\n ),\n );\n } else {\n pages.push({\n ...entry,\n routePath: entry.routePattern,\n fileName: fileNameFromRoute(entry.routePattern, cleanUrls),\n params: {},\n });\n }\n }\n\n pages.sort((a, b) => compareRoutePriority(a.routePattern, b.routePattern));\n\n const seenRoutes = new Map<string, HtPageInfo>();\n\n for (const page of pages) {\n const existing = seenRoutes.get(page.routePath);\n\n if (existing) {\n throw new Error(\n `[${PLUGIN_NAME}] Duplicate route generated: \"${page.routePath}\" from \"${existing.relativePath}\" and \"${page.relativePath}\"`,\n );\n }\n\n seenRoutes.set(page.routePath, page);\n }\n\n return pages;\n}","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport * as esbuild from 'esbuild';\nimport fsSync from 'node:fs';\n\nexport interface StaticAssetFile {\n absolutePath: string;\n relativePathFromSrc: string;\n outputFileName: string;\n kind: 'copy' | 'process';\n}\n\nexport interface CollectStaticAssetsArgs {\n root: string;\n pagesDir: string;\n pageExtensions: string[];\n}\n\nfunction normalizeSlashes(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nfunction hasAnySuffix(value: string, suffixes: string[]): boolean {\n return suffixes.some((suffix) => value.endsWith(suffix));\n}\n\nfunction shouldIgnoreFile(rel: string): boolean {\n return (\n rel.endsWith('.d.ts') ||\n rel.endsWith('.map') ||\n rel.endsWith('.tsbuildinfo') ||\n rel.startsWith('.') ||\n rel.includes('/.')\n );\n}\n\nfunction isProcessableAsset(rel: string): boolean {\n return (\n rel.endsWith('.js') ||\n rel.endsWith('.mjs') ||\n rel.endsWith('.ts') ||\n rel.endsWith('.css')\n );\n}\n\nfunction toOutputFileName(relativePathFromSrc: string): string {\n if (relativePathFromSrc.endsWith('.ts')) {\n return relativePathFromSrc.slice(0, -3) + '.js';\n }\n return relativePathFromSrc;\n}\n\nexport async function collectStaticAssets(\n args: CollectStaticAssetsArgs,\n): Promise<StaticAssetFile[]> {\n const { root, pagesDir, pageExtensions } = args;\n const srcDir = path.join(root, pagesDir);\n\n const entries = await fg('**/*', {\n cwd: srcDir,\n onlyFiles: true,\n dot: false,\n absolute: false,\n });\n\n const assets: StaticAssetFile[] = [];\n\n for (const entry of entries) {\n const rel = normalizeSlashes(entry);\n\n if (shouldIgnoreFile(rel)) continue;\n if (hasAnySuffix(rel, pageExtensions)) continue;\n\n const absolutePath = path.join(srcDir, rel);\n\n assets.push({\n absolutePath,\n relativePathFromSrc: rel,\n outputFileName: normalizeSlashes(toOutputFileName(rel)),\n kind: isProcessableAsset(rel) ? 'process' : 'copy',\n });\n }\n\n return assets;\n}\n\nexport async function copyStaticAssetSource(\n asset: StaticAssetFile,\n): Promise<Uint8Array> {\n return fs.readFile(asset.absolutePath);\n}\n\nexport async function buildProcessedStaticAssets(args: {\n root: string;\n pagesDir: string;\n assets: StaticAssetFile[];\n minify?: boolean;\n sourcemap?: boolean;\n }): Promise<Map<string, string | Uint8Array>> {\n const { root, pagesDir, assets, minify = true, sourcemap = false } = args;\n \n const processable = assets.filter((a) => a.kind === 'process');\n const out = new Map<string, string | Uint8Array>();\n \n if (processable.length === 0) {\n return out;\n }\n \n const srcDir = path.join(root, pagesDir);\n const distDir = path.join(root, 'dist');\n const warnedMissingAssets = new Set<string>();\n const result = await esbuild.build({\n entryPoints: processable.map((a) => a.absolutePath),\n absWorkingDir: root,\n outbase: srcDir,\n outdir: distDir,\n bundle: true,\n splitting: true,\n treeShaking: true,\n minify,\n sourcemap,\n format: 'esm',\n target: 'esnext',\n platform: 'browser',\n write: false,\n entryNames: '[dir]/[name]',\n assetNames: '[dir]/[name]',\n loader: {\n '.css': 'css',\n '.png': 'file',\n '.jpg': 'file',\n '.jpeg': 'file',\n '.gif': 'file',\n '.svg': 'file',\n '.webp': 'file',\n '.woff': 'file',\n '.woff2': 'file',\n '.ttf': 'file',\n '.otf': 'file',\n },\n plugins: [\n {\n name: 'html-pages-root-url-resolver',\n setup(build) {\n build.onResolve({ filter: /^\\// }, (resolveArgs) => {\n // Leave real filesystem absolute paths alone\n if (\n path.isAbsolute(resolveArgs.path) &&\n fsSync.existsSync(resolveArgs.path)\n ) {\n return { path: resolveArgs.path };\n }\n \n const cleanPath = resolveArgs.path.slice(1);\n \n const fromSrc = path.join(srcDir, cleanPath);\n if (fsSync.existsSync(fromSrc)) {\n return { path: fromSrc };\n }\n \n const fromPublic = path.join(root, 'public', cleanPath);\n if (fsSync.existsSync(fromPublic)) {\n return {\n path: resolveArgs.path,\n external: true,\n };\n }\n \n const isCssUrlToken = resolveArgs.kind === 'url-token';\n \n if (isCssUrlToken) {\n if (!warnedMissingAssets.has(resolveArgs.path)) {\n warnedMissingAssets.add(resolveArgs.path);\n console.warn(\n `[vite-plugin-html-pages] ⚠️ Missing CSS asset: ${resolveArgs.path}\\n` +\n ` Looked in:\\n` +\n ` - ${fromSrc}\\n` +\n ` - ${fromPublic}`\n );\n }\n \n // Keep the original root-relative URL in output CSS\n return {\n path: resolveArgs.path,\n external: true,\n };\n }\n \n // JS/CSS entry imports remain strict\n return {\n path: fromSrc,\n };\n });\n },\n },\n ],\n });\n \n for (const file of result.outputFiles) {\n const rel = normalizeSlashes(path.relative(distDir, file.path));\n out.set(rel, file.text ?? file.contents);\n }\n \n return out;\n }\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { CACHE_DIR_NAME } from './constants';\n\nexport type FetchCacheMode = 'auto' | 'memory' | 'fs' | 'none';\nexport interface FetchWithCacheOptions {\n maxAge?: number;\n cacheKey?: string;\n forceRefresh?: boolean;\n cache?: FetchCacheMode;\n}\n\ntype CachedResponseRecord = {\n timestamp: number;\n status: number;\n statusText: string;\n headers: [string, string][];\n body: string;\n};\n\nconst memoryCache = new Map<string, CachedResponseRecord>();\n\nfunction createDefaultCacheKey(\n input: RequestInfo | URL,\n init?: RequestInit,\n): string {\n const raw = JSON.stringify({\n url: String(input),\n method: init?.method ?? 'GET',\n headers: init?.headers ?? {},\n body: init?.body ?? null,\n });\n\n return createHash('sha256').update(raw).digest('hex');\n}\n\nfunction getCacheFilePath(cacheKey: string): string {\n return path.join(process.cwd(), CACHE_DIR_NAME, 'fetch', `${cacheKey}.json`);\n}\n\nfunction getEffectiveCacheMode(\n mode: FetchCacheMode | undefined,\n): Exclude<FetchCacheMode, 'auto'> {\n if (mode === 'memory' || mode === 'fs' || mode === 'none') {\n return mode;\n }\n\n return process.env.NODE_ENV === 'production' ? 'fs' : 'memory';\n}\n\nfunction toResponse(cached: CachedResponseRecord): Response {\n return new Response(cached.body, {\n status: cached.status,\n statusText: cached.statusText,\n headers: cached.headers,\n });\n}\n\nfunction isFresh(cached: CachedResponseRecord, maxAgeSeconds: number): boolean {\n const ageSeconds = (Date.now() - cached.timestamp) / 1000;\n return ageSeconds <= maxAgeSeconds;\n}\n\nexport function clearMemoryFetchCache(): void {\n memoryCache.clear();\n}\n\nexport function deleteMemoryFetchCache(cacheKey: string): void {\n memoryCache.delete(cacheKey);\n}\n\nexport async function fetchWithCache(\n input: RequestInfo | URL,\n init?: RequestInit,\n options: FetchWithCacheOptions = {},\n): Promise<Response> {\n const maxAge = options.maxAge ?? 60 * 60;\n const method = (init?.method ?? 'GET').toUpperCase();\n\n if (method !== 'GET' && !options.cacheKey) {\n return fetch(input, init);\n }\n\n const cacheMode = getEffectiveCacheMode(options.cache);\n const cacheKey = options.cacheKey ?? createDefaultCacheKey(input, init);\n\n if (cacheMode === 'none') {\n return fetch(input, init);\n }\n\n if (cacheMode === 'memory' && !options.forceRefresh) {\n const cached = memoryCache.get(cacheKey);\n\n if (cached && isFresh(cached, maxAge)) {\n return toResponse(cached);\n }\n }\n\n const filePath = getCacheFilePath(cacheKey);\n\n if (cacheMode === 'fs') {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n if (!options.forceRefresh) {\n try {\n const raw = await fs.readFile(filePath, 'utf8');\n const cached = JSON.parse(raw) as CachedResponseRecord;\n\n if (isFresh(cached, maxAge)) {\n return toResponse(cached);\n }\n } catch {\n // cache miss or invalid cache; fetch fresh\n }\n }\n }\n\n const res = await fetch(input, init);\n const body = await res.text();\n\n const record: CachedResponseRecord = {\n timestamp: Date.now(),\n status: res.status,\n statusText: res.statusText,\n headers: [...res.headers.entries()],\n body,\n };\n\n if (cacheMode === 'memory') {\n memoryCache.set(cacheKey, record);\n } else if (cacheMode === 'fs') {\n await fs.writeFile(filePath, JSON.stringify(record), 'utf8');\n }\n\n return new Response(body, {\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n });\n}\n"],"mappings":"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","names":["fs","path","path","path","path","fg","path","fs","path","path","paramsTypeFromDefinitions","isStructuredPageModule","path","normalizeRoutePath","path","fs","fs","path","fs","path","build","path","fs","isLocalPageTypesImport","fs","path","path","fs","path"]}
1
+ {"version":3,"sources":["../src/plugin.ts","../src/typegen.ts","../src/path-utils.ts","../src/format-dev-error.ts","../src/constants.ts","../src/discover.ts","../src/route-utils.ts","../src/route-params.ts","../src/dev-server.ts","../src/errors.ts","../src/react-static-validation.ts","../src/render-runtime.ts","../src/module-loader.ts","../src/page-helper-generator.ts","../src/html-asset-validator.ts","../src/page-index.ts","../src/static-assets.ts","../src/fetch-cache.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { transform as esbuildTransform } from 'esbuild';\nimport pLimit from 'p-limit';\nimport type { Plugin, ViteDevServer } from 'vite';\n\nimport { writePageTypeDeclarations } from './typegen';\nimport { formatDevPageError } from './format-dev-error';\n\nimport {\n PLUGIN_NAME,\n VIRTUAL_BUILD_ENTRY_ID,\n VIRTUAL_PAGE_HELPER_ID,\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX,\n VIRTUAL_JSX_RUNTIME_ID,\n VIRTUAL_JSX_DEV_RUNTIME_ID,\n RESOLVED_VIRTUAL_JSX_RUNTIME_ID,\n RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID,\n VIRTUAL_LOCAL_TYPES_PREFIX,\n} from './constants';\nimport { discoverEntryPages } from './discover';\nimport { installDevServer } from './dev-server';\nimport { validateHtmlAssetReferences } from './html-asset-validator';\nimport { createPageModuleLoader, closePageModuleLoader } from './module-loader';\nimport { buildPageIndex } from './page-index';\nimport { generateTypedPageHelper } from './page-helper-generator';\nimport { renderPage } from './render-runtime';\nimport {\n buildProcessedStaticAssets,\n collectStaticAssets,\n copyStaticAssetSource,\n} from './static-assets';\nimport type { HtPageInfo, HtPageModule, HtPagesPluginOptions } from './types';\n\nlet hasWarnedESM = false;\n\nconst pluginDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction warnIfNotESM(root: string) {\n try {\n const pkgPath = path.join(root, 'package.json');\n\n if (!fs.existsSync(pkgPath)) return;\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n\n if (pkg.type !== 'module') {\n console.warn(\n `[${PLUGIN_NAME}] ⚠️ It is recommended to add \"type\": \"module\" to your package.json for optimal performance and to avoid Node ESM warnings.`,\n );\n }\n } catch {\n // silent — never break build\n }\n}\n\nfunction isLocalPageTypesImport(id: string): boolean {\n return /^\\.\\/\\$types(?:\\.[A-Za-z0-9_.-]+)?$/.test(id);\n}\n\nfunction chunkArray<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n out.push(items.slice(i, i + size));\n }\n return out;\n}\n\nfunction isHtJsxFile(id: string): boolean {\n return (\n id.endsWith('.ht.jsx') ||\n id.endsWith('.html.jsx') ||\n id.endsWith('.ht.tsx') ||\n id.endsWith('.html.tsx')\n );\n}\n\nfunction isHtTsxFile(id: string): boolean {\n return id.endsWith('.ht.tsx') || id.endsWith('.html.tsx');\n}\n\nfunction isHtJsxImporter(importer: string | undefined): boolean {\n if (!importer) return false;\n\n const normalized = importer.split('?')[0].replace(/\\\\/g, '/');\n\n return isHtJsxFile(normalized);\n}\n\nexport function htPages(options: HtPagesPluginOptions = {}): Plugin {\n let root = process.cwd();\n let server: ViteDevServer | null = null;\n let devPages: HtPageInfo[] = [];\n let watcherAttached = false;\n\n const cleanUrls = options.cleanUrls ?? true;\n const pagesDir = options.pagesDir ?? 'src';\n const pageExtensions = options.pageExtensions?.length\n ? options.pageExtensions\n : [\n '.ht.js',\n '.html.js',\n '.ht.ts',\n '.html.ts',\n '.ht.jsx',\n '.html.jsx',\n '.ht.tsx',\n '.html.tsx',\n ];\n\n function logDebug(enabled: boolean | undefined, ...args: unknown[]) {\n if (!enabled) return;\n console.log(`[${PLUGIN_NAME}]`, ...args);\n }\n\n async function loadDevPages(): Promise<HtPageInfo[]> {\n const entries = await discoverEntryPages(root, options);\n \n // 🔥 generate types for editor\n await writePageTypeDeclarations({\n root,\n pagesDir,\n entries,\n });\n \n const modulesByEntry = new Map<string, HtPageModule>();\n\n logDebug(\n options.debug,\n 'discovered entries',\n entries.map((e) => e.relativePath),\n );\n\n if (!server) return [];\n\n const loadModule = await createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n for (const entry of entries) {\n const mod = await loadModule(entry.entryPath, entry.relativePath);\n modulesByEntry.set(entry.entryPath, mod);\n }\n\n devPages = await buildPageIndex({\n entries,\n modulesByEntry,\n cleanUrls,\n });\n\n logDebug(\n options.debug,\n 'dev pages',\n devPages.map((p) => `${p.routePath} -> ${p.relativePath}`),\n );\n\n return devPages;\n }\n\n async function buildPagesPipeline() {\n const entries = await discoverEntryPages(root, options);\n \n // 🔥 generate types for build (also ensures fresh output)\n await writePageTypeDeclarations({\n root,\n pagesDir,\n entries,\n });\n \n const modulesByEntry = new Map<string, HtPageModule>();\n\n const loadModule = await createPageModuleLoader({\n mode: 'build',\n root,\n getPages: async () => entries,\n });\n\n for (const entry of entries) {\n const mod = await loadModule(entry.entryPath, entry.relativePath);\n modulesByEntry.set(entry.entryPath, mod);\n }\n\n const pages = await buildPageIndex({\n entries,\n modulesByEntry,\n cleanUrls,\n });\n\n return { entries, modulesByEntry, pages };\n }\n\n return {\n name: PLUGIN_NAME,\n\n config(userConfig, env) {\n if (env.command !== 'build') return;\n\n const hasExplicitInput = userConfig.build?.rollupOptions?.input != null;\n if (hasExplicitInput) return;\n\n return {\n build: {\n rollupOptions: {\n input: VIRTUAL_BUILD_ENTRY_ID,\n },\n },\n };\n },\n\n resolveId(id, importer) {\n if (id === VIRTUAL_BUILD_ENTRY_ID) {\n return id;\n }\n\n if (id === VIRTUAL_PAGE_HELPER_ID && importer) {\n return `${RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX}${importer}`;\n }\n\n if (id === VIRTUAL_JSX_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_JSX_RUNTIME_ID;\n }\n\n if (id === VIRTUAL_JSX_DEV_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID;\n }\n\n if (isHtJsxImporter(importer)) {\n if (id === 'react/jsx-runtime') {\n return RESOLVED_VIRTUAL_JSX_RUNTIME_ID;\n }\n\n if (id === 'react/jsx-dev-runtime') {\n return RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID;\n }\n }\n\n if (importer && isLocalPageTypesImport(id)) {\n return `${VIRTUAL_LOCAL_TYPES_PREFIX}${importer}::${id}`;\n } \n\n return null;\n },\n\n async load(id) {\n if (id === VIRTUAL_BUILD_ENTRY_ID) {\n return 'export default {};';\n }\n\n if (id === RESOLVED_VIRTUAL_JSX_RUNTIME_ID) {\n return `\nexport { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(\n pathToFileURL(path.join(pluginDir, 'jsx-runtime.js')).href,\n )};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID) {\n return `\nexport { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(\n pathToFileURL(path.join(pluginDir, 'jsx-dev-runtime.js')).href,\n )};\n`;\n }\n\n if (id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {\n const importer = id.slice(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length);\n const { pages } = await buildPagesPipeline();\n\n const normalizedImporter = path.resolve(importer);\n\n const page = pages.find(\n (candidate) =>\n path.resolve(candidate.absolutePath) === normalizedImporter,\n );\n\n return generateTypedPageHelper(page);\n }\n\n if (id.startsWith(VIRTUAL_LOCAL_TYPES_PREFIX)) {\n return `\nexport {\n definePage,\n defineData,\n defineStaticParams,\n definePageModule\n} from 'vite-plugin-html-pages/page';\n`;\n } \n\n return null;\n },\n\n async transform(code, id) {\n const normalizedId = id.split('?')[0].replace(/\\\\/g, '/');\n\n if (!isHtJsxFile(normalizedId)) {\n return null;\n }\n\n const result = await esbuildTransform(code, {\n loader: isHtTsxFile(normalizedId) ? 'tsx' : 'jsx',\n format: 'esm',\n jsx: 'automatic',\n jsxImportSource: 'vite-plugin-html-pages',\n sourcemap: true,\n sourcefile: normalizedId,\n target: 'esnext',\n });\n\n return {\n code: result.code,\n map: result.map,\n };\n },\n\n configResolved(resolved) {\n root = options.root ? path.resolve(resolved.root, options.root) : resolved.root;\n\n if (!hasWarnedESM) {\n warnIfNotESM(root);\n hasWarnedESM = true;\n }\n },\n\n async buildStart() {\n const entries = await discoverEntryPages(root, options);\n\n for (const entry of entries) {\n this.addWatchFile(entry.entryPath);\n }\n\n const staticAssets = await collectStaticAssets({\n root,\n pagesDir,\n pageExtensions,\n });\n\n for (const asset of staticAssets) {\n this.addWatchFile(asset.absolutePath);\n }\n\n logDebug(\n options.debug,\n 'static assets',\n staticAssets.map((asset) => ({\n kind: asset.kind,\n input: asset.relativePathFromSrc,\n output: asset.outputFileName,\n })),\n );\n },\n\n configureServer(_server) {\n server = _server;\n\n installDevServer({\n server,\n root,\n pagesDir,\n getPages: async () => {\n if (devPages.length > 0) return devPages;\n return loadDevPages();\n },\n getEntries: async () => discoverEntryPages(root, options),\n });\n\n if (!watcherAttached) {\n watcherAttached = true;\n\n const reloadAfterChange = async (file: string): Promise<void> => {\n logDebug(options.debug, 'file changed', file);\n\n try {\n await loadDevPages();\n\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n } catch (error) {\n if (error instanceof Error) {\n server?.ssrFixStacktrace(error);\n }\n \n server?.config.logger.error(\n formatDevPageError({\n error,\n root,\n phase: 'reload',\n debug: options.debug,\n }),\n );\n \n // Do not rethrow.\n }\n };\n\n const reload = (file: string): void => {\n if (\n !file.includes(`${path.sep}${pagesDir}${path.sep}`) &&\n !file.includes(`/${pagesDir}/`)\n ) {\n return;\n }\n\n void reloadAfterChange(file);\n };\n\n server.watcher.on('add', reload);\n server.watcher.on('change', reload);\n server.watcher.on('unlink', reload);\n }\n\n void loadDevPages().catch((error) => {\n if (error instanceof Error) {\n server?.ssrFixStacktrace(error);\n }\n \n server?.config.logger.error(\n formatDevPageError({\n error,\n root,\n phase: 'load',\n debug: options.debug,\n }),\n );\n }); \n\n\n },\n\n async generateBundle(_, bundle) {\n try {\n const { modulesByEntry, pages } = await buildPagesPipeline();\n\n const staticAssets = await collectStaticAssets({\n root,\n pagesDir,\n pageExtensions,\n });\n\n logDebug(\n options.debug,\n 'emitting pages',\n pages.map((p) => p.fileName),\n );\n\n logDebug(\n options.debug,\n 'emitting static assets',\n staticAssets.map((asset) => ({\n kind: asset.kind,\n input: asset.relativePathFromSrc,\n output: asset.outputFileName,\n })),\n );\n\n const limit = pLimit(options.renderConcurrency ?? 8);\n const batchSize =\n options.renderBatchSize ??\n Math.max(options.renderConcurrency ?? 8, 32);\n\n const processedOutputs = await buildProcessedStaticAssets({\n root,\n pagesDir,\n assets: staticAssets,\n minify: true,\n sourcemap: false,\n });\n\n for (const [fileName, source] of processedOutputs) {\n this.emitFile({\n type: 'asset',\n fileName,\n source,\n });\n }\n\n for (const asset of staticAssets) {\n if (asset.kind !== 'copy') continue;\n\n const source = await copyStaticAssetSource(asset);\n\n this.emitFile({\n type: 'asset',\n fileName: asset.outputFileName,\n source,\n });\n }\n\n for (const batch of chunkArray(pages, batchSize)) {\n await Promise.all(\n batch.map((page) =>\n limit(async () => {\n const mod = modulesByEntry.get(page.entryPath);\n\n if (!mod) {\n throw new Error(\n `[${PLUGIN_NAME}] Missing module for page entry: ${page.entryPath}`,\n );\n }\n\n const html = await renderPage(page, mod, false);\n\n validateHtmlAssetReferences({\n root,\n pagesDir,\n html,\n pluginName: PLUGIN_NAME,\n pageLabel: page.relativePath,\n missingAssets: options.missingAssets ?? 'error',\n });\n\n this.emitFile({\n type: 'asset',\n fileName: options.mapOutputPath?.(page) ?? page.fileName,\n source: html,\n });\n }),\n ),\n );\n }\n\n const notFoundPage = pages.find((p) => p.routePath === '/404');\n\n if (notFoundPage) {\n const mod = modulesByEntry.get(notFoundPage.entryPath);\n\n if (!mod) {\n throw new Error(\n `[${PLUGIN_NAME}] Missing module for 404 page entry: ${notFoundPage.entryPath}`,\n );\n }\n\n const html = await renderPage(notFoundPage, mod, false);\n\n validateHtmlAssetReferences({\n root,\n pagesDir,\n html,\n pluginName: PLUGIN_NAME,\n pageLabel: notFoundPage.relativePath,\n missingAssets: options.missingAssets ?? 'error',\n });\n\n this.emitFile({\n type: 'asset',\n fileName: '404.html',\n source: html,\n });\n\n logDebug(options.debug, 'generated 404.html from user page');\n } else {\n const default404 = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>404 - Page Not Found</title>\n <style>\n :root {\n color-scheme: light dark;\n }\n body {\n margin: 0;\n font-family: system-ui, sans-serif;\n min-height: 100vh;\n display: grid;\n place-items: center;\n padding: 2rem;\n }\n main {\n max-width: 40rem;\n text-align: center;\n }\n h1 {\n font-size: 3rem;\n margin: 0 0 1rem;\n }\n p {\n margin: 0.5rem 0;\n line-height: 1.5;\n }\n a {\n color: inherit;\n }\n </style>\n </head>\n <body>\n <main>\n <h1>404</h1>\n <p>Page not found.</p>\n <p><a href=\"/\">Go back home</a></p>\n </main>\n </body>\n</html>\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: '404.html',\n source: default404,\n });\n\n logDebug(options.debug, 'generated default 404.html');\n }\n\n const sitemapBase = options.site ?? '';\n\n const sitemapRoutes = [...new Set(pages.map((p) => p.routePath))].filter(\n (route) => !route.includes(':') && !route.includes('*'),\n );\n\n if (sitemapBase && sitemapRoutes.length > 0) {\n const sitemap = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${sitemapRoutes\n .map((route) => ` <url><loc>${sitemapBase}${route}</loc></url>`)\n .join('\\n')}\\n</urlset>\\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: 'sitemap.xml',\n source: sitemap,\n });\n\n logDebug(options.debug, 'generated sitemap.xml');\n }\n\n const rss = options.rss;\n\n if (rss?.site) {\n const routePrefix = rss.routePrefix ?? '/blog';\n\n const rssItems = pages\n .filter((page) => page.routePath.startsWith(routePrefix))\n .map((page) => {\n const url = `${rss.site}${page.routePath}`;\n\n return ` <item>\\n <title>${page.routePath}</title>\\n <link>${url}</link>\\n <guid>${url}</guid>\\n </item>`;\n })\n .join('\\n');\n\n const rssXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<rss version=\"2.0\">\\n<channel>\\n <title>${rss.title ?? PLUGIN_NAME}</title>\\n <link>${rss.site}</link>\\n <description>${rss.description ?? 'RSS feed'}</description>\\n${rssItems}\\n</channel>\\n</rss>\\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: 'rss.xml',\n source: rssXml,\n });\n\n logDebug(options.debug, 'generated rss.xml');\n }\n\n for (const [fileName, output] of Object.entries(bundle)) {\n if (\n output.type === 'chunk' &&\n output.facadeModuleId === VIRTUAL_BUILD_ENTRY_ID\n ) {\n delete bundle[fileName];\n }\n }\n } finally {\n await closePageModuleLoader();\n }\n },\n };\n}\n\nexport default htPages;","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { HtPageInfo, RouteParamDefinition } from './types';\nimport { normalizeFsPath, toPosix } from './path-utils';\n\nfunction paramsTypeFromDefinitions(\n paramDefinitions: RouteParamDefinition[],\n): string {\n if (paramDefinitions.length === 0) {\n return '{}';\n }\n\n const fields = paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return `${param.name}: string`;\n }\n\n if (param.type === 'catch-all') {\n return `${param.name}: string[]`;\n }\n\n return `${param.name}?: string[]`;\n });\n\n return `{ ${fields.join('; ')} }`;\n}\n\nfunction pageHelperModuleSource(page: HtPageInfo): string {\n const paramsType = paramsTypeFromDefinitions(page.paramDefinitions ?? []);\n return `export type PageParams = ${paramsType};\n \n export type StaticParams = PageParams[];\n \n export type DataContext = {\n params: PageParams;\n dev: boolean;\n };\n \n export type RenderContext<TData = unknown> = {\n params: PageParams;\n data: TData;\n dev: boolean;\n };\n \n export type PageContext<TData = unknown> = {\n params: PageParams;\n data?: TData;\n dev: boolean;\n };\n \n export type RenderResult = unknown;\n \n export type PageModule<TData = unknown> = {\n generateStaticParams?: () => StaticParams | Promise<StaticParams>;\n data?: (ctx: DataContext) => TData | Promise<TData>;\n render: (ctx: RenderContext<TData>) => RenderResult | Promise<RenderResult>;\n };\n \n export declare function definePage<\n T extends (ctx: PageContext) => RenderResult | Promise<RenderResult>\n >(fn: T): T;\n \n export declare function defineData<\n T extends (ctx: DataContext) => unknown | Promise<unknown>\n >(fn: T): T;\n \n export declare function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n >(fn: T): T;\n \n export declare function definePageModule<TData>(\n mod: PageModule<TData>\n ): PageModule<TData>;\n `;\n}\n\nfunction stripPageExtension(filePath: string): string {\n return filePath.replace(/\\.(ht|html)\\.(js|ts|jsx|tsx)$/i, '');\n}\n\nfunction getTypesFileName(page: HtPageInfo): string {\n if (!page.dynamic || page.paramDefinitions.length === 0) {\n return '$types.d.ts';\n }\n\n const parts = page.paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return param.name;\n }\n\n if (param.type === 'catch-all') {\n return `${param.name}.all`;\n }\n\n return `${param.name}.opt`;\n });\n\n return `$types.${parts.join('.')}.d.ts`;\n}\n\nasync function listFilesRecursive(dir: string): Promise<string[]> {\n let entries;\n \n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n \n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = path.join(dir, entry.name);\n \n if (entry.isDirectory()) {\n return listFilesRecursive(fullPath);\n }\n \n return [fullPath];\n }),\n );\n \n return files.flat();\n }\n \n async function removeEmptyDirectories(dir: string, stopAt: string): Promise<void> {\n const normalizedDir = normalizeFsPath(dir);\n const normalizedStopAt = normalizeFsPath(stopAt);\n \n if (normalizedDir === normalizedStopAt) {\n return;\n }\n \n let entries;\n \n try {\n entries = await fs.readdir(normalizedDir);\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n \n if (entries.length > 0) {\n return;\n }\n \n await fs.rmdir(normalizedDir);\n await removeEmptyDirectories(path.dirname(normalizedDir), normalizedStopAt);\n }\n\nexport function getGeneratedTypesRoot(root: string): string {\n return normalizeFsPath(path.join(root, '.vite-plugin-html-pages', 'types'));\n}\n\nexport function getGeneratedHelperPath(args: {\n root: string;\n pagesDir: string;\n page: HtPageInfo;\n}): string {\n const pagesRoot = normalizeFsPath(path.join(args.root, args.pagesDir));\n const relativeFromPagesDir = toPosix(\n path.relative(pagesRoot, args.page.absolutePath),\n );\n const withoutExt = stripPageExtension(relativeFromPagesDir);\n const outRoot = getGeneratedTypesRoot(args.root);\n const fileName = getTypesFileName(args.page);\n\n return normalizeFsPath(\n path.join(outRoot, path.dirname(withoutExt), fileName),\n );\n}\n\nasync function removeStalePageTypeDeclarations(args: {\n root: string;\n expectedFiles: Set<string>;\n}): Promise<void> {\n const outRoot = getGeneratedTypesRoot(args.root);\n const existingFiles = await listFilesRecursive(outRoot);\n\n const staleFiles = existingFiles.filter((file) => {\n if (!file.endsWith('.d.ts')) {\n return false;\n }\n\n return !args.expectedFiles.has(normalizeFsPath(file));\n });\n\n await Promise.all(\n staleFiles.map(async (file) => {\n await fs.unlink(file);\n await removeEmptyDirectories(path.dirname(file), outRoot);\n }),\n );\n}\n\nexport async function writePageTypeDeclarations(args: {\n root: string;\n pagesDir: string;\n entries: HtPageInfo[];\n}): Promise<void> {\n const outRoot = getGeneratedTypesRoot(args.root);\n\n await fs.mkdir(outRoot, { recursive: true });\n\n const outputs = args.entries.map((page) => ({\n page,\n outFile: getGeneratedHelperPath({\n root: args.root,\n pagesDir: args.pagesDir,\n page,\n }),\n }));\n\n const expectedFiles = new Set(\n outputs.map(({ outFile }) => normalizeFsPath(outFile)),\n );\n\n await Promise.all(\n outputs.map(async ({ page, outFile }) => {\n await fs.mkdir(path.dirname(outFile), { recursive: true });\n await fs.writeFile(outFile, pageHelperModuleSource(page), 'utf8');\n }),\n );\n\n await removeStalePageTypeDeclarations({\n root: args.root,\n expectedFiles,\n });\n}","import path from 'node:path';\n\nexport function toPosix(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nexport function normalizeFsPath(value: string): string {\n return path.normalize(value);\n}\n\nexport function normalizeRoutePath(value: string): string {\n const normalized = toPosix(value).replace(/\\/+/g, '/');\n if (!normalized || normalized === '/') return '/';\n\n const withLeadingSlash = normalized.startsWith('/')\n ? normalized\n : `/${normalized}`;\n\n return withLeadingSlash !== '/' && withLeadingSlash.endsWith('/')\n ? withLeadingSlash.slice(0, -1)\n : withLeadingSlash;\n}\n\nexport function stripPageSuffix(\n filePath: string,\n extensions: string[],\n): string {\n const normalized = toPosix(filePath);\n\n const match = [...extensions]\n .sort((a, b) => b.length - a.length)\n .find((ext) => normalized.endsWith(ext));\n\n if (!match) return normalized;\n\n return normalized.slice(0, -match.length);\n}","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\n\ntype SourceLocation = {\n file: string;\n line: number;\n column: number;\n};\n\nfunction extractSourceLocation(\n error: Error,\n root: string,\n): SourceLocation | null {\n const stack = error.stack ?? '';\n\n for (const line of stack.split('\\n')) {\n const match = line.match(\n /(?:at\\s+.*?\\s+\\()?((?:file:\\/\\/)?[^():\\n]+):(\\d+):(\\d+)\\)?$/,\n );\n\n if (!match) continue;\n\n const rawFile = match[1].replace(/^file:\\/\\//, '');\n const file = decodeURIComponent(rawFile);\n\n if (file.includes('/node_modules/')) continue;\n if (!path.isAbsolute(file)) continue;\n\n const relative = path.relative(root, file);\n\n if (relative.startsWith('..')) continue;\n\n return {\n file,\n line: Number(match[2]),\n column: Number(match[3]),\n };\n }\n\n return null;\n}\n\nfunction createSourceFrame(\n location: SourceLocation,\n root: string,\n contextLines = 3,\n): string | null {\n if (!fs.existsSync(location.file)) return null;\n\n const lines = fs.readFileSync(location.file, 'utf8').split(/\\r?\\n/);\n\n const errorIndex = location.line - 1;\n const start = Math.max(0, errorIndex - contextLines);\n const end = Math.min(lines.length - 1, errorIndex + contextLines);\n const lineNumberWidth = String(end + 1).length;\n\n const output: string[] = [];\n\n for (let index = start; index <= end; index++) {\n const number = String(index + 1).padStart(lineNumberWidth, ' ');\n const isErrorLine = index === errorIndex;\n const marker = isErrorLine ? pc.red('>') : ' ';\n\n output.push(\n `${marker} ${pc.dim(number)} ${pc.dim('│')} ${\n isErrorLine ? pc.red(lines[index]) : lines[index]\n }`,\n );\n\n if (isErrorLine) {\n const indentation = ' '.repeat(\n Math.max(0, location.column - 1),\n );\n\n output.push(\n ` ${' '.repeat(lineNumberWidth)} ${pc.dim('│')} ${indentation}${pc.red(\n '^',\n )}`,\n );\n }\n }\n\n return [\n pc.dim(path.relative(root, location.file)),\n '',\n ...output,\n ].join('\\n');\n}\n\nexport function formatDevPageError(args: {\n error: unknown;\n root: string;\n phase: 'load' | 'reload';\n debug?: boolean;\n}): string {\n const { root, phase, debug = false } = args;\n\n const error =\n args.error instanceof Error\n ? args.error\n : new Error(String(args.error));\n\n const location = extractSourceLocation(error, root);\n const sourceFrame = location\n ? createSourceFrame(location, root)\n : null;\n\n const heading =\n phase === 'load' ? 'PAGE LOAD ERROR' : 'PAGE RELOAD ERROR';\n\n const fileLabel = location\n ? ` ${path.relative(root, location.file)}`\n : '';\n\n const separatorLength = Math.max(\n 12,\n 64 - heading.length - fileLabel.length,\n );\n\n const output = [\n '',\n pc.cyan(\n `── ${heading} ${'─'.repeat(separatorLength)}${fileLabel}`,\n ),\n '',\n `${pc.red(error.name + ':')} ${error.message}`,\n ];\n\n if (sourceFrame) {\n output.push('', sourceFrame);\n }\n\n if (debug && error.stack) {\n output.push('', pc.dim(error.stack));\n }\n\n output.push(\n '',\n pc.yellow('Fix the error and save again.'),\n pc.dim('Watching for file changes...'),\n '',\n );\n\n return output.join('\\n');\n}","export const PLUGIN_NAME = 'vite-plugin-html-pages';\nexport const VIRTUAL_BUILD_ENTRY_ID = `\\0${PLUGIN_NAME}:build-entry`;\nexport const VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;\nexport const RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX =`\\0${PLUGIN_NAME}/page:`;\nexport const VIRTUAL_MANIFEST_ID = `\\0virtual:${PLUGIN_NAME}-manifest`;\nexport const CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;\nexport const VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;\nexport const VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;\nexport const RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\\0${VIRTUAL_JSX_RUNTIME_ID}`;\nexport const RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;\nexport const VIRTUAL_LOCAL_TYPES_PREFIX = `\\0${PLUGIN_NAME}:local-types:`;","import path from 'node:path';\nimport { normalizeFsPath, toPosix } from './path-utils';\nimport { isDynamicPage, toRoutePattern } from './route-utils';\nimport { extractRouteParamDefinitions } from './route-params';\nimport type { HtPageInfo, HtPagesPluginOptions } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nfunction buildDefaultIncludeGlobs(\n pagesDir: string,\n pageExtensions: string[],\n): string[] {\n return pageExtensions.map((ext) => {\n const cleanExt = ext.startsWith('.') ? ext.slice(1) : ext;\n return `${pagesDir}/**/*.${cleanExt}`;\n });\n}\n\nexport async function discoverEntryPages(\n root: string,\n options: HtPagesPluginOptions,\n): Promise<HtPageInfo[]> {\n const fgModule = await import('fast-glob');\n const fg = (fgModule.default ?? fgModule) as typeof import('fast-glob');\n\n const pagesDir = options.pagesDir ?? 'src';\n const pageExtensions = options.pageExtensions?.length\n ? options.pageExtensions\n : ['.ht.js', '.html.js', '.ht.ts', '.html.ts', '.ht.jsx', '.html.jsx', '.ht.tsx', '.html.tsx'];\n\n const include = Array.isArray(options.include)\n ? options.include\n : options.include\n ? [options.include]\n : buildDefaultIncludeGlobs(pagesDir, pageExtensions);\n\n const exclude = Array.isArray(options.exclude)\n ? options.exclude\n : options.exclude\n ? [options.exclude]\n : [];\n\n const pagesRoot = normalizeFsPath(path.join(root, pagesDir));\n\n const files = await fg.glob(include, {\n cwd: root,\n ignore: exclude,\n absolute: true,\n });\n\n return files\n .sort()\n .map((absolutePath) => {\n const entryPath = normalizeFsPath(absolutePath);\n const relativePath = toPosix(path.relative(root, entryPath));\n const relativeFromPagesDir = toPosix(path.relative(pagesRoot, entryPath));\n\n if (\n relativeFromPagesDir.startsWith('../') ||\n relativeFromPagesDir === '..'\n ) {\n throw new Error(\n `[${PLUGIN_NAME}] Page is outside pagesDir: ${entryPath} (pagesDir: ${pagesDir})`,\n );\n }\n\n const dynamic = isDynamicPage(relativeFromPagesDir);\n const routePattern = toRoutePattern(relativeFromPagesDir, pageExtensions);\n const paramDefinitions = extractRouteParamDefinitions(routePattern);\n\n return {\n id: entryPath,\n entryPath,\n absolutePath: entryPath,\n relativePath,\n routePattern,\n routePath: routePattern,\n fileName: '',\n dynamic,\n paramNames: paramDefinitions.map((p) => p.name),\n paramDefinitions,\n params: {},\n } satisfies HtPageInfo;\n });\n}","import { normalizeRoutePath, stripPageSuffix, toPosix } from './path-utils';\nimport type {\n HtPageInfo,\n HtPageParams,\n StaticParamRecord,\n StaticParamValue,\n} from './types';\n\nconst DYNAMIC_SEGMENT_RE = /\\[([A-Za-z0-9_]+)\\]/g;\nconst CATCH_ALL_SEGMENT_RE = /\\[\\.\\.\\.([A-Za-z0-9_]+)\\]/g;\nconst OPTIONAL_CATCH_ALL_SEGMENT_RE = /\\[\\.\\.\\.([A-Za-z0-9_]+)\\]\\?/g;\nconst ANY_PARAM_RE = /\\[(?:\\.\\.\\.)?([A-Za-z0-9_]+)\\]\\??/g;\nconst ROUTE_GROUP_RE = /(^|\\/)\\(([^)]+)\\)(?=\\/|$)/g;\n\nexport function getParamNames(relativeFromPagesDir: string): string[] {\n return [...relativeFromPagesDir.matchAll(ANY_PARAM_RE)].map((m) => m[1]);\n}\n\nexport function isDynamicPage(relativeFromPagesDir: string): boolean {\n return /\\[(?:\\.\\.\\.)?[A-Za-z0-9_]+\\]\\??/.test(relativeFromPagesDir);\n}\n\nexport function toRoutePattern(\n relativeFromPagesDir: string,\n extensions: string[],\n): string {\n const noExt = stripPageSuffix(toPosix(relativeFromPagesDir), extensions);\n\n const withoutGroups = noExt.replace(ROUTE_GROUP_RE, '$1');\n const withoutIndex = withoutGroups.replace(/\\/index$/i, '').replace(/^index$/i, '');\n\n const raw = withoutIndex\n .replace(OPTIONAL_CATCH_ALL_SEGMENT_RE, '*?:$1')\n .replace(CATCH_ALL_SEGMENT_RE, '*:$1')\n .replace(DYNAMIC_SEGMENT_RE, ':$1');\n\n return normalizeRoutePath(raw || '/');\n}\n\nfunction encodePathParts(parts: string[]): string {\n return parts.map((part) => encodeURIComponent(part)).join('/');\n}\n\nfunction normalizeCatchAllValue(value: StaticParamValue): string[] {\n if (Array.isArray(value)) {\n return value.map((part) => String(part)).filter(Boolean);\n }\n\n if (value === '') {\n return [];\n }\n\n return String(value).split('/').filter(Boolean);\n}\n\nfunction normalizePageParams(params: StaticParamRecord): HtPageParams {\n const normalized: HtPageParams = {};\n\n for (const [key, value] of Object.entries(params)) {\n normalized[key] = Array.isArray(value)\n ? value.map((part) => String(part))\n : String(value);\n }\n\n return normalized;\n}\n\nexport function fillParams(\n pattern: string,\n params: StaticParamRecord,\n): string {\n const result = pattern\n .replace(/\\*\\?:([A-Za-z0-9_]+)/g, (_, key) => {\n const value = params[key];\n if (value == null) {\n return '';\n }\n\n const parts = normalizeCatchAllValue(value);\n if (parts.length === 0) {\n return '';\n }\n\n return encodePathParts(parts);\n })\n .replace(/\\*:([A-Za-z0-9_]+)/g, (_, key) => {\n if (!(key in params)) {\n throw new Error(`Missing catch-all route param \"${key}\"`);\n }\n\n const value = params[key];\n const parts = normalizeCatchAllValue(value);\n\n if (parts.length === 0) {\n throw new Error(`Catch-all route param \"${key}\" must not be empty`);\n }\n\n return encodePathParts(parts);\n })\n .replace(/:([A-Za-z0-9_]+)/g, (_, key) => {\n if (!(key in params)) {\n throw new Error(`Missing route param \"${key}\"`);\n }\n\n const value = params[key];\n if (Array.isArray(value)) {\n throw new Error(`Route param \"${key}\" must be a string, received array`);\n }\n\n return encodeURIComponent(String(value));\n });\n\n return normalizeRoutePath(result || '/');\n}\n\nexport function fileNameFromRoute(\n routePath: string,\n cleanUrls: boolean,\n): string {\n const normalized = normalizeRoutePath(routePath);\n\n if (normalized === '/') return 'index.html';\n\n const base = normalized.slice(1);\n return cleanUrls ? `${base}/index.html` : `${base}.html`;\n}\n\nexport function expandStaticPaths(\n basePage: Omit<HtPageInfo, 'routePath' | 'fileName' | 'params'>,\n rows: StaticParamRecord[],\n cleanUrls: boolean,\n): HtPageInfo[] {\n return rows.map((row) => {\n const routePath = fillParams(basePage.routePattern, row);\n const params = normalizePageParams(row);\n\n return {\n ...basePage,\n routePath,\n fileName: fileNameFromRoute(routePath, cleanUrls),\n params,\n };\n });\n}\n\nexport function routeMatch(\n pattern: string,\n urlPath: string,\n): HtPageParams | null {\n const a = normalizeRoutePath(pattern).split('/').filter(Boolean);\n const b = normalizeRoutePath(urlPath).split('/').filter(Boolean);\n const params: HtPageParams = {};\n\n for (let i = 0; i < a.length; i++) {\n const patternSeg = a[i];\n const urlSeg = b[i];\n\n if (patternSeg.startsWith('*?:')) {\n const key = patternSeg.slice(3);\n if (i < b.length) {\n params[key] = b.slice(i).map(decodeURIComponent);\n }\n return params;\n }\n\n if (patternSeg.startsWith('*:')) {\n const rest = b.slice(i);\n if (rest.length === 0) return null;\n\n params[patternSeg.slice(2)] = rest.map(decodeURIComponent);\n return params;\n }\n\n if (!urlSeg) return null;\n\n if (patternSeg.startsWith(':')) {\n params[patternSeg.slice(1)] = decodeURIComponent(urlSeg);\n continue;\n }\n\n if (patternSeg !== urlSeg) return null;\n }\n\n return a.length === b.length ? params : null;\n}\n\nexport function compareRoutePriority(a: string, b: string): number {\n const aSegs = normalizeRoutePath(a).split('/').filter(Boolean);\n const bSegs = normalizeRoutePath(b).split('/').filter(Boolean);\n const len = Math.max(aSegs.length, bSegs.length);\n\n for (let i = 0; i < len; i++) {\n const aa = aSegs[i];\n const bb = bSegs[i];\n\n if (aa == null) return 1;\n if (bb == null) return -1;\n\n const aOptionalCatchAll = aa.startsWith('*?:');\n const bOptionalCatchAll = bb.startsWith('*?:');\n if (aOptionalCatchAll !== bOptionalCatchAll) {\n return aOptionalCatchAll ? 1 : -1;\n }\n\n const aCatchAll = aa.startsWith('*:');\n const bCatchAll = bb.startsWith('*:');\n if (aCatchAll !== bCatchAll) {\n return aCatchAll ? 1 : -1;\n }\n\n const aDynamic = aa.startsWith(':');\n const bDynamic = bb.startsWith(':');\n if (aDynamic !== bDynamic) {\n return aDynamic ? 1 : -1;\n }\n }\n\n return bSegs.length - aSegs.length;\n}","import type { RouteParamDefinition } from './types';\n\nexport function parseRouteParamSegment(\n segment: string,\n): RouteParamDefinition | null {\n if (segment.startsWith('*?:')) {\n return {\n name: segment.slice(3),\n type: 'optional-catch-all',\n };\n }\n\n if (segment.startsWith('*:')) {\n return {\n name: segment.slice(2),\n type: 'catch-all',\n };\n }\n\n if (segment.startsWith(':')) {\n return {\n name: segment.slice(1),\n type: 'single',\n };\n }\n\n return null;\n}\n\nexport function extractRouteParamDefinitions(\n routePattern: string,\n): RouteParamDefinition[] {\n return routePattern\n .split('/')\n .filter(Boolean)\n .map((segment) => parseRouteParamSegment(segment))\n .filter((value): value is RouteParamDefinition => value != null);\n}","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ViteDevServer } from 'vite';\n\nimport { renderPage } from './render-runtime';\nimport type { HtPageInfo } from './types';\nimport { PLUGIN_NAME } from './constants';\nimport { createPageModuleLoader } from './module-loader';\n\nfunction isStaticAssetRequest(url: string): boolean {\n return (\n url.endsWith('.css') ||\n url.endsWith('.js') ||\n url.endsWith('.mjs') ||\n url.endsWith('.ts') ||\n url.endsWith('.png') ||\n url.endsWith('.jpg') ||\n url.endsWith('.jpeg') ||\n url.endsWith('.gif') ||\n url.endsWith('.svg') ||\n url.endsWith('.webp') ||\n url.endsWith('.ico') ||\n url.endsWith('.woff') ||\n url.endsWith('.woff2') ||\n url.endsWith('.ttf') ||\n url.endsWith('.otf')\n );\n}\n\nfunction normalizeRoutePath(input: string): string {\n let value = input.split('?')[0].split('#')[0];\n\n if (!value.startsWith('/')) value = '/' + value;\n value = value.replace(/\\/+/g, '/');\n\n if (value.length > 1 && value.endsWith('/')) {\n value = value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction shouldSkipHtmlRouting(url: string, pagesDir: string): boolean {\n return (\n url.startsWith('/@vite') ||\n url.startsWith('/@fs/') ||\n url.startsWith('/node_modules/') ||\n url.startsWith(`/${pagesDir}/`) ||\n url === '/favicon.ico' ||\n isStaticAssetRequest(url)\n );\n}\n\nfunction tryRewriteRootAssetToSrc(\n root: string,\n pagesDir: string,\n url: string,\n): string | null {\n if (!url.startsWith('/')) return null;\n if (!isStaticAssetRequest(url)) return null;\n if (url.startsWith(`/${pagesDir}/`)) return null;\n\n const candidate = path.join(root, pagesDir, url.slice(1));\n\n if (fs.existsSync(candidate)) {\n return `/${pagesDir}/${url.slice(1)}`;\n }\n\n return null;\n}\n\nfunction rewriteRootAssetUrlsInDevHtml(\n html: string,\n root: string,\n pagesDir: string,\n): string {\n return html.replace(\n /\\b(href|src)=[\"'](\\/[^\"']+)[\"']/g,\n (full, attr: string, url: string) => {\n if (!isStaticAssetRequest(url)) return full;\n if (url.startsWith(`/${pagesDir}/`)) return full;\n\n const candidate = path.join(root, pagesDir, url.slice(1));\n\n if (!fs.existsSync(candidate)) return full;\n\n return `${attr}=\"/${pagesDir}/${url.slice(1)}\"`;\n },\n );\n}\n\nexport function installDevServer(args: {\n server: ViteDevServer;\n root: string;\n pagesDir: string;\n getPages: () => Promise<HtPageInfo[]>;\n getEntries?: () => Promise<HtPageInfo[]>;\n}) {\n const { server, root, pagesDir, getPages } = args;\n const loadModulePromise = createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n server.middlewares.use(async (req, res, next) => {\n try {\n const originalUrl = req.url ?? '/';\n const url = normalizeRoutePath(originalUrl);\n\n const rewrittenAssetUrl = tryRewriteRootAssetToSrc(root, pagesDir, url);\n if (rewrittenAssetUrl) {\n req.url = rewrittenAssetUrl + originalUrl.slice(url.length);\n return next();\n }\n\n if (shouldSkipHtmlRouting(url, pagesDir)) {\n return next();\n }\n\n const pages = await getPages();\n const page = pages.find(\n (p) => normalizeRoutePath(p.routePath) === url,\n );\n\n if (!page) {\n return next();\n }\n\n const loadModule = await loadModulePromise;\n const mod = await loadModule(page.entryPath, page.relativePath);\n\n if (!mod) {\n return next();\n }\n\n const html = await renderPage(page, mod, true);\n\n const devHtml = rewriteRootAssetUrlsInDevHtml(\n html,\n root,\n pagesDir,\n );\n \n const transformedHtml = await server.transformIndexHtml(\n url,\n devHtml,\n req.originalUrl,\n );\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(transformedHtml);\n } catch (error) {\n server.config.logger.error(\n `[${PLUGIN_NAME}] dev server render failed: ${\n error instanceof Error ? error.stack ?? error.message : String(error)\n }`,\n );\n\n next(error as Error);\n }\n });\n}","import type { HtPageInfo } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nexport function invalidHtmlReturn(page: HtPageInfo, value: unknown): Error {\n const type =\n value === null\n ? 'null'\n : Array.isArray(value)\n ? 'array'\n : typeof value;\n\n return new Error(\n `[vite-plugin-html-pages] ${page.relativePath}: page render must return a string or a JSX/React renderable value, but received ${type}.`,\n );\n}\n\nexport function missingDefaultExport(page: HtPageInfo): Error {\n return new Error(\n `[${PLUGIN_NAME}] Page \"${page.relativePath}\" does not export a default renderer`,\n );\n}\n\nexport function pageError(page: HtPageInfo, cause: unknown): Error {\n const message = `[${PLUGIN_NAME}] Failed to render \"${page.relativePath}\" at route \"${page.routePath}\"`;\n\n if (cause instanceof Error) {\n const err = new Error(`${message}: ${cause.message}`);\n\n if (cause.stack) {\n err.stack = `${err.stack}\\nCaused by:\\n${cause.stack}`;\n }\n\n return err;\n }\n\n return new Error(`${message}: ${String(cause)}`);\n}","type WarnContext = {\n page: {\n routePath: string;\n relativePath?: string;\n };\n onWarn: (message: string) => void;\n };\n \n const warnedKeys = new Set<string>();\n \n function warnOnce(\n key: string,\n message: string,\n onWarn: (message: string) => void,\n ): void {\n if (warnedKeys.has(key)) return;\n warnedKeys.add(key);\n onWarn(message);\n }\n \n function isEventProp(name: string): boolean {\n return /^on[A-Z]/.test(name);\n }\n \n function getElementName(type: unknown): string {\n if (typeof type === 'string') {\n return `<${type}>`;\n }\n \n if (typeof type === 'function') {\n const maybeNamed = type as {\n displayName?: string;\n name?: string;\n };\n \n return maybeNamed.displayName || maybeNamed.name || 'AnonymousComponent';\n }\n \n return 'UnknownElement';\n }\n \n export async function validateStaticJsxTree(\n node: unknown,\n ctx: WarnContext,\n ): Promise<void> {\n const react = await import('react');\n const { isValidElement } = react;\n \n function inspectElement(el: any): void {\n const props = (el.props ?? {}) as Record<string, unknown>;\n \n for (const [key, value] of Object.entries(props)) {\n if (!isEventProp(key)) continue;\n if (typeof value !== 'function') continue;\n \n const elementName = getElementName(el.type);\n \n warnOnce(\n `${ctx.page.routePath}:${elementName}:${key}`,\n `[vite-plugin-html-pages] ${ctx.page.relativePath ?? ctx.page.routePath}: prop \"${key}\" on ${elementName} will not be interactive in static TSX/JSX output. Use a client script or future hydration/islands support instead.`,\n ctx.onWarn,\n );\n }\n }\n \n function walk(value: unknown): void {\n if (value == null || typeof value === 'boolean') return;\n if (typeof value === 'string' || typeof value === 'number') return;\n \n if (Array.isArray(value)) {\n for (const child of value) {\n walk(child);\n }\n return;\n }\n \n if (!isValidElement(value)) return;\n \n inspectElement(value);\n \n walk((value as any).props?.children);\n }\n \n walk(node);\n }","import { invalidHtmlReturn, pageError, missingDefaultExport } from './errors';\nimport { validateStaticJsxTree } from './react-static-validation';\nimport type {\n HtPageInfo,\n HtPageModule,\n HtPageRenderContext,\n HtPageRenderResult,\n HtStructuredPageModule,\n} from './types';\n\nfunction isStructuredPageModule(value: unknown): value is HtStructuredPageModule {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'render' in value &&\n typeof (value as { render?: unknown }).render === 'function'\n );\n}\n\nfunction ensureDoctype(html: string): string {\n const trimmed = html.trimStart();\n\n if (/^<!doctype html>/i.test(trimmed)) {\n return html;\n }\n\n if (/^<html[\\s>]/i.test(trimmed)) {\n return '<!DOCTYPE html>' + html;\n }\n\n return html;\n}\n\nasync function isRenderableReactResult(value: unknown): Promise<boolean> {\n try {\n const react = await import('react');\n return (\n value == null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n Array.isArray(value) ||\n react.isValidElement(value)\n );\n } catch {\n return false;\n }\n}\n\nasync function renderReactResult(value: unknown): Promise<string> {\n const { renderToStaticMarkup } = await import('react-dom/server');\n return renderToStaticMarkup(value as any);\n}\n\nasync function resolveRenderResult(\n page: HtPageInfo,\n mod: HtPageModule,\n ctx: HtPageRenderContext,\n): Promise<HtPageRenderResult> {\n const entry = mod.default;\n\n if (entry == null) {\n throw missingDefaultExport(page);\n }\n\n if (typeof entry === 'string') {\n return entry;\n }\n\n if (typeof entry === 'function') {\n return await entry(ctx);\n }\n\n if (isStructuredPageModule(entry)) {\n if (typeof entry.data === 'function') {\n ctx.data = await entry.data(ctx);\n }\n\n return await entry.render(ctx);\n }\n\n throw invalidHtmlReturn(page, entry);\n}\n\nasync function ensureReactAvailable(page: HtPageInfo): Promise<void> {\n try {\n await import('react');\n await import('react-dom/server');\n } catch {\n throw new Error(\n `[vite-plugin-html-pages] ${page.relativePath}: TSX/JSX page rendering requires \"react\" and \"react-dom\" to be installed in the consuming app.`,\n );\n }\n}\n\nexport async function renderPage(\n page: HtPageInfo,\n mod: HtPageModule,\n dev = false,\n): Promise<string> {\n const ctx: HtPageRenderContext = {\n page,\n params: page.params,\n dev,\n };\n\n try {\n if (typeof mod.data === 'function') {\n ctx.data = await mod.data(ctx);\n }\n\n const result = await resolveRenderResult(page, mod, ctx);\n\n if (typeof result === 'string') {\n return ensureDoctype(result);\n }\n \n await ensureReactAvailable(page);\n \n const looksReactRenderable = await isRenderableReactResult(result);\n\n if (!looksReactRenderable) {\n throw invalidHtmlReturn(page, result);\n }\n\n if (dev) {\n await validateStaticJsxTree(result, {\n page,\n onWarn(message) {\n console.warn(message);\n },\n });\n }\n\n const html = await renderReactResult(result);\n\n return ensureDoctype(html);\n } catch (error) {\n throw pageError(page, error);\n }\n}","import path from 'node:path';\nimport {\n createServer,\n isRunnableDevEnvironment,\n type InlineConfig,\n type ViteDevServer,\n} from 'vite';\n\nimport {\n VIRTUAL_PAGE_HELPER_ID,\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX,\n VIRTUAL_LOCAL_TYPES_PREFIX,\n} from './constants';\nimport { generateTypedPageHelper } from './page-helper-generator';\nimport type {\n HtPageInfo,\n HtPageModule,\n HtStructuredPageModule,\n} from './types';\n\nexport type PageModuleLoader = (\n entryPath: string,\n relativePath: string,\n) => Promise<HtPageModule>;\n\nlet buildServer: ViteDevServer | null = null;\n\nasync function importPageModule(\n server: ViteDevServer,\n url: string,\n): Promise<HtPageModule> {\n const environment = server.environments.ssr;\n\n if (!isRunnableDevEnvironment(environment)) {\n throw new Error(\n '[vite-plugin-html-pages] The Vite SSR environment is not runnable. ' +\n 'A RunnableDevEnvironment is required to evaluate page modules.',\n );\n }\n\n const mod = await environment.runner.import(url);\n\n return normalizeLoadedPageModule(mod);\n}\n\nfunction isStructuredPageModule(\n value: unknown,\n): value is HtStructuredPageModule {\n return (\n !!value &&\n typeof value === 'object' &&\n 'render' in value &&\n typeof (value as { render?: unknown }).render === 'function'\n );\n}\n\nfunction isLocalPageTypesImport(id: string): boolean {\n return /^\\.\\/\\$types(?:\\.[A-Za-z0-9_.-]+)?$/.test(id);\n}\n\nfunction normalizeLoadedPageModule(mod: unknown): HtPageModule {\n const pageModule = (mod ?? {}) as HtPageModule;\n\n if (isStructuredPageModule(pageModule.default)) {\n const structured = pageModule.default;\n\n return {\n default: structured.render,\n data: structured.data,\n generateStaticParams: structured.generateStaticParams,\n dynamic: structured.dynamic,\n prerender: structured.prerender,\n };\n }\n\n return pageModule;\n}\n\nexport async function createPageModuleLoader(args: {\n mode: 'dev' | 'build';\n root: string;\n server?: ViteDevServer | null;\n getPages?: () => Promise<HtPageInfo[]>;\n}): Promise<PageModuleLoader> {\n const { mode, root, server, getPages } = args;\n\n if (mode === 'dev') {\n if (!server) {\n throw new Error('[vite-plugin-html-pages] dev server not available');\n }\n\n return async (_entryPath, relativePath) =>\n importPageModule(server, `/${relativePath}`);\n }\n\n if (!getPages) {\n throw new Error(\n '[vite-plugin-html-pages] getPages is required in build mode',\n );\n }\n\n if (!buildServer) {\n const config: InlineConfig = {\n root,\n configFile: false,\n logLevel: 'error',\n appType: 'custom',\n esbuild: {\n jsx: 'automatic',\n jsxImportSource: 'vite-plugin-html-pages',\n },\n server: {\n middlewareMode: true,\n },\n plugins: [\n {\n name: 'vite-plugin-html-pages:page-helper',\n\n resolveId(id, importer) {\n if (id === VIRTUAL_PAGE_HELPER_ID && importer) {\n return `${RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX}${importer}`;\n }\n\n if (importer && isLocalPageTypesImport(id)) {\n return `${VIRTUAL_LOCAL_TYPES_PREFIX}${importer}::${id}`;\n }\n\n return null;\n },\n\n async load(id) {\n if (id.startsWith(VIRTUAL_LOCAL_TYPES_PREFIX)) {\n return `\nexport {\n definePage,\n defineData,\n defineStaticParams,\n definePageModule\n} from 'vite-plugin-html-pages/page';\n`;\n }\n\n if (!id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {\n return null;\n }\n\n const importer = id.slice(\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length,\n );\n\n const pages = await getPages();\n const normalizedImporter = path.resolve(importer);\n\n const page = pages.find(\n (candidate) =>\n path.resolve(candidate.absolutePath) === normalizedImporter,\n );\n\n return generateTypedPageHelper(page);\n },\n },\n ],\n };\n\n buildServer = await createServer(config);\n }\n\n return async (entryPath) => {\n const relativePath =\n '/' + path.relative(root, entryPath).replace(/\\\\/g, '/');\n\n return importPageModule(buildServer!, relativePath);\n };\n}\n\nexport async function closePageModuleLoader(): Promise<void> {\n if (buildServer) {\n await buildServer.close();\n buildServer = null;\n }\n}","import type { HtPageInfo, RouteParamDefinition } from './types';\n\nfunction paramsTypeFromDefinitions(\n paramDefinitions: RouteParamDefinition[],\n): string {\n if (paramDefinitions.length === 0) {\n return '{}';\n }\n\n const fields = paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return `${JSON.stringify(param.name)}: string`;\n }\n\n if (param.type === 'catch-all') {\n return `${JSON.stringify(param.name)}: string[]`;\n }\n\n return `${JSON.stringify(param.name)}?: string[]`;\n });\n\n return `{ ${fields.join('; ')} }`;\n}\n\nexport function generateTypedPageHelper(page?: HtPageInfo): string {\n const paramsType = page\n ? paramsTypeFromDefinitions(page.paramDefinitions ?? [])\n : '{}';\n\n return `\nexport type PageParams = ${paramsType};\n\nexport type StaticParams = PageParams[];\n\nexport type DataContext = {\n params: PageParams;\n dev: boolean;\n};\n\nexport type RenderContext<TData = unknown> = {\n params: PageParams;\n data: TData;\n dev: boolean;\n};\n\nexport type PageContext<TData = unknown> = {\n params: PageParams;\n data?: TData;\n dev: boolean;\n};\n\nexport type PageModule<TData = unknown> = {\n generateStaticParams?: () => StaticParams | Promise<StaticParams>;\n data?: (ctx: DataContext) => TData | Promise<TData>;\n render: (ctx: RenderContext<TData>) => any;\n};\n\nexport function definePage<T extends (ctx: PageContext) => any>(fn: T): T {\n return fn;\n}\n\nexport function defineData<T extends (ctx: DataContext) => any>(fn: T): T {\n return fn;\n}\n\nexport function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n>(fn: T): T {\n return fn;\n}\n\nexport function definePageModule<TData>(\n mod: PageModule<TData>,\n): PageModule<TData> {\n return mod;\n}\n`;\n}","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface HtmlAssetValidationOptions {\n root: string;\n pagesDir: string;\n html: string;\n pluginName: string;\n pageLabel?: string;\n missingAssets?: 'error' | 'warn';\n}\n\nfunction stripQueryAndHash(url: string): string {\n return url.split('#')[0].split('?')[0];\n}\n\nfunction isLocalRootUrl(url: string): boolean {\n return !!url && url.startsWith('/') && !url.startsWith('//');\n}\n\nfunction fileExistsForPublicUrl(root: string, pagesDir: string, url: string): boolean {\n const clean = stripQueryAndHash(url).slice(1);\n\n const fromSrc = path.join(root, pagesDir, clean);\n if (fs.existsSync(fromSrc)) return true;\n\n const fromPublic = path.join(root, 'public', clean);\n if (fs.existsSync(fromPublic)) return true;\n\n return false;\n}\n\nfunction collectScriptSrcs(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /<script\\b[^>]*\\bsrc=[\"']([^\"']+)[\"'][^>]*>/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction collectStylesheetHrefs(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /<link\\b[^>]*\\brel=[\"']stylesheet[\"'][^>]*\\bhref=[\"']([^\"']+)[\"'][^>]*>/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction collectLiteralDynamicImports(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /import\\s*\\(\\s*[\"']([^\"'`]+)[\"']\\s*\\)/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction formatPageLabel(pageLabel?: string): string {\n return pageLabel ? ` (${pageLabel})` : '';\n}\n\nfunction missingAssetMessage(args: {\n pluginName: string;\n kind: string;\n url: string;\n root: string;\n pagesDir: string;\n pageLabel?: string;\n}): string {\n const { pluginName, kind, url, root, pagesDir, pageLabel } = args;\n const clean = stripQueryAndHash(url).slice(1);\n const pageSuffix = formatPageLabel(pageLabel);\n\n return (\n `[${pluginName}] Missing ${kind}${pageSuffix}: ${url}\\n` +\n `Expected one of:\\n` +\n `- ${path.join(root, pagesDir, clean)}\\n` +\n `- ${path.join(root, 'public', clean)}`\n );\n}\n\nfunction reportMissing(args: {\n mode: 'error' | 'warn';\n pluginName: string;\n kind: string;\n url: string;\n root: string;\n pagesDir: string;\n pageLabel?: string;\n}) {\n const message = missingAssetMessage(args);\n\n if (args.mode === 'warn') {\n console.warn(`⚠️ ${message}`);\n return;\n }\n\n throw new Error(message);\n}\n\nexport function validateHtmlAssetReferences(\n options: HtmlAssetValidationOptions,\n): void {\n const {\n root,\n pagesDir,\n html,\n pluginName,\n pageLabel,\n missingAssets = 'error',\n } = options;\n\n const scriptSrcs = unique(collectScriptSrcs(html)).filter(isLocalRootUrl);\n const stylesheetHrefs = unique(collectStylesheetHrefs(html)).filter(isLocalRootUrl);\n const literalDynamicImports = unique(collectLiteralDynamicImports(html)).filter(\n isLocalRootUrl,\n );\n\n for (const url of scriptSrcs) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n reportMissing({\n mode: missingAssets,\n pluginName,\n kind: 'JavaScript asset',\n url,\n root,\n pagesDir,\n pageLabel,\n });\n }\n }\n\n for (const url of stylesheetHrefs) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n reportMissing({\n mode: missingAssets,\n pluginName,\n kind: 'stylesheet asset',\n url,\n root,\n pagesDir,\n pageLabel,\n });\n }\n }\n\n for (const url of literalDynamicImports) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n console.warn(\n `⚠️ ${missingAssetMessage({\n pluginName,\n kind: 'literal dynamic import',\n url,\n root,\n pagesDir,\n pageLabel,\n })}`,\n );\n }\n }\n}","import {\n compareRoutePriority,\n expandStaticPaths,\n fileNameFromRoute,\n} from './route-utils';\nimport type { HtPageInfo, HtPageModule } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nexport async function buildPageIndex(args: {\n entries: HtPageInfo[];\n modulesByEntry: Map<string, HtPageModule>;\n cleanUrls: boolean;\n}): Promise<HtPageInfo[]> {\n const { entries, modulesByEntry, cleanUrls } = args;\n const pages: HtPageInfo[] = [];\n\n for (const entry of entries) {\n const mod = modulesByEntry.get(entry.entryPath) ?? {};\n\n if (entry.dynamic) {\n const rows =\n (mod.generateStaticParams\n ? await mod.generateStaticParams()\n : []) ?? [];\n\n pages.push(\n ...expandStaticPaths(\n {\n id: entry.id,\n entryPath: entry.entryPath,\n absolutePath: entry.absolutePath,\n relativePath: entry.relativePath,\n routePattern: entry.routePattern,\n dynamic: entry.dynamic,\n paramNames: entry.paramNames,\n paramDefinitions: entry.paramDefinitions,\n },\n Array.isArray(rows) ? rows : [],\n cleanUrls,\n ),\n );\n } else {\n pages.push({\n ...entry,\n routePath: entry.routePattern,\n fileName: fileNameFromRoute(entry.routePattern, cleanUrls),\n params: {},\n });\n }\n }\n\n pages.sort((a, b) => compareRoutePriority(a.routePattern, b.routePattern));\n\n const seenRoutes = new Map<string, HtPageInfo>();\n\n for (const page of pages) {\n const existing = seenRoutes.get(page.routePath);\n\n if (existing) {\n throw new Error(\n `[${PLUGIN_NAME}] Duplicate route generated: \"${page.routePath}\" from \"${existing.relativePath}\" and \"${page.relativePath}\"`,\n );\n }\n\n seenRoutes.set(page.routePath, page);\n }\n\n return pages;\n}","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport * as esbuild from 'esbuild';\nimport fsSync from 'node:fs';\n\nexport interface StaticAssetFile {\n absolutePath: string;\n relativePathFromSrc: string;\n outputFileName: string;\n kind: 'copy' | 'process';\n}\n\nexport interface CollectStaticAssetsArgs {\n root: string;\n pagesDir: string;\n pageExtensions: string[];\n}\n\nfunction normalizeSlashes(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nfunction hasAnySuffix(value: string, suffixes: string[]): boolean {\n return suffixes.some((suffix) => value.endsWith(suffix));\n}\n\nfunction shouldIgnoreFile(rel: string): boolean {\n return (\n rel.endsWith('.d.ts') ||\n rel.endsWith('.map') ||\n rel.endsWith('.tsbuildinfo') ||\n rel.startsWith('.') ||\n rel.includes('/.')\n );\n}\n\nfunction isProcessableAsset(rel: string): boolean {\n return (\n rel.endsWith('.js') ||\n rel.endsWith('.mjs') ||\n rel.endsWith('.ts') ||\n rel.endsWith('.css')\n );\n}\n\nfunction toOutputFileName(relativePathFromSrc: string): string {\n if (relativePathFromSrc.endsWith('.ts')) {\n return relativePathFromSrc.slice(0, -3) + '.js';\n }\n return relativePathFromSrc;\n}\n\nexport async function collectStaticAssets(\n args: CollectStaticAssetsArgs,\n): Promise<StaticAssetFile[]> {\n const { root, pagesDir, pageExtensions } = args;\n const srcDir = path.join(root, pagesDir);\n\n const entries = await fg('**/*', {\n cwd: srcDir,\n onlyFiles: true,\n dot: false,\n absolute: false,\n });\n\n const assets: StaticAssetFile[] = [];\n\n for (const entry of entries) {\n const rel = normalizeSlashes(entry);\n\n if (shouldIgnoreFile(rel)) continue;\n if (hasAnySuffix(rel, pageExtensions)) continue;\n\n const absolutePath = path.join(srcDir, rel);\n\n assets.push({\n absolutePath,\n relativePathFromSrc: rel,\n outputFileName: normalizeSlashes(toOutputFileName(rel)),\n kind: isProcessableAsset(rel) ? 'process' : 'copy',\n });\n }\n\n return assets;\n}\n\nexport async function copyStaticAssetSource(\n asset: StaticAssetFile,\n): Promise<Uint8Array> {\n return fs.readFile(asset.absolutePath);\n}\n\nexport async function buildProcessedStaticAssets(args: {\n root: string;\n pagesDir: string;\n assets: StaticAssetFile[];\n minify?: boolean;\n sourcemap?: boolean;\n }): Promise<Map<string, string | Uint8Array>> {\n const { root, pagesDir, assets, minify = true, sourcemap = false } = args;\n \n const processable = assets.filter((a) => a.kind === 'process');\n const out = new Map<string, string | Uint8Array>();\n \n if (processable.length === 0) {\n return out;\n }\n \n const srcDir = path.join(root, pagesDir);\n const distDir = path.join(root, 'dist');\n const warnedMissingAssets = new Set<string>();\n const result = await esbuild.build({\n entryPoints: processable.map((a) => a.absolutePath),\n absWorkingDir: root,\n outbase: srcDir,\n outdir: distDir,\n bundle: true,\n splitting: true,\n treeShaking: true,\n minify,\n sourcemap,\n format: 'esm',\n target: 'esnext',\n platform: 'browser',\n write: false,\n entryNames: '[dir]/[name]',\n assetNames: '[dir]/[name]',\n loader: {\n '.css': 'css',\n '.png': 'file',\n '.jpg': 'file',\n '.jpeg': 'file',\n '.gif': 'file',\n '.svg': 'file',\n '.webp': 'file',\n '.woff': 'file',\n '.woff2': 'file',\n '.ttf': 'file',\n '.otf': 'file',\n },\n plugins: [\n {\n name: 'html-pages-root-url-resolver',\n setup(build) {\n build.onResolve({ filter: /^\\// }, (resolveArgs) => {\n // Leave real filesystem absolute paths alone\n if (\n path.isAbsolute(resolveArgs.path) &&\n fsSync.existsSync(resolveArgs.path)\n ) {\n return { path: resolveArgs.path };\n }\n \n const cleanPath = resolveArgs.path.slice(1);\n \n const fromSrc = path.join(srcDir, cleanPath);\n if (fsSync.existsSync(fromSrc)) {\n return { path: fromSrc };\n }\n \n const fromPublic = path.join(root, 'public', cleanPath);\n if (fsSync.existsSync(fromPublic)) {\n return {\n path: resolveArgs.path,\n external: true,\n };\n }\n \n const isCssUrlToken = resolveArgs.kind === 'url-token';\n \n if (isCssUrlToken) {\n if (!warnedMissingAssets.has(resolveArgs.path)) {\n warnedMissingAssets.add(resolveArgs.path);\n console.warn(\n `[vite-plugin-html-pages] ⚠️ Missing CSS asset: ${resolveArgs.path}\\n` +\n ` Looked in:\\n` +\n ` - ${fromSrc}\\n` +\n ` - ${fromPublic}`\n );\n }\n \n // Keep the original root-relative URL in output CSS\n return {\n path: resolveArgs.path,\n external: true,\n };\n }\n \n // JS/CSS entry imports remain strict\n return {\n path: fromSrc,\n };\n });\n },\n },\n ],\n });\n \n for (const file of result.outputFiles) {\n const rel = normalizeSlashes(path.relative(distDir, file.path));\n out.set(rel, file.text ?? file.contents);\n }\n \n return out;\n }\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { CACHE_DIR_NAME } from './constants';\n\nexport type FetchCacheMode = 'auto' | 'memory' | 'fs' | 'none';\nexport interface FetchWithCacheOptions {\n maxAge?: number;\n cacheKey?: string;\n forceRefresh?: boolean;\n cache?: FetchCacheMode;\n}\n\ntype CachedResponseRecord = {\n timestamp: number;\n status: number;\n statusText: string;\n headers: [string, string][];\n body: string;\n};\n\nconst memoryCache = new Map<string, CachedResponseRecord>();\n\nfunction createDefaultCacheKey(\n input: RequestInfo | URL,\n init?: RequestInit,\n): string {\n const raw = JSON.stringify({\n url: String(input),\n method: init?.method ?? 'GET',\n headers: init?.headers ?? {},\n body: init?.body ?? null,\n });\n\n return createHash('sha256').update(raw).digest('hex');\n}\n\nfunction getCacheFilePath(cacheKey: string): string {\n return path.join(process.cwd(), CACHE_DIR_NAME, 'fetch', `${cacheKey}.json`);\n}\n\nfunction getEffectiveCacheMode(\n mode: FetchCacheMode | undefined,\n): Exclude<FetchCacheMode, 'auto'> {\n if (mode === 'memory' || mode === 'fs' || mode === 'none') {\n return mode;\n }\n\n return process.env.NODE_ENV === 'production' ? 'fs' : 'memory';\n}\n\nfunction toResponse(cached: CachedResponseRecord): Response {\n return new Response(cached.body, {\n status: cached.status,\n statusText: cached.statusText,\n headers: cached.headers,\n });\n}\n\nfunction isFresh(cached: CachedResponseRecord, maxAgeSeconds: number): boolean {\n const ageSeconds = (Date.now() - cached.timestamp) / 1000;\n return ageSeconds <= maxAgeSeconds;\n}\n\nexport function clearMemoryFetchCache(): void {\n memoryCache.clear();\n}\n\nexport function deleteMemoryFetchCache(cacheKey: string): void {\n memoryCache.delete(cacheKey);\n}\n\nexport async function fetchWithCache(\n input: RequestInfo | URL,\n init?: RequestInit,\n options: FetchWithCacheOptions = {},\n): Promise<Response> {\n const maxAge = options.maxAge ?? 60 * 60;\n const method = (init?.method ?? 'GET').toUpperCase();\n\n if (method !== 'GET' && !options.cacheKey) {\n return fetch(input, init);\n }\n\n const cacheMode = getEffectiveCacheMode(options.cache);\n const cacheKey = options.cacheKey ?? createDefaultCacheKey(input, init);\n\n if (cacheMode === 'none') {\n return fetch(input, init);\n }\n\n if (cacheMode === 'memory' && !options.forceRefresh) {\n const cached = memoryCache.get(cacheKey);\n\n if (cached && isFresh(cached, maxAge)) {\n return toResponse(cached);\n }\n }\n\n const filePath = getCacheFilePath(cacheKey);\n\n if (cacheMode === 'fs') {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n if (!options.forceRefresh) {\n try {\n const raw = await fs.readFile(filePath, 'utf8');\n const cached = JSON.parse(raw) as CachedResponseRecord;\n\n if (isFresh(cached, maxAge)) {\n return toResponse(cached);\n }\n } catch {\n // cache miss or invalid cache; fetch fresh\n }\n }\n }\n\n const res = await fetch(input, init);\n const body = await res.text();\n\n const record: CachedResponseRecord = {\n timestamp: Date.now(),\n status: res.status,\n statusText: res.statusText,\n headers: [...res.headers.entries()],\n body,\n };\n\n if (cacheMode === 'memory') {\n memoryCache.set(cacheKey, record);\n } else if (cacheMode === 'fs') {\n await fs.writeFile(filePath, JSON.stringify(record), 'utf8');\n }\n\n return new Response(body, {\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n });\n}\n"],"mappings":"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","names":["fs","path","path","path","fs","path","path","fg","path","fs","path","path","paramsTypeFromDefinitions","isStructuredPageModule","path","normalizeRoutePath","path","fs","fs","path","fs","path","build","path","fs","isLocalPageTypesImport","fs","path","path","fs","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-html-pages",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "author": "Paul Browne",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -79,7 +79,8 @@
79
79
  "esbuild": "^0.27.5",
80
80
  "fast-glob": "^3.3.3",
81
81
  "javascript-to-html": "^1.1.3",
82
- "p-limit": "^4.0.0"
82
+ "p-limit": "^4.0.0",
83
+ "picocolors": "^1.1.1"
83
84
  },
84
85
  "engines": {
85
86
  "node": ">=18"