vite-plugin-html-pages 1.6.2 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +46 -141
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/plugin.ts
|
|
2
2
|
import fs5 from "fs";
|
|
3
|
-
import
|
|
3
|
+
import path8 from "path";
|
|
4
4
|
import { fileURLToPath, pathToFileURL } from "url";
|
|
5
5
|
import { transform as esbuildTransform } from "esbuild";
|
|
6
6
|
import pLimit from "p-limit";
|
|
@@ -210,22 +210,19 @@ async function writePageTypeDeclarations(args) {
|
|
|
210
210
|
expectedFiles
|
|
211
211
|
});
|
|
212
212
|
}
|
|
213
|
-
function getGeneratedHelperImportPath(args) {
|
|
214
|
-
const pagesRoot = normalizeFsPath(path2.join(args.root, args.pagesDir));
|
|
215
|
-
const relativeFromPagesDir = toPosix(
|
|
216
|
-
path2.relative(pagesRoot, args.page.absolutePath)
|
|
217
|
-
);
|
|
218
|
-
const withoutExt = stripPageExtension(relativeFromPagesDir);
|
|
219
|
-
const dir = path2.dirname(withoutExt);
|
|
220
|
-
const fileName = getTypesFileName(args.page).replace(/\.d\.ts$/, "");
|
|
221
|
-
if (dir === "." || dir === "") {
|
|
222
|
-
return `./${fileName}`;
|
|
223
|
-
}
|
|
224
|
-
return `./${fileName}`;
|
|
225
|
-
}
|
|
226
213
|
|
|
227
|
-
// src/
|
|
228
|
-
|
|
214
|
+
// src/constants.ts
|
|
215
|
+
var PLUGIN_NAME = "vite-plugin-html-pages";
|
|
216
|
+
var VIRTUAL_BUILD_ENTRY_ID = `\0${PLUGIN_NAME}:build-entry`;
|
|
217
|
+
var VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;
|
|
218
|
+
var RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX = `\0${PLUGIN_NAME}/page:`;
|
|
219
|
+
var VIRTUAL_MANIFEST_ID = `\0virtual:${PLUGIN_NAME}-manifest`;
|
|
220
|
+
var CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;
|
|
221
|
+
var VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;
|
|
222
|
+
var VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;
|
|
223
|
+
var RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\0${VIRTUAL_JSX_RUNTIME_ID}`;
|
|
224
|
+
var RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;
|
|
225
|
+
var VIRTUAL_LOCAL_TYPES_PREFIX = `\0${PLUGIN_NAME}:local-types:`;
|
|
229
226
|
|
|
230
227
|
// src/discover.ts
|
|
231
228
|
import path3 from "path";
|
|
@@ -369,19 +366,6 @@ function extractRouteParamDefinitions(routePattern) {
|
|
|
369
366
|
return routePattern.split("/").filter(Boolean).map((segment) => parseRouteParamSegment(segment)).filter((value) => value != null);
|
|
370
367
|
}
|
|
371
368
|
|
|
372
|
-
// src/constants.ts
|
|
373
|
-
var PLUGIN_NAME = "vite-plugin-html-pages";
|
|
374
|
-
var VIRTUAL_BUILD_ENTRY_ID = `\0${PLUGIN_NAME}:build-entry`;
|
|
375
|
-
var VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;
|
|
376
|
-
var RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX = `\0${PLUGIN_NAME}/page:`;
|
|
377
|
-
var VIRTUAL_MANIFEST_ID = `\0virtual:${PLUGIN_NAME}-manifest`;
|
|
378
|
-
var CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;
|
|
379
|
-
var VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;
|
|
380
|
-
var VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;
|
|
381
|
-
var RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\0${VIRTUAL_JSX_RUNTIME_ID}`;
|
|
382
|
-
var RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;
|
|
383
|
-
var VIRTUAL_LOCAL_TYPES_PREFIX = `\0${PLUGIN_NAME}:local-types:`;
|
|
384
|
-
|
|
385
369
|
// src/discover.ts
|
|
386
370
|
function buildDefaultIncludeGlobs(pagesDir, pageExtensions) {
|
|
387
371
|
return pageExtensions.map((ext) => {
|
|
@@ -430,47 +414,9 @@ async function discoverEntryPages(root, options) {
|
|
|
430
414
|
});
|
|
431
415
|
}
|
|
432
416
|
|
|
433
|
-
// src/page-helper-inject.ts
|
|
434
|
-
function hasPageHelperImport(code) {
|
|
435
|
-
return code.includes(`from './$types`) || code.includes(`from "./$types`) || code.includes(`from 'vite-plugin-html-pages/page'`) || code.includes(`from "vite-plugin-html-pages/page"`);
|
|
436
|
-
}
|
|
437
|
-
function usesPageHelper(code) {
|
|
438
|
-
return code.includes("definePage(") || code.includes("defineData(") || code.includes("defineStaticParams(") || code.includes("definePageModule(");
|
|
439
|
-
}
|
|
440
|
-
async function findEntryByAbsolutePath(args) {
|
|
441
|
-
const entries = await discoverEntryPages(args.root, args.options);
|
|
442
|
-
const normalized = path4.resolve(args.absolutePath);
|
|
443
|
-
return entries.find(
|
|
444
|
-
(entry) => path4.resolve(entry.absolutePath) === normalized
|
|
445
|
-
);
|
|
446
|
-
}
|
|
447
|
-
async function injectPageHelperImport(args) {
|
|
448
|
-
const { code, absolutePath, root, pagesDir, options } = args;
|
|
449
|
-
if (hasPageHelperImport(code) || !usesPageHelper(code)) {
|
|
450
|
-
return code;
|
|
451
|
-
}
|
|
452
|
-
const entry = await findEntryByAbsolutePath({
|
|
453
|
-
root,
|
|
454
|
-
options,
|
|
455
|
-
absolutePath
|
|
456
|
-
});
|
|
457
|
-
if (!entry) {
|
|
458
|
-
return code;
|
|
459
|
-
}
|
|
460
|
-
const helperImportPath = getGeneratedHelperImportPath({
|
|
461
|
-
root,
|
|
462
|
-
pagesDir,
|
|
463
|
-
page: entry
|
|
464
|
-
});
|
|
465
|
-
return `import { definePage, defineData, defineStaticParams, definePageModule } from ${JSON.stringify(
|
|
466
|
-
helperImportPath
|
|
467
|
-
)};
|
|
468
|
-
${code}`;
|
|
469
|
-
}
|
|
470
|
-
|
|
471
417
|
// src/dev-server.ts
|
|
472
418
|
import fs2 from "fs";
|
|
473
|
-
import
|
|
419
|
+
import path5 from "path";
|
|
474
420
|
|
|
475
421
|
// src/errors.ts
|
|
476
422
|
function invalidHtmlReturn(page, value) {
|
|
@@ -523,7 +469,7 @@ async function renderPage(page, mod, dev = false) {
|
|
|
523
469
|
}
|
|
524
470
|
|
|
525
471
|
// src/module-loader.ts
|
|
526
|
-
import
|
|
472
|
+
import path4 from "path";
|
|
527
473
|
import { createServer } from "vite";
|
|
528
474
|
|
|
529
475
|
// src/page-helper-generator.ts
|
|
@@ -617,7 +563,7 @@ function normalizeLoadedPageModule(mod) {
|
|
|
617
563
|
return pageModule;
|
|
618
564
|
}
|
|
619
565
|
async function createPageModuleLoader(args) {
|
|
620
|
-
const { mode, root,
|
|
566
|
+
const { mode, root, server, getPages } = args;
|
|
621
567
|
if (mode === "dev") {
|
|
622
568
|
if (!server) {
|
|
623
569
|
throw new Error("[vite-plugin-html-pages] dev server not available");
|
|
@@ -675,28 +621,11 @@ export {
|
|
|
675
621
|
RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length
|
|
676
622
|
);
|
|
677
623
|
const pages = await getPages();
|
|
678
|
-
const normalizedImporter =
|
|
624
|
+
const normalizedImporter = path4.resolve(importer);
|
|
679
625
|
const page = pages.find(
|
|
680
|
-
(candidate) =>
|
|
626
|
+
(candidate) => path4.resolve(candidate.absolutePath) === normalizedImporter
|
|
681
627
|
);
|
|
682
628
|
return generateTypedPageHelper(page);
|
|
683
|
-
},
|
|
684
|
-
async transform(code, id) {
|
|
685
|
-
const normalizedId = id.split("?")[0].replace(/\\/g, "/");
|
|
686
|
-
const transformedCode = await injectPageHelperImport({
|
|
687
|
-
code,
|
|
688
|
-
absolutePath: normalizedId,
|
|
689
|
-
root,
|
|
690
|
-
pagesDir,
|
|
691
|
-
options
|
|
692
|
-
});
|
|
693
|
-
if (transformedCode === code) {
|
|
694
|
-
return null;
|
|
695
|
-
}
|
|
696
|
-
return {
|
|
697
|
-
code: transformedCode,
|
|
698
|
-
map: null
|
|
699
|
-
};
|
|
700
629
|
}
|
|
701
630
|
}
|
|
702
631
|
]
|
|
@@ -704,7 +633,7 @@ export {
|
|
|
704
633
|
buildServer = await createServer(config);
|
|
705
634
|
}
|
|
706
635
|
return async (entryPath) => {
|
|
707
|
-
const relativePath = "/" +
|
|
636
|
+
const relativePath = "/" + path4.relative(root, entryPath).replace(/\\/g, "/");
|
|
708
637
|
const mod = await buildServer.ssrLoadModule(relativePath);
|
|
709
638
|
return normalizeLoadedPageModule(mod);
|
|
710
639
|
};
|
|
@@ -727,15 +656,12 @@ function tryRewriteRootAssetToSrc(root, pagesDir, url) {
|
|
|
727
656
|
if (!url.startsWith("/")) return null;
|
|
728
657
|
if (!isStaticAssetRequest(url)) return null;
|
|
729
658
|
if (url.startsWith(`/${pagesDir}/`)) return null;
|
|
730
|
-
const candidate =
|
|
659
|
+
const candidate = path5.join(root, pagesDir, url.slice(1));
|
|
731
660
|
if (fs2.existsSync(candidate)) {
|
|
732
661
|
return `/${pagesDir}/${url.slice(1)}`;
|
|
733
662
|
}
|
|
734
663
|
return null;
|
|
735
664
|
}
|
|
736
|
-
function shouldUseDynamicRendering(mod) {
|
|
737
|
-
return mod.dynamic === true || mod.prerender === false;
|
|
738
|
-
}
|
|
739
665
|
function installDevServer(args) {
|
|
740
666
|
const { server, root, pagesDir, getPages } = args;
|
|
741
667
|
server.middlewares.use(async (req, res, next) => {
|
|
@@ -764,9 +690,6 @@ function installDevServer(args) {
|
|
|
764
690
|
if (!mod) {
|
|
765
691
|
return next();
|
|
766
692
|
}
|
|
767
|
-
if (!shouldUseDynamicRendering(mod) && page.dynamic) {
|
|
768
|
-
return next();
|
|
769
|
-
}
|
|
770
693
|
const html = await renderPage(page, mod, true);
|
|
771
694
|
const transformedHtml = await server.transformIndexHtml(
|
|
772
695
|
url,
|
|
@@ -787,7 +710,7 @@ function installDevServer(args) {
|
|
|
787
710
|
|
|
788
711
|
// src/html-asset-validator.ts
|
|
789
712
|
import fs3 from "fs";
|
|
790
|
-
import
|
|
713
|
+
import path6 from "path";
|
|
791
714
|
function stripQueryAndHash(url) {
|
|
792
715
|
return url.split("#")[0].split("?")[0];
|
|
793
716
|
}
|
|
@@ -796,9 +719,9 @@ function isLocalRootUrl(url) {
|
|
|
796
719
|
}
|
|
797
720
|
function fileExistsForPublicUrl(root, pagesDir, url) {
|
|
798
721
|
const clean = stripQueryAndHash(url).slice(1);
|
|
799
|
-
const fromSrc =
|
|
722
|
+
const fromSrc = path6.join(root, pagesDir, clean);
|
|
800
723
|
if (fs3.existsSync(fromSrc)) return true;
|
|
801
|
-
const fromPublic =
|
|
724
|
+
const fromPublic = path6.join(root, "public", clean);
|
|
802
725
|
if (fs3.existsSync(fromPublic)) return true;
|
|
803
726
|
return false;
|
|
804
727
|
}
|
|
@@ -841,8 +764,8 @@ function missingAssetMessage(args) {
|
|
|
841
764
|
const pageSuffix = formatPageLabel(pageLabel);
|
|
842
765
|
return `[${pluginName}] Missing ${kind}${pageSuffix}: ${url}
|
|
843
766
|
Expected one of:
|
|
844
|
-
- ${
|
|
845
|
-
- ${
|
|
767
|
+
- ${path6.join(root, pagesDir, clean)}
|
|
768
|
+
- ${path6.join(root, "public", clean)}`;
|
|
846
769
|
}
|
|
847
770
|
function reportMissing(args) {
|
|
848
771
|
const message = missingAssetMessage(args);
|
|
@@ -957,7 +880,7 @@ async function buildPageIndex(args) {
|
|
|
957
880
|
|
|
958
881
|
// src/static-assets.ts
|
|
959
882
|
import fs4 from "fs/promises";
|
|
960
|
-
import
|
|
883
|
+
import path7 from "path";
|
|
961
884
|
import fg from "fast-glob";
|
|
962
885
|
import * as esbuild from "esbuild";
|
|
963
886
|
import fsSync from "fs";
|
|
@@ -981,7 +904,7 @@ function toOutputFileName(relativePathFromSrc) {
|
|
|
981
904
|
}
|
|
982
905
|
async function collectStaticAssets(args) {
|
|
983
906
|
const { root, pagesDir, pageExtensions } = args;
|
|
984
|
-
const srcDir =
|
|
907
|
+
const srcDir = path7.join(root, pagesDir);
|
|
985
908
|
const entries = await fg("**/*", {
|
|
986
909
|
cwd: srcDir,
|
|
987
910
|
onlyFiles: true,
|
|
@@ -993,7 +916,7 @@ async function collectStaticAssets(args) {
|
|
|
993
916
|
const rel = normalizeSlashes(entry);
|
|
994
917
|
if (shouldIgnoreFile(rel)) continue;
|
|
995
918
|
if (hasAnySuffix(rel, pageExtensions)) continue;
|
|
996
|
-
const absolutePath =
|
|
919
|
+
const absolutePath = path7.join(srcDir, rel);
|
|
997
920
|
assets.push({
|
|
998
921
|
absolutePath,
|
|
999
922
|
relativePathFromSrc: rel,
|
|
@@ -1013,8 +936,8 @@ async function buildProcessedStaticAssets(args) {
|
|
|
1013
936
|
if (processable.length === 0) {
|
|
1014
937
|
return out;
|
|
1015
938
|
}
|
|
1016
|
-
const srcDir =
|
|
1017
|
-
const distDir =
|
|
939
|
+
const srcDir = path7.join(root, pagesDir);
|
|
940
|
+
const distDir = path7.join(root, "dist");
|
|
1018
941
|
const warnedMissingAssets = /* @__PURE__ */ new Set();
|
|
1019
942
|
const result = await esbuild.build({
|
|
1020
943
|
entryPoints: processable.map((a) => a.absolutePath),
|
|
@@ -1050,15 +973,15 @@ async function buildProcessedStaticAssets(args) {
|
|
|
1050
973
|
name: "html-pages-root-url-resolver",
|
|
1051
974
|
setup(build2) {
|
|
1052
975
|
build2.onResolve({ filter: /^\// }, (resolveArgs) => {
|
|
1053
|
-
if (
|
|
976
|
+
if (path7.isAbsolute(resolveArgs.path) && fsSync.existsSync(resolveArgs.path)) {
|
|
1054
977
|
return { path: resolveArgs.path };
|
|
1055
978
|
}
|
|
1056
979
|
const cleanPath = resolveArgs.path.slice(1);
|
|
1057
|
-
const fromSrc =
|
|
980
|
+
const fromSrc = path7.join(srcDir, cleanPath);
|
|
1058
981
|
if (fsSync.existsSync(fromSrc)) {
|
|
1059
982
|
return { path: fromSrc };
|
|
1060
983
|
}
|
|
1061
|
-
const fromPublic =
|
|
984
|
+
const fromPublic = path7.join(root, "public", cleanPath);
|
|
1062
985
|
if (fsSync.existsSync(fromPublic)) {
|
|
1063
986
|
return {
|
|
1064
987
|
path: resolveArgs.path,
|
|
@@ -1090,7 +1013,7 @@ async function buildProcessedStaticAssets(args) {
|
|
|
1090
1013
|
]
|
|
1091
1014
|
});
|
|
1092
1015
|
for (const file of result.outputFiles) {
|
|
1093
|
-
const rel = normalizeSlashes(
|
|
1016
|
+
const rel = normalizeSlashes(path7.relative(distDir, file.path));
|
|
1094
1017
|
out.set(rel, file.text ?? file.contents);
|
|
1095
1018
|
}
|
|
1096
1019
|
return out;
|
|
@@ -1098,10 +1021,10 @@ async function buildProcessedStaticAssets(args) {
|
|
|
1098
1021
|
|
|
1099
1022
|
// src/plugin.ts
|
|
1100
1023
|
var hasWarnedESM = false;
|
|
1101
|
-
var pluginDir =
|
|
1024
|
+
var pluginDir = path8.dirname(fileURLToPath(import.meta.url));
|
|
1102
1025
|
function warnIfNotESM(root) {
|
|
1103
1026
|
try {
|
|
1104
|
-
const pkgPath =
|
|
1027
|
+
const pkgPath = path8.join(root, "package.json");
|
|
1105
1028
|
if (!fs5.existsSync(pkgPath)) return;
|
|
1106
1029
|
const pkg = JSON.parse(fs5.readFileSync(pkgPath, "utf8"));
|
|
1107
1030
|
if (pkg.type !== "module") {
|
|
@@ -1154,13 +1077,6 @@ function htPages(options = {}) {
|
|
|
1154
1077
|
if (!enabled) return;
|
|
1155
1078
|
console.log(`[${PLUGIN_NAME}]`, ...args);
|
|
1156
1079
|
}
|
|
1157
|
-
async function findEntryByAbsolutePath2(absolutePath) {
|
|
1158
|
-
const entries = await discoverEntryPages(root, options);
|
|
1159
|
-
const normalized = path9.resolve(absolutePath);
|
|
1160
|
-
return entries.find(
|
|
1161
|
-
(entry) => path9.resolve(entry.absolutePath) === normalized
|
|
1162
|
-
);
|
|
1163
|
-
}
|
|
1164
1080
|
async function loadDevPages() {
|
|
1165
1081
|
const entries = await discoverEntryPages(root, options);
|
|
1166
1082
|
await writePageTypeDeclarations({
|
|
@@ -1178,8 +1094,6 @@ function htPages(options = {}) {
|
|
|
1178
1094
|
const loadModule = await createPageModuleLoader({
|
|
1179
1095
|
mode: "dev",
|
|
1180
1096
|
root,
|
|
1181
|
-
pagesDir,
|
|
1182
|
-
options,
|
|
1183
1097
|
server
|
|
1184
1098
|
});
|
|
1185
1099
|
for (const entry of entries) {
|
|
@@ -1209,8 +1123,6 @@ function htPages(options = {}) {
|
|
|
1209
1123
|
const loadModule = await createPageModuleLoader({
|
|
1210
1124
|
mode: "build",
|
|
1211
1125
|
root,
|
|
1212
|
-
pagesDir,
|
|
1213
|
-
options,
|
|
1214
1126
|
getPages: async () => entries
|
|
1215
1127
|
});
|
|
1216
1128
|
for (const entry of entries) {
|
|
@@ -1271,23 +1183,23 @@ function htPages(options = {}) {
|
|
|
1271
1183
|
if (id === RESOLVED_VIRTUAL_JSX_RUNTIME_ID) {
|
|
1272
1184
|
return `
|
|
1273
1185
|
export { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(
|
|
1274
|
-
pathToFileURL(
|
|
1186
|
+
pathToFileURL(path8.join(pluginDir, "jsx-runtime.js")).href
|
|
1275
1187
|
)};
|
|
1276
1188
|
`;
|
|
1277
1189
|
}
|
|
1278
1190
|
if (id === RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID) {
|
|
1279
1191
|
return `
|
|
1280
1192
|
export { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(
|
|
1281
|
-
pathToFileURL(
|
|
1193
|
+
pathToFileURL(path8.join(pluginDir, "jsx-dev-runtime.js")).href
|
|
1282
1194
|
)};
|
|
1283
1195
|
`;
|
|
1284
1196
|
}
|
|
1285
1197
|
if (id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {
|
|
1286
1198
|
const importer = id.slice(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length);
|
|
1287
1199
|
const { pages } = await buildPagesPipeline();
|
|
1288
|
-
const normalizedImporter =
|
|
1200
|
+
const normalizedImporter = path8.resolve(importer);
|
|
1289
1201
|
const page = pages.find(
|
|
1290
|
-
(candidate) =>
|
|
1202
|
+
(candidate) => path8.resolve(candidate.absolutePath) === normalizedImporter
|
|
1291
1203
|
);
|
|
1292
1204
|
return generateTypedPageHelper(page);
|
|
1293
1205
|
}
|
|
@@ -1308,14 +1220,7 @@ export {
|
|
|
1308
1220
|
if (!isHtJsxFile(normalizedId)) {
|
|
1309
1221
|
return null;
|
|
1310
1222
|
}
|
|
1311
|
-
const
|
|
1312
|
-
code,
|
|
1313
|
-
absolutePath: normalizedId,
|
|
1314
|
-
root,
|
|
1315
|
-
pagesDir,
|
|
1316
|
-
options
|
|
1317
|
-
});
|
|
1318
|
-
const result = await esbuildTransform(transformedCode, {
|
|
1223
|
+
const result = await esbuildTransform(code, {
|
|
1319
1224
|
loader: isHtTsxFile(normalizedId) ? "tsx" : "jsx",
|
|
1320
1225
|
format: "esm",
|
|
1321
1226
|
jsx: "automatic",
|
|
@@ -1330,7 +1235,7 @@ export {
|
|
|
1330
1235
|
};
|
|
1331
1236
|
},
|
|
1332
1237
|
configResolved(resolved) {
|
|
1333
|
-
root = options.root ?
|
|
1238
|
+
root = options.root ? path8.resolve(resolved.root, options.root) : resolved.root;
|
|
1334
1239
|
if (!hasWarnedESM) {
|
|
1335
1240
|
warnIfNotESM(root);
|
|
1336
1241
|
hasWarnedESM = true;
|
|
@@ -1374,7 +1279,7 @@ export {
|
|
|
1374
1279
|
if (!watcherAttached) {
|
|
1375
1280
|
watcherAttached = true;
|
|
1376
1281
|
const reload = async (file) => {
|
|
1377
|
-
if (!file.includes(`${
|
|
1282
|
+
if (!file.includes(`${path8.sep}${pagesDir}${path8.sep}`) && !file.includes(`/${pagesDir}/`)) {
|
|
1378
1283
|
return;
|
|
1379
1284
|
}
|
|
1380
1285
|
logDebug(options.debug, "file changed", file);
|
|
@@ -1603,7 +1508,7 @@ ${rssItems}
|
|
|
1603
1508
|
|
|
1604
1509
|
// src/fetch-cache.ts
|
|
1605
1510
|
import fs6 from "fs/promises";
|
|
1606
|
-
import
|
|
1511
|
+
import path9 from "path";
|
|
1607
1512
|
import { createHash } from "crypto";
|
|
1608
1513
|
var memoryCache = /* @__PURE__ */ new Map();
|
|
1609
1514
|
function createDefaultCacheKey(input, init) {
|
|
@@ -1616,7 +1521,7 @@ function createDefaultCacheKey(input, init) {
|
|
|
1616
1521
|
return createHash("sha256").update(raw).digest("hex");
|
|
1617
1522
|
}
|
|
1618
1523
|
function getCacheFilePath(cacheKey) {
|
|
1619
|
-
return
|
|
1524
|
+
return path9.join(process.cwd(), CACHE_DIR_NAME, "fetch", `${cacheKey}.json`);
|
|
1620
1525
|
}
|
|
1621
1526
|
function getEffectiveCacheMode(mode) {
|
|
1622
1527
|
if (mode === "memory" || mode === "fs" || mode === "none") {
|
|
@@ -1654,7 +1559,7 @@ async function fetchWithCache(input, init, options = {}) {
|
|
|
1654
1559
|
}
|
|
1655
1560
|
const filePath = getCacheFilePath(cacheKey);
|
|
1656
1561
|
if (cacheMode === "fs") {
|
|
1657
|
-
await fs6.mkdir(
|
|
1562
|
+
await fs6.mkdir(path9.dirname(filePath), { recursive: true });
|
|
1658
1563
|
if (!options.forceRefresh) {
|
|
1659
1564
|
try {
|
|
1660
1565
|
const raw = await fs6.readFile(filePath, "utf8");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/typegen.ts","../src/path-utils.ts","../src/page-helper-inject.ts","../src/discover.ts","../src/route-utils.ts","../src/route-params.ts","../src/constants.ts","../src/dev-server.ts","../src/errors.ts","../src/render-runtime.ts","../src/module-loader.ts","../src/page-helper-generator.ts","../src/html-asset-validator.ts","../src/page-index.ts","../src/static-assets.ts","../src/fetch-cache.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { transform as esbuildTransform } from 'esbuild';\nimport pLimit from 'p-limit';\nimport type { Plugin, ViteDevServer } from 'vite';\n\nimport { writePageTypeDeclarations, getGeneratedHelperImportPath } from './typegen';\nimport { injectPageHelperImport } from './page-helper-inject';\n\nimport {\n PLUGIN_NAME,\n VIRTUAL_BUILD_ENTRY_ID,\n VIRTUAL_PAGE_HELPER_ID,\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX,\n VIRTUAL_JSX_RUNTIME_ID,\n VIRTUAL_JSX_DEV_RUNTIME_ID,\n RESOLVED_VIRTUAL_JSX_RUNTIME_ID,\n RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID,\n VIRTUAL_LOCAL_TYPES_PREFIX,\n} from './constants';\nimport { discoverEntryPages } from './discover';\nimport { installDevServer } from './dev-server';\nimport { validateHtmlAssetReferences } from './html-asset-validator';\nimport { createPageModuleLoader, closePageModuleLoader } from './module-loader';\nimport { buildPageIndex } from './page-index';\nimport { generateTypedPageHelper } from './page-helper-generator';\nimport { renderPage } from './render-runtime';\nimport {\n buildProcessedStaticAssets,\n collectStaticAssets,\n copyStaticAssetSource,\n} from './static-assets';\nimport type { HtPageInfo, HtPageModule, HtPagesPluginOptions } from './types';\n\nlet hasWarnedESM = false;\n\nconst pluginDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction warnIfNotESM(root: string) {\n try {\n const pkgPath = path.join(root, 'package.json');\n\n if (!fs.existsSync(pkgPath)) return;\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n\n if (pkg.type !== 'module') {\n console.warn(\n `[${PLUGIN_NAME}] ⚠️ It is recommended to add \"type\": \"module\" to your package.json for optimal performance and to avoid Node ESM warnings.`,\n );\n }\n } catch {\n // silent — never break build\n }\n}\n\nfunction isLocalPageTypesImport(id: string): boolean {\n return /^\\.\\/\\$types(?:\\.[A-Za-z0-9_.-]+)?$/.test(id);\n}\n\nfunction chunkArray<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n out.push(items.slice(i, i + size));\n }\n return out;\n}\n\nfunction isHtJsxFile(id: string): boolean {\n return (\n id.endsWith('.ht.jsx') ||\n id.endsWith('.html.jsx') ||\n id.endsWith('.ht.tsx') ||\n id.endsWith('.html.tsx')\n );\n}\n\nfunction isHtTsxFile(id: string): boolean {\n return id.endsWith('.ht.tsx') || id.endsWith('.html.tsx');\n}\n\nfunction isHtJsxImporter(importer: string | undefined): boolean {\n if (!importer) return false;\n\n const normalized = importer.split('?')[0].replace(/\\\\/g, '/');\n\n return isHtJsxFile(normalized);\n}\n\nfunction hasPageHelperImport(code: string): boolean {\n return (\n code.includes(`from './$types`) ||\n code.includes(`from \"./$types`) ||\n code.includes(`from 'vite-plugin-html-pages/page'`) ||\n code.includes(`from \"vite-plugin-html-pages/page\"`)\n );\n}\n\nfunction usesPageHelper(code: string): boolean {\n return (\n code.includes('definePage(') ||\n code.includes('defineData(') ||\n code.includes('defineStaticParams(') ||\n code.includes('definePageModule(')\n );\n}\n\nexport function htPages(options: HtPagesPluginOptions = {}): Plugin {\n let root = process.cwd();\n let server: ViteDevServer | null = null;\n let devPages: HtPageInfo[] = [];\n let watcherAttached = false;\n\n const cleanUrls = options.cleanUrls ?? true;\n const pagesDir = options.pagesDir ?? 'src';\n const pageExtensions = options.pageExtensions?.length\n ? options.pageExtensions\n : [\n '.ht.js',\n '.html.js',\n '.ht.ts',\n '.html.ts',\n '.ht.jsx',\n '.html.jsx',\n '.ht.tsx',\n '.html.tsx',\n ];\n\n function logDebug(enabled: boolean | undefined, ...args: unknown[]) {\n if (!enabled) return;\n console.log(`[${PLUGIN_NAME}]`, ...args);\n }\n\n async function findEntryByAbsolutePath(absolutePath: string): Promise<HtPageInfo | undefined> {\n const entries = await discoverEntryPages(root, options);\n const normalized = path.resolve(absolutePath);\n \n return entries.find(\n (entry) => path.resolve(entry.absolutePath) === normalized,\n );\n }\n\n async function loadDevPages(): Promise<HtPageInfo[]> {\n const entries = await discoverEntryPages(root, options);\n \n // 🔥 generate types for editor\n await writePageTypeDeclarations({\n root,\n pagesDir,\n entries,\n });\n \n const modulesByEntry = new Map<string, HtPageModule>();\n\n logDebug(\n options.debug,\n 'discovered entries',\n entries.map((e) => e.relativePath),\n );\n\n if (!server) return [];\n\n const loadModule = await createPageModuleLoader({\n mode: 'dev',\n root,\n pagesDir,\n options,\n server,\n });\n\n for (const entry of entries) {\n const mod = await loadModule(entry.entryPath, entry.relativePath);\n modulesByEntry.set(entry.entryPath, mod);\n }\n\n devPages = await buildPageIndex({\n entries,\n modulesByEntry,\n cleanUrls,\n });\n\n logDebug(\n options.debug,\n 'dev pages',\n devPages.map((p) => `${p.routePath} -> ${p.relativePath}`),\n );\n\n return devPages;\n }\n\n async function buildPagesPipeline() {\n const entries = await discoverEntryPages(root, options);\n \n // 🔥 generate types for build (also ensures fresh output)\n await writePageTypeDeclarations({\n root,\n pagesDir,\n entries,\n });\n \n const modulesByEntry = new Map<string, HtPageModule>();\n\n const loadModule = await createPageModuleLoader({\n mode: 'build',\n root,\n pagesDir,\n options,\n getPages: async () => entries,\n });\n\n for (const entry of entries) {\n const mod = await loadModule(entry.entryPath, entry.relativePath);\n modulesByEntry.set(entry.entryPath, mod);\n }\n\n const pages = await buildPageIndex({\n entries,\n modulesByEntry,\n cleanUrls,\n });\n\n return { entries, modulesByEntry, pages };\n }\n\n return {\n name: PLUGIN_NAME,\n\n config(userConfig, env) {\n if (env.command !== 'build') return;\n\n const hasExplicitInput = userConfig.build?.rollupOptions?.input != null;\n if (hasExplicitInput) return;\n\n return {\n build: {\n rollupOptions: {\n input: VIRTUAL_BUILD_ENTRY_ID,\n },\n },\n };\n },\n\n resolveId(id, importer) {\n if (id === VIRTUAL_BUILD_ENTRY_ID) {\n return id;\n }\n\n if (id === VIRTUAL_PAGE_HELPER_ID && importer) {\n return `${RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX}${importer}`;\n }\n\n if (id === VIRTUAL_JSX_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_JSX_RUNTIME_ID;\n }\n\n if (id === VIRTUAL_JSX_DEV_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID;\n }\n\n if (isHtJsxImporter(importer)) {\n if (id === 'react/jsx-runtime') {\n return RESOLVED_VIRTUAL_JSX_RUNTIME_ID;\n }\n\n if (id === 'react/jsx-dev-runtime') {\n return RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID;\n }\n }\n\n if (importer && isLocalPageTypesImport(id)) {\n return `${VIRTUAL_LOCAL_TYPES_PREFIX}${importer}::${id}`;\n } \n\n return null;\n },\n\n async load(id) {\n if (id === VIRTUAL_BUILD_ENTRY_ID) {\n return 'export default {};';\n }\n\n if (id === RESOLVED_VIRTUAL_JSX_RUNTIME_ID) {\n return `\nexport { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(\n pathToFileURL(path.join(pluginDir, 'jsx-runtime.js')).href,\n )};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID) {\n return `\nexport { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(\n pathToFileURL(path.join(pluginDir, 'jsx-dev-runtime.js')).href,\n )};\n`;\n }\n\n if (id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {\n const importer = id.slice(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length);\n const { pages } = await buildPagesPipeline();\n\n const normalizedImporter = path.resolve(importer);\n\n const page = pages.find(\n (candidate) =>\n path.resolve(candidate.absolutePath) === normalizedImporter,\n );\n\n return generateTypedPageHelper(page);\n }\n\n if (id.startsWith(VIRTUAL_LOCAL_TYPES_PREFIX)) {\n return `\nexport {\n definePage,\n defineData,\n defineStaticParams,\n definePageModule\n} from 'vite-plugin-html-pages/page';\n`;\n } \n\n return null;\n },\n\n async transform(code, id) {\n const normalizedId = id.split('?')[0].replace(/\\\\/g, '/');\n\n if (!isHtJsxFile(normalizedId)) {\n return null;\n }\n\n // let transformedCode = code;\n\n // if (!hasPageHelperImport(code) && usesPageHelper(code)) {\n // const entry = await findEntryByAbsolutePath(normalizedId);\n \n // if (entry) {\n // const helperImportPath = getGeneratedHelperImportPath({\n // root,\n // pagesDir,\n // page: entry,\n // });\n \n // transformedCode =\n // `import { definePage, defineData, defineStaticParams, definePageModule } from ${JSON.stringify(helperImportPath)};\\n` +\n // code;\n // }\n // } \n \n const transformedCode = await injectPageHelperImport({\n code,\n absolutePath: normalizedId,\n root,\n pagesDir,\n options,\n }); \n\n const result = await esbuildTransform(transformedCode, {\n loader: isHtTsxFile(normalizedId) ? 'tsx' : 'jsx',\n format: 'esm',\n jsx: 'automatic',\n jsxImportSource: 'vite-plugin-html-pages',\n sourcemap: true,\n sourcefile: normalizedId,\n target: 'es2020',\n });\n\n return {\n code: result.code,\n map: result.map,\n };\n },\n\n configResolved(resolved) {\n root = options.root ? path.resolve(resolved.root, options.root) : resolved.root;\n\n if (!hasWarnedESM) {\n warnIfNotESM(root);\n hasWarnedESM = true;\n }\n },\n\n async buildStart() {\n const entries = await discoverEntryPages(root, options);\n\n for (const entry of entries) {\n this.addWatchFile(entry.entryPath);\n }\n\n const staticAssets = await collectStaticAssets({\n root,\n pagesDir,\n pageExtensions,\n });\n\n for (const asset of staticAssets) {\n this.addWatchFile(asset.absolutePath);\n }\n\n logDebug(\n options.debug,\n 'static assets',\n staticAssets.map((asset) => ({\n kind: asset.kind,\n input: asset.relativePathFromSrc,\n output: asset.outputFileName,\n })),\n );\n },\n\n configureServer(_server) {\n server = _server;\n\n installDevServer({\n server,\n root,\n pagesDir,\n getPages: async () => {\n if (devPages.length > 0) return devPages;\n return loadDevPages();\n },\n getEntries: async () => discoverEntryPages(root, options),\n });\n\n if (!watcherAttached) {\n watcherAttached = true;\n\n const reload = async (file: string) => {\n if (\n !file.includes(`${path.sep}${pagesDir}${path.sep}`) &&\n !file.includes(`/${pagesDir}/`)\n ) {\n return;\n }\n\n logDebug(options.debug, 'file changed', file);\n\n await loadDevPages();\n\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n };\n\n server.watcher.on('add', reload);\n server.watcher.on('change', reload);\n server.watcher.on('unlink', reload);\n }\n\n loadDevPages().catch((error) => {\n server?.config.logger.error(\n `[${PLUGIN_NAME}] loadDevPages failed: ${\n error instanceof Error ? error.stack ?? error.message : String(error)\n }`,\n );\n });\n },\n\n async generateBundle(_, bundle) {\n try {\n const { modulesByEntry, pages } = await buildPagesPipeline();\n\n const staticAssets = await collectStaticAssets({\n root,\n pagesDir,\n pageExtensions,\n });\n\n logDebug(\n options.debug,\n 'emitting pages',\n pages.map((p) => p.fileName),\n );\n\n logDebug(\n options.debug,\n 'emitting static assets',\n staticAssets.map((asset) => ({\n kind: asset.kind,\n input: asset.relativePathFromSrc,\n output: asset.outputFileName,\n })),\n );\n\n const limit = pLimit(options.renderConcurrency ?? 8);\n const batchSize =\n options.renderBatchSize ??\n Math.max(options.renderConcurrency ?? 8, 32);\n\n const processedOutputs = await buildProcessedStaticAssets({\n root,\n pagesDir,\n assets: staticAssets,\n minify: true,\n sourcemap: false,\n });\n\n for (const [fileName, source] of processedOutputs) {\n this.emitFile({\n type: 'asset',\n fileName,\n source,\n });\n }\n\n for (const asset of staticAssets) {\n if (asset.kind !== 'copy') continue;\n\n const source = await copyStaticAssetSource(asset);\n\n this.emitFile({\n type: 'asset',\n fileName: asset.outputFileName,\n source,\n });\n }\n\n for (const batch of chunkArray(pages, batchSize)) {\n await Promise.all(\n batch.map((page) =>\n limit(async () => {\n const mod = modulesByEntry.get(page.entryPath);\n\n if (!mod) {\n throw new Error(\n `[${PLUGIN_NAME}] Missing module for page entry: ${page.entryPath}`,\n );\n }\n\n const html = await renderPage(page, mod, false);\n\n validateHtmlAssetReferences({\n root,\n pagesDir,\n html,\n pluginName: PLUGIN_NAME,\n pageLabel: page.relativePath,\n missingAssets: options.missingAssets ?? 'error',\n });\n\n this.emitFile({\n type: 'asset',\n fileName: options.mapOutputPath?.(page) ?? page.fileName,\n source: html,\n });\n }),\n ),\n );\n }\n\n const notFoundPage = pages.find((p) => p.routePath === '/404');\n\n if (notFoundPage) {\n const mod = modulesByEntry.get(notFoundPage.entryPath);\n\n if (!mod) {\n throw new Error(\n `[${PLUGIN_NAME}] Missing module for 404 page entry: ${notFoundPage.entryPath}`,\n );\n }\n\n const html = await renderPage(notFoundPage, mod, false);\n\n validateHtmlAssetReferences({\n root,\n pagesDir,\n html,\n pluginName: PLUGIN_NAME,\n pageLabel: notFoundPage.relativePath,\n missingAssets: options.missingAssets ?? 'error',\n });\n\n this.emitFile({\n type: 'asset',\n fileName: '404.html',\n source: html,\n });\n\n logDebug(options.debug, 'generated 404.html from user page');\n } else {\n const default404 = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>404 - Page Not Found</title>\n <style>\n :root {\n color-scheme: light dark;\n }\n body {\n margin: 0;\n font-family: system-ui, sans-serif;\n min-height: 100vh;\n display: grid;\n place-items: center;\n padding: 2rem;\n }\n main {\n max-width: 40rem;\n text-align: center;\n }\n h1 {\n font-size: 3rem;\n margin: 0 0 1rem;\n }\n p {\n margin: 0.5rem 0;\n line-height: 1.5;\n }\n a {\n color: inherit;\n }\n </style>\n </head>\n <body>\n <main>\n <h1>404</h1>\n <p>Page not found.</p>\n <p><a href=\"/\">Go back home</a></p>\n </main>\n </body>\n</html>\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: '404.html',\n source: default404,\n });\n\n logDebug(options.debug, 'generated default 404.html');\n }\n\n const sitemapBase = options.site ?? '';\n\n const sitemapRoutes = [...new Set(pages.map((p) => p.routePath))].filter(\n (route) => !route.includes(':') && !route.includes('*'),\n );\n\n if (sitemapBase && sitemapRoutes.length > 0) {\n const sitemap = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${sitemapRoutes\n .map((route) => ` <url><loc>${sitemapBase}${route}</loc></url>`)\n .join('\\n')}\\n</urlset>\\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: 'sitemap.xml',\n source: sitemap,\n });\n\n logDebug(options.debug, 'generated sitemap.xml');\n }\n\n const rss = options.rss;\n\n if (rss?.site) {\n const routePrefix = rss.routePrefix ?? '/blog';\n\n const rssItems = pages\n .filter((page) => page.routePath.startsWith(routePrefix))\n .map((page) => {\n const url = `${rss.site}${page.routePath}`;\n\n return ` <item>\\n <title>${page.routePath}</title>\\n <link>${url}</link>\\n <guid>${url}</guid>\\n </item>`;\n })\n .join('\\n');\n\n const rssXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<rss version=\"2.0\">\\n<channel>\\n <title>${rss.title ?? PLUGIN_NAME}</title>\\n <link>${rss.site}</link>\\n <description>${rss.description ?? 'RSS feed'}</description>\\n${rssItems}\\n</channel>\\n</rss>\\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: 'rss.xml',\n source: rssXml,\n });\n\n logDebug(options.debug, 'generated rss.xml');\n }\n\n for (const [fileName, output] of Object.entries(bundle)) {\n if (\n output.type === 'chunk' &&\n output.facadeModuleId === VIRTUAL_BUILD_ENTRY_ID\n ) {\n delete bundle[fileName];\n }\n }\n } finally {\n await closePageModuleLoader();\n }\n },\n };\n}\n\nexport default htPages;","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { HtPageInfo, RouteParamDefinition } from './types';\nimport { normalizeFsPath, toPosix } from './path-utils';\n\nfunction paramsTypeFromDefinitions(\n paramDefinitions: RouteParamDefinition[],\n): string {\n if (paramDefinitions.length === 0) {\n return '{}';\n }\n\n const fields = paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return `${param.name}: string`;\n }\n\n if (param.type === 'catch-all') {\n return `${param.name}: string[]`;\n }\n\n return `${param.name}?: string[]`;\n });\n\n return `{ ${fields.join('; ')} }`;\n}\n\nfunction pageHelperModuleSource(page: HtPageInfo): string {\n const paramsType = paramsTypeFromDefinitions(page.paramDefinitions ?? []);\n\n return `export type PageParams = ${paramsType};\n\nexport type StaticParams = PageParams[];\n\nexport type DataContext = {\n params: PageParams;\n dev: boolean;\n};\n\nexport type RenderContext<TData = unknown> = {\n params: PageParams;\n data: TData;\n dev: boolean;\n};\n\nexport type PageContext<TData = unknown> = {\n params: PageParams;\n data?: TData;\n dev: boolean;\n};\n\nexport type PageModule<TData = unknown> = {\n generateStaticParams?: () => StaticParams | Promise<StaticParams>;\n data?: (ctx: DataContext) => TData | Promise<TData>;\n render: (ctx: RenderContext<TData>) => string | Promise<string>;\n};\n\nexport declare function definePage<\n T extends (ctx: PageContext) => string | Promise<string>\n>(fn: T): T;\n\nexport declare function defineData<\n T extends (ctx: DataContext) => unknown | Promise<unknown>\n>(fn: T): T;\n\nexport declare function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n>(fn: T): T;\n\nexport declare function definePageModule<TData>(\n mod: PageModule<TData>\n): PageModule<TData>;\n`;\n}\n\nfunction stripPageExtension(filePath: string): string {\n return filePath.replace(/\\.(ht|html)\\.(js|ts|jsx|tsx)$/i, '');\n}\n\nfunction getTypesFileName(page: HtPageInfo): string {\n if (!page.dynamic || page.paramDefinitions.length === 0) {\n return '$types.d.ts';\n }\n\n const parts = page.paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return param.name;\n }\n\n if (param.type === 'catch-all') {\n return `${param.name}.all`;\n }\n\n return `${param.name}.opt`;\n });\n\n return `$types.${parts.join('.')}.d.ts`;\n}\n\nasync function listFilesRecursive(dir: string): Promise<string[]> {\n let entries;\n \n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n \n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = path.join(dir, entry.name);\n \n if (entry.isDirectory()) {\n return listFilesRecursive(fullPath);\n }\n \n return [fullPath];\n }),\n );\n \n return files.flat();\n }\n \n async function removeEmptyDirectories(dir: string, stopAt: string): Promise<void> {\n const normalizedDir = normalizeFsPath(dir);\n const normalizedStopAt = normalizeFsPath(stopAt);\n \n if (normalizedDir === normalizedStopAt) {\n return;\n }\n \n let entries;\n \n try {\n entries = await fs.readdir(normalizedDir);\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n \n if (entries.length > 0) {\n return;\n }\n \n await fs.rmdir(normalizedDir);\n await removeEmptyDirectories(path.dirname(normalizedDir), normalizedStopAt);\n }\n\nexport function getGeneratedTypesRoot(root: string): string {\n return normalizeFsPath(path.join(root, '.vite-plugin-html-pages', 'types'));\n}\n\nexport function getGeneratedHelperPath(args: {\n root: string;\n pagesDir: string;\n page: HtPageInfo;\n}): string {\n const pagesRoot = normalizeFsPath(path.join(args.root, args.pagesDir));\n const relativeFromPagesDir = toPosix(\n path.relative(pagesRoot, args.page.absolutePath),\n );\n const withoutExt = stripPageExtension(relativeFromPagesDir);\n const outRoot = getGeneratedTypesRoot(args.root);\n const fileName = getTypesFileName(args.page);\n\n return normalizeFsPath(\n path.join(outRoot, path.dirname(withoutExt), fileName),\n );\n}\n\nasync function removeStalePageTypeDeclarations(args: {\n root: string;\n expectedFiles: Set<string>;\n}): Promise<void> {\n const outRoot = getGeneratedTypesRoot(args.root);\n const existingFiles = await listFilesRecursive(outRoot);\n\n const staleFiles = existingFiles.filter((file) => {\n if (!file.endsWith('.d.ts')) {\n return false;\n }\n\n return !args.expectedFiles.has(normalizeFsPath(file));\n });\n\n await Promise.all(\n staleFiles.map(async (file) => {\n await fs.unlink(file);\n await removeEmptyDirectories(path.dirname(file), outRoot);\n }),\n );\n}\n\nexport async function writePageTypeDeclarations(args: {\n root: string;\n pagesDir: string;\n entries: HtPageInfo[];\n}): Promise<void> {\n const outRoot = getGeneratedTypesRoot(args.root);\n\n await fs.mkdir(outRoot, { recursive: true });\n\n const outputs = args.entries.map((page) => ({\n page,\n outFile: getGeneratedHelperPath({\n root: args.root,\n pagesDir: args.pagesDir,\n page,\n }),\n }));\n\n const expectedFiles = new Set(\n outputs.map(({ outFile }) => normalizeFsPath(outFile)),\n );\n\n await Promise.all(\n outputs.map(async ({ page, outFile }) => {\n await fs.mkdir(path.dirname(outFile), { recursive: true });\n await fs.writeFile(outFile, pageHelperModuleSource(page), 'utf8');\n }),\n );\n\n await removeStalePageTypeDeclarations({\n root: args.root,\n expectedFiles,\n });\n}\n\nexport function getGeneratedHelperImportPath(args: {\n root: string;\n pagesDir: string;\n page: HtPageInfo;\n }): string {\n const pagesRoot = normalizeFsPath(path.join(args.root, args.pagesDir));\n const relativeFromPagesDir = toPosix(\n path.relative(pagesRoot, args.page.absolutePath),\n );\n const withoutExt = stripPageExtension(relativeFromPagesDir);\n const dir = path.dirname(withoutExt);\n const fileName = getTypesFileName(args.page).replace(/\\.d\\.ts$/, '');\n \n if (dir === '.' || dir === '') {\n return `./${fileName}`;\n }\n \n return `./${fileName}`;\n}","import path from 'node:path';\n\nexport function toPosix(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nexport function normalizeFsPath(value: string): string {\n return path.normalize(value);\n}\n\nexport function normalizeRoutePath(value: string): string {\n const normalized = toPosix(value).replace(/\\/+/g, '/');\n if (!normalized || normalized === '/') return '/';\n\n const withLeadingSlash = normalized.startsWith('/')\n ? normalized\n : `/${normalized}`;\n\n return withLeadingSlash !== '/' && withLeadingSlash.endsWith('/')\n ? withLeadingSlash.slice(0, -1)\n : withLeadingSlash;\n}\n\nexport function stripPageSuffix(\n filePath: string,\n extensions: string[],\n): string {\n const normalized = toPosix(filePath);\n\n const match = [...extensions]\n .sort((a, b) => b.length - a.length)\n .find((ext) => normalized.endsWith(ext));\n\n if (!match) return normalized;\n\n return normalized.slice(0, -match.length);\n}","import path from 'node:path';\nimport type { HtPageInfo, HtPagesPluginOptions } from './types';\nimport { discoverEntryPages } from './discover';\nimport { getGeneratedHelperImportPath } from './typegen';\n\nexport function hasPageHelperImport(code: string): boolean {\n return (\n code.includes(`from './$types`) ||\n code.includes(`from \"./$types`) ||\n code.includes(`from 'vite-plugin-html-pages/page'`) ||\n code.includes(`from \"vite-plugin-html-pages/page\"`)\n );\n}\n\nexport function usesPageHelper(code: string): boolean {\n return (\n code.includes('definePage(') ||\n code.includes('defineData(') ||\n code.includes('defineStaticParams(') ||\n code.includes('definePageModule(')\n );\n}\n\nexport async function findEntryByAbsolutePath(args: {\n root: string;\n options: HtPagesPluginOptions;\n absolutePath: string;\n}): Promise<HtPageInfo | undefined> {\n const entries = await discoverEntryPages(args.root, args.options);\n const normalized = path.resolve(args.absolutePath);\n\n return entries.find(\n (entry) => path.resolve(entry.absolutePath) === normalized,\n );\n}\n\nexport async function injectPageHelperImport(args: {\n code: string;\n absolutePath: string;\n root: string;\n pagesDir: string;\n options: HtPagesPluginOptions;\n}): Promise<string> {\n const { code, absolutePath, root, pagesDir, options } = args;\n\n if (hasPageHelperImport(code) || !usesPageHelper(code)) {\n return code;\n }\n\n const entry = await findEntryByAbsolutePath({\n root,\n options,\n absolutePath,\n });\n\n if (!entry) {\n return code;\n }\n\n const helperImportPath = getGeneratedHelperImportPath({\n root,\n pagesDir,\n page: entry,\n });\n\n return `import { definePage, defineData, defineStaticParams, definePageModule } from ${JSON.stringify(\n helperImportPath,\n )};\\n${code}`;\n}","import path from 'node:path';\nimport { normalizeFsPath, toPosix } from './path-utils';\nimport { isDynamicPage, toRoutePattern } from './route-utils';\nimport { extractRouteParamDefinitions } from './route-params';\nimport type { HtPageInfo, HtPagesPluginOptions } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nfunction buildDefaultIncludeGlobs(\n pagesDir: string,\n pageExtensions: string[],\n): string[] {\n return pageExtensions.map((ext) => {\n const cleanExt = ext.startsWith('.') ? ext.slice(1) : ext;\n return `${pagesDir}/**/*.${cleanExt}`;\n });\n}\n\nexport async function discoverEntryPages(\n root: string,\n options: HtPagesPluginOptions,\n): Promise<HtPageInfo[]> {\n const fgModule = await import('fast-glob');\n const fg = (fgModule.default ?? fgModule) as typeof import('fast-glob');\n\n const pagesDir = options.pagesDir ?? 'src';\n const pageExtensions = options.pageExtensions?.length\n ? options.pageExtensions\n : ['.ht.js', '.html.js', '.ht.ts', '.html.ts', '.ht.jsx', '.html.jsx', '.ht.tsx', '.html.tsx'];\n\n const include = Array.isArray(options.include)\n ? options.include\n : options.include\n ? [options.include]\n : buildDefaultIncludeGlobs(pagesDir, pageExtensions);\n\n const exclude = Array.isArray(options.exclude)\n ? options.exclude\n : options.exclude\n ? [options.exclude]\n : [];\n\n const pagesRoot = normalizeFsPath(path.join(root, pagesDir));\n\n const files = await fg.glob(include, {\n cwd: root,\n ignore: exclude,\n absolute: true,\n });\n\n return files\n .sort()\n .map((absolutePath) => {\n const entryPath = normalizeFsPath(absolutePath);\n const relativePath = toPosix(path.relative(root, entryPath));\n const relativeFromPagesDir = toPosix(path.relative(pagesRoot, entryPath));\n\n if (\n relativeFromPagesDir.startsWith('../') ||\n relativeFromPagesDir === '..'\n ) {\n throw new Error(\n `[${PLUGIN_NAME}] Page is outside pagesDir: ${entryPath} (pagesDir: ${pagesDir})`,\n );\n }\n\n const dynamic = isDynamicPage(relativeFromPagesDir);\n const routePattern = toRoutePattern(relativeFromPagesDir, pageExtensions);\n const paramDefinitions = extractRouteParamDefinitions(routePattern);\n\n return {\n id: entryPath,\n entryPath,\n absolutePath: entryPath,\n relativePath,\n routePattern,\n routePath: routePattern,\n fileName: '',\n dynamic,\n paramNames: paramDefinitions.map((p) => p.name),\n paramDefinitions,\n params: {},\n } satisfies HtPageInfo;\n });\n}","import { normalizeRoutePath, stripPageSuffix, toPosix } from './path-utils';\nimport type {\n HtPageInfo,\n HtPageParams,\n StaticParamRecord,\n StaticParamValue,\n} from './types';\n\nconst DYNAMIC_SEGMENT_RE = /\\[([A-Za-z0-9_]+)\\]/g;\nconst CATCH_ALL_SEGMENT_RE = /\\[\\.\\.\\.([A-Za-z0-9_]+)\\]/g;\nconst OPTIONAL_CATCH_ALL_SEGMENT_RE = /\\[\\.\\.\\.([A-Za-z0-9_]+)\\]\\?/g;\nconst ANY_PARAM_RE = /\\[(?:\\.\\.\\.)?([A-Za-z0-9_]+)\\]\\??/g;\nconst ROUTE_GROUP_RE = /(^|\\/)\\(([^)]+)\\)(?=\\/|$)/g;\n\nexport function getParamNames(relativeFromPagesDir: string): string[] {\n return [...relativeFromPagesDir.matchAll(ANY_PARAM_RE)].map((m) => m[1]);\n}\n\nexport function isDynamicPage(relativeFromPagesDir: string): boolean {\n return /\\[(?:\\.\\.\\.)?[A-Za-z0-9_]+\\]\\??/.test(relativeFromPagesDir);\n}\n\nexport function toRoutePattern(\n relativeFromPagesDir: string,\n extensions: string[],\n): string {\n const noExt = stripPageSuffix(toPosix(relativeFromPagesDir), extensions);\n\n const withoutGroups = noExt.replace(ROUTE_GROUP_RE, '$1');\n const withoutIndex = withoutGroups.replace(/\\/index$/i, '').replace(/^index$/i, '');\n\n const raw = withoutIndex\n .replace(OPTIONAL_CATCH_ALL_SEGMENT_RE, '*?:$1')\n .replace(CATCH_ALL_SEGMENT_RE, '*:$1')\n .replace(DYNAMIC_SEGMENT_RE, ':$1');\n\n return normalizeRoutePath(raw || '/');\n}\n\nfunction encodePathParts(parts: string[]): string {\n return parts.map((part) => encodeURIComponent(part)).join('/');\n}\n\nfunction normalizeCatchAllValue(value: StaticParamValue): string[] {\n if (Array.isArray(value)) {\n return value.map((part) => String(part)).filter(Boolean);\n }\n\n if (value === '') {\n return [];\n }\n\n return String(value).split('/').filter(Boolean);\n}\n\nfunction normalizePageParams(params: StaticParamRecord): HtPageParams {\n const normalized: HtPageParams = {};\n\n for (const [key, value] of Object.entries(params)) {\n normalized[key] = Array.isArray(value)\n ? value.map((part) => String(part))\n : String(value);\n }\n\n return normalized;\n}\n\nexport function fillParams(\n pattern: string,\n params: StaticParamRecord,\n): string {\n const result = pattern\n .replace(/\\*\\?:([A-Za-z0-9_]+)/g, (_, key) => {\n const value = params[key];\n if (value == null) {\n return '';\n }\n\n const parts = normalizeCatchAllValue(value);\n if (parts.length === 0) {\n return '';\n }\n\n return encodePathParts(parts);\n })\n .replace(/\\*:([A-Za-z0-9_]+)/g, (_, key) => {\n if (!(key in params)) {\n throw new Error(`Missing catch-all route param \"${key}\"`);\n }\n\n const value = params[key];\n const parts = normalizeCatchAllValue(value);\n\n if (parts.length === 0) {\n throw new Error(`Catch-all route param \"${key}\" must not be empty`);\n }\n\n return encodePathParts(parts);\n })\n .replace(/:([A-Za-z0-9_]+)/g, (_, key) => {\n if (!(key in params)) {\n throw new Error(`Missing route param \"${key}\"`);\n }\n\n const value = params[key];\n if (Array.isArray(value)) {\n throw new Error(`Route param \"${key}\" must be a string, received array`);\n }\n\n return encodeURIComponent(String(value));\n });\n\n return normalizeRoutePath(result || '/');\n}\n\nexport function fileNameFromRoute(\n routePath: string,\n cleanUrls: boolean,\n): string {\n const normalized = normalizeRoutePath(routePath);\n\n if (normalized === '/') return 'index.html';\n\n const base = normalized.slice(1);\n return cleanUrls ? `${base}/index.html` : `${base}.html`;\n}\n\nexport function expandStaticPaths(\n basePage: Omit<HtPageInfo, 'routePath' | 'fileName' | 'params'>,\n rows: StaticParamRecord[],\n cleanUrls: boolean,\n): HtPageInfo[] {\n return rows.map((row) => {\n const routePath = fillParams(basePage.routePattern, row);\n const params = normalizePageParams(row);\n\n return {\n ...basePage,\n routePath,\n fileName: fileNameFromRoute(routePath, cleanUrls),\n params,\n };\n });\n}\n\nexport function routeMatch(\n pattern: string,\n urlPath: string,\n): HtPageParams | null {\n const a = normalizeRoutePath(pattern).split('/').filter(Boolean);\n const b = normalizeRoutePath(urlPath).split('/').filter(Boolean);\n const params: HtPageParams = {};\n\n for (let i = 0; i < a.length; i++) {\n const patternSeg = a[i];\n const urlSeg = b[i];\n\n if (patternSeg.startsWith('*?:')) {\n const key = patternSeg.slice(3);\n if (i < b.length) {\n params[key] = b.slice(i).map(decodeURIComponent);\n }\n return params;\n }\n\n if (patternSeg.startsWith('*:')) {\n const rest = b.slice(i);\n if (rest.length === 0) return null;\n\n params[patternSeg.slice(2)] = rest.map(decodeURIComponent);\n return params;\n }\n\n if (!urlSeg) return null;\n\n if (patternSeg.startsWith(':')) {\n params[patternSeg.slice(1)] = decodeURIComponent(urlSeg);\n continue;\n }\n\n if (patternSeg !== urlSeg) return null;\n }\n\n return a.length === b.length ? params : null;\n}\n\nexport function compareRoutePriority(a: string, b: string): number {\n const aSegs = normalizeRoutePath(a).split('/').filter(Boolean);\n const bSegs = normalizeRoutePath(b).split('/').filter(Boolean);\n const len = Math.max(aSegs.length, bSegs.length);\n\n for (let i = 0; i < len; i++) {\n const aa = aSegs[i];\n const bb = bSegs[i];\n\n if (aa == null) return 1;\n if (bb == null) return -1;\n\n const aOptionalCatchAll = aa.startsWith('*?:');\n const bOptionalCatchAll = bb.startsWith('*?:');\n if (aOptionalCatchAll !== bOptionalCatchAll) {\n return aOptionalCatchAll ? 1 : -1;\n }\n\n const aCatchAll = aa.startsWith('*:');\n const bCatchAll = bb.startsWith('*:');\n if (aCatchAll !== bCatchAll) {\n return aCatchAll ? 1 : -1;\n }\n\n const aDynamic = aa.startsWith(':');\n const bDynamic = bb.startsWith(':');\n if (aDynamic !== bDynamic) {\n return aDynamic ? 1 : -1;\n }\n }\n\n return bSegs.length - aSegs.length;\n}","import type { RouteParamDefinition } from './types';\n\nexport function parseRouteParamSegment(\n segment: string,\n): RouteParamDefinition | null {\n if (segment.startsWith('*?:')) {\n return {\n name: segment.slice(3),\n type: 'optional-catch-all',\n };\n }\n\n if (segment.startsWith('*:')) {\n return {\n name: segment.slice(2),\n type: 'catch-all',\n };\n }\n\n if (segment.startsWith(':')) {\n return {\n name: segment.slice(1),\n type: 'single',\n };\n }\n\n return null;\n}\n\nexport function extractRouteParamDefinitions(\n routePattern: string,\n): RouteParamDefinition[] {\n return routePattern\n .split('/')\n .filter(Boolean)\n .map((segment) => parseRouteParamSegment(segment))\n .filter((value): value is RouteParamDefinition => value != null);\n}","export const PLUGIN_NAME = 'vite-plugin-html-pages';\nexport const VIRTUAL_BUILD_ENTRY_ID = `\\0${PLUGIN_NAME}:build-entry`;\nexport const VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;\nexport const RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX =`\\0${PLUGIN_NAME}/page:`;\nexport const VIRTUAL_MANIFEST_ID = `\\0virtual:${PLUGIN_NAME}-manifest`;\nexport const CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;\nexport const VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;\nexport const VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;\nexport const RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\\0${VIRTUAL_JSX_RUNTIME_ID}`;\nexport const RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;\nexport const VIRTUAL_LOCAL_TYPES_PREFIX = `\\0${PLUGIN_NAME}:local-types:`;","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ViteDevServer } from 'vite';\n\nimport { renderPage } from './render-runtime';\nimport type { HtPageInfo, HtPageModule } from './types';\nimport { PLUGIN_NAME } from './constants';\nimport { createPageModuleLoader } from './module-loader';\n\nfunction isStaticAssetRequest(url: string): boolean {\n return (\n url.endsWith('.css') ||\n url.endsWith('.js') ||\n url.endsWith('.mjs') ||\n url.endsWith('.ts') ||\n url.endsWith('.png') ||\n url.endsWith('.jpg') ||\n url.endsWith('.jpeg') ||\n url.endsWith('.gif') ||\n url.endsWith('.svg') ||\n url.endsWith('.webp') ||\n url.endsWith('.ico') ||\n url.endsWith('.woff') ||\n url.endsWith('.woff2') ||\n url.endsWith('.ttf') ||\n url.endsWith('.otf')\n );\n}\n\nfunction shouldSkipHtmlRouting(url: string, pagesDir: string): boolean {\n return (\n url.startsWith('/@vite') ||\n url.startsWith('/@fs/') ||\n url.startsWith('/node_modules/') ||\n url.startsWith(`/${pagesDir}/`) ||\n url === '/favicon.ico' ||\n isStaticAssetRequest(url)\n );\n}\n\nfunction tryRewriteRootAssetToSrc(\n root: string,\n pagesDir: string,\n url: string,\n): string | null {\n if (!url.startsWith('/')) return null;\n if (!isStaticAssetRequest(url)) return null;\n if (url.startsWith(`/${pagesDir}/`)) return null;\n\n const candidate = path.join(root, pagesDir, url.slice(1));\n\n if (fs.existsSync(candidate)) {\n return `/${pagesDir}/${url.slice(1)}`;\n }\n\n return null;\n}\n\nfunction shouldUseDynamicRendering(mod: HtPageModule): boolean {\n return mod.dynamic === true || mod.prerender === false;\n}\n\nexport function installDevServer(args: {\n server: ViteDevServer;\n root: string;\n pagesDir: string;\n getPages: () => Promise<HtPageInfo[]>;\n getEntries?: () => Promise<HtPageInfo[]>;\n}) {\n const { server, root, pagesDir, getPages } = args;\n\n server.middlewares.use(async (req, res, next) => {\n try {\n const originalUrl = req.url ?? '/';\n const url = originalUrl.split('?')[0];\n\n const rewrittenAssetUrl = tryRewriteRootAssetToSrc(root, pagesDir, url);\n if (rewrittenAssetUrl) {\n req.url = rewrittenAssetUrl + originalUrl.slice(url.length);\n return next();\n }\n\n if (shouldSkipHtmlRouting(url, pagesDir)) {\n return next();\n }\n\n const pages = await getPages();\n\n const page = pages.find((p) => p.routePath === url);\n\n if (!page) {\n return next();\n }\n\n const loadModule = await createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n const mod = await loadModule(page.entryPath, page.relativePath);\n\n if (!mod) {\n return next();\n }\n\n if (!shouldUseDynamicRendering(mod) && page.dynamic) {\n return next();\n }\n\n const html = await renderPage(page, mod, true);\n const transformedHtml = await server.transformIndexHtml(\n url,\n html,\n req.originalUrl,\n );\n \n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(transformedHtml);\n } catch (error) {\n server.config.logger.error(\n `[${PLUGIN_NAME}] dev server render failed: ${\n error instanceof Error ? error.stack ?? error.message : String(error)\n }`,\n );\n\n next(error as Error);\n }\n });\n}","import type { HtPageInfo } from './types';\nimport { PLUGIN_NAME } from './constants';\nexport function invalidHtmlReturn(\n page: HtPageInfo,\n value: unknown,\n): Error {\n return new Error(\n `[${PLUGIN_NAME}] Page \"${page.relativePath}\" must resolve to an HTML string, got ${typeof value}`,\n );\n}\n\nexport function missingDefaultExport(page: HtPageInfo): Error {\n return new Error(\n `[${PLUGIN_NAME}] Page \"${page.relativePath}\" does not export a default renderer`,\n );\n}\n\nexport function pageError(page: HtPageInfo, cause: unknown): Error {\n const message = `[${PLUGIN_NAME}] Failed to render \"${page.relativePath}\" at route \"${page.routePath}\"`;\n\n if (cause instanceof Error) {\n const err = new Error(`${message}: ${cause.message}`);\n\n if (cause.stack) {\n err.stack = `${err.stack}\\nCaused by:\\n${cause.stack}`;\n }\n\n return err;\n }\n\n return new Error(`${message}: ${String(cause)}`);\n}","import { invalidHtmlReturn, pageError, missingDefaultExport } from './errors';\nimport type { HtPageInfo, HtPageModule, HtPageRenderContext } from './types';\n\nexport async function renderPage(\n page: HtPageInfo,\n mod: HtPageModule,\n dev = false,\n): Promise<string> {\n const ctx: HtPageRenderContext = {\n page,\n params: page.params,\n dev,\n };\n\n try {\n if (typeof mod.data === 'function') {\n ctx.data = await mod.data(ctx);\n }\n\n const entry = mod.default;\n\n if (entry == null) {\n throw missingDefaultExport(page);\n }\n\n const html = typeof entry === 'function' ? await entry(ctx) : entry;\n\n if (typeof html !== 'string') {\n throw invalidHtmlReturn(page, html);\n }\n\n return html;\n } catch (error) {\n throw pageError(page, error);\n }\n}","import path from 'node:path';\nimport { createServer, type InlineConfig, type ViteDevServer } from 'vite';\n\nimport {\n VIRTUAL_PAGE_HELPER_ID,\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX,\n VIRTUAL_LOCAL_TYPES_PREFIX,\n} from './constants';\nimport { generateTypedPageHelper } from './page-helper-generator';\nimport type {\n HtPageInfo,\n HtPageModule,\n HtPagesPluginOptions,\n HtStructuredPageModule,\n} from './types';\nimport { injectPageHelperImport } from './page-helper-inject';\n\n\nexport type PageModuleLoader = (\n entryPath: string,\n relativePath: string,\n) => Promise<HtPageModule>;\n\nlet buildServer: ViteDevServer | null = null;\n\nfunction isStructuredPageModule(\n value: unknown,\n): value is HtStructuredPageModule {\n return (\n !!value &&\n typeof value === 'object' &&\n 'render' in value &&\n typeof (value as { render?: unknown }).render === 'function'\n );\n}\n\nfunction isLocalPageTypesImport(id: string): boolean {\n return /^\\.\\/\\$types(?:\\.[A-Za-z0-9_.-]+)?$/.test(id);\n}\n\nfunction normalizeLoadedPageModule(mod: unknown): HtPageModule {\n const pageModule = (mod ?? {}) as HtPageModule;\n\n if (isStructuredPageModule(pageModule.default)) {\n const structured = pageModule.default;\n\n return {\n default: structured.render,\n data: structured.data,\n generateStaticParams: structured.generateStaticParams,\n dynamic: structured.dynamic,\n prerender: structured.prerender,\n };\n }\n\n return pageModule;\n}\n\nexport async function createPageModuleLoader(args: {\n mode: 'dev' | 'build';\n root: string;\n pagesDir: string;\n options: HtPagesPluginOptions;\n server?: ViteDevServer | null;\n getPages?: () => Promise<HtPageInfo[]>;\n}): Promise<PageModuleLoader> {\n const { mode, root, pagesDir, options, server, getPages } = args;\n\n if (mode === 'dev') {\n if (!server) {\n throw new Error('[vite-plugin-html-pages] dev server not available');\n }\n\n return async (_entryPath, relativePath) => {\n const mod = await server.ssrLoadModule(`/${relativePath}`);\n return normalizeLoadedPageModule(mod);\n };\n }\n\n if (!getPages) {\n throw new Error(\n '[vite-plugin-html-pages] getPages is required in build mode',\n );\n }\n\n if (!buildServer) {\n const config: InlineConfig = {\n root,\n configFile: false,\n logLevel: 'error',\n appType: 'custom',\n esbuild: {\n jsx: 'automatic',\n jsxImportSource: 'vite-plugin-html-pages',\n },\n server: {\n middlewareMode: true,\n },\n plugins: [\n {\n name: 'vite-plugin-html-pages:page-helper',\n\n resolveId(id, importer) {\n if (id === VIRTUAL_PAGE_HELPER_ID && importer) {\n return `${RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX}${importer}`;\n }\n\n if (importer && isLocalPageTypesImport(id)) {\n return `${VIRTUAL_LOCAL_TYPES_PREFIX}${importer}::${id}`;\n }\n\n return null;\n },\n\n async load(id) {\n if (id.startsWith(VIRTUAL_LOCAL_TYPES_PREFIX)) {\n return `\nexport {\n definePage,\n defineData,\n defineStaticParams,\n definePageModule\n} from 'vite-plugin-html-pages/page';\n`;\n }\n \n\n if (!id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {\n return null;\n }\n\n const importer = id.slice(\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length,\n );\n\n const pages = await getPages();\n const normalizedImporter = path.resolve(importer);\n\n const page = pages.find(\n (candidate) =>\n path.resolve(candidate.absolutePath) === normalizedImporter,\n );\n\n return generateTypedPageHelper(page);\n },\n\n async transform(code, id) {\n const normalizedId = id.split('?')[0].replace(/\\\\/g, '/');\n \n const transformedCode = await injectPageHelperImport({\n code,\n absolutePath: normalizedId,\n root,\n pagesDir,\n options,\n });\n \n if (transformedCode === code) {\n return null;\n }\n \n return {\n code: transformedCode,\n map: null,\n };\n },\n \n },\n ],\n };\n\n buildServer = await createServer(config);\n }\n\n return async (entryPath) => {\n const relativePath =\n '/' + path.relative(root, entryPath).replace(/\\\\/g, '/');\n\n const mod = await buildServer!.ssrLoadModule(relativePath);\n return normalizeLoadedPageModule(mod);\n };\n}\n\nexport async function closePageModuleLoader(): Promise<void> {\n if (buildServer) {\n await buildServer.close();\n buildServer = null;\n }\n}","import type { HtPageInfo, RouteParamDefinition } from './types';\n\nfunction paramsTypeFromDefinitions(\n paramDefinitions: RouteParamDefinition[],\n): string {\n if (paramDefinitions.length === 0) {\n return '{}';\n }\n\n const fields = paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return `${JSON.stringify(param.name)}: string`;\n }\n\n if (param.type === 'catch-all') {\n return `${JSON.stringify(param.name)}: string[]`;\n }\n\n return `${JSON.stringify(param.name)}?: string[]`;\n });\n\n return `{ ${fields.join('; ')} }`;\n}\n\nexport function generateTypedPageHelper(page: HtPageInfo | undefined): string {\n const paramsType = page\n ? paramsTypeFromDefinitions(page.paramDefinitions ?? [])\n : '{}';\n\n return `\nexport type PageParams = ${paramsType};\n\nexport type StaticParams = PageParams[];\n\nexport type DataContext = {\n params: PageParams;\n dev: boolean;\n};\n\nexport type RenderContext<TData = unknown> = {\n params: PageParams;\n data: TData;\n dev: boolean;\n};\n\nexport type PageContext<TData = unknown> = {\n params: PageParams;\n data?: TData;\n dev: boolean;\n};\n\nexport type PageModule<TData = unknown> = {\n generateStaticParams?: () => StaticParams | Promise<StaticParams>;\n data?: (ctx: DataContext) => TData | Promise<TData>;\n render: (ctx: RenderContext<TData>) => any;\n};\n\nexport function definePage<T extends (ctx: PageContext) => any>(fn: T): T {\n return fn;\n}\n\nexport function defineData<T extends (ctx: DataContext) => any>(fn: T): T {\n return fn;\n}\n\nexport function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n>(fn: T): T {\n return fn;\n}\n\nexport function definePageModule<TData>(\n mod: PageModule<TData>,\n): PageModule<TData> {\n return mod;\n}\n`;\n}","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface HtmlAssetValidationOptions {\n root: string;\n pagesDir: string;\n html: string;\n pluginName: string;\n pageLabel?: string;\n missingAssets?: 'error' | 'warn';\n}\n\nfunction stripQueryAndHash(url: string): string {\n return url.split('#')[0].split('?')[0];\n}\n\nfunction isLocalRootUrl(url: string): boolean {\n return !!url && url.startsWith('/') && !url.startsWith('//');\n}\n\nfunction fileExistsForPublicUrl(root: string, pagesDir: string, url: string): boolean {\n const clean = stripQueryAndHash(url).slice(1);\n\n const fromSrc = path.join(root, pagesDir, clean);\n if (fs.existsSync(fromSrc)) return true;\n\n const fromPublic = path.join(root, 'public', clean);\n if (fs.existsSync(fromPublic)) return true;\n\n return false;\n}\n\nfunction collectScriptSrcs(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /<script\\b[^>]*\\bsrc=[\"']([^\"']+)[\"'][^>]*>/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction collectStylesheetHrefs(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /<link\\b[^>]*\\brel=[\"']stylesheet[\"'][^>]*\\bhref=[\"']([^\"']+)[\"'][^>]*>/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction collectLiteralDynamicImports(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /import\\s*\\(\\s*[\"']([^\"'`]+)[\"']\\s*\\)/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction formatPageLabel(pageLabel?: string): string {\n return pageLabel ? ` (${pageLabel})` : '';\n}\n\nfunction missingAssetMessage(args: {\n pluginName: string;\n kind: string;\n url: string;\n root: string;\n pagesDir: string;\n pageLabel?: string;\n}): string {\n const { pluginName, kind, url, root, pagesDir, pageLabel } = args;\n const clean = stripQueryAndHash(url).slice(1);\n const pageSuffix = formatPageLabel(pageLabel);\n\n return (\n `[${pluginName}] Missing ${kind}${pageSuffix}: ${url}\\n` +\n `Expected one of:\\n` +\n `- ${path.join(root, pagesDir, clean)}\\n` +\n `- ${path.join(root, 'public', clean)}`\n );\n}\n\nfunction reportMissing(args: {\n mode: 'error' | 'warn';\n pluginName: string;\n kind: string;\n url: string;\n root: string;\n pagesDir: string;\n pageLabel?: string;\n}) {\n const message = missingAssetMessage(args);\n\n if (args.mode === 'warn') {\n console.warn(`⚠️ ${message}`);\n return;\n }\n\n throw new Error(message);\n}\n\nexport function validateHtmlAssetReferences(\n options: HtmlAssetValidationOptions,\n): void {\n const {\n root,\n pagesDir,\n html,\n pluginName,\n pageLabel,\n missingAssets = 'error',\n } = options;\n\n const scriptSrcs = unique(collectScriptSrcs(html)).filter(isLocalRootUrl);\n const stylesheetHrefs = unique(collectStylesheetHrefs(html)).filter(isLocalRootUrl);\n const literalDynamicImports = unique(collectLiteralDynamicImports(html)).filter(\n isLocalRootUrl,\n );\n\n for (const url of scriptSrcs) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n reportMissing({\n mode: missingAssets,\n pluginName,\n kind: 'JavaScript asset',\n url,\n root,\n pagesDir,\n pageLabel,\n });\n }\n }\n\n for (const url of stylesheetHrefs) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n reportMissing({\n mode: missingAssets,\n pluginName,\n kind: 'stylesheet asset',\n url,\n root,\n pagesDir,\n pageLabel,\n });\n }\n }\n\n for (const url of literalDynamicImports) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n console.warn(\n `⚠️ ${missingAssetMessage({\n pluginName,\n kind: 'literal dynamic import',\n url,\n root,\n pagesDir,\n pageLabel,\n })}`,\n );\n }\n }\n}","import {\n compareRoutePriority,\n expandStaticPaths,\n fileNameFromRoute,\n} from './route-utils';\nimport type { HtPageInfo, HtPageModule } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nexport async function buildPageIndex(args: {\n entries: HtPageInfo[];\n modulesByEntry: Map<string, HtPageModule>;\n cleanUrls: boolean;\n}): Promise<HtPageInfo[]> {\n const { entries, modulesByEntry, cleanUrls } = args;\n const pages: HtPageInfo[] = [];\n\n for (const entry of entries) {\n const mod = modulesByEntry.get(entry.entryPath) ?? {};\n\n if (entry.dynamic) {\n const rows =\n (mod.generateStaticParams\n ? await mod.generateStaticParams()\n : []) ?? [];\n\n pages.push(\n ...expandStaticPaths(\n {\n id: entry.id,\n entryPath: entry.entryPath,\n absolutePath: entry.absolutePath,\n relativePath: entry.relativePath,\n routePattern: entry.routePattern,\n dynamic: entry.dynamic,\n paramNames: entry.paramNames,\n paramDefinitions: entry.paramDefinitions,\n },\n Array.isArray(rows) ? rows : [],\n cleanUrls,\n ),\n );\n } else {\n pages.push({\n ...entry,\n routePath: entry.routePattern,\n fileName: fileNameFromRoute(entry.routePattern, cleanUrls),\n params: {},\n });\n }\n }\n\n pages.sort((a, b) => compareRoutePriority(a.routePattern, b.routePattern));\n\n const seenRoutes = new Map<string, HtPageInfo>();\n\n for (const page of pages) {\n const existing = seenRoutes.get(page.routePath);\n\n if (existing) {\n throw new Error(\n `[${PLUGIN_NAME}] Duplicate route generated: \"${page.routePath}\" from \"${existing.relativePath}\" and \"${page.relativePath}\"`,\n );\n }\n\n seenRoutes.set(page.routePath, page);\n }\n\n return pages;\n}","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport * as esbuild from 'esbuild';\nimport fsSync from 'node:fs';\n\nexport interface StaticAssetFile {\n absolutePath: string;\n relativePathFromSrc: string;\n outputFileName: string;\n kind: 'copy' | 'process';\n}\n\nexport interface CollectStaticAssetsArgs {\n root: string;\n pagesDir: string;\n pageExtensions: string[];\n}\n\nfunction normalizeSlashes(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nfunction hasAnySuffix(value: string, suffixes: string[]): boolean {\n return suffixes.some((suffix) => value.endsWith(suffix));\n}\n\nfunction shouldIgnoreFile(rel: string): boolean {\n return (\n rel.endsWith('.d.ts') ||\n rel.endsWith('.map') ||\n rel.endsWith('.tsbuildinfo') ||\n rel.startsWith('.') ||\n rel.includes('/.')\n );\n}\n\nfunction isProcessableAsset(rel: string): boolean {\n return (\n rel.endsWith('.js') ||\n rel.endsWith('.mjs') ||\n rel.endsWith('.ts') ||\n rel.endsWith('.css')\n );\n}\n\nfunction toOutputFileName(relativePathFromSrc: string): string {\n if (relativePathFromSrc.endsWith('.ts')) {\n return relativePathFromSrc.slice(0, -3) + '.js';\n }\n return relativePathFromSrc;\n}\n\nexport async function collectStaticAssets(\n args: CollectStaticAssetsArgs,\n): Promise<StaticAssetFile[]> {\n const { root, pagesDir, pageExtensions } = args;\n const srcDir = path.join(root, pagesDir);\n\n const entries = await fg('**/*', {\n cwd: srcDir,\n onlyFiles: true,\n dot: false,\n absolute: false,\n });\n\n const assets: StaticAssetFile[] = [];\n\n for (const entry of entries) {\n const rel = normalizeSlashes(entry);\n\n if (shouldIgnoreFile(rel)) continue;\n if (hasAnySuffix(rel, pageExtensions)) continue;\n\n const absolutePath = path.join(srcDir, rel);\n\n assets.push({\n absolutePath,\n relativePathFromSrc: rel,\n outputFileName: normalizeSlashes(toOutputFileName(rel)),\n kind: isProcessableAsset(rel) ? 'process' : 'copy',\n });\n }\n\n return assets;\n}\n\nexport async function copyStaticAssetSource(\n asset: StaticAssetFile,\n): Promise<Uint8Array> {\n return fs.readFile(asset.absolutePath);\n}\n\nexport async function buildProcessedStaticAssets(args: {\n root: string;\n pagesDir: string;\n assets: StaticAssetFile[];\n minify?: boolean;\n sourcemap?: boolean;\n }): Promise<Map<string, string | Uint8Array>> {\n const { root, pagesDir, assets, minify = true, sourcemap = false } = args;\n \n const processable = assets.filter((a) => a.kind === 'process');\n const out = new Map<string, string | Uint8Array>();\n \n if (processable.length === 0) {\n return out;\n }\n \n const srcDir = path.join(root, pagesDir);\n const distDir = path.join(root, 'dist');\n const warnedMissingAssets = new Set<string>();\n const result = await esbuild.build({\n entryPoints: processable.map((a) => a.absolutePath),\n absWorkingDir: root,\n outbase: srcDir,\n outdir: distDir,\n bundle: true,\n splitting: true,\n treeShaking: true,\n minify,\n sourcemap,\n format: 'esm',\n target: 'es2020',\n platform: 'browser',\n write: false,\n entryNames: '[dir]/[name]',\n assetNames: '[dir]/[name]',\n loader: {\n '.css': 'css',\n '.png': 'file',\n '.jpg': 'file',\n '.jpeg': 'file',\n '.gif': 'file',\n '.svg': 'file',\n '.webp': 'file',\n '.woff': 'file',\n '.woff2': 'file',\n '.ttf': 'file',\n '.otf': 'file',\n },\n plugins: [\n {\n name: 'html-pages-root-url-resolver',\n setup(build) {\n build.onResolve({ filter: /^\\// }, (resolveArgs) => {\n // Leave real filesystem absolute paths alone\n if (\n path.isAbsolute(resolveArgs.path) &&\n fsSync.existsSync(resolveArgs.path)\n ) {\n return { path: resolveArgs.path };\n }\n \n const cleanPath = resolveArgs.path.slice(1);\n \n const fromSrc = path.join(srcDir, cleanPath);\n if (fsSync.existsSync(fromSrc)) {\n return { path: fromSrc };\n }\n \n const fromPublic = path.join(root, 'public', cleanPath);\n if (fsSync.existsSync(fromPublic)) {\n return {\n path: resolveArgs.path,\n external: true,\n };\n }\n \n const isCssUrlToken = resolveArgs.kind === 'url-token';\n \n if (isCssUrlToken) {\n if (!warnedMissingAssets.has(resolveArgs.path)) {\n warnedMissingAssets.add(resolveArgs.path);\n console.warn(\n `[vite-plugin-html-pages] ⚠️ Missing CSS asset: ${resolveArgs.path}\\n` +\n ` Looked in:\\n` +\n ` - ${fromSrc}\\n` +\n ` - ${fromPublic}`\n );\n }\n \n // Keep the original root-relative URL in output CSS\n return {\n path: resolveArgs.path,\n external: true,\n };\n }\n \n // JS/CSS entry imports remain strict\n return {\n path: fromSrc,\n };\n });\n },\n },\n ],\n });\n \n for (const file of result.outputFiles) {\n const rel = normalizeSlashes(path.relative(distDir, file.path));\n out.set(rel, file.text ?? file.contents);\n }\n \n return out;\n }\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { CACHE_DIR_NAME } from './constants';\n\nexport type FetchCacheMode = 'auto' | 'memory' | 'fs' | 'none';\nexport interface FetchWithCacheOptions {\n maxAge?: number;\n cacheKey?: string;\n forceRefresh?: boolean;\n cache?: FetchCacheMode;\n}\n\ntype CachedResponseRecord = {\n timestamp: number;\n status: number;\n statusText: string;\n headers: [string, string][];\n body: string;\n};\n\nconst memoryCache = new Map<string, CachedResponseRecord>();\n\nfunction createDefaultCacheKey(\n input: RequestInfo | URL,\n init?: RequestInit,\n): string {\n const raw = JSON.stringify({\n url: String(input),\n method: init?.method ?? 'GET',\n headers: init?.headers ?? {},\n body: init?.body ?? null,\n });\n\n return createHash('sha256').update(raw).digest('hex');\n}\n\nfunction getCacheFilePath(cacheKey: string): string {\n return path.join(process.cwd(), CACHE_DIR_NAME, 'fetch', `${cacheKey}.json`);\n}\n\nfunction getEffectiveCacheMode(\n mode: FetchCacheMode | undefined,\n): Exclude<FetchCacheMode, 'auto'> {\n if (mode === 'memory' || mode === 'fs' || mode === 'none') {\n return mode;\n }\n\n return process.env.NODE_ENV === 'production' ? 'fs' : 'memory';\n}\n\nfunction toResponse(cached: CachedResponseRecord): Response {\n return new Response(cached.body, {\n status: cached.status,\n statusText: cached.statusText,\n headers: cached.headers,\n });\n}\n\nfunction isFresh(cached: CachedResponseRecord, maxAgeSeconds: number): boolean {\n const ageSeconds = (Date.now() - cached.timestamp) / 1000;\n return ageSeconds <= maxAgeSeconds;\n}\n\nexport function clearMemoryFetchCache(): void {\n memoryCache.clear();\n}\n\nexport function deleteMemoryFetchCache(cacheKey: string): void {\n memoryCache.delete(cacheKey);\n}\n\nexport async function fetchWithCache(\n input: RequestInfo | URL,\n init?: RequestInit,\n options: FetchWithCacheOptions = {},\n): Promise<Response> {\n const maxAge = options.maxAge ?? 60 * 60;\n const method = (init?.method ?? 'GET').toUpperCase();\n\n if (method !== 'GET' && !options.cacheKey) {\n return fetch(input, init);\n }\n\n const cacheMode = getEffectiveCacheMode(options.cache);\n const cacheKey = options.cacheKey ?? createDefaultCacheKey(input, init);\n\n if (cacheMode === 'none') {\n return fetch(input, init);\n }\n\n if (cacheMode === 'memory' && !options.forceRefresh) {\n const cached = memoryCache.get(cacheKey);\n\n if (cached && isFresh(cached, maxAge)) {\n return toResponse(cached);\n }\n }\n\n const filePath = getCacheFilePath(cacheKey);\n\n if (cacheMode === 'fs') {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n if (!options.forceRefresh) {\n try {\n const raw = await fs.readFile(filePath, 'utf8');\n const cached = JSON.parse(raw) as CachedResponseRecord;\n\n if (isFresh(cached, maxAge)) {\n return toResponse(cached);\n }\n } catch {\n // cache miss or invalid cache; fetch fresh\n }\n }\n }\n\n const res = await fetch(input, init);\n const body = await res.text();\n\n const record: CachedResponseRecord = {\n timestamp: Date.now(),\n status: res.status,\n statusText: res.statusText,\n headers: [...res.headers.entries()],\n body,\n };\n\n if (cacheMode === 'memory') {\n memoryCache.set(cacheKey, record);\n } else if (cacheMode === 'fs') {\n await fs.writeFile(filePath, JSON.stringify(record), 'utf8');\n }\n\n return new Response(body, {\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n });\n}\n"],"mappings":"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","names":["fs","path","path","path","path","path","fg","path","path","fs","path","path","paramsTypeFromDefinitions","path","path","fs","fs","path","fs","path","build","path","fs","isLocalPageTypesImport","findEntryByAbsolutePath","path","isLocalPageTypesImport","fs","path","path","fs","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts","../src/typegen.ts","../src/path-utils.ts","../src/constants.ts","../src/discover.ts","../src/route-utils.ts","../src/route-params.ts","../src/dev-server.ts","../src/errors.ts","../src/render-runtime.ts","../src/module-loader.ts","../src/page-helper-generator.ts","../src/html-asset-validator.ts","../src/page-index.ts","../src/static-assets.ts","../src/fetch-cache.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { transform as esbuildTransform } from 'esbuild';\nimport pLimit from 'p-limit';\nimport type { Plugin, ViteDevServer } from 'vite';\n\nimport { writePageTypeDeclarations } from './typegen';\n\nimport {\n PLUGIN_NAME,\n VIRTUAL_BUILD_ENTRY_ID,\n VIRTUAL_PAGE_HELPER_ID,\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX,\n VIRTUAL_JSX_RUNTIME_ID,\n VIRTUAL_JSX_DEV_RUNTIME_ID,\n RESOLVED_VIRTUAL_JSX_RUNTIME_ID,\n RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID,\n VIRTUAL_LOCAL_TYPES_PREFIX,\n} from './constants';\nimport { discoverEntryPages } from './discover';\nimport { installDevServer } from './dev-server';\nimport { validateHtmlAssetReferences } from './html-asset-validator';\nimport { createPageModuleLoader, closePageModuleLoader } from './module-loader';\nimport { buildPageIndex } from './page-index';\nimport { generateTypedPageHelper } from './page-helper-generator';\nimport { renderPage } from './render-runtime';\nimport {\n buildProcessedStaticAssets,\n collectStaticAssets,\n copyStaticAssetSource,\n} from './static-assets';\nimport type { HtPageInfo, HtPageModule, HtPagesPluginOptions } from './types';\n\nlet hasWarnedESM = false;\n\nconst pluginDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction warnIfNotESM(root: string) {\n try {\n const pkgPath = path.join(root, 'package.json');\n\n if (!fs.existsSync(pkgPath)) return;\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n\n if (pkg.type !== 'module') {\n console.warn(\n `[${PLUGIN_NAME}] ⚠️ It is recommended to add \"type\": \"module\" to your package.json for optimal performance and to avoid Node ESM warnings.`,\n );\n }\n } catch {\n // silent — never break build\n }\n}\n\nfunction isLocalPageTypesImport(id: string): boolean {\n return /^\\.\\/\\$types(?:\\.[A-Za-z0-9_.-]+)?$/.test(id);\n}\n\nfunction chunkArray<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n out.push(items.slice(i, i + size));\n }\n return out;\n}\n\nfunction isHtJsxFile(id: string): boolean {\n return (\n id.endsWith('.ht.jsx') ||\n id.endsWith('.html.jsx') ||\n id.endsWith('.ht.tsx') ||\n id.endsWith('.html.tsx')\n );\n}\n\nfunction isHtTsxFile(id: string): boolean {\n return id.endsWith('.ht.tsx') || id.endsWith('.html.tsx');\n}\n\nfunction isHtJsxImporter(importer: string | undefined): boolean {\n if (!importer) return false;\n\n const normalized = importer.split('?')[0].replace(/\\\\/g, '/');\n\n return isHtJsxFile(normalized);\n}\n\nexport function htPages(options: HtPagesPluginOptions = {}): Plugin {\n let root = process.cwd();\n let server: ViteDevServer | null = null;\n let devPages: HtPageInfo[] = [];\n let watcherAttached = false;\n\n const cleanUrls = options.cleanUrls ?? true;\n const pagesDir = options.pagesDir ?? 'src';\n const pageExtensions = options.pageExtensions?.length\n ? options.pageExtensions\n : [\n '.ht.js',\n '.html.js',\n '.ht.ts',\n '.html.ts',\n '.ht.jsx',\n '.html.jsx',\n '.ht.tsx',\n '.html.tsx',\n ];\n\n function logDebug(enabled: boolean | undefined, ...args: unknown[]) {\n if (!enabled) return;\n console.log(`[${PLUGIN_NAME}]`, ...args);\n }\n\n async function loadDevPages(): Promise<HtPageInfo[]> {\n const entries = await discoverEntryPages(root, options);\n \n // 🔥 generate types for editor\n await writePageTypeDeclarations({\n root,\n pagesDir,\n entries,\n });\n \n const modulesByEntry = new Map<string, HtPageModule>();\n\n logDebug(\n options.debug,\n 'discovered entries',\n entries.map((e) => e.relativePath),\n );\n\n if (!server) return [];\n\n const loadModule = await createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n for (const entry of entries) {\n const mod = await loadModule(entry.entryPath, entry.relativePath);\n modulesByEntry.set(entry.entryPath, mod);\n }\n\n devPages = await buildPageIndex({\n entries,\n modulesByEntry,\n cleanUrls,\n });\n\n logDebug(\n options.debug,\n 'dev pages',\n devPages.map((p) => `${p.routePath} -> ${p.relativePath}`),\n );\n\n return devPages;\n }\n\n async function buildPagesPipeline() {\n const entries = await discoverEntryPages(root, options);\n \n // 🔥 generate types for build (also ensures fresh output)\n await writePageTypeDeclarations({\n root,\n pagesDir,\n entries,\n });\n \n const modulesByEntry = new Map<string, HtPageModule>();\n\n const loadModule = await createPageModuleLoader({\n mode: 'build',\n root,\n getPages: async () => entries,\n });\n\n for (const entry of entries) {\n const mod = await loadModule(entry.entryPath, entry.relativePath);\n modulesByEntry.set(entry.entryPath, mod);\n }\n\n const pages = await buildPageIndex({\n entries,\n modulesByEntry,\n cleanUrls,\n });\n\n return { entries, modulesByEntry, pages };\n }\n\n return {\n name: PLUGIN_NAME,\n\n config(userConfig, env) {\n if (env.command !== 'build') return;\n\n const hasExplicitInput = userConfig.build?.rollupOptions?.input != null;\n if (hasExplicitInput) return;\n\n return {\n build: {\n rollupOptions: {\n input: VIRTUAL_BUILD_ENTRY_ID,\n },\n },\n };\n },\n\n resolveId(id, importer) {\n if (id === VIRTUAL_BUILD_ENTRY_ID) {\n return id;\n }\n\n if (id === VIRTUAL_PAGE_HELPER_ID && importer) {\n return `${RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX}${importer}`;\n }\n\n if (id === VIRTUAL_JSX_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_JSX_RUNTIME_ID;\n }\n\n if (id === VIRTUAL_JSX_DEV_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID;\n }\n\n if (isHtJsxImporter(importer)) {\n if (id === 'react/jsx-runtime') {\n return RESOLVED_VIRTUAL_JSX_RUNTIME_ID;\n }\n\n if (id === 'react/jsx-dev-runtime') {\n return RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID;\n }\n }\n\n if (importer && isLocalPageTypesImport(id)) {\n return `${VIRTUAL_LOCAL_TYPES_PREFIX}${importer}::${id}`;\n } \n\n return null;\n },\n\n async load(id) {\n if (id === VIRTUAL_BUILD_ENTRY_ID) {\n return 'export default {};';\n }\n\n if (id === RESOLVED_VIRTUAL_JSX_RUNTIME_ID) {\n return `\nexport { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(\n pathToFileURL(path.join(pluginDir, 'jsx-runtime.js')).href,\n )};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID) {\n return `\nexport { Fragment, jsx, jsxs, jsxDEV } from ${JSON.stringify(\n pathToFileURL(path.join(pluginDir, 'jsx-dev-runtime.js')).href,\n )};\n`;\n }\n\n if (id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {\n const importer = id.slice(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length);\n const { pages } = await buildPagesPipeline();\n\n const normalizedImporter = path.resolve(importer);\n\n const page = pages.find(\n (candidate) =>\n path.resolve(candidate.absolutePath) === normalizedImporter,\n );\n\n return generateTypedPageHelper(page);\n }\n\n if (id.startsWith(VIRTUAL_LOCAL_TYPES_PREFIX)) {\n return `\nexport {\n definePage,\n defineData,\n defineStaticParams,\n definePageModule\n} from 'vite-plugin-html-pages/page';\n`;\n } \n\n return null;\n },\n\n async transform(code, id) {\n const normalizedId = id.split('?')[0].replace(/\\\\/g, '/');\n\n if (!isHtJsxFile(normalizedId)) {\n return null;\n }\n\n const result = await esbuildTransform(code, {\n loader: isHtTsxFile(normalizedId) ? 'tsx' : 'jsx',\n format: 'esm',\n jsx: 'automatic',\n jsxImportSource: 'vite-plugin-html-pages',\n sourcemap: true,\n sourcefile: normalizedId,\n target: 'es2020',\n });\n\n return {\n code: result.code,\n map: result.map,\n };\n },\n\n configResolved(resolved) {\n root = options.root ? path.resolve(resolved.root, options.root) : resolved.root;\n\n if (!hasWarnedESM) {\n warnIfNotESM(root);\n hasWarnedESM = true;\n }\n },\n\n async buildStart() {\n const entries = await discoverEntryPages(root, options);\n\n for (const entry of entries) {\n this.addWatchFile(entry.entryPath);\n }\n\n const staticAssets = await collectStaticAssets({\n root,\n pagesDir,\n pageExtensions,\n });\n\n for (const asset of staticAssets) {\n this.addWatchFile(asset.absolutePath);\n }\n\n logDebug(\n options.debug,\n 'static assets',\n staticAssets.map((asset) => ({\n kind: asset.kind,\n input: asset.relativePathFromSrc,\n output: asset.outputFileName,\n })),\n );\n },\n\n configureServer(_server) {\n server = _server;\n\n installDevServer({\n server,\n root,\n pagesDir,\n getPages: async () => {\n if (devPages.length > 0) return devPages;\n return loadDevPages();\n },\n getEntries: async () => discoverEntryPages(root, options),\n });\n\n if (!watcherAttached) {\n watcherAttached = true;\n\n const reload = async (file: string) => {\n if (\n !file.includes(`${path.sep}${pagesDir}${path.sep}`) &&\n !file.includes(`/${pagesDir}/`)\n ) {\n return;\n }\n\n logDebug(options.debug, 'file changed', file);\n\n await loadDevPages();\n\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n };\n\n server.watcher.on('add', reload);\n server.watcher.on('change', reload);\n server.watcher.on('unlink', reload);\n }\n\n loadDevPages().catch((error) => {\n server?.config.logger.error(\n `[${PLUGIN_NAME}] loadDevPages failed: ${\n error instanceof Error ? error.stack ?? error.message : String(error)\n }`,\n );\n });\n },\n\n async generateBundle(_, bundle) {\n try {\n const { modulesByEntry, pages } = await buildPagesPipeline();\n\n const staticAssets = await collectStaticAssets({\n root,\n pagesDir,\n pageExtensions,\n });\n\n logDebug(\n options.debug,\n 'emitting pages',\n pages.map((p) => p.fileName),\n );\n\n logDebug(\n options.debug,\n 'emitting static assets',\n staticAssets.map((asset) => ({\n kind: asset.kind,\n input: asset.relativePathFromSrc,\n output: asset.outputFileName,\n })),\n );\n\n const limit = pLimit(options.renderConcurrency ?? 8);\n const batchSize =\n options.renderBatchSize ??\n Math.max(options.renderConcurrency ?? 8, 32);\n\n const processedOutputs = await buildProcessedStaticAssets({\n root,\n pagesDir,\n assets: staticAssets,\n minify: true,\n sourcemap: false,\n });\n\n for (const [fileName, source] of processedOutputs) {\n this.emitFile({\n type: 'asset',\n fileName,\n source,\n });\n }\n\n for (const asset of staticAssets) {\n if (asset.kind !== 'copy') continue;\n\n const source = await copyStaticAssetSource(asset);\n\n this.emitFile({\n type: 'asset',\n fileName: asset.outputFileName,\n source,\n });\n }\n\n for (const batch of chunkArray(pages, batchSize)) {\n await Promise.all(\n batch.map((page) =>\n limit(async () => {\n const mod = modulesByEntry.get(page.entryPath);\n\n if (!mod) {\n throw new Error(\n `[${PLUGIN_NAME}] Missing module for page entry: ${page.entryPath}`,\n );\n }\n\n const html = await renderPage(page, mod, false);\n\n validateHtmlAssetReferences({\n root,\n pagesDir,\n html,\n pluginName: PLUGIN_NAME,\n pageLabel: page.relativePath,\n missingAssets: options.missingAssets ?? 'error',\n });\n\n this.emitFile({\n type: 'asset',\n fileName: options.mapOutputPath?.(page) ?? page.fileName,\n source: html,\n });\n }),\n ),\n );\n }\n\n const notFoundPage = pages.find((p) => p.routePath === '/404');\n\n if (notFoundPage) {\n const mod = modulesByEntry.get(notFoundPage.entryPath);\n\n if (!mod) {\n throw new Error(\n `[${PLUGIN_NAME}] Missing module for 404 page entry: ${notFoundPage.entryPath}`,\n );\n }\n\n const html = await renderPage(notFoundPage, mod, false);\n\n validateHtmlAssetReferences({\n root,\n pagesDir,\n html,\n pluginName: PLUGIN_NAME,\n pageLabel: notFoundPage.relativePath,\n missingAssets: options.missingAssets ?? 'error',\n });\n\n this.emitFile({\n type: 'asset',\n fileName: '404.html',\n source: html,\n });\n\n logDebug(options.debug, 'generated 404.html from user page');\n } else {\n const default404 = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>404 - Page Not Found</title>\n <style>\n :root {\n color-scheme: light dark;\n }\n body {\n margin: 0;\n font-family: system-ui, sans-serif;\n min-height: 100vh;\n display: grid;\n place-items: center;\n padding: 2rem;\n }\n main {\n max-width: 40rem;\n text-align: center;\n }\n h1 {\n font-size: 3rem;\n margin: 0 0 1rem;\n }\n p {\n margin: 0.5rem 0;\n line-height: 1.5;\n }\n a {\n color: inherit;\n }\n </style>\n </head>\n <body>\n <main>\n <h1>404</h1>\n <p>Page not found.</p>\n <p><a href=\"/\">Go back home</a></p>\n </main>\n </body>\n</html>\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: '404.html',\n source: default404,\n });\n\n logDebug(options.debug, 'generated default 404.html');\n }\n\n const sitemapBase = options.site ?? '';\n\n const sitemapRoutes = [...new Set(pages.map((p) => p.routePath))].filter(\n (route) => !route.includes(':') && !route.includes('*'),\n );\n\n if (sitemapBase && sitemapRoutes.length > 0) {\n const sitemap = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${sitemapRoutes\n .map((route) => ` <url><loc>${sitemapBase}${route}</loc></url>`)\n .join('\\n')}\\n</urlset>\\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: 'sitemap.xml',\n source: sitemap,\n });\n\n logDebug(options.debug, 'generated sitemap.xml');\n }\n\n const rss = options.rss;\n\n if (rss?.site) {\n const routePrefix = rss.routePrefix ?? '/blog';\n\n const rssItems = pages\n .filter((page) => page.routePath.startsWith(routePrefix))\n .map((page) => {\n const url = `${rss.site}${page.routePath}`;\n\n return ` <item>\\n <title>${page.routePath}</title>\\n <link>${url}</link>\\n <guid>${url}</guid>\\n </item>`;\n })\n .join('\\n');\n\n const rssXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<rss version=\"2.0\">\\n<channel>\\n <title>${rss.title ?? PLUGIN_NAME}</title>\\n <link>${rss.site}</link>\\n <description>${rss.description ?? 'RSS feed'}</description>\\n${rssItems}\\n</channel>\\n</rss>\\n`;\n\n this.emitFile({\n type: 'asset',\n fileName: 'rss.xml',\n source: rssXml,\n });\n\n logDebug(options.debug, 'generated rss.xml');\n }\n\n for (const [fileName, output] of Object.entries(bundle)) {\n if (\n output.type === 'chunk' &&\n output.facadeModuleId === VIRTUAL_BUILD_ENTRY_ID\n ) {\n delete bundle[fileName];\n }\n }\n } finally {\n await closePageModuleLoader();\n }\n },\n };\n}\n\nexport default htPages;","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { HtPageInfo, RouteParamDefinition } from './types';\nimport { normalizeFsPath, toPosix } from './path-utils';\n\nfunction paramsTypeFromDefinitions(\n paramDefinitions: RouteParamDefinition[],\n): string {\n if (paramDefinitions.length === 0) {\n return '{}';\n }\n\n const fields = paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return `${param.name}: string`;\n }\n\n if (param.type === 'catch-all') {\n return `${param.name}: string[]`;\n }\n\n return `${param.name}?: string[]`;\n });\n\n return `{ ${fields.join('; ')} }`;\n}\n\nfunction pageHelperModuleSource(page: HtPageInfo): string {\n const paramsType = paramsTypeFromDefinitions(page.paramDefinitions ?? []);\n\n return `export type PageParams = ${paramsType};\n\nexport type StaticParams = PageParams[];\n\nexport type DataContext = {\n params: PageParams;\n dev: boolean;\n};\n\nexport type RenderContext<TData = unknown> = {\n params: PageParams;\n data: TData;\n dev: boolean;\n};\n\nexport type PageContext<TData = unknown> = {\n params: PageParams;\n data?: TData;\n dev: boolean;\n};\n\nexport type PageModule<TData = unknown> = {\n generateStaticParams?: () => StaticParams | Promise<StaticParams>;\n data?: (ctx: DataContext) => TData | Promise<TData>;\n render: (ctx: RenderContext<TData>) => string | Promise<string>;\n};\n\nexport declare function definePage<\n T extends (ctx: PageContext) => string | Promise<string>\n>(fn: T): T;\n\nexport declare function defineData<\n T extends (ctx: DataContext) => unknown | Promise<unknown>\n>(fn: T): T;\n\nexport declare function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n>(fn: T): T;\n\nexport declare function definePageModule<TData>(\n mod: PageModule<TData>\n): PageModule<TData>;\n`;\n}\n\nfunction stripPageExtension(filePath: string): string {\n return filePath.replace(/\\.(ht|html)\\.(js|ts|jsx|tsx)$/i, '');\n}\n\nfunction getTypesFileName(page: HtPageInfo): string {\n if (!page.dynamic || page.paramDefinitions.length === 0) {\n return '$types.d.ts';\n }\n\n const parts = page.paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return param.name;\n }\n\n if (param.type === 'catch-all') {\n return `${param.name}.all`;\n }\n\n return `${param.name}.opt`;\n });\n\n return `$types.${parts.join('.')}.d.ts`;\n}\n\nasync function listFilesRecursive(dir: string): Promise<string[]> {\n let entries;\n \n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n \n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = path.join(dir, entry.name);\n \n if (entry.isDirectory()) {\n return listFilesRecursive(fullPath);\n }\n \n return [fullPath];\n }),\n );\n \n return files.flat();\n }\n \n async function removeEmptyDirectories(dir: string, stopAt: string): Promise<void> {\n const normalizedDir = normalizeFsPath(dir);\n const normalizedStopAt = normalizeFsPath(stopAt);\n \n if (normalizedDir === normalizedStopAt) {\n return;\n }\n \n let entries;\n \n try {\n entries = await fs.readdir(normalizedDir);\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n \n if (entries.length > 0) {\n return;\n }\n \n await fs.rmdir(normalizedDir);\n await removeEmptyDirectories(path.dirname(normalizedDir), normalizedStopAt);\n }\n\nexport function getGeneratedTypesRoot(root: string): string {\n return normalizeFsPath(path.join(root, '.vite-plugin-html-pages', 'types'));\n}\n\nexport function getGeneratedHelperPath(args: {\n root: string;\n pagesDir: string;\n page: HtPageInfo;\n}): string {\n const pagesRoot = normalizeFsPath(path.join(args.root, args.pagesDir));\n const relativeFromPagesDir = toPosix(\n path.relative(pagesRoot, args.page.absolutePath),\n );\n const withoutExt = stripPageExtension(relativeFromPagesDir);\n const outRoot = getGeneratedTypesRoot(args.root);\n const fileName = getTypesFileName(args.page);\n\n return normalizeFsPath(\n path.join(outRoot, path.dirname(withoutExt), fileName),\n );\n}\n\nasync function removeStalePageTypeDeclarations(args: {\n root: string;\n expectedFiles: Set<string>;\n}): Promise<void> {\n const outRoot = getGeneratedTypesRoot(args.root);\n const existingFiles = await listFilesRecursive(outRoot);\n\n const staleFiles = existingFiles.filter((file) => {\n if (!file.endsWith('.d.ts')) {\n return false;\n }\n\n return !args.expectedFiles.has(normalizeFsPath(file));\n });\n\n await Promise.all(\n staleFiles.map(async (file) => {\n await fs.unlink(file);\n await removeEmptyDirectories(path.dirname(file), outRoot);\n }),\n );\n}\n\nexport async function writePageTypeDeclarations(args: {\n root: string;\n pagesDir: string;\n entries: HtPageInfo[];\n}): Promise<void> {\n const outRoot = getGeneratedTypesRoot(args.root);\n\n await fs.mkdir(outRoot, { recursive: true });\n\n const outputs = args.entries.map((page) => ({\n page,\n outFile: getGeneratedHelperPath({\n root: args.root,\n pagesDir: args.pagesDir,\n page,\n }),\n }));\n\n const expectedFiles = new Set(\n outputs.map(({ outFile }) => normalizeFsPath(outFile)),\n );\n\n await Promise.all(\n outputs.map(async ({ page, outFile }) => {\n await fs.mkdir(path.dirname(outFile), { recursive: true });\n await fs.writeFile(outFile, pageHelperModuleSource(page), 'utf8');\n }),\n );\n\n await removeStalePageTypeDeclarations({\n root: args.root,\n expectedFiles,\n });\n}","import path from 'node:path';\n\nexport function toPosix(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nexport function normalizeFsPath(value: string): string {\n return path.normalize(value);\n}\n\nexport function normalizeRoutePath(value: string): string {\n const normalized = toPosix(value).replace(/\\/+/g, '/');\n if (!normalized || normalized === '/') return '/';\n\n const withLeadingSlash = normalized.startsWith('/')\n ? normalized\n : `/${normalized}`;\n\n return withLeadingSlash !== '/' && withLeadingSlash.endsWith('/')\n ? withLeadingSlash.slice(0, -1)\n : withLeadingSlash;\n}\n\nexport function stripPageSuffix(\n filePath: string,\n extensions: string[],\n): string {\n const normalized = toPosix(filePath);\n\n const match = [...extensions]\n .sort((a, b) => b.length - a.length)\n .find((ext) => normalized.endsWith(ext));\n\n if (!match) return normalized;\n\n return normalized.slice(0, -match.length);\n}","export const PLUGIN_NAME = 'vite-plugin-html-pages';\nexport const VIRTUAL_BUILD_ENTRY_ID = `\\0${PLUGIN_NAME}:build-entry`;\nexport const VIRTUAL_PAGE_HELPER_ID = `${PLUGIN_NAME}/page`;\nexport const RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX =`\\0${PLUGIN_NAME}/page:`;\nexport const VIRTUAL_MANIFEST_ID = `\\0virtual:${PLUGIN_NAME}-manifest`;\nexport const CACHE_DIR_NAME = `node_modules/.cache/${PLUGIN_NAME}`;\nexport const VIRTUAL_JSX_RUNTIME_ID = `${PLUGIN_NAME}/jsx-runtime`;\nexport const VIRTUAL_JSX_DEV_RUNTIME_ID = `${PLUGIN_NAME}/jsx-dev-runtime`;\nexport const RESOLVED_VIRTUAL_JSX_RUNTIME_ID = `\\0${VIRTUAL_JSX_RUNTIME_ID}`;\nexport const RESOLVED_VIRTUAL_JSX_DEV_RUNTIME_ID = `\\0${VIRTUAL_JSX_DEV_RUNTIME_ID}`;\nexport const VIRTUAL_LOCAL_TYPES_PREFIX = `\\0${PLUGIN_NAME}:local-types:`;","import path from 'node:path';\nimport { normalizeFsPath, toPosix } from './path-utils';\nimport { isDynamicPage, toRoutePattern } from './route-utils';\nimport { extractRouteParamDefinitions } from './route-params';\nimport type { HtPageInfo, HtPagesPluginOptions } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nfunction buildDefaultIncludeGlobs(\n pagesDir: string,\n pageExtensions: string[],\n): string[] {\n return pageExtensions.map((ext) => {\n const cleanExt = ext.startsWith('.') ? ext.slice(1) : ext;\n return `${pagesDir}/**/*.${cleanExt}`;\n });\n}\n\nexport async function discoverEntryPages(\n root: string,\n options: HtPagesPluginOptions,\n): Promise<HtPageInfo[]> {\n const fgModule = await import('fast-glob');\n const fg = (fgModule.default ?? fgModule) as typeof import('fast-glob');\n\n const pagesDir = options.pagesDir ?? 'src';\n const pageExtensions = options.pageExtensions?.length\n ? options.pageExtensions\n : ['.ht.js', '.html.js', '.ht.ts', '.html.ts', '.ht.jsx', '.html.jsx', '.ht.tsx', '.html.tsx'];\n\n const include = Array.isArray(options.include)\n ? options.include\n : options.include\n ? [options.include]\n : buildDefaultIncludeGlobs(pagesDir, pageExtensions);\n\n const exclude = Array.isArray(options.exclude)\n ? options.exclude\n : options.exclude\n ? [options.exclude]\n : [];\n\n const pagesRoot = normalizeFsPath(path.join(root, pagesDir));\n\n const files = await fg.glob(include, {\n cwd: root,\n ignore: exclude,\n absolute: true,\n });\n\n return files\n .sort()\n .map((absolutePath) => {\n const entryPath = normalizeFsPath(absolutePath);\n const relativePath = toPosix(path.relative(root, entryPath));\n const relativeFromPagesDir = toPosix(path.relative(pagesRoot, entryPath));\n\n if (\n relativeFromPagesDir.startsWith('../') ||\n relativeFromPagesDir === '..'\n ) {\n throw new Error(\n `[${PLUGIN_NAME}] Page is outside pagesDir: ${entryPath} (pagesDir: ${pagesDir})`,\n );\n }\n\n const dynamic = isDynamicPage(relativeFromPagesDir);\n const routePattern = toRoutePattern(relativeFromPagesDir, pageExtensions);\n const paramDefinitions = extractRouteParamDefinitions(routePattern);\n\n return {\n id: entryPath,\n entryPath,\n absolutePath: entryPath,\n relativePath,\n routePattern,\n routePath: routePattern,\n fileName: '',\n dynamic,\n paramNames: paramDefinitions.map((p) => p.name),\n paramDefinitions,\n params: {},\n } satisfies HtPageInfo;\n });\n}","import { normalizeRoutePath, stripPageSuffix, toPosix } from './path-utils';\nimport type {\n HtPageInfo,\n HtPageParams,\n StaticParamRecord,\n StaticParamValue,\n} from './types';\n\nconst DYNAMIC_SEGMENT_RE = /\\[([A-Za-z0-9_]+)\\]/g;\nconst CATCH_ALL_SEGMENT_RE = /\\[\\.\\.\\.([A-Za-z0-9_]+)\\]/g;\nconst OPTIONAL_CATCH_ALL_SEGMENT_RE = /\\[\\.\\.\\.([A-Za-z0-9_]+)\\]\\?/g;\nconst ANY_PARAM_RE = /\\[(?:\\.\\.\\.)?([A-Za-z0-9_]+)\\]\\??/g;\nconst ROUTE_GROUP_RE = /(^|\\/)\\(([^)]+)\\)(?=\\/|$)/g;\n\nexport function getParamNames(relativeFromPagesDir: string): string[] {\n return [...relativeFromPagesDir.matchAll(ANY_PARAM_RE)].map((m) => m[1]);\n}\n\nexport function isDynamicPage(relativeFromPagesDir: string): boolean {\n return /\\[(?:\\.\\.\\.)?[A-Za-z0-9_]+\\]\\??/.test(relativeFromPagesDir);\n}\n\nexport function toRoutePattern(\n relativeFromPagesDir: string,\n extensions: string[],\n): string {\n const noExt = stripPageSuffix(toPosix(relativeFromPagesDir), extensions);\n\n const withoutGroups = noExt.replace(ROUTE_GROUP_RE, '$1');\n const withoutIndex = withoutGroups.replace(/\\/index$/i, '').replace(/^index$/i, '');\n\n const raw = withoutIndex\n .replace(OPTIONAL_CATCH_ALL_SEGMENT_RE, '*?:$1')\n .replace(CATCH_ALL_SEGMENT_RE, '*:$1')\n .replace(DYNAMIC_SEGMENT_RE, ':$1');\n\n return normalizeRoutePath(raw || '/');\n}\n\nfunction encodePathParts(parts: string[]): string {\n return parts.map((part) => encodeURIComponent(part)).join('/');\n}\n\nfunction normalizeCatchAllValue(value: StaticParamValue): string[] {\n if (Array.isArray(value)) {\n return value.map((part) => String(part)).filter(Boolean);\n }\n\n if (value === '') {\n return [];\n }\n\n return String(value).split('/').filter(Boolean);\n}\n\nfunction normalizePageParams(params: StaticParamRecord): HtPageParams {\n const normalized: HtPageParams = {};\n\n for (const [key, value] of Object.entries(params)) {\n normalized[key] = Array.isArray(value)\n ? value.map((part) => String(part))\n : String(value);\n }\n\n return normalized;\n}\n\nexport function fillParams(\n pattern: string,\n params: StaticParamRecord,\n): string {\n const result = pattern\n .replace(/\\*\\?:([A-Za-z0-9_]+)/g, (_, key) => {\n const value = params[key];\n if (value == null) {\n return '';\n }\n\n const parts = normalizeCatchAllValue(value);\n if (parts.length === 0) {\n return '';\n }\n\n return encodePathParts(parts);\n })\n .replace(/\\*:([A-Za-z0-9_]+)/g, (_, key) => {\n if (!(key in params)) {\n throw new Error(`Missing catch-all route param \"${key}\"`);\n }\n\n const value = params[key];\n const parts = normalizeCatchAllValue(value);\n\n if (parts.length === 0) {\n throw new Error(`Catch-all route param \"${key}\" must not be empty`);\n }\n\n return encodePathParts(parts);\n })\n .replace(/:([A-Za-z0-9_]+)/g, (_, key) => {\n if (!(key in params)) {\n throw new Error(`Missing route param \"${key}\"`);\n }\n\n const value = params[key];\n if (Array.isArray(value)) {\n throw new Error(`Route param \"${key}\" must be a string, received array`);\n }\n\n return encodeURIComponent(String(value));\n });\n\n return normalizeRoutePath(result || '/');\n}\n\nexport function fileNameFromRoute(\n routePath: string,\n cleanUrls: boolean,\n): string {\n const normalized = normalizeRoutePath(routePath);\n\n if (normalized === '/') return 'index.html';\n\n const base = normalized.slice(1);\n return cleanUrls ? `${base}/index.html` : `${base}.html`;\n}\n\nexport function expandStaticPaths(\n basePage: Omit<HtPageInfo, 'routePath' | 'fileName' | 'params'>,\n rows: StaticParamRecord[],\n cleanUrls: boolean,\n): HtPageInfo[] {\n return rows.map((row) => {\n const routePath = fillParams(basePage.routePattern, row);\n const params = normalizePageParams(row);\n\n return {\n ...basePage,\n routePath,\n fileName: fileNameFromRoute(routePath, cleanUrls),\n params,\n };\n });\n}\n\nexport function routeMatch(\n pattern: string,\n urlPath: string,\n): HtPageParams | null {\n const a = normalizeRoutePath(pattern).split('/').filter(Boolean);\n const b = normalizeRoutePath(urlPath).split('/').filter(Boolean);\n const params: HtPageParams = {};\n\n for (let i = 0; i < a.length; i++) {\n const patternSeg = a[i];\n const urlSeg = b[i];\n\n if (patternSeg.startsWith('*?:')) {\n const key = patternSeg.slice(3);\n if (i < b.length) {\n params[key] = b.slice(i).map(decodeURIComponent);\n }\n return params;\n }\n\n if (patternSeg.startsWith('*:')) {\n const rest = b.slice(i);\n if (rest.length === 0) return null;\n\n params[patternSeg.slice(2)] = rest.map(decodeURIComponent);\n return params;\n }\n\n if (!urlSeg) return null;\n\n if (patternSeg.startsWith(':')) {\n params[patternSeg.slice(1)] = decodeURIComponent(urlSeg);\n continue;\n }\n\n if (patternSeg !== urlSeg) return null;\n }\n\n return a.length === b.length ? params : null;\n}\n\nexport function compareRoutePriority(a: string, b: string): number {\n const aSegs = normalizeRoutePath(a).split('/').filter(Boolean);\n const bSegs = normalizeRoutePath(b).split('/').filter(Boolean);\n const len = Math.max(aSegs.length, bSegs.length);\n\n for (let i = 0; i < len; i++) {\n const aa = aSegs[i];\n const bb = bSegs[i];\n\n if (aa == null) return 1;\n if (bb == null) return -1;\n\n const aOptionalCatchAll = aa.startsWith('*?:');\n const bOptionalCatchAll = bb.startsWith('*?:');\n if (aOptionalCatchAll !== bOptionalCatchAll) {\n return aOptionalCatchAll ? 1 : -1;\n }\n\n const aCatchAll = aa.startsWith('*:');\n const bCatchAll = bb.startsWith('*:');\n if (aCatchAll !== bCatchAll) {\n return aCatchAll ? 1 : -1;\n }\n\n const aDynamic = aa.startsWith(':');\n const bDynamic = bb.startsWith(':');\n if (aDynamic !== bDynamic) {\n return aDynamic ? 1 : -1;\n }\n }\n\n return bSegs.length - aSegs.length;\n}","import type { RouteParamDefinition } from './types';\n\nexport function parseRouteParamSegment(\n segment: string,\n): RouteParamDefinition | null {\n if (segment.startsWith('*?:')) {\n return {\n name: segment.slice(3),\n type: 'optional-catch-all',\n };\n }\n\n if (segment.startsWith('*:')) {\n return {\n name: segment.slice(2),\n type: 'catch-all',\n };\n }\n\n if (segment.startsWith(':')) {\n return {\n name: segment.slice(1),\n type: 'single',\n };\n }\n\n return null;\n}\n\nexport function extractRouteParamDefinitions(\n routePattern: string,\n): RouteParamDefinition[] {\n return routePattern\n .split('/')\n .filter(Boolean)\n .map((segment) => parseRouteParamSegment(segment))\n .filter((value): value is RouteParamDefinition => value != null);\n}","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ViteDevServer } from 'vite';\n\nimport { renderPage } from './render-runtime';\nimport type { HtPageInfo, HtPageModule } from './types';\nimport { PLUGIN_NAME } from './constants';\nimport { createPageModuleLoader } from './module-loader';\n\nfunction isStaticAssetRequest(url: string): boolean {\n return (\n url.endsWith('.css') ||\n url.endsWith('.js') ||\n url.endsWith('.mjs') ||\n url.endsWith('.ts') ||\n url.endsWith('.png') ||\n url.endsWith('.jpg') ||\n url.endsWith('.jpeg') ||\n url.endsWith('.gif') ||\n url.endsWith('.svg') ||\n url.endsWith('.webp') ||\n url.endsWith('.ico') ||\n url.endsWith('.woff') ||\n url.endsWith('.woff2') ||\n url.endsWith('.ttf') ||\n url.endsWith('.otf')\n );\n}\n\nfunction shouldSkipHtmlRouting(url: string, pagesDir: string): boolean {\n return (\n url.startsWith('/@vite') ||\n url.startsWith('/@fs/') ||\n url.startsWith('/node_modules/') ||\n url.startsWith(`/${pagesDir}/`) ||\n url === '/favicon.ico' ||\n isStaticAssetRequest(url)\n );\n}\n\nfunction tryRewriteRootAssetToSrc(\n root: string,\n pagesDir: string,\n url: string,\n): string | null {\n if (!url.startsWith('/')) return null;\n if (!isStaticAssetRequest(url)) return null;\n if (url.startsWith(`/${pagesDir}/`)) return null;\n\n const candidate = path.join(root, pagesDir, url.slice(1));\n\n if (fs.existsSync(candidate)) {\n return `/${pagesDir}/${url.slice(1)}`;\n }\n\n return null;\n}\n\nfunction shouldUseDynamicRendering(mod: HtPageModule): boolean {\n return mod.dynamic === true || mod.prerender === false;\n}\n\nexport function installDevServer(args: {\n server: ViteDevServer;\n root: string;\n pagesDir: string;\n getPages: () => Promise<HtPageInfo[]>;\n getEntries?: () => Promise<HtPageInfo[]>;\n}) {\n const { server, root, pagesDir, getPages } = args;\n\n server.middlewares.use(async (req, res, next) => {\n try {\n const originalUrl = req.url ?? '/';\n const url = originalUrl.split('?')[0];\n\n const rewrittenAssetUrl = tryRewriteRootAssetToSrc(root, pagesDir, url);\n if (rewrittenAssetUrl) {\n req.url = rewrittenAssetUrl + originalUrl.slice(url.length);\n return next();\n }\n\n if (shouldSkipHtmlRouting(url, pagesDir)) {\n return next();\n }\n\n const pages = await getPages();\n\n const page = pages.find((p) => p.routePath === url);\n\n if (!page) {\n return next();\n }\n\n const loadModule = await createPageModuleLoader({\n mode: 'dev',\n root,\n server,\n });\n\n const mod = await loadModule(page.entryPath, page.relativePath);\n\n if (!mod) {\n return next();\n }\n\n // if (!shouldUseDynamicRendering(mod) && page.dynamic) {\n // return next();\n // }\n\n const html = await renderPage(page, mod, true);\n const transformedHtml = await server.transformIndexHtml(\n url,\n html,\n req.originalUrl,\n );\n \n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(transformedHtml);\n } catch (error) {\n server.config.logger.error(\n `[${PLUGIN_NAME}] dev server render failed: ${\n error instanceof Error ? error.stack ?? error.message : String(error)\n }`,\n );\n\n next(error as Error);\n }\n });\n}","import type { HtPageInfo } from './types';\nimport { PLUGIN_NAME } from './constants';\nexport function invalidHtmlReturn(\n page: HtPageInfo,\n value: unknown,\n): Error {\n return new Error(\n `[${PLUGIN_NAME}] Page \"${page.relativePath}\" must resolve to an HTML string, got ${typeof value}`,\n );\n}\n\nexport function missingDefaultExport(page: HtPageInfo): Error {\n return new Error(\n `[${PLUGIN_NAME}] Page \"${page.relativePath}\" does not export a default renderer`,\n );\n}\n\nexport function pageError(page: HtPageInfo, cause: unknown): Error {\n const message = `[${PLUGIN_NAME}] Failed to render \"${page.relativePath}\" at route \"${page.routePath}\"`;\n\n if (cause instanceof Error) {\n const err = new Error(`${message}: ${cause.message}`);\n\n if (cause.stack) {\n err.stack = `${err.stack}\\nCaused by:\\n${cause.stack}`;\n }\n\n return err;\n }\n\n return new Error(`${message}: ${String(cause)}`);\n}","import { invalidHtmlReturn, pageError, missingDefaultExport } from './errors';\nimport type { HtPageInfo, HtPageModule, HtPageRenderContext } from './types';\n\nexport async function renderPage(\n page: HtPageInfo,\n mod: HtPageModule,\n dev = false,\n): Promise<string> {\n const ctx: HtPageRenderContext = {\n page,\n params: page.params,\n dev,\n };\n\n try {\n if (typeof mod.data === 'function') {\n ctx.data = await mod.data(ctx);\n }\n\n const entry = mod.default;\n\n if (entry == null) {\n throw missingDefaultExport(page);\n }\n\n const html = typeof entry === 'function' ? await entry(ctx) : entry;\n\n if (typeof html !== 'string') {\n throw invalidHtmlReturn(page, html);\n }\n\n return html;\n } catch (error) {\n throw pageError(page, error);\n }\n}","import path from 'node:path';\nimport { createServer, type InlineConfig, type ViteDevServer } from 'vite';\n\nimport {\n VIRTUAL_PAGE_HELPER_ID,\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX,\n VIRTUAL_LOCAL_TYPES_PREFIX,\n} from './constants';\nimport { generateTypedPageHelper } from './page-helper-generator';\nimport type {\n HtPageInfo,\n HtPageModule,\n HtStructuredPageModule,\n} from './types';\n\nexport type PageModuleLoader = (\n entryPath: string,\n relativePath: string,\n) => Promise<HtPageModule>;\n\nlet buildServer: ViteDevServer | null = null;\n\nfunction isStructuredPageModule(\n value: unknown,\n): value is HtStructuredPageModule {\n return (\n !!value &&\n typeof value === 'object' &&\n 'render' in value &&\n typeof (value as { render?: unknown }).render === 'function'\n );\n}\n\nfunction isLocalPageTypesImport(id: string): boolean {\n return /^\\.\\/\\$types(?:\\.[A-Za-z0-9_.-]+)?$/.test(id);\n}\n\nfunction normalizeLoadedPageModule(mod: unknown): HtPageModule {\n const pageModule = (mod ?? {}) as HtPageModule;\n\n if (isStructuredPageModule(pageModule.default)) {\n const structured = pageModule.default;\n\n return {\n default: structured.render,\n data: structured.data,\n generateStaticParams: structured.generateStaticParams,\n dynamic: structured.dynamic,\n prerender: structured.prerender,\n };\n }\n\n return pageModule;\n}\n\nexport async function createPageModuleLoader(args: {\n mode: 'dev' | 'build';\n root: string;\n server?: ViteDevServer | null;\n getPages?: () => Promise<HtPageInfo[]>;\n}): Promise<PageModuleLoader> {\n const { mode, root, server, getPages } = args;\n\n if (mode === 'dev') {\n if (!server) {\n throw new Error('[vite-plugin-html-pages] dev server not available');\n }\n\n return async (_entryPath, relativePath) => {\n const mod = await server.ssrLoadModule(`/${relativePath}`);\n return normalizeLoadedPageModule(mod);\n };\n }\n\n if (!getPages) {\n throw new Error(\n '[vite-plugin-html-pages] getPages is required in build mode',\n );\n }\n\n if (!buildServer) {\n const config: InlineConfig = {\n root,\n configFile: false,\n logLevel: 'error',\n appType: 'custom',\n esbuild: {\n jsx: 'automatic',\n jsxImportSource: 'vite-plugin-html-pages',\n },\n server: {\n middlewareMode: true,\n },\n plugins: [\n {\n name: 'vite-plugin-html-pages:page-helper',\n\n resolveId(id, importer) {\n if (id === VIRTUAL_PAGE_HELPER_ID && importer) {\n return `${RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX}${importer}`;\n }\n\n if (importer && isLocalPageTypesImport(id)) {\n return `${VIRTUAL_LOCAL_TYPES_PREFIX}${importer}::${id}`;\n }\n\n return null;\n },\n\n async load(id) {\n if (id.startsWith(VIRTUAL_LOCAL_TYPES_PREFIX)) {\n return `\nexport {\n definePage,\n defineData,\n defineStaticParams,\n definePageModule\n} from 'vite-plugin-html-pages/page';\n`;\n }\n\n if (!id.startsWith(RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX)) {\n return null;\n }\n\n const importer = id.slice(\n RESOLVED_VIRTUAL_PAGE_HELPER_PREFIX.length,\n );\n\n const pages = await getPages();\n const normalizedImporter = path.resolve(importer);\n\n const page = pages.find(\n (candidate) =>\n path.resolve(candidate.absolutePath) === normalizedImporter,\n );\n\n return generateTypedPageHelper(page);\n },\n },\n ],\n };\n\n buildServer = await createServer(config);\n }\n\n return async (entryPath) => {\n const relativePath =\n '/' + path.relative(root, entryPath).replace(/\\\\/g, '/');\n\n const mod = await buildServer!.ssrLoadModule(relativePath);\n return normalizeLoadedPageModule(mod);\n };\n}\n\nexport async function closePageModuleLoader(): Promise<void> {\n if (buildServer) {\n await buildServer.close();\n buildServer = null;\n }\n}","import type { HtPageInfo, RouteParamDefinition } from './types';\n\nfunction paramsTypeFromDefinitions(\n paramDefinitions: RouteParamDefinition[],\n): string {\n if (paramDefinitions.length === 0) {\n return '{}';\n }\n\n const fields = paramDefinitions.map((param) => {\n if (param.type === 'single') {\n return `${JSON.stringify(param.name)}: string`;\n }\n\n if (param.type === 'catch-all') {\n return `${JSON.stringify(param.name)}: string[]`;\n }\n\n return `${JSON.stringify(param.name)}?: string[]`;\n });\n\n return `{ ${fields.join('; ')} }`;\n}\n\nexport function generateTypedPageHelper(page: HtPageInfo | undefined): string {\n const paramsType = page\n ? paramsTypeFromDefinitions(page.paramDefinitions ?? [])\n : '{}';\n\n return `\nexport type PageParams = ${paramsType};\n\nexport type StaticParams = PageParams[];\n\nexport type DataContext = {\n params: PageParams;\n dev: boolean;\n};\n\nexport type RenderContext<TData = unknown> = {\n params: PageParams;\n data: TData;\n dev: boolean;\n};\n\nexport type PageContext<TData = unknown> = {\n params: PageParams;\n data?: TData;\n dev: boolean;\n};\n\nexport type PageModule<TData = unknown> = {\n generateStaticParams?: () => StaticParams | Promise<StaticParams>;\n data?: (ctx: DataContext) => TData | Promise<TData>;\n render: (ctx: RenderContext<TData>) => any;\n};\n\nexport function definePage<T extends (ctx: PageContext) => any>(fn: T): T {\n return fn;\n}\n\nexport function defineData<T extends (ctx: DataContext) => any>(fn: T): T {\n return fn;\n}\n\nexport function defineStaticParams<\n T extends () => StaticParams | Promise<StaticParams>\n>(fn: T): T {\n return fn;\n}\n\nexport function definePageModule<TData>(\n mod: PageModule<TData>,\n): PageModule<TData> {\n return mod;\n}\n`;\n}","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface HtmlAssetValidationOptions {\n root: string;\n pagesDir: string;\n html: string;\n pluginName: string;\n pageLabel?: string;\n missingAssets?: 'error' | 'warn';\n}\n\nfunction stripQueryAndHash(url: string): string {\n return url.split('#')[0].split('?')[0];\n}\n\nfunction isLocalRootUrl(url: string): boolean {\n return !!url && url.startsWith('/') && !url.startsWith('//');\n}\n\nfunction fileExistsForPublicUrl(root: string, pagesDir: string, url: string): boolean {\n const clean = stripQueryAndHash(url).slice(1);\n\n const fromSrc = path.join(root, pagesDir, clean);\n if (fs.existsSync(fromSrc)) return true;\n\n const fromPublic = path.join(root, 'public', clean);\n if (fs.existsSync(fromPublic)) return true;\n\n return false;\n}\n\nfunction collectScriptSrcs(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /<script\\b[^>]*\\bsrc=[\"']([^\"']+)[\"'][^>]*>/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction collectStylesheetHrefs(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /<link\\b[^>]*\\brel=[\"']stylesheet[\"'][^>]*\\bhref=[\"']([^\"']+)[\"'][^>]*>/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction collectLiteralDynamicImports(html: string): string[] {\n const out: string[] = [];\n\n for (const match of html.matchAll(\n /import\\s*\\(\\s*[\"']([^\"'`]+)[\"']\\s*\\)/gi,\n )) {\n out.push(match[1]);\n }\n\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction formatPageLabel(pageLabel?: string): string {\n return pageLabel ? ` (${pageLabel})` : '';\n}\n\nfunction missingAssetMessage(args: {\n pluginName: string;\n kind: string;\n url: string;\n root: string;\n pagesDir: string;\n pageLabel?: string;\n}): string {\n const { pluginName, kind, url, root, pagesDir, pageLabel } = args;\n const clean = stripQueryAndHash(url).slice(1);\n const pageSuffix = formatPageLabel(pageLabel);\n\n return (\n `[${pluginName}] Missing ${kind}${pageSuffix}: ${url}\\n` +\n `Expected one of:\\n` +\n `- ${path.join(root, pagesDir, clean)}\\n` +\n `- ${path.join(root, 'public', clean)}`\n );\n}\n\nfunction reportMissing(args: {\n mode: 'error' | 'warn';\n pluginName: string;\n kind: string;\n url: string;\n root: string;\n pagesDir: string;\n pageLabel?: string;\n}) {\n const message = missingAssetMessage(args);\n\n if (args.mode === 'warn') {\n console.warn(`⚠️ ${message}`);\n return;\n }\n\n throw new Error(message);\n}\n\nexport function validateHtmlAssetReferences(\n options: HtmlAssetValidationOptions,\n): void {\n const {\n root,\n pagesDir,\n html,\n pluginName,\n pageLabel,\n missingAssets = 'error',\n } = options;\n\n const scriptSrcs = unique(collectScriptSrcs(html)).filter(isLocalRootUrl);\n const stylesheetHrefs = unique(collectStylesheetHrefs(html)).filter(isLocalRootUrl);\n const literalDynamicImports = unique(collectLiteralDynamicImports(html)).filter(\n isLocalRootUrl,\n );\n\n for (const url of scriptSrcs) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n reportMissing({\n mode: missingAssets,\n pluginName,\n kind: 'JavaScript asset',\n url,\n root,\n pagesDir,\n pageLabel,\n });\n }\n }\n\n for (const url of stylesheetHrefs) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n reportMissing({\n mode: missingAssets,\n pluginName,\n kind: 'stylesheet asset',\n url,\n root,\n pagesDir,\n pageLabel,\n });\n }\n }\n\n for (const url of literalDynamicImports) {\n if (!fileExistsForPublicUrl(root, pagesDir, url)) {\n console.warn(\n `⚠️ ${missingAssetMessage({\n pluginName,\n kind: 'literal dynamic import',\n url,\n root,\n pagesDir,\n pageLabel,\n })}`,\n );\n }\n }\n}","import {\n compareRoutePriority,\n expandStaticPaths,\n fileNameFromRoute,\n} from './route-utils';\nimport type { HtPageInfo, HtPageModule } from './types';\nimport { PLUGIN_NAME } from './constants';\n\nexport async function buildPageIndex(args: {\n entries: HtPageInfo[];\n modulesByEntry: Map<string, HtPageModule>;\n cleanUrls: boolean;\n}): Promise<HtPageInfo[]> {\n const { entries, modulesByEntry, cleanUrls } = args;\n const pages: HtPageInfo[] = [];\n\n for (const entry of entries) {\n const mod = modulesByEntry.get(entry.entryPath) ?? {};\n\n if (entry.dynamic) {\n const rows =\n (mod.generateStaticParams\n ? await mod.generateStaticParams()\n : []) ?? [];\n\n pages.push(\n ...expandStaticPaths(\n {\n id: entry.id,\n entryPath: entry.entryPath,\n absolutePath: entry.absolutePath,\n relativePath: entry.relativePath,\n routePattern: entry.routePattern,\n dynamic: entry.dynamic,\n paramNames: entry.paramNames,\n paramDefinitions: entry.paramDefinitions,\n },\n Array.isArray(rows) ? rows : [],\n cleanUrls,\n ),\n );\n } else {\n pages.push({\n ...entry,\n routePath: entry.routePattern,\n fileName: fileNameFromRoute(entry.routePattern, cleanUrls),\n params: {},\n });\n }\n }\n\n pages.sort((a, b) => compareRoutePriority(a.routePattern, b.routePattern));\n\n const seenRoutes = new Map<string, HtPageInfo>();\n\n for (const page of pages) {\n const existing = seenRoutes.get(page.routePath);\n\n if (existing) {\n throw new Error(\n `[${PLUGIN_NAME}] Duplicate route generated: \"${page.routePath}\" from \"${existing.relativePath}\" and \"${page.relativePath}\"`,\n );\n }\n\n seenRoutes.set(page.routePath, page);\n }\n\n return pages;\n}","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport * as esbuild from 'esbuild';\nimport fsSync from 'node:fs';\n\nexport interface StaticAssetFile {\n absolutePath: string;\n relativePathFromSrc: string;\n outputFileName: string;\n kind: 'copy' | 'process';\n}\n\nexport interface CollectStaticAssetsArgs {\n root: string;\n pagesDir: string;\n pageExtensions: string[];\n}\n\nfunction normalizeSlashes(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nfunction hasAnySuffix(value: string, suffixes: string[]): boolean {\n return suffixes.some((suffix) => value.endsWith(suffix));\n}\n\nfunction shouldIgnoreFile(rel: string): boolean {\n return (\n rel.endsWith('.d.ts') ||\n rel.endsWith('.map') ||\n rel.endsWith('.tsbuildinfo') ||\n rel.startsWith('.') ||\n rel.includes('/.')\n );\n}\n\nfunction isProcessableAsset(rel: string): boolean {\n return (\n rel.endsWith('.js') ||\n rel.endsWith('.mjs') ||\n rel.endsWith('.ts') ||\n rel.endsWith('.css')\n );\n}\n\nfunction toOutputFileName(relativePathFromSrc: string): string {\n if (relativePathFromSrc.endsWith('.ts')) {\n return relativePathFromSrc.slice(0, -3) + '.js';\n }\n return relativePathFromSrc;\n}\n\nexport async function collectStaticAssets(\n args: CollectStaticAssetsArgs,\n): Promise<StaticAssetFile[]> {\n const { root, pagesDir, pageExtensions } = args;\n const srcDir = path.join(root, pagesDir);\n\n const entries = await fg('**/*', {\n cwd: srcDir,\n onlyFiles: true,\n dot: false,\n absolute: false,\n });\n\n const assets: StaticAssetFile[] = [];\n\n for (const entry of entries) {\n const rel = normalizeSlashes(entry);\n\n if (shouldIgnoreFile(rel)) continue;\n if (hasAnySuffix(rel, pageExtensions)) continue;\n\n const absolutePath = path.join(srcDir, rel);\n\n assets.push({\n absolutePath,\n relativePathFromSrc: rel,\n outputFileName: normalizeSlashes(toOutputFileName(rel)),\n kind: isProcessableAsset(rel) ? 'process' : 'copy',\n });\n }\n\n return assets;\n}\n\nexport async function copyStaticAssetSource(\n asset: StaticAssetFile,\n): Promise<Uint8Array> {\n return fs.readFile(asset.absolutePath);\n}\n\nexport async function buildProcessedStaticAssets(args: {\n root: string;\n pagesDir: string;\n assets: StaticAssetFile[];\n minify?: boolean;\n sourcemap?: boolean;\n }): Promise<Map<string, string | Uint8Array>> {\n const { root, pagesDir, assets, minify = true, sourcemap = false } = args;\n \n const processable = assets.filter((a) => a.kind === 'process');\n const out = new Map<string, string | Uint8Array>();\n \n if (processable.length === 0) {\n return out;\n }\n \n const srcDir = path.join(root, pagesDir);\n const distDir = path.join(root, 'dist');\n const warnedMissingAssets = new Set<string>();\n const result = await esbuild.build({\n entryPoints: processable.map((a) => a.absolutePath),\n absWorkingDir: root,\n outbase: srcDir,\n outdir: distDir,\n bundle: true,\n splitting: true,\n treeShaking: true,\n minify,\n sourcemap,\n format: 'esm',\n target: 'es2020',\n platform: 'browser',\n write: false,\n entryNames: '[dir]/[name]',\n assetNames: '[dir]/[name]',\n loader: {\n '.css': 'css',\n '.png': 'file',\n '.jpg': 'file',\n '.jpeg': 'file',\n '.gif': 'file',\n '.svg': 'file',\n '.webp': 'file',\n '.woff': 'file',\n '.woff2': 'file',\n '.ttf': 'file',\n '.otf': 'file',\n },\n plugins: [\n {\n name: 'html-pages-root-url-resolver',\n setup(build) {\n build.onResolve({ filter: /^\\// }, (resolveArgs) => {\n // Leave real filesystem absolute paths alone\n if (\n path.isAbsolute(resolveArgs.path) &&\n fsSync.existsSync(resolveArgs.path)\n ) {\n return { path: resolveArgs.path };\n }\n \n const cleanPath = resolveArgs.path.slice(1);\n \n const fromSrc = path.join(srcDir, cleanPath);\n if (fsSync.existsSync(fromSrc)) {\n return { path: fromSrc };\n }\n \n const fromPublic = path.join(root, 'public', cleanPath);\n if (fsSync.existsSync(fromPublic)) {\n return {\n path: resolveArgs.path,\n external: true,\n };\n }\n \n const isCssUrlToken = resolveArgs.kind === 'url-token';\n \n if (isCssUrlToken) {\n if (!warnedMissingAssets.has(resolveArgs.path)) {\n warnedMissingAssets.add(resolveArgs.path);\n console.warn(\n `[vite-plugin-html-pages] ⚠️ Missing CSS asset: ${resolveArgs.path}\\n` +\n ` Looked in:\\n` +\n ` - ${fromSrc}\\n` +\n ` - ${fromPublic}`\n );\n }\n \n // Keep the original root-relative URL in output CSS\n return {\n path: resolveArgs.path,\n external: true,\n };\n }\n \n // JS/CSS entry imports remain strict\n return {\n path: fromSrc,\n };\n });\n },\n },\n ],\n });\n \n for (const file of result.outputFiles) {\n const rel = normalizeSlashes(path.relative(distDir, file.path));\n out.set(rel, file.text ?? file.contents);\n }\n \n return out;\n }\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { CACHE_DIR_NAME } from './constants';\n\nexport type FetchCacheMode = 'auto' | 'memory' | 'fs' | 'none';\nexport interface FetchWithCacheOptions {\n maxAge?: number;\n cacheKey?: string;\n forceRefresh?: boolean;\n cache?: FetchCacheMode;\n}\n\ntype CachedResponseRecord = {\n timestamp: number;\n status: number;\n statusText: string;\n headers: [string, string][];\n body: string;\n};\n\nconst memoryCache = new Map<string, CachedResponseRecord>();\n\nfunction createDefaultCacheKey(\n input: RequestInfo | URL,\n init?: RequestInit,\n): string {\n const raw = JSON.stringify({\n url: String(input),\n method: init?.method ?? 'GET',\n headers: init?.headers ?? {},\n body: init?.body ?? null,\n });\n\n return createHash('sha256').update(raw).digest('hex');\n}\n\nfunction getCacheFilePath(cacheKey: string): string {\n return path.join(process.cwd(), CACHE_DIR_NAME, 'fetch', `${cacheKey}.json`);\n}\n\nfunction getEffectiveCacheMode(\n mode: FetchCacheMode | undefined,\n): Exclude<FetchCacheMode, 'auto'> {\n if (mode === 'memory' || mode === 'fs' || mode === 'none') {\n return mode;\n }\n\n return process.env.NODE_ENV === 'production' ? 'fs' : 'memory';\n}\n\nfunction toResponse(cached: CachedResponseRecord): Response {\n return new Response(cached.body, {\n status: cached.status,\n statusText: cached.statusText,\n headers: cached.headers,\n });\n}\n\nfunction isFresh(cached: CachedResponseRecord, maxAgeSeconds: number): boolean {\n const ageSeconds = (Date.now() - cached.timestamp) / 1000;\n return ageSeconds <= maxAgeSeconds;\n}\n\nexport function clearMemoryFetchCache(): void {\n memoryCache.clear();\n}\n\nexport function deleteMemoryFetchCache(cacheKey: string): void {\n memoryCache.delete(cacheKey);\n}\n\nexport async function fetchWithCache(\n input: RequestInfo | URL,\n init?: RequestInit,\n options: FetchWithCacheOptions = {},\n): Promise<Response> {\n const maxAge = options.maxAge ?? 60 * 60;\n const method = (init?.method ?? 'GET').toUpperCase();\n\n if (method !== 'GET' && !options.cacheKey) {\n return fetch(input, init);\n }\n\n const cacheMode = getEffectiveCacheMode(options.cache);\n const cacheKey = options.cacheKey ?? createDefaultCacheKey(input, init);\n\n if (cacheMode === 'none') {\n return fetch(input, init);\n }\n\n if (cacheMode === 'memory' && !options.forceRefresh) {\n const cached = memoryCache.get(cacheKey);\n\n if (cached && isFresh(cached, maxAge)) {\n return toResponse(cached);\n }\n }\n\n const filePath = getCacheFilePath(cacheKey);\n\n if (cacheMode === 'fs') {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n if (!options.forceRefresh) {\n try {\n const raw = await fs.readFile(filePath, 'utf8');\n const cached = JSON.parse(raw) as CachedResponseRecord;\n\n if (isFresh(cached, maxAge)) {\n return toResponse(cached);\n }\n } catch {\n // cache miss or invalid cache; fetch fresh\n }\n }\n }\n\n const res = await fetch(input, init);\n const body = await res.text();\n\n const record: CachedResponseRecord = {\n timestamp: Date.now(),\n status: res.status,\n statusText: res.statusText,\n headers: [...res.headers.entries()],\n body,\n };\n\n if (cacheMode === 'memory') {\n memoryCache.set(cacheKey, record);\n } else if (cacheMode === 'fs') {\n await fs.writeFile(filePath, JSON.stringify(record), 'utf8');\n }\n\n return new Response(body, {\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n });\n}\n"],"mappings":"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","names":["fs","path","path","path","path","fg","path","fs","path","path","paramsTypeFromDefinitions","path","path","fs","fs","path","fs","path","build","path","fs","isLocalPageTypesImport","fs","path","path","fs","path"]}
|