vite-plugin-html-pages 1.6.2 → 1.6.4

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
2
  import fs5 from "fs";
3
- import path9 from "path";
3
+ import path8 from "path";
4
4
  import { fileURLToPath, pathToFileURL } from "url";
5
5
  import { transform as esbuildTransform } from "esbuild";
6
6
  import pLimit from "p-limit";
@@ -210,22 +210,19 @@ async function writePageTypeDeclarations(args) {
210
210
  expectedFiles
211
211
  });
212
212
  }
213
- function getGeneratedHelperImportPath(args) {
214
- const pagesRoot = normalizeFsPath(path2.join(args.root, args.pagesDir));
215
- const relativeFromPagesDir = toPosix(
216
- path2.relative(pagesRoot, args.page.absolutePath)
217
- );
218
- const withoutExt = stripPageExtension(relativeFromPagesDir);
219
- const dir = path2.dirname(withoutExt);
220
- const fileName = getTypesFileName(args.page).replace(/\.d\.ts$/, "");
221
- if (dir === "." || dir === "") {
222
- return `./${fileName}`;
223
- }
224
- return `./${fileName}`;
225
- }
226
213
 
227
- // src/page-helper-inject.ts
228
- import path4 from "path";
214
+ // src/constants.ts
215
+ var PLUGIN_NAME = "vite-plugin-html-pages";
216
+ var VIRTUAL_BUILD_ENTRY_ID = `\0${PLUGIN_NAME}:build-entry`;
217
+ var VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;
218
+ var RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX = `\0${PLUGIN_NAME}/page:`;
219
+ var VIRTUAL_MANIFEST_ID = `\0virtual:${PLUGIN_NAME}-manifest`;
220
+ var CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;
221
+ var VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;
222
+ var VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;
223
+ var RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\0${VIRTUAL_JSX_RUNTIME_ID}`;
224
+ var RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;
225
+ var VIRTUAL_LOCAL_TYPES_PREFIX = `\0${PLUGIN_NAME}:local-types:`;
229
226
 
230
227
  // src/discover.ts
231
228
  import path3 from "path";
@@ -369,19 +366,6 @@ function extractRouteParamDefinitions(routePattern) {
369
366
  return routePattern.split("/").filter(Boolean).map((segment) => parseRouteParamSegment(segment)).filter((value) => value != null);
370
367
  }
371
368
 
372
- // src/constants.ts
373
- var PLUGIN_NAME = "vite-plugin-html-pages";
374
- var VIRTUAL_BUILD_ENTRY_ID = `\0${PLUGIN_NAME}:build-entry`;
375
- var VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;
376
- var RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX = `\0${PLUGIN_NAME}/page:`;
377
- var VIRTUAL_MANIFEST_ID = `\0virtual:${PLUGIN_NAME}-manifest`;
378
- var CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;
379
- var VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;
380
- var VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;
381
- var RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\0${VIRTUAL_JSX_RUNTIME_ID}`;
382
- var RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;
383
- var VIRTUAL_LOCAL_TYPES_PREFIX = `\0${PLUGIN_NAME}:local-types:`;
384
-
385
369
  // src/discover.ts
386
370
  function buildDefaultIncludeGlobs(pagesDir, pageExtensions) {
387
371
  return pageExtensions.map((ext) => {
@@ -430,47 +414,9 @@ async function discoverEntryPages(root, options) {
430
414
  });
431
415
  }
432
416
 
433
- // src/page-helper-inject.ts
434
- function hasPageHelperImport(code) {
435
- return code.includes(`from './$types`) || code.includes(`from "./$types`) || code.includes(`from 'vite-plugin-html-pages/page'`) || code.includes(`from "vite-plugin-html-pages/page"`);
436
- }
437
- function usesPageHelper(code) {
438
- return code.includes("definePage(") || code.includes("defineData(") || code.includes("defineStaticParams(") || code.includes("definePageModule(");
439
- }
440
- async function findEntryByAbsolutePath(args) {
441
- const entries = await discoverEntryPages(args.root, args.options);
442
- const normalized = path4.resolve(args.absolutePath);
443
- return entries.find(
444
- (entry) => path4.resolve(entry.absolutePath) === normalized
445
- );
446
- }
447
- async function injectPageHelperImport(args) {
448
- const { code, absolutePath, root, pagesDir, options } = args;
449
- if (hasPageHelperImport(code) || !usesPageHelper(code)) {
450
- return code;
451
- }
452
- const entry = await findEntryByAbsolutePath({
453
- root,
454
- options,
455
- absolutePath
456
- });
457
- if (!entry) {
458
- return code;
459
- }
460
- const helperImportPath = getGeneratedHelperImportPath({
461
- root,
462
- pagesDir,
463
- page: entry
464
- });
465
- return `import { definePage, defineData, defineStaticParams, definePageModule } from ${JSON.stringify(
466
- helperImportPath
467
- )};
468
- ${code}`;
469
- }
470
-
471
417
  // src/dev-server.ts
472
418
  import fs2 from "fs";
473
- import path6 from "path";
419
+ import path5 from "path";
474
420
 
475
421
  // src/errors.ts
476
422
  function invalidHtmlReturn(page, value) {
@@ -523,7 +469,7 @@ async function renderPage(page, mod, dev = false) {
523
469
  }
524
470
 
525
471
  // src/module-loader.ts
526
- import path5 from "path";
472
+ import path4 from "path";
527
473
  import { createServer } from "vite";
528
474
 
529
475
  // src/page-helper-generator.ts
@@ -617,7 +563,7 @@ function normalizeLoadedPageModule(mod) {
617
563
  return pageModule;
618
564
  }
619
565
  async function createPageModuleLoader(args) {
620
- const { mode, root, pagesDir, options, server, getPages } = args;
566
+ const { mode, root, server, getPages } = args;
621
567
  if (mode === "dev") {
622
568
  if (!server) {
623
569
  throw new Error("[vite-plugin-html-pages] dev server not available");
@@ -675,28 +621,11 @@ export {
675
621
  RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length
676
622
  );
677
623
  const pages = await getPages();
678
- const normalizedImporter = path5.resolve(importer);
624
+ const normalizedImporter = path4.resolve(importer);
679
625
  const page = pages.find(
680
- (candidate) => path5.resolve(candidate.absolutePath) === normalizedImporter
626
+ (candidate) => path4.resolve(candidate.absolutePath) === normalizedImporter
681
627
  );
682
628
  return generateTypedPageHelper(page);
683
- },
684
- async transform(code, id) {
685
- const normalizedId = id.split("?")[0].replace(/\\/g, "/");
686
- const transformedCode = await injectPageHelperImport({
687
- code,
688
- absolutePath: normalizedId,
689
- root,
690
- pagesDir,
691
- options
692
- });
693
- if (transformedCode === code) {
694
- return null;
695
- }
696
- return {
697
- code: transformedCode,
698
- map: null
699
- };
700
629
  }
701
630
  }
702
631
  ]
@@ -704,7 +633,7 @@ export {
704
633
  buildServer = await createServer(config);
705
634
  }
706
635
  return async (entryPath) => {
707
- const relativePath = "/" + path5.relative(root, entryPath).replace(/\\/g, "/");
636
+ const relativePath = "/" + path4.relative(root, entryPath).replace(/\\/g, "/");
708
637
  const mod = await buildServer.ssrLoadModule(relativePath);
709
638
  return normalizeLoadedPageModule(mod);
710
639
  };
@@ -727,15 +656,12 @@ function tryRewriteRootAssetToSrc(root, pagesDir, url) {
727
656
  if (!url.startsWith("/")) return null;
728
657
  if (!isStaticAssetRequest(url)) return null;
729
658
  if (url.startsWith(`/${pagesDir}/`)) return null;
730
- const candidate = path6.join(root, pagesDir, url.slice(1));
659
+ const candidate = path5.join(root, pagesDir, url.slice(1));
731
660
  if (fs2.existsSync(candidate)) {
732
661
  return `/${pagesDir}/${url.slice(1)}`;
733
662
  }
734
663
  return null;
735
664
  }
736
- function shouldUseDynamicRendering(mod) {
737
- return mod.dynamic === true || mod.prerender === false;
738
- }
739
665
  function installDevServer(args) {
740
666
  const { server, root, pagesDir, getPages } = args;
741
667
  server.middlewares.use(async (req, res, next) => {
@@ -764,9 +690,6 @@ function installDevServer(args) {
764
690
  if (!mod) {
765
691
  return next();
766
692
  }
767
- if (!shouldUseDynamicRendering(mod) && page.dynamic) {
768
- return next();
769
- }
770
693
  const html = await renderPage(page, mod, true);
771
694
  const transformedHtml = await server.transformIndexHtml(
772
695
  url,
@@ -787,7 +710,7 @@ function installDevServer(args) {
787
710
 
788
711
  // src/html-asset-validator.ts
789
712
  import fs3 from "fs";
790
- import path7 from "path";
713
+ import path6 from "path";
791
714
  function stripQueryAndHash(url) {
792
715
  return url.split("#")[0].split("?")[0];
793
716
  }
@@ -796,9 +719,9 @@ function isLocalRootUrl(url) {
796
719
  }
797
720
  function fileExistsForPublicUrl(root, pagesDir, url) {
798
721
  const clean = stripQueryAndHash(url).slice(1);
799
- const fromSrc = path7.join(root, pagesDir, clean);
722
+ const fromSrc = path6.join(root, pagesDir, clean);
800
723
  if (fs3.existsSync(fromSrc)) return true;
801
- const fromPublic = path7.join(root, "public", clean);
724
+ const fromPublic = path6.join(root, "public", clean);
802
725
  if (fs3.existsSync(fromPublic)) return true;
803
726
  return false;
804
727
  }
@@ -841,8 +764,8 @@ function missingAssetMessage(args) {
841
764
  const pageSuffix = formatPageLabel(pageLabel);
842
765
  return `[${pluginName}] Missing ${kind}${pageSuffix}: ${url}
843
766
  Expected one of:
844
- - ${path7.join(root, pagesDir, clean)}
845
- - ${path7.join(root, "public", clean)}`;
767
+ - ${path6.join(root, pagesDir, clean)}
768
+ - ${path6.join(root, "public", clean)}`;
846
769
  }
847
770
  function reportMissing(args) {
848
771
  const message = missingAssetMessage(args);
@@ -957,7 +880,7 @@ async function buildPageIndex(args) {
957
880
 
958
881
  // src/static-assets.ts
959
882
  import fs4 from "fs/promises";
960
- import path8 from "path";
883
+ import path7 from "path";
961
884
  import fg from "fast-glob";
962
885
  import * as esbuild from "esbuild";
963
886
  import fsSync from "fs";
@@ -981,7 +904,7 @@ function toOutputFileName(relativePathFromSrc) {
981
904
  }
982
905
  async function collectStaticAssets(args) {
983
906
  const { root, pagesDir, pageExtensions } = args;
984
- const srcDir = path8.join(root, pagesDir);
907
+ const srcDir = path7.join(root, pagesDir);
985
908
  const entries = await fg("**/*", {
986
909
  cwd: srcDir,
987
910
  onlyFiles: true,
@@ -993,7 +916,7 @@ async function collectStaticAssets(args) {
993
916
  const rel = normalizeSlashes(entry);
994
917
  if (shouldIgnoreFile(rel)) continue;
995
918
  if (hasAnySuffix(rel, pageExtensions)) continue;
996
- const absolutePath = path8.join(srcDir, rel);
919
+ const absolutePath = path7.join(srcDir, rel);
997
920
  assets.push({
998
921
  absolutePath,
999
922
  relativePathFromSrc: rel,
@@ -1013,8 +936,8 @@ async function buildProcessedStaticAssets(args) {
1013
936
  if (processable.length === 0) {
1014
937
  return out;
1015
938
  }
1016
- const srcDir = path8.join(root, pagesDir);
1017
- const distDir = path8.join(root, "dist");
939
+ const srcDir = path7.join(root, pagesDir);
940
+ const distDir = path7.join(root, "dist");
1018
941
  const warnedMissingAssets = /* @__PURE__ */ new Set();
1019
942
  const result = await esbuild.build({
1020
943
  entryPoints: processable.map((a) => a.absolutePath),
@@ -1050,15 +973,15 @@ async function buildProcessedStaticAssets(args) {
1050
973
  name: "html-pages-root-url-resolver",
1051
974
  setup(build2) {
1052
975
  build2.onResolve({ filter: /^\// }, (resolveArgs) => {
1053
- if (path8.isAbsolute(resolveArgs.path) && fsSync.existsSync(resolveArgs.path)) {
976
+ if (path7.isAbsolute(resolveArgs.path) && fsSync.existsSync(resolveArgs.path)) {
1054
977
  return { path: resolveArgs.path };
1055
978
  }
1056
979
  const cleanPath = resolveArgs.path.slice(1);
1057
- const fromSrc = path8.join(srcDir, cleanPath);
980
+ const fromSrc = path7.join(srcDir, cleanPath);
1058
981
  if (fsSync.existsSync(fromSrc)) {
1059
982
  return { path: fromSrc };
1060
983
  }
1061
- const fromPublic = path8.join(root, "public", cleanPath);
984
+ const fromPublic = path7.join(root, "public", cleanPath);
1062
985
  if (fsSync.existsSync(fromPublic)) {
1063
986
  return {
1064
987
  path: resolveArgs.path,
@@ -1090,7 +1013,7 @@ async function buildProcessedStaticAssets(args) {
1090
1013
  ]
1091
1014
  });
1092
1015
  for (const file of result.outputFiles) {
1093
- const rel = normalizeSlashes(path8.relative(distDir, file.path));
1016
+ const rel = normalizeSlashes(path7.relative(distDir, file.path));
1094
1017
  out.set(rel, file.text ?? file.contents);
1095
1018
  }
1096
1019
  return out;
@@ -1098,10 +1021,10 @@ async function buildProcessedStaticAssets(args) {
1098
1021
 
1099
1022
  // src/plugin.ts
1100
1023
  var hasWarnedESM = false;
1101
- var pluginDir = path9.dirname(fileURLToPath(import.meta.url));
1024
+ var pluginDir = path8.dirname(fileURLToPath(import.meta.url));
1102
1025
  function warnIfNotESM(root) {
1103
1026
  try {
1104
- const pkgPath = path9.join(root, "package.json");
1027
+ const pkgPath = path8.join(root, "package.json");
1105
1028
  if (!fs5.existsSync(pkgPath)) return;
1106
1029
  const pkg = JSON.parse(fs5.readFileSync(pkgPath, "utf8"));
1107
1030
  if (pkg.type !== "module") {
@@ -1154,13 +1077,6 @@ function htPages(options = {}) {
1154
1077
  if (!enabled) return;
1155
1078
  console.log(`[${PLUGIN_NAME}]`, ...args);
1156
1079
  }
1157
- async function findEntryByAbsolutePath2(absolutePath) {
1158
- const entries = await discoverEntryPages(root, options);
1159
- const normalized = path9.resolve(absolutePath);
1160
- return entries.find(
1161
- (entry) => path9.resolve(entry.absolutePath) === normalized
1162
- );
1163
- }
1164
1080
  async function loadDevPages() {
1165
1081
  const entries = await discoverEntryPages(root, options);
1166
1082
  await writePageTypeDeclarations({
@@ -1178,8 +1094,6 @@ function htPages(options = {}) {
1178
1094
  const loadModule = await createPageModuleLoader({
1179
1095
  mode: "dev",
1180
1096
  root,
1181
- pagesDir,
1182
- options,
1183
1097
  server
1184
1098
  });
1185
1099
  for (const entry of entries) {
@@ -1209,8 +1123,6 @@ function htPages(options = {}) {
1209
1123
  const loadModule = await createPageModuleLoader({
1210
1124
  mode: "build",
1211
1125
  root,
1212
- pagesDir,
1213
- options,
1214
1126
  getPages: async () => entries
1215
1127
  });
1216
1128
  for (const entry of entries) {
@@ -1271,23 +1183,23 @@ function htPages(options = {}) {
1271
1183
  if (id === RESOLVED_VIRTUAL_JSX_RUNTIME_ID) {
1272
1184
  return `
1273
1185
  export { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(
1274
- pathToFileURL(path9.join(pluginDir, "jsx-runtime.js")).href
1186
+ pathToFileURL(path8.join(pluginDir, "jsx-runtime.js")).href
1275
1187
  )};
1276
1188
  `;
1277
1189
  }
1278
1190
  if (id === RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID) {
1279
1191
  return `
1280
1192
  export { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(
1281
- pathToFileURL(path9.join(pluginDir, "jsx-dev-runtime.js")).href
1193
+ pathToFileURL(path8.join(pluginDir, "jsx-dev-runtime.js")).href
1282
1194
  )};
1283
1195
  `;
1284
1196
  }
1285
1197
  if (id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {
1286
1198
  const importer = id.slice(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length);
1287
1199
  const { pages } = await buildPagesPipeline();
1288
- const normalizedImporter = path9.resolve(importer);
1200
+ const normalizedImporter = path8.resolve(importer);
1289
1201
  const page = pages.find(
1290
- (candidate) => path9.resolve(candidate.absolutePath) === normalizedImporter
1202
+ (candidate) => path8.resolve(candidate.absolutePath) === normalizedImporter
1291
1203
  );
1292
1204
  return generateTypedPageHelper(page);
1293
1205
  }
@@ -1308,14 +1220,7 @@ export {
1308
1220
  if (!isHtJsxFile(normalizedId)) {
1309
1221
  return null;
1310
1222
  }
1311
- const transformedCode = await injectPageHelperImport({
1312
- code,
1313
- absolutePath: normalizedId,
1314
- root,
1315
- pagesDir,
1316
- options
1317
- });
1318
- const result = await esbuildTransform(transformedCode, {
1223
+ const result = await esbuildTransform(code, {
1319
1224
  loader: isHtTsxFile(normalizedId) ? "tsx" : "jsx",
1320
1225
  format: "esm",
1321
1226
  jsx: "automatic",
@@ -1330,7 +1235,7 @@ export {
1330
1235
  };
1331
1236
  },
1332
1237
  configResolved(resolved) {
1333
- root = options.root ? path9.resolve(resolved.root, options.root) : resolved.root;
1238
+ root = options.root ? path8.resolve(resolved.root, options.root) : resolved.root;
1334
1239
  if (!hasWarnedESM) {
1335
1240
  warnIfNotESM(root);
1336
1241
  hasWarnedESM = true;
@@ -1374,7 +1279,7 @@ export {
1374
1279
  if (!watcherAttached) {
1375
1280
  watcherAttached = true;
1376
1281
  const reload = async (file) => {
1377
- if (!file.includes(`${path9.sep}${pagesDir}${path9.sep}`) && !file.includes(`/${pagesDir}/`)) {
1282
+ if (!file.includes(`${path8.sep}${pagesDir}${path8.sep}`) && !file.includes(`/${pagesDir}/`)) {
1378
1283
  return;
1379
1284
  }
1380
1285
  logDebug(options.debug, "file changed", file);
@@ -1603,7 +1508,7 @@ ${rssItems}
1603
1508
 
1604
1509
  // src/fetch-cache.ts
1605
1510
  import fs6 from "fs/promises";
1606
- import path10 from "path";
1511
+ import path9 from "path";
1607
1512
  import { createHash } from "crypto";
1608
1513
  var memoryCache = /* @__PURE__ */ new Map();
1609
1514
  function createDefaultCacheKey(input, init) {
@@ -1616,7 +1521,7 @@ function createDefaultCacheKey(input, init) {
1616
1521
  return createHash("sha256").update(raw).digest("hex");
1617
1522
  }
1618
1523
  function getCacheFilePath(cacheKey) {
1619
- return path10.join(process.cwd(), CACHE_DIR_NAME, "fetch", `${cacheKey}.json`);
1524
+ return path9.join(process.cwd(), CACHE_DIR_NAME, "fetch", `${cacheKey}.json`);
1620
1525
  }
1621
1526
  function getEffectiveCacheMode(mode) {
1622
1527
  if (mode === "memory" || mode === "fs" || mode === "none") {
@@ -1654,7 +1559,7 @@ async function fetchWithCache(input, init, options = {}) {
1654
1559
  }
1655
1560
  const filePath = getCacheFilePath(cacheKey);
1656
1561
  if (cacheMode === "fs") {
1657
- await fs6.mkdir(path10.dirname(filePath), { recursive: true });
1562
+ await fs6.mkdir(path9.dirname(filePath), { recursive: true });
1658
1563
  if (!options.forceRefresh) {
1659
1564
  try {
1660
1565
  const raw = await fs6.readFile(filePath, "utf8");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts","../src/typegen.ts","../src/path-utils.ts","../src/page-helper-inject.ts","../src/discover.ts","../src/route-utils.ts","../src/route-params.ts","../src/constants.ts","../src/dev-server.ts","../src/errors.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, getGeneratedHelperImportPath } from './typegen';\nimport { injectPageHelperImport } from './page-helper-inject';\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\nfunction hasPageHelperImport(code: string): boolean {\n return (\n code.includes(`from './$types`) ||\n code.includes(`from \"./$types`) ||\n code.includes(`from 'vite-plugin-html-pages/page'`) ||\n code.includes(`from \"vite-plugin-html-pages/page\"`)\n );\n}\n\nfunction usesPageHelper(code: string): boolean {\n return (\n code.includes('definePage(') ||\n code.includes('defineData(') ||\n code.includes('defineStaticParams(') ||\n code.includes('definePageModule(')\n );\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 findEntryByAbsolutePath(absolutePath: string): Promise<HtPageInfo | undefined> {\n const entries = await discoverEntryPages(root, options);\n const normalized = path.resolve(absolutePath);\n \n return entries.find(\n (entry) => path.resolve(entry.absolutePath) === normalized,\n );\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 pagesDir,\n options,\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 pagesDir,\n options,\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 // let transformedCode = code;\n\n // if (!hasPageHelperImport(code) && usesPageHelper(code)) {\n // const entry = await findEntryByAbsolutePath(normalizedId);\n \n // if (entry) {\n // const helperImportPath = getGeneratedHelperImportPath({\n // root,\n // pagesDir,\n // page: entry,\n // });\n \n // transformedCode =\n // `import { definePage, defineData, defineStaticParams, definePageModule } from ${JSON.stringify(helperImportPath)};\\n` +\n // code;\n // }\n // } \n \n const transformedCode = await injectPageHelperImport({\n code,\n absolutePath: normalizedId,\n root,\n pagesDir,\n options,\n }); \n\n const result = await esbuildTransform(transformedCode, {\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: 'es2020',\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 reload = async (file: string) => {\n if (\n !file.includes(`${path.sep}${pagesDir}${path.sep}`) &&\n !file.includes(`/${pagesDir}/`)\n ) {\n return;\n }\n\n logDebug(options.debug, 'file changed', file);\n\n await loadDevPages();\n\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n };\n\n server.watcher.on('add', reload);\n server.watcher.on('change', reload);\n server.watcher.on('unlink', reload);\n }\n\n loadDevPages().catch((error) => {\n server?.config.logger.error(\n `[${PLUGIN_NAME}] loadDevPages failed: ${\n error instanceof Error ? error.stack ?? error.message : String(error)\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\n return `export 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>) => string | Promise<string>;\n};\n\nexport declare function definePage<\n T extends (ctx: PageContext) => string | Promise<string>\n>(fn: T): T;\n\nexport declare function defineData<\n T extends (ctx: DataContext) => unknown | Promise<unknown>\n>(fn: T): T;\n\nexport declare function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n>(fn: T): T;\n\nexport 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}\n\nexport function getGeneratedHelperImportPath(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 dir = path.dirname(withoutExt);\n const fileName = getTypesFileName(args.page).replace(/\\.d\\.ts$/, '');\n \n if (dir === '.' || dir === '') {\n return `./${fileName}`;\n }\n \n return `./${fileName}`;\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 path from 'node:path';\nimport type { HtPageInfo, HtPagesPluginOptions } from './types';\nimport { discoverEntryPages } from './discover';\nimport { getGeneratedHelperImportPath } from './typegen';\n\nexport function hasPageHelperImport(code: string): boolean {\n return (\n code.includes(`from './$types`) ||\n code.includes(`from \"./$types`) ||\n code.includes(`from 'vite-plugin-html-pages/page'`) ||\n code.includes(`from \"vite-plugin-html-pages/page\"`)\n );\n}\n\nexport function usesPageHelper(code: string): boolean {\n return (\n code.includes('definePage(') ||\n code.includes('defineData(') ||\n code.includes('defineStaticParams(') ||\n code.includes('definePageModule(')\n );\n}\n\nexport async function findEntryByAbsolutePath(args: {\n root: string;\n options: HtPagesPluginOptions;\n absolutePath: string;\n}): Promise<HtPageInfo | undefined> {\n const entries = await discoverEntryPages(args.root, args.options);\n const normalized = path.resolve(args.absolutePath);\n\n return entries.find(\n (entry) => path.resolve(entry.absolutePath) === normalized,\n );\n}\n\nexport async function injectPageHelperImport(args: {\n code: string;\n absolutePath: string;\n root: string;\n pagesDir: string;\n options: HtPagesPluginOptions;\n}): Promise<string> {\n const { code, absolutePath, root, pagesDir, options } = args;\n\n if (hasPageHelperImport(code) || !usesPageHelper(code)) {\n return code;\n }\n\n const entry = await findEntryByAbsolutePath({\n root,\n options,\n absolutePath,\n });\n\n if (!entry) {\n return code;\n }\n\n const helperImportPath = getGeneratedHelperImportPath({\n root,\n pagesDir,\n page: entry,\n });\n\n return `import { definePage, defineData, defineStaticParams, definePageModule } from ${JSON.stringify(\n helperImportPath,\n )};\\n${code}`;\n}","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}","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 fs from 'node:fs';\nimport path from 'node:path';\nimport type { ViteDevServer } from 'vite';\n\nimport { renderPage } from './render-runtime';\nimport type { HtPageInfo, HtPageModule } 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 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 shouldUseDynamicRendering(mod: HtPageModule): boolean {\n return mod.dynamic === true || mod.prerender === false;\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\n server.middlewares.use(async (req, res, next) => {\n try {\n const originalUrl = req.url ?? '/';\n const url = originalUrl.split('?')[0];\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\n const page = pages.find((p) => p.routePath === url);\n\n if (!page) {\n return next();\n }\n\n const loadModule = await createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n const mod = await loadModule(page.entryPath, page.relativePath);\n\n if (!mod) {\n return next();\n }\n\n if (!shouldUseDynamicRendering(mod) && page.dynamic) {\n return next();\n }\n\n const html = await renderPage(page, mod, true);\n const transformedHtml = await server.transformIndexHtml(\n url,\n html,\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';\nexport function invalidHtmlReturn(\n page: HtPageInfo,\n value: unknown,\n): Error {\n return new Error(\n `[${PLUGIN_NAME}] Page \"${page.relativePath}\" must resolve to an HTML string, got ${typeof value}`,\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}","import { invalidHtmlReturn, pageError, missingDefaultExport } from './errors';\nimport type { HtPageInfo, HtPageModule, HtPageRenderContext } from './types';\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 entry = mod.default;\n\n if (entry == null) {\n throw missingDefaultExport(page);\n }\n\n const html = typeof entry === 'function' ? await entry(ctx) : entry;\n\n if (typeof html !== 'string') {\n throw invalidHtmlReturn(page, html);\n }\n\n return html;\n } catch (error) {\n throw pageError(page, error);\n }\n}","import path from 'node:path';\nimport { createServer, type InlineConfig, type ViteDevServer } 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 HtPagesPluginOptions,\n HtStructuredPageModule,\n} from './types';\nimport { injectPageHelperImport } from './page-helper-inject';\n\n\nexport type PageModuleLoader = (\n entryPath: string,\n relativePath: string,\n) => Promise<HtPageModule>;\n\nlet buildServer: ViteDevServer | null = null;\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 pagesDir: string;\n options: HtPagesPluginOptions;\n server?: ViteDevServer | null;\n getPages?: () => Promise<HtPageInfo[]>;\n}): Promise<PageModuleLoader> {\n const { mode, root, pagesDir, options, 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 const mod = await server.ssrLoadModule(`/${relativePath}`);\n return normalizeLoadedPageModule(mod);\n };\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\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 async transform(code, id) {\n const normalizedId = id.split('?')[0].replace(/\\\\/g, '/');\n \n const transformedCode = await injectPageHelperImport({\n code,\n absolutePath: normalizedId,\n root,\n pagesDir,\n options,\n });\n \n if (transformedCode === code) {\n return null;\n }\n \n return {\n code: transformedCode,\n map: null,\n };\n },\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 const mod = await buildServer!.ssrLoadModule(relativePath);\n return normalizeLoadedPageModule(mod);\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 | undefined): 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: 'es2020',\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","path","fg","path","path","fs","path","path","paramsTypeFromDefinitions","path","path","fs","fs","path","fs","path","build","path","fs","isLocalPageTypesImport","findEntryByAbsolutePath","path","isLocalPageTypesImport","fs","path","path","fs","path"]}
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/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: 'es2020',\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 reload = async (file: string) => {\n if (\n !file.includes(`${path.sep}${pagesDir}${path.sep}`) &&\n !file.includes(`/${pagesDir}/`)\n ) {\n return;\n }\n\n logDebug(options.debug, 'file changed', file);\n\n await loadDevPages();\n\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n };\n\n server.watcher.on('add', reload);\n server.watcher.on('change', reload);\n server.watcher.on('unlink', reload);\n }\n\n loadDevPages().catch((error) => {\n server?.config.logger.error(\n `[${PLUGIN_NAME}] loadDevPages failed: ${\n error instanceof Error ? error.stack ?? error.message : String(error)\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\n return `export 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>) => string | Promise<string>;\n};\n\nexport declare function definePage<\n T extends (ctx: PageContext) => string | Promise<string>\n>(fn: T): T;\n\nexport declare function defineData<\n T extends (ctx: DataContext) => unknown | Promise<unknown>\n>(fn: T): T;\n\nexport declare function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n>(fn: T): T;\n\nexport 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, HtPageModule } 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 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 shouldUseDynamicRendering(mod: HtPageModule): boolean {\n return mod.dynamic === true || mod.prerender === false;\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\n server.middlewares.use(async (req, res, next) => {\n try {\n const originalUrl = req.url ?? '/';\n const url = originalUrl.split('?')[0];\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\n const page = pages.find((p) => p.routePath === url);\n\n if (!page) {\n return next();\n }\n\n const loadModule = await createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n const mod = await loadModule(page.entryPath, page.relativePath);\n\n if (!mod) {\n return next();\n }\n\n // if (!shouldUseDynamicRendering(mod) && page.dynamic) {\n // return next();\n // }\n\n const html = await renderPage(page, mod, true);\n const transformedHtml = await server.transformIndexHtml(\n url,\n html,\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';\nexport function invalidHtmlReturn(\n page: HtPageInfo,\n value: unknown,\n): Error {\n return new Error(\n `[${PLUGIN_NAME}] Page \"${page.relativePath}\" must resolve to an HTML string, got ${typeof value}`,\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}","import { invalidHtmlReturn, pageError, missingDefaultExport } from './errors';\nimport type { HtPageInfo, HtPageModule, HtPageRenderContext } from './types';\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 entry = mod.default;\n\n if (entry == null) {\n throw missingDefaultExport(page);\n }\n\n const html = typeof entry === 'function' ? await entry(ctx) : entry;\n\n if (typeof html !== 'string') {\n throw invalidHtmlReturn(page, html);\n }\n\n return html;\n } catch (error) {\n throw pageError(page, error);\n }\n}","import path from 'node:path';\nimport { createServer, type InlineConfig, type ViteDevServer } 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\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 const mod = await server.ssrLoadModule(`/${relativePath}`);\n return normalizeLoadedPageModule(mod);\n };\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 const mod = await buildServer!.ssrLoadModule(relativePath);\n return normalizeLoadedPageModule(mod);\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 | undefined): 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: 'es2020',\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","path","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": "1.6.2",
3
+ "version": "1.6.4",
4
4
  "author": "Paul Browne",
5
5
  "type": "module",
6
6
  "license": "MIT",