vite-plugin-html-pages 1.6.1 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/plugin.ts
2
2
  import fs5 from "fs";
3
- import path8 from "path";
3
+ import path9 from "path";
4
4
  import { fileURLToPath, pathToFileURL } from "url";
5
5
  import { transform as esbuildTransform } from "esbuild";
6
6
  import pLimit from "p-limit";
@@ -224,18 +224,8 @@ function getGeneratedHelperImportPath(args) {
224
224
  return `./${fileName}`;
225
225
  }
226
226
 
227
- // src/constants.ts
228
- var PLUGIN_NAME = "vite-plugin-html-pages";
229
- var VIRTUAL_BUILD_ENTRY_ID = `\0${PLUGIN_NAME}:build-entry`;
230
- var VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;
231
- var RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX = `\0${PLUGIN_NAME}/page:`;
232
- var VIRTUAL_MANIFEST_ID = `\0virtual:${PLUGIN_NAME}-manifest`;
233
- var CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;
234
- var VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;
235
- var VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;
236
- var RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\0${VIRTUAL_JSX_RUNTIME_ID}`;
237
- var RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;
238
- var VIRTUAL_LOCAL_TYPES_PREFIX = `\0${PLUGIN_NAME}:local-types:`;
227
+ // src/page-helper-inject.ts
228
+ import path4 from "path";
239
229
 
240
230
  // src/discover.ts
241
231
  import path3 from "path";
@@ -379,6 +369,19 @@ function extractRouteParamDefinitions(routePattern) {
379
369
  return routePattern.split("/").filter(Boolean).map((segment) => parseRouteParamSegment(segment)).filter((value) => value != null);
380
370
  }
381
371
 
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
+
382
385
  // src/discover.ts
383
386
  function buildDefaultIncludeGlobs(pagesDir, pageExtensions) {
384
387
  return pageExtensions.map((ext) => {
@@ -427,9 +430,47 @@ async function discoverEntryPages(root, options) {
427
430
  });
428
431
  }
429
432
 
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
+
430
471
  // src/dev-server.ts
431
472
  import fs2 from "fs";
432
- import path5 from "path";
473
+ import path6 from "path";
433
474
 
434
475
  // src/errors.ts
435
476
  function invalidHtmlReturn(page, value) {
@@ -482,7 +523,7 @@ async function renderPage(page, mod, dev = false) {
482
523
  }
483
524
 
484
525
  // src/module-loader.ts
485
- import path4 from "path";
526
+ import path5 from "path";
486
527
  import { createServer } from "vite";
487
528
 
488
529
  // src/page-helper-generator.ts
@@ -576,7 +617,7 @@ function normalizeLoadedPageModule(mod) {
576
617
  return pageModule;
577
618
  }
578
619
  async function createPageModuleLoader(args) {
579
- const { mode, root, server, getPages } = args;
620
+ const { mode, root, pagesDir, options, server, getPages } = args;
580
621
  if (mode === "dev") {
581
622
  if (!server) {
582
623
  throw new Error("[vite-plugin-html-pages] dev server not available");
@@ -634,11 +675,28 @@ export {
634
675
  RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length
635
676
  );
636
677
  const pages = await getPages();
637
- const normalizedImporter = path4.resolve(importer);
678
+ const normalizedImporter = path5.resolve(importer);
638
679
  const page = pages.find(
639
- (candidate) => path4.resolve(candidate.absolutePath) === normalizedImporter
680
+ (candidate) => path5.resolve(candidate.absolutePath) === normalizedImporter
640
681
  );
641
682
  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
+ };
642
700
  }
643
701
  }
644
702
  ]
@@ -646,7 +704,7 @@ export {
646
704
  buildServer = await createServer(config);
647
705
  }
648
706
  return async (entryPath) => {
649
- const relativePath = "/" + path4.relative(root, entryPath).replace(/\\/g, "/");
707
+ const relativePath = "/" + path5.relative(root, entryPath).replace(/\\/g, "/");
650
708
  const mod = await buildServer.ssrLoadModule(relativePath);
651
709
  return normalizeLoadedPageModule(mod);
652
710
  };
@@ -669,7 +727,7 @@ function tryRewriteRootAssetToSrc(root, pagesDir, url) {
669
727
  if (!url.startsWith("/")) return null;
670
728
  if (!isStaticAssetRequest(url)) return null;
671
729
  if (url.startsWith(`/${pagesDir}/`)) return null;
672
- const candidate = path5.join(root, pagesDir, url.slice(1));
730
+ const candidate = path6.join(root, pagesDir, url.slice(1));
673
731
  if (fs2.existsSync(candidate)) {
674
732
  return `/${pagesDir}/${url.slice(1)}`;
675
733
  }
@@ -729,7 +787,7 @@ function installDevServer(args) {
729
787
 
730
788
  // src/html-asset-validator.ts
731
789
  import fs3 from "fs";
732
- import path6 from "path";
790
+ import path7 from "path";
733
791
  function stripQueryAndHash(url) {
734
792
  return url.split("#")[0].split("?")[0];
735
793
  }
@@ -738,9 +796,9 @@ function isLocalRootUrl(url) {
738
796
  }
739
797
  function fileExistsForPublicUrl(root, pagesDir, url) {
740
798
  const clean = stripQueryAndHash(url).slice(1);
741
- const fromSrc = path6.join(root, pagesDir, clean);
799
+ const fromSrc = path7.join(root, pagesDir, clean);
742
800
  if (fs3.existsSync(fromSrc)) return true;
743
- const fromPublic = path6.join(root, "public", clean);
801
+ const fromPublic = path7.join(root, "public", clean);
744
802
  if (fs3.existsSync(fromPublic)) return true;
745
803
  return false;
746
804
  }
@@ -783,8 +841,8 @@ function missingAssetMessage(args) {
783
841
  const pageSuffix = formatPageLabel(pageLabel);
784
842
  return `[${pluginName}] Missing ${kind}${pageSuffix}: ${url}
785
843
  Expected one of:
786
- - ${path6.join(root, pagesDir, clean)}
787
- - ${path6.join(root, "public", clean)}`;
844
+ - ${path7.join(root, pagesDir, clean)}
845
+ - ${path7.join(root, "public", clean)}`;
788
846
  }
789
847
  function reportMissing(args) {
790
848
  const message = missingAssetMessage(args);
@@ -899,7 +957,7 @@ async function buildPageIndex(args) {
899
957
 
900
958
  // src/static-assets.ts
901
959
  import fs4 from "fs/promises";
902
- import path7 from "path";
960
+ import path8 from "path";
903
961
  import fg from "fast-glob";
904
962
  import * as esbuild from "esbuild";
905
963
  import fsSync from "fs";
@@ -923,7 +981,7 @@ function toOutputFileName(relativePathFromSrc) {
923
981
  }
924
982
  async function collectStaticAssets(args) {
925
983
  const { root, pagesDir, pageExtensions } = args;
926
- const srcDir = path7.join(root, pagesDir);
984
+ const srcDir = path8.join(root, pagesDir);
927
985
  const entries = await fg("**/*", {
928
986
  cwd: srcDir,
929
987
  onlyFiles: true,
@@ -935,7 +993,7 @@ async function collectStaticAssets(args) {
935
993
  const rel = normalizeSlashes(entry);
936
994
  if (shouldIgnoreFile(rel)) continue;
937
995
  if (hasAnySuffix(rel, pageExtensions)) continue;
938
- const absolutePath = path7.join(srcDir, rel);
996
+ const absolutePath = path8.join(srcDir, rel);
939
997
  assets.push({
940
998
  absolutePath,
941
999
  relativePathFromSrc: rel,
@@ -955,8 +1013,8 @@ async function buildProcessedStaticAssets(args) {
955
1013
  if (processable.length === 0) {
956
1014
  return out;
957
1015
  }
958
- const srcDir = path7.join(root, pagesDir);
959
- const distDir = path7.join(root, "dist");
1016
+ const srcDir = path8.join(root, pagesDir);
1017
+ const distDir = path8.join(root, "dist");
960
1018
  const warnedMissingAssets = /* @__PURE__ */ new Set();
961
1019
  const result = await esbuild.build({
962
1020
  entryPoints: processable.map((a) => a.absolutePath),
@@ -992,15 +1050,15 @@ async function buildProcessedStaticAssets(args) {
992
1050
  name: "html-pages-root-url-resolver",
993
1051
  setup(build2) {
994
1052
  build2.onResolve({ filter: /^\// }, (resolveArgs) => {
995
- if (path7.isAbsolute(resolveArgs.path) && fsSync.existsSync(resolveArgs.path)) {
1053
+ if (path8.isAbsolute(resolveArgs.path) && fsSync.existsSync(resolveArgs.path)) {
996
1054
  return { path: resolveArgs.path };
997
1055
  }
998
1056
  const cleanPath = resolveArgs.path.slice(1);
999
- const fromSrc = path7.join(srcDir, cleanPath);
1057
+ const fromSrc = path8.join(srcDir, cleanPath);
1000
1058
  if (fsSync.existsSync(fromSrc)) {
1001
1059
  return { path: fromSrc };
1002
1060
  }
1003
- const fromPublic = path7.join(root, "public", cleanPath);
1061
+ const fromPublic = path8.join(root, "public", cleanPath);
1004
1062
  if (fsSync.existsSync(fromPublic)) {
1005
1063
  return {
1006
1064
  path: resolveArgs.path,
@@ -1032,7 +1090,7 @@ async function buildProcessedStaticAssets(args) {
1032
1090
  ]
1033
1091
  });
1034
1092
  for (const file of result.outputFiles) {
1035
- const rel = normalizeSlashes(path7.relative(distDir, file.path));
1093
+ const rel = normalizeSlashes(path8.relative(distDir, file.path));
1036
1094
  out.set(rel, file.text ?? file.contents);
1037
1095
  }
1038
1096
  return out;
@@ -1040,10 +1098,10 @@ async function buildProcessedStaticAssets(args) {
1040
1098
 
1041
1099
  // src/plugin.ts
1042
1100
  var hasWarnedESM = false;
1043
- var pluginDir = path8.dirname(fileURLToPath(import.meta.url));
1101
+ var pluginDir = path9.dirname(fileURLToPath(import.meta.url));
1044
1102
  function warnIfNotESM(root) {
1045
1103
  try {
1046
- const pkgPath = path8.join(root, "package.json");
1104
+ const pkgPath = path9.join(root, "package.json");
1047
1105
  if (!fs5.existsSync(pkgPath)) return;
1048
1106
  const pkg = JSON.parse(fs5.readFileSync(pkgPath, "utf8"));
1049
1107
  if (pkg.type !== "module") {
@@ -1075,12 +1133,6 @@ function isHtJsxImporter(importer) {
1075
1133
  const normalized = importer.split("?")[0].replace(/\\/g, "/");
1076
1134
  return isHtJsxFile(normalized);
1077
1135
  }
1078
- function hasPageHelperImport(code) {
1079
- 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"`);
1080
- }
1081
- function usesPageHelper(code) {
1082
- return code.includes("definePage(") || code.includes("defineData(") || code.includes("defineStaticParams(") || code.includes("definePageModule(");
1083
- }
1084
1136
  function htPages(options = {}) {
1085
1137
  let root = process.cwd();
1086
1138
  let server = null;
@@ -1102,11 +1154,11 @@ function htPages(options = {}) {
1102
1154
  if (!enabled) return;
1103
1155
  console.log(`[${PLUGIN_NAME}]`, ...args);
1104
1156
  }
1105
- async function findEntryByAbsolutePath(absolutePath) {
1157
+ async function findEntryByAbsolutePath2(absolutePath) {
1106
1158
  const entries = await discoverEntryPages(root, options);
1107
- const normalized = path8.resolve(absolutePath);
1159
+ const normalized = path9.resolve(absolutePath);
1108
1160
  return entries.find(
1109
- (entry) => path8.resolve(entry.absolutePath) === normalized
1161
+ (entry) => path9.resolve(entry.absolutePath) === normalized
1110
1162
  );
1111
1163
  }
1112
1164
  async function loadDevPages() {
@@ -1126,6 +1178,8 @@ function htPages(options = {}) {
1126
1178
  const loadModule = await createPageModuleLoader({
1127
1179
  mode: "dev",
1128
1180
  root,
1181
+ pagesDir,
1182
+ options,
1129
1183
  server
1130
1184
  });
1131
1185
  for (const entry of entries) {
@@ -1155,6 +1209,8 @@ function htPages(options = {}) {
1155
1209
  const loadModule = await createPageModuleLoader({
1156
1210
  mode: "build",
1157
1211
  root,
1212
+ pagesDir,
1213
+ options,
1158
1214
  getPages: async () => entries
1159
1215
  });
1160
1216
  for (const entry of entries) {
@@ -1215,23 +1271,23 @@ function htPages(options = {}) {
1215
1271
  if (id === RESOLVED_VIRTUAL_JSX_RUNTIME_ID) {
1216
1272
  return `
1217
1273
  export { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(
1218
- pathToFileURL(path8.join(pluginDir, "jsx-runtime.js")).href
1274
+ pathToFileURL(path9.join(pluginDir, "jsx-runtime.js")).href
1219
1275
  )};
1220
1276
  `;
1221
1277
  }
1222
1278
  if (id === RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID) {
1223
1279
  return `
1224
1280
  export { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(
1225
- pathToFileURL(path8.join(pluginDir, "jsx-dev-runtime.js")).href
1281
+ pathToFileURL(path9.join(pluginDir, "jsx-dev-runtime.js")).href
1226
1282
  )};
1227
1283
  `;
1228
1284
  }
1229
1285
  if (id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {
1230
1286
  const importer = id.slice(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length);
1231
1287
  const { pages } = await buildPagesPipeline();
1232
- const normalizedImporter = path8.resolve(importer);
1288
+ const normalizedImporter = path9.resolve(importer);
1233
1289
  const page = pages.find(
1234
- (candidate) => path8.resolve(candidate.absolutePath) === normalizedImporter
1290
+ (candidate) => path9.resolve(candidate.absolutePath) === normalizedImporter
1235
1291
  );
1236
1292
  return generateTypedPageHelper(page);
1237
1293
  }
@@ -1252,19 +1308,13 @@ export {
1252
1308
  if (!isHtJsxFile(normalizedId)) {
1253
1309
  return null;
1254
1310
  }
1255
- let transformedCode = code;
1256
- if (!hasPageHelperImport(code) && usesPageHelper(code)) {
1257
- const entry = await findEntryByAbsolutePath(normalizedId);
1258
- if (entry) {
1259
- const helperImportPath = getGeneratedHelperImportPath({
1260
- root,
1261
- pagesDir,
1262
- page: entry
1263
- });
1264
- transformedCode = `import { definePage, defineData, defineStaticParams, definePageModule } from ${JSON.stringify(helperImportPath)};
1265
- ` + code;
1266
- }
1267
- }
1311
+ const transformedCode = await injectPageHelperImport({
1312
+ code,
1313
+ absolutePath: normalizedId,
1314
+ root,
1315
+ pagesDir,
1316
+ options
1317
+ });
1268
1318
  const result = await esbuildTransform(transformedCode, {
1269
1319
  loader: isHtTsxFile(normalizedId) ? "tsx" : "jsx",
1270
1320
  format: "esm",
@@ -1280,7 +1330,7 @@ export {
1280
1330
  };
1281
1331
  },
1282
1332
  configResolved(resolved) {
1283
- root = options.root ? path8.resolve(resolved.root, options.root) : resolved.root;
1333
+ root = options.root ? path9.resolve(resolved.root, options.root) : resolved.root;
1284
1334
  if (!hasWarnedESM) {
1285
1335
  warnIfNotESM(root);
1286
1336
  hasWarnedESM = true;
@@ -1324,7 +1374,7 @@ export {
1324
1374
  if (!watcherAttached) {
1325
1375
  watcherAttached = true;
1326
1376
  const reload = async (file) => {
1327
- if (!file.includes(`${path8.sep}${pagesDir}${path8.sep}`) && !file.includes(`/${pagesDir}/`)) {
1377
+ if (!file.includes(`${path9.sep}${pagesDir}${path9.sep}`) && !file.includes(`/${pagesDir}/`)) {
1328
1378
  return;
1329
1379
  }
1330
1380
  logDebug(options.debug, "file changed", file);
@@ -1553,7 +1603,7 @@ ${rssItems}
1553
1603
 
1554
1604
  // src/fetch-cache.ts
1555
1605
  import fs6 from "fs/promises";
1556
- import path9 from "path";
1606
+ import path10 from "path";
1557
1607
  import { createHash } from "crypto";
1558
1608
  var memoryCache = /* @__PURE__ */ new Map();
1559
1609
  function createDefaultCacheKey(input, init) {
@@ -1566,7 +1616,7 @@ function createDefaultCacheKey(input, init) {
1566
1616
  return createHash("sha256").update(raw).digest("hex");
1567
1617
  }
1568
1618
  function getCacheFilePath(cacheKey) {
1569
- return path9.join(process.cwd(), CACHE_DIR_NAME, "fetch", `${cacheKey}.json`);
1619
+ return path10.join(process.cwd(), CACHE_DIR_NAME, "fetch", `${cacheKey}.json`);
1570
1620
  }
1571
1621
  function getEffectiveCacheMode(mode) {
1572
1622
  if (mode === "memory" || mode === "fs" || mode === "none") {
@@ -1604,7 +1654,7 @@ async function fetchWithCache(input, init, options = {}) {
1604
1654
  }
1605
1655
  const filePath = getCacheFilePath(cacheKey);
1606
1656
  if (cacheMode === "fs") {
1607
- await fs6.mkdir(path9.dirname(filePath), { recursive: true });
1657
+ await fs6.mkdir(path10.dirname(filePath), { recursive: true });
1608
1658
  if (!options.forceRefresh) {
1609
1659
  try {
1610
1660
  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/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, getGeneratedHelperImportPath } 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\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 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 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 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}","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"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-html-pages",
3
- "version": "1.6.1",
3
+ "version": "1.6.2",
4
4
  "author": "Paul Browne",
5
5
  "type": "module",
6
6
  "license": "MIT",