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