@blinkk/root 1.0.0-rc.2 → 1.0.0-rc.20

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.
@@ -4,6 +4,7 @@ import {
4
4
  trailingSlashMiddleware
5
5
  } from "./chunk-WNXIRMFF.js";
6
6
  import {
7
+ bundleRootConfig,
7
8
  copyGlob,
8
9
  createViteServer,
9
10
  dirExists,
@@ -11,22 +12,24 @@ import {
11
12
  fileExists,
12
13
  isDirectory,
13
14
  isJsFile,
15
+ loadBundledConfig,
14
16
  loadJson,
15
17
  loadRootConfig,
16
18
  makeDir,
17
19
  rmDir,
18
20
  writeFile
19
- } from "./chunk-J2ANSYAE.js";
21
+ } from "./chunk-JH33OQEK.js";
20
22
  import {
21
23
  configureServerPlugins,
22
24
  getVitePlugins
23
25
  } from "./chunk-QKBMWK5B.js";
24
26
  import {
27
+ RouteTrie,
25
28
  htmlMinify,
26
29
  htmlPretty,
27
30
  isValidTagName,
28
31
  parseTagNames
29
- } from "./chunk-DFBTOMQF.js";
32
+ } from "./chunk-IUQLRDFW.js";
30
33
 
31
34
  // src/cli/commands/build.ts
32
35
  import path3 from "node:path";
@@ -415,7 +418,7 @@ async function build(rootProjectDir, options) {
415
418
  ssr: {
416
419
  ...viteConfig.ssr,
417
420
  target: "node",
418
- noExternal: ["@blinkk/root", ...noExternal]
421
+ noExternal: ["@blinkk/root", "@blinkk/root-cms/richtext", ...noExternal]
419
422
  }
420
423
  });
421
424
  await viteBuild({
@@ -435,9 +438,9 @@ async function build(rootProjectDir, options) {
435
438
  ...(_e = (_d = viteConfig == null ? void 0 : viteConfig.build) == null ? void 0 : _d.rollupOptions) == null ? void 0 : _e.output
436
439
  }
437
440
  },
438
- outDir: path3.join(distDir, "routes"),
441
+ outDir: path3.join(distDir, ".build/routes"),
439
442
  ssr: true,
440
- ssrManifest: true,
443
+ ssrManifest: false,
441
444
  ssrEmitAssets: true,
442
445
  manifest: true,
443
446
  cssCodeSplit: true,
@@ -466,7 +469,7 @@ async function build(rootProjectDir, options) {
466
469
  ...(_h = (_g = viteConfig == null ? void 0 : viteConfig.build) == null ? void 0 : _g.rollupOptions) == null ? void 0 : _h.output
467
470
  }
468
471
  },
469
- outDir: path3.join(distDir, "client"),
472
+ outDir: path3.join(distDir, ".build/client"),
470
473
  ssr: false,
471
474
  ssrManifest: false,
472
475
  manifest: true,
@@ -478,18 +481,22 @@ async function build(rootProjectDir, options) {
478
481
  }
479
482
  });
480
483
  } else {
481
- await writeFile(path3.join(distDir, "client/manifest.json"), "{}");
484
+ await writeFile(
485
+ path3.join(distDir, ".build/client/.vite/manifest.json"),
486
+ "{}"
487
+ );
482
488
  }
489
+ await bundleRootConfig(rootDir, path3.join(distDir, "root.config.js"));
483
490
  await copyGlob(
484
491
  "**/*.css",
485
- path3.join(distDir, "routes"),
486
- path3.join(distDir, "client")
492
+ path3.join(distDir, ".build/routes"),
493
+ path3.join(distDir, ".build/client")
487
494
  );
488
495
  const routesManifest = await loadJson(
489
- path3.join(distDir, "routes/manifest.json")
496
+ path3.join(distDir, ".build/routes/.vite/manifest.json")
490
497
  );
491
498
  const clientManifest = await loadJson(
492
- path3.join(distDir, "client/manifest.json")
499
+ path3.join(distDir, ".build/client/.vite/manifest.json")
493
500
  );
494
501
  function collectRouteCss(asset, cssDeps, visited) {
495
502
  if (!asset || !asset.file || visited.has(asset.file)) {
@@ -525,12 +532,12 @@ async function build(rootProjectDir, options) {
525
532
  );
526
533
  const rootManifest = assetMap.toJson();
527
534
  await writeFile(
528
- path3.join(distDir, "client/root-manifest.json"),
535
+ path3.join(distDir, ".root/manifest.json"),
529
536
  JSON.stringify(rootManifest, null, 2)
530
537
  );
531
538
  const elementGraphJson = elementGraph.toJson();
532
539
  await writeFile(
533
- path3.join(distDir, "client/root-element-graph.json"),
540
+ path3.join(distDir, ".root/elements.json"),
534
541
  JSON.stringify(elementGraphJson, null, 2)
535
542
  );
536
543
  const buildDir = path3.join(distDir, "html");
@@ -540,25 +547,37 @@ async function build(rootProjectDir, options) {
540
547
  } else {
541
548
  await makeDir(buildDir);
542
549
  }
550
+ const seenAssets = /* @__PURE__ */ new Set();
551
+ async function copyAssetToDistHtml(assetUrl) {
552
+ if (seenAssets.has(assetUrl)) {
553
+ return;
554
+ }
555
+ seenAssets.add(assetUrl);
556
+ const assetRelPath = assetUrl.slice(1);
557
+ const assetFrom = path3.join(distDir, ".build/client", assetRelPath);
558
+ const assetTo = path3.join(buildDir, assetRelPath);
559
+ if (!await fileExists(assetFrom)) {
560
+ console.log(`${assetFrom} does not exist`);
561
+ return;
562
+ }
563
+ await fsExtra.copy(assetFrom, assetTo);
564
+ printFileOutput(fileSize(assetTo), "dist/html/", assetRelPath);
565
+ }
543
566
  console.log("\njs/css output:");
544
567
  await Promise.all(
545
568
  Object.keys(rootManifest).map(async (src) => {
569
+ const assetData = rootManifest[src];
546
570
  if (isRouteFile(src)) {
571
+ const importedCss = assetData.importedCss || [];
572
+ for (const cssAssetUrl of importedCss) {
573
+ await copyAssetToDistHtml(cssAssetUrl);
574
+ }
547
575
  return;
548
576
  }
549
- const assetData = rootManifest[src];
550
577
  if (!assetData.assetUrl) {
551
578
  return;
552
579
  }
553
- const assetRelPath = assetData.assetUrl.slice(1);
554
- const assetFrom = path3.join(distDir, "client", assetRelPath);
555
- const assetTo = path3.join(buildDir, assetRelPath);
556
- if (!await fileExists(assetFrom)) {
557
- console.log(`${assetFrom} does not exist`);
558
- return;
559
- }
560
- await fsExtra.copy(assetFrom, assetTo);
561
- printFileOutput(fileSize(assetTo), "dist/html/", assetRelPath);
580
+ await copyAssetToDistHtml(assetData.assetUrl);
562
581
  })
563
582
  );
564
583
  if (!ssrOnly) {
@@ -683,6 +702,51 @@ var Hooks = class {
683
702
  }
684
703
  };
685
704
 
705
+ // src/middleware/redirects.ts
706
+ function redirectsMiddleware(options) {
707
+ const routeTrie = new RouteTrie();
708
+ const redirects = options.redirects || [];
709
+ redirects.forEach((redirect) => {
710
+ if (!verifyRedirectConfig(redirect)) {
711
+ console.warn("ignoring invalid redirect config:", redirect);
712
+ return;
713
+ }
714
+ routeTrie.add(redirect.source, redirect);
715
+ });
716
+ return (req, res, next) => {
717
+ const [redirect, params] = routeTrie.get(req.path);
718
+ if (redirect) {
719
+ const destination = replaceParams(redirect.destination, params);
720
+ const code = redirect.type || 302;
721
+ res.redirect(code, destination);
722
+ return;
723
+ }
724
+ next();
725
+ };
726
+ }
727
+ function verifyRedirectConfig(redirect) {
728
+ if (!redirect.source) {
729
+ return false;
730
+ }
731
+ if (!redirect.destination) {
732
+ return false;
733
+ }
734
+ return true;
735
+ }
736
+ function replaceParams(urlPathFormat, params) {
737
+ const urlPath = urlPathFormat.replaceAll(
738
+ /\[\[?(\.\.\.)?([\w\-_]*)\]?\]/g,
739
+ (match, _wildcard, key) => {
740
+ const val = params[key];
741
+ if (!val) {
742
+ throw new Error(`unreplaced param ${match} in url: ${urlPathFormat}`);
743
+ }
744
+ return val;
745
+ }
746
+ );
747
+ return urlPath;
748
+ }
749
+
686
750
  // src/render/asset-map/dev-asset-map.ts
687
751
  import path4 from "node:path";
688
752
  import { searchForWorkspaceRoot as searchForWorkspaceRoot2 } from "vite";
@@ -862,12 +926,17 @@ async function dev(rootProjectDir, options) {
862
926
  const defaultPort = parseInt(process.env.PORT || "4007");
863
927
  const host = (options == null ? void 0 : options.host) || "localhost";
864
928
  const port = await findOpenPort(defaultPort, defaultPort + 10);
929
+ const server = await createDevServer({ rootDir, port });
930
+ const rootConfig = server.get("rootConfig");
931
+ const basePath = rootConfig.base || "";
865
932
  console.log();
866
933
  console.log(`${dim2("\u2503")} project: ${rootDir}`);
867
- console.log(`${dim2("\u2503")} server: http://${host}:${port}`);
934
+ console.log(`${dim2("\u2503")} server: http://${host}:${port}${basePath}`);
935
+ if (testCmsEnabled(rootConfig)) {
936
+ console.log(`${dim2("\u2503")} cms: http://${host}:${port}/cms/`);
937
+ }
868
938
  console.log(`${dim2("\u2503")} mode: development`);
869
939
  console.log();
870
- const server = await createDevServer({ rootDir, port });
871
940
  server.listen(port, host);
872
941
  }
873
942
  async function createDevServer(options) {
@@ -876,6 +945,7 @@ async function createDevServer(options) {
876
945
  const rootConfig = await loadRootConfig(rootDir, { command: "dev" });
877
946
  const port = options == null ? void 0 : options.port;
878
947
  const server = express();
948
+ server.set("rootConfig", rootConfig);
879
949
  server.disable("x-powered-by");
880
950
  server.use(rootProjectMiddleware({ rootConfig }));
881
951
  server.use(await viteServerMiddleware({ rootConfig, port }));
@@ -887,11 +957,16 @@ async function createDevServer(options) {
887
957
  await configureServerPlugins(
888
958
  server,
889
959
  async () => {
890
- var _a2;
960
+ var _a2, _b;
891
961
  const userMiddlewares = ((_a2 = rootConfig.server) == null ? void 0 : _a2.middlewares) || [];
892
962
  for (const middleware of userMiddlewares) {
893
963
  server.use(middleware);
894
964
  }
965
+ if ((_b = rootConfig.server) == null ? void 0 : _b.redirects) {
966
+ server.use(
967
+ redirectsMiddleware({ redirects: rootConfig.server.redirects })
968
+ );
969
+ }
895
970
  const publicDir = path5.join(rootDir, "public");
896
971
  if (await dirExists(publicDir)) {
897
972
  server.use(sirv(publicDir, { dev: false }));
@@ -1010,6 +1085,10 @@ function rootDevServer500Middleware() {
1010
1085
  next(err);
1011
1086
  };
1012
1087
  }
1088
+ function testCmsEnabled(rootConfig) {
1089
+ const plugins = rootConfig.plugins || [];
1090
+ return Boolean(plugins.find((plugin) => plugin.name === "root-cms"));
1091
+ }
1013
1092
 
1014
1093
  // src/cli/commands/preview.ts
1015
1094
  import path6 from "node:path";
@@ -1034,7 +1113,7 @@ async function preview(rootProjectDir, options) {
1034
1113
  async function createPreviewServer(options) {
1035
1114
  var _a;
1036
1115
  const rootDir = options.rootDir;
1037
- const rootConfig = await loadRootConfig(rootDir, { command: "preview" });
1116
+ const rootConfig = await loadBundledConfig(rootDir, { command: "preview" });
1038
1117
  const distDir = path6.join(rootDir, "dist");
1039
1118
  const server = express2();
1040
1119
  server.disable("x-powered-by");
@@ -1049,11 +1128,16 @@ async function createPreviewServer(options) {
1049
1128
  configureServerPlugins(
1050
1129
  server,
1051
1130
  async () => {
1052
- var _a2;
1131
+ var _a2, _b;
1053
1132
  const userMiddlewares = ((_a2 = rootConfig.server) == null ? void 0 : _a2.middlewares) || [];
1054
1133
  userMiddlewares.forEach((middleware) => {
1055
1134
  server.use(middleware);
1056
1135
  });
1136
+ if ((_b = rootConfig.server) == null ? void 0 : _b.redirects) {
1137
+ server.use(
1138
+ redirectsMiddleware({ redirects: rootConfig.server.redirects })
1139
+ );
1140
+ }
1057
1141
  const publicDir = path6.join(distDir, "html");
1058
1142
  server.use(sirv2(publicDir, { dev: false }));
1059
1143
  server.use(trailingSlashMiddleware({ rootConfig }));
@@ -1069,19 +1153,16 @@ async function createPreviewServer(options) {
1069
1153
  async function rootPreviewRendererMiddleware(options) {
1070
1154
  const { distDir, rootConfig } = options;
1071
1155
  const render = await import(path6.join(distDir, "server/render.js"));
1072
- const manifestPath = path6.join(distDir, "client/root-manifest.json");
1156
+ const manifestPath = path6.join(distDir, ".root/manifest.json");
1073
1157
  if (!await fileExists(manifestPath)) {
1074
1158
  throw new Error(
1075
1159
  `could not find ${manifestPath}. run \`root build\` before \`root preview\`.`
1076
1160
  );
1077
1161
  }
1078
- const elementGraphJsonPath = path6.join(
1079
- distDir,
1080
- "client/root-element-graph.json"
1081
- );
1162
+ const elementGraphJsonPath = path6.join(distDir, ".root/elements.json");
1082
1163
  if (!await fileExists(elementGraphJsonPath)) {
1083
1164
  throw new Error(
1084
- `could not find ${elementGraphJsonPath}. run \`root build\` before \`root start\`.`
1165
+ `could not find ${elementGraphJsonPath}. run \`root build\` before \`root preview\`.`
1085
1166
  );
1086
1167
  }
1087
1168
  const rootManifest = await loadJson(manifestPath);
@@ -1103,7 +1184,7 @@ function rootPreviewServerMiddleware() {
1103
1184
  try {
1104
1185
  console.error(`error rendering ${req.originalUrl}`);
1105
1186
  console.error(e.stack || e);
1106
- const { html } = await renderer.renderError(e);
1187
+ const { html } = await renderer.renderDevServer500(req, e);
1107
1188
  res.status(500).set({ "Content-Type": "text/html" }).end(html);
1108
1189
  } catch (e2) {
1109
1190
  console.error("failed to render custom error");
@@ -1172,7 +1253,7 @@ async function start(rootProjectDir, options) {
1172
1253
  async function createProdServer(options) {
1173
1254
  var _a;
1174
1255
  const rootDir = options.rootDir;
1175
- const rootConfig = await loadRootConfig(rootDir, { command: "start" });
1256
+ const rootConfig = await loadBundledConfig(rootDir, { command: "start" });
1176
1257
  const distDir = path7.join(rootDir, "dist");
1177
1258
  const server = express3();
1178
1259
  server.disable("x-powered-by");
@@ -1187,11 +1268,16 @@ async function createProdServer(options) {
1187
1268
  configureServerPlugins(
1188
1269
  server,
1189
1270
  async () => {
1190
- var _a2;
1271
+ var _a2, _b;
1191
1272
  const userMiddlewares = ((_a2 = rootConfig.server) == null ? void 0 : _a2.middlewares) || [];
1192
1273
  userMiddlewares.forEach((middleware) => {
1193
1274
  server.use(middleware);
1194
1275
  });
1276
+ if ((_b = rootConfig.server) == null ? void 0 : _b.redirects) {
1277
+ server.use(
1278
+ redirectsMiddleware({ redirects: rootConfig.server.redirects })
1279
+ );
1280
+ }
1195
1281
  const publicDir = path7.join(distDir, "html");
1196
1282
  server.use(sirv3(publicDir, { dev: false }));
1197
1283
  server.use(trailingSlashMiddleware({ rootConfig }));
@@ -1207,16 +1293,13 @@ async function createProdServer(options) {
1207
1293
  async function rootProdRendererMiddleware(options) {
1208
1294
  const { distDir, rootConfig } = options;
1209
1295
  const render = await import(path7.join(distDir, "server/render.js"));
1210
- const manifestPath = path7.join(distDir, "client/root-manifest.json");
1296
+ const manifestPath = path7.join(distDir, ".root/manifest.json");
1211
1297
  if (!await fileExists(manifestPath)) {
1212
1298
  throw new Error(
1213
1299
  `could not find ${manifestPath}. run \`root build\` before \`root start\`.`
1214
1300
  );
1215
1301
  }
1216
- const elementGraphJsonPath = path7.join(
1217
- distDir,
1218
- "client/root-element-graph.json"
1219
- );
1302
+ const elementGraphJsonPath = path7.join(distDir, ".root/elements.json");
1220
1303
  if (!await fileExists(elementGraphJsonPath)) {
1221
1304
  throw new Error(
1222
1305
  `could not find ${elementGraphJsonPath}. run \`root build\` before \`root start\`.`
@@ -1296,4 +1379,4 @@ export {
1296
1379
  start,
1297
1380
  createProdServer
1298
1381
  };
1299
- //# sourceMappingURL=chunk-CY3DVKXO.js.map
1382
+ //# sourceMappingURL=chunk-4H7UTBRX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/build.ts","../src/node/element-graph.ts","../src/render/asset-map/build-asset-map.ts","../src/utils/batch.ts","../src/cli/commands/dev.ts","../src/middleware/hooks.ts","../src/middleware/redirects.ts","../src/render/asset-map/dev-asset-map.ts","../src/utils/ports.ts","../src/utils/rand.ts","../src/cli/commands/preview.ts","../src/cli/commands/start.ts"],"sourcesContent":["/* eslint-disable no-control-regex */\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nimport fsExtra from 'fs-extra';\nimport {dim, cyan} from 'kleur/colors';\nimport glob from 'tiny-glob';\nimport {build as viteBuild, Manifest, ManifestChunk, UserConfig} from 'vite';\n\nimport {getVitePlugins} from '../../core/plugin.js';\nimport {Route} from '../../core/types.js';\nimport {getElements} from '../../node/element-graph.js';\nimport {bundleRootConfig, loadRootConfig} from '../../node/load-config.js';\nimport {BuildAssetMap} from '../../render/asset-map/build-asset-map.js';\nimport {htmlMinify} from '../../render/html-minify.js';\nimport {htmlPretty} from '../../render/html-pretty.js';\nimport {batchAsyncCalls} from '../../utils/batch.js';\nimport {\n copyGlob,\n fileExists,\n isDirectory,\n isJsFile,\n loadJson,\n makeDir,\n rmDir,\n writeFile,\n} from '../../utils/fsutils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ntype RenderModule = typeof import('../../render/render.js');\n\ninterface BuildOptions {\n ssrOnly?: boolean;\n mode?: string;\n concurrency?: number;\n}\n\nexport async function build(rootProjectDir?: string, options?: BuildOptions) {\n const mode = options?.mode || 'production';\n process.env.NODE_ENV = mode;\n\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir, {command: 'build'});\n const distDir = path.join(rootDir, 'dist');\n const ssrOnly = options?.ssrOnly || false;\n\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} output: ${distDir}/html`);\n console.log(`${dim('┃')} mode: ${mode}`);\n console.log();\n\n await rmDir(distDir);\n await makeDir(distDir);\n\n const routeFiles: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob('routes/**/*', {cwd: rootDir});\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n routeFiles.push(path.resolve(rootDir, file));\n }\n });\n }\n\n const elementGraph = await getElements(rootConfig);\n const elements = Object.values(elementGraph.sourceFiles).map((sourceFile) => {\n return sourceFile.filePath;\n });\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(path.resolve(rootDir, file));\n }\n });\n }\n\n const rootPlugins = rootConfig.plugins || [];\n const viteConfig = rootConfig.vite || {};\n const vitePlugins = [\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootPlugins),\n ];\n\n const baseConfig: UserConfig = {\n ...viteConfig,\n root: rootDir,\n mode: mode,\n esbuild: {\n ...viteConfig.esbuild,\n jsx: 'automatic',\n jsxImportSource: 'preact',\n treeShaking: true,\n },\n plugins: vitePlugins,\n };\n\n // Bundle the render.js file with vite along with any plugins `ssrInput()`\n // config values. These inputs are bundled through vite and support things\n // like `input.meta.glob()`.\n const ssrInput = {\n render: path.resolve(__dirname, './render.js'),\n };\n rootPlugins.forEach((plugin) => {\n if (plugin.ssrInput) {\n Object.assign(ssrInput, plugin.ssrInput());\n }\n });\n const noExternalConfig = viteConfig.ssr?.noExternal;\n const noExternal: Array<string | RegExp> = [];\n if (noExternalConfig) {\n if (Array.isArray(noExternalConfig)) {\n noExternal.push(...noExternalConfig);\n } else {\n noExternal.push(noExternalConfig as string | RegExp);\n }\n }\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rollupOptions: {\n ...viteConfig?.build?.rollupOptions,\n input: ssrInput,\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[hash].min.js',\n assetFileNames: 'assets/[name].[hash][extname]',\n sanitizeFileName: sanitizeFileName,\n },\n },\n outDir: path.join(distDir, 'server'),\n ssr: true,\n ssrManifest: false,\n cssCodeSplit: true,\n target: 'esnext',\n minify: false,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n ssr: {\n ...viteConfig.ssr,\n target: 'node',\n noExternal: ['@blinkk/root', '@blinkk/root-cms/richtext', ...noExternal],\n },\n });\n\n // Pre-render CSS deps from /routes/.\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rollupOptions: {\n ...viteConfig?.build?.rollupOptions,\n input: [...routeFiles],\n output: {\n format: 'esm',\n entryFileNames: 'assets/[name].[hash].min.js',\n assetFileNames: 'assets/[name].[hash][extname]',\n chunkFileNames: 'chunks/[hash].min.js',\n sanitizeFileName: sanitizeFileName,\n ...viteConfig?.build?.rollupOptions?.output,\n },\n },\n outDir: path.join(distDir, '.build/routes'),\n ssr: true,\n ssrManifest: false,\n ssrEmitAssets: true,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n });\n\n // Pre-render /elements/ and /bundles/.\n const clientInput = [...elements, ...bundleScripts];\n if (clientInput.length > 0) {\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rollupOptions: {\n ...viteConfig?.build?.rollupOptions,\n input: [...elements, ...bundleScripts],\n output: {\n format: 'esm',\n entryFileNames: 'assets/[name].[hash].min.js',\n assetFileNames: 'assets/[name].[hash][extname]',\n chunkFileNames: 'chunks/[hash].min.js',\n sanitizeFileName: sanitizeFileName,\n ...viteConfig?.build?.rollupOptions?.output,\n },\n },\n outDir: path.join(distDir, '.build/client'),\n ssr: false,\n ssrManifest: false,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n });\n } else {\n await writeFile(\n path.join(distDir, '.build/client/.vite/manifest.json'),\n '{}'\n );\n }\n\n // Bundle the root.config.ts file to dist/root.config.js.\n await bundleRootConfig(rootDir, path.join(distDir, 'root.config.js'));\n\n // Copy CSS files from `dist/.build/routes/**/*.css` to\n // `dist/.build/client/` and flatten the routes manifest to ignore any\n // imported modules. Then add the route assets to the client manifest.\n await copyGlob(\n '**/*.css',\n path.join(distDir, '.build/routes'),\n path.join(distDir, '.build/client')\n );\n const routesManifest = await loadJson<Manifest>(\n path.join(distDir, '.build/routes/.vite/manifest.json')\n );\n const clientManifest = await loadJson<Manifest>(\n path.join(distDir, '.build/client/.vite/manifest.json')\n );\n function collectRouteCss(\n asset: ManifestChunk,\n cssDeps: Set<string>,\n visited: Set<string>\n ) {\n if (!asset || !asset.file || visited.has(asset.file)) {\n return;\n }\n visited.add(asset.file);\n if (asset.css) {\n asset.css.forEach((dep) => cssDeps.add(dep));\n }\n if (asset.imports) {\n asset.imports.forEach((manifestKey) => {\n collectRouteCss(routesManifest[manifestKey], cssDeps, visited);\n });\n }\n }\n Object.keys(routesManifest).forEach((manifestKey) => {\n const asset = routesManifest[manifestKey];\n if (asset.isEntry) {\n const visited = new Set<string>();\n const cssDeps = new Set<string>();\n collectRouteCss(asset, cssDeps, visited);\n asset.css = Array.from(cssDeps);\n asset.imports = [];\n clientManifest[manifestKey] = asset;\n } else if (asset.file.endsWith('.css')) {\n clientManifest[manifestKey] = asset;\n }\n });\n\n // Use the output of the client build to generate an asset map, which is used\n // by the renderer for automatically injecting dependencies for a page.\n const assetMap = BuildAssetMap.fromViteManifest(\n rootConfig,\n clientManifest,\n elementGraph\n );\n\n // Save the root's asset map to `dist/.root/manifest.json` for use by the prod\n // SSR server.\n const rootManifest = assetMap.toJson();\n await writeFile(\n path.join(distDir, '.root/manifest.json'),\n JSON.stringify(rootManifest, null, 2)\n );\n\n // Save the element graph to `dist/.root/elements.json` for use by the prod\n // SSR server.\n const elementGraphJson = elementGraph.toJson();\n await writeFile(\n path.join(distDir, '.root/elements.json'),\n JSON.stringify(elementGraphJson, null, 2)\n );\n\n // Write SSG output to `dist/html`.\n const buildDir = path.join(distDir, 'html');\n\n // Recursively copy files from `public` to `dist/html`.\n const publicDir = path.join(rootDir, 'public');\n if (fsExtra.existsSync(path.join(rootDir, 'public'))) {\n fsExtra.copySync(publicDir, buildDir, {dereference: true});\n } else {\n await makeDir(buildDir);\n }\n\n const seenAssets = new Set<string>();\n async function copyAssetToDistHtml(assetUrl: string) {\n if (seenAssets.has(assetUrl)) {\n return;\n }\n seenAssets.add(assetUrl);\n const assetRelPath = assetUrl.slice(1);\n const assetFrom = path.join(distDir, '.build/client', assetRelPath);\n const assetTo = path.join(buildDir, assetRelPath);\n // Ignore assets that don't exist. This is because build artifacts from\n // the routes/ folder are not copied to dist/client (only css deps are).\n if (!(await fileExists(assetFrom))) {\n console.log(`${assetFrom} does not exist`);\n return;\n }\n await fsExtra.copy(assetFrom, assetTo);\n printFileOutput(fileSize(assetTo), 'dist/html/', assetRelPath);\n }\n\n // Copy files from `dist/client/{assets,chunks}` to `dist/html` using the\n // root manifest. Ignore route files.\n console.log('\\njs/css output:');\n await Promise.all(\n Object.keys(rootManifest).map(async (src) => {\n const assetData = rootManifest[src];\n // Only imported css from routes files should be included in build output.\n // Don't expose route files in the final output. If any client-side code\n // relies on route dependencies, it should probably be broken out into a\n // shared component instead.\n if (isRouteFile(src)) {\n const importedCss = assetData.importedCss || [];\n for (const cssAssetUrl of importedCss) {\n await copyAssetToDistHtml(cssAssetUrl);\n }\n return;\n }\n\n // Ignore files with no assetUrl, which can sometimes occur if a source\n // file is empty.\n if (!assetData.assetUrl) {\n return;\n }\n\n await copyAssetToDistHtml(assetData.assetUrl);\n })\n );\n\n // Pre-render HTML pages (SSG).\n if (!ssrOnly) {\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n const sitemap = await renderer.getSitemap();\n\n console.log('\\nhtml output:');\n const batchSize = Number(options?.concurrency || 10);\n await batchAsyncCalls(Object.keys(sitemap), batchSize, async (urlPath) => {\n const {route, params} = sitemap[urlPath];\n try {\n const data = await renderer.renderRoute(route, {\n routeParams: params,\n });\n if (data.notFound) {\n return;\n }\n\n // The renderer currently assumes that all paths serve HTML.\n // TODO(stevenle): support non-HTML routes using `routes/[name].[ext].ts`.\n let outFilePath = path.join(urlPath.slice(1), 'index.html');\n if (outFilePath.endsWith('404/index.html')) {\n outFilePath = outFilePath.replace('404/index.html', '404.html');\n }\n const outPath = path.join(buildDir, outFilePath);\n\n let html = data.html || '';\n if (rootConfig.prettyHtml !== false) {\n html = await htmlPretty(html, rootConfig.prettyHtmlOptions);\n }\n // HTML minification is `true` by default. Set to `false` to disable.\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html, rootConfig.minifyHtmlOptions);\n }\n await writeFile(outPath, html);\n\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n } catch (e) {\n logBuildError({route, params, urlPath}, e);\n throw new Error(\n `BuildError: ${urlPath} (${route.src}) failed to build.`\n );\n }\n });\n }\n}\n\nfunction isRouteFile(filepath: string) {\n return filepath.startsWith('routes') && isJsFile(filepath);\n}\n\nfunction fileSize(filepath: string) {\n const stats = fsExtra.statSync(filepath);\n const bytes = stats.size;\n\n const k = 1024;\n if (bytes < k) {\n return (bytes / k).toFixed(2) + ' kB';\n }\n const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + units[i];\n}\n\nfunction printFileOutput(\n fileSize: string,\n outputDir: string,\n outputFile: string\n) {\n const indent = ' '.repeat(2);\n const paddedSize = fileSize.padStart(9, ' ');\n console.log(\n `${indent}${dim(paddedSize)} ${dim(outputDir)}${cyan(outputFile)}`\n );\n}\n\nfunction sanitizeFileName(name: string): string {\n return (\n name\n // Remove placeholder vars from paths like routes/[...var].tsx.\n .replaceAll('...', '')\n .replaceAll('_', '')\n .replaceAll('[', '')\n .replaceAll(']', '')\n // Remove non-ascii chars and null bytes.\n .replace(/[^\\x00-\\x7F]/g, '')\n .replace(/\\x00/g, '')\n .toLowerCase()\n );\n}\n\ninterface BuildContext {\n route: Route;\n params: Record<string, string>;\n urlPath: string;\n}\n\nfunction logBuildError(ctx: BuildContext, e: Error) {\n const {route, params, urlPath} = ctx;\n const errorString = String(e.stack || e);\n console.error();\n if (Object.keys(params).length > 0) {\n console.error(\n `An error occurred building ${urlPath} (${route.src}) with params:\n${formatParams(params)}\n\nThe error was:\n ${errorString}\n `.trim()\n );\n } else {\n console.error(\n `An error occurred building ${urlPath} (${route.src})\n\nThe error was:\n ${errorString}`\n );\n }\n}\n\nfunction formatParams(params: Record<string, string>) {\n return Object.entries(params)\n .map(([key, value]) => {\n return ` ${key}: ${value}`;\n })\n .join('\\n');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport glob from 'tiny-glob';\nimport {searchForWorkspaceRoot} from 'vite';\n\nimport {RootConfig} from '../core/config';\nimport {isValidTagName, parseTagNames} from '../utils/elements';\nimport {directoryContains, isDirectory, isJsFile} from '../utils/fsutils';\n\ninterface ElementSourceFile {\n /** Full file path. */\n filePath: string;\n /** Path relative to the root project directory. */\n relPath: string;\n}\n\n/**\n * Dependency graph for element files to capture which other elements are used\n * by any particular element.\n */\nexport class ElementGraph {\n /**\n * Element tagName => sourceFile.\n */\n readonly sourceFiles: {[tagName: string]: ElementSourceFile} = {};\n\n /**\n * Element tagName => set of element tagName dependencies.\n */\n private deps: Record<string, string[]> = {};\n\n constructor(sourceFiles: {[tagName: string]: ElementSourceFile}) {\n this.sourceFiles = sourceFiles;\n }\n\n toJson() {\n for (const tagName in this.sourceFiles) {\n this.deps[tagName] ??= this.parseDepsFromSource(tagName);\n }\n return {\n sourceFiles: this.sourceFiles,\n deps: this.deps,\n };\n }\n\n static fromJson(data: {deps: any; sourceFiles: any}) {\n const graph = new ElementGraph(data.sourceFiles);\n graph.deps = data.deps;\n return graph;\n }\n\n getDeps(tagName: string, visited?: Set<string>): string[] {\n visited ??= new Set();\n if (visited.has(tagName)) {\n return [];\n }\n\n visited.add(tagName);\n this.deps[tagName] ??= this.parseDepsFromSource(tagName);\n\n const deps = new Set(this.deps[tagName]);\n for (const depTagName of this.deps[tagName]) {\n for (const childDep of this.getDeps(depTagName, visited)) {\n deps.add(childDep);\n }\n }\n return Array.from(deps);\n }\n\n /**\n * Parses an element's source file for usage of other custom elements.\n */\n private parseDepsFromSource(tagName: string): string[] {\n const srcFile = this.sourceFiles[tagName];\n if (!srcFile) {\n throw new Error(`could not find file path for tagName <${tagName}>`);\n }\n const src = fs.readFileSync(srcFile.filePath, 'utf-8');\n const tagNames = parseTagNames(src);\n const deps = new Set<string>();\n for (const depTagName of tagNames) {\n if (depTagName !== tagName && depTagName in this.sourceFiles) {\n deps.add(depTagName);\n }\n }\n return Array.from(deps);\n }\n}\n\n/**\n * Returns a map of all the element file definitions in the project.\n */\nexport async function getElements(\n rootConfig: RootConfig\n): Promise<ElementGraph> {\n const rootDir = rootConfig.rootDir;\n\n const elementsDirs = getElementsDirs(rootConfig);\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n const elementFilePaths: {[tagName: string]: ElementSourceFile} = {};\n for (const dirPath of elementsDirs) {\n if (await isDirectory(dirPath)) {\n const files = await glob('**/*', {cwd: dirPath});\n files.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base) && isValidTagName(parts.name)) {\n const tagName = parts.name;\n const filePath = path.join(dirPath, file);\n const relPath = path.relative(rootDir, filePath);\n if (!excludeElement(relPath)) {\n elementFilePaths[tagName] = {filePath, relPath};\n }\n }\n });\n }\n }\n\n const graph = new ElementGraph(elementFilePaths);\n return graph;\n}\n\n/**\n * Get all element dirs.\n */\nexport function getElementsDirs(rootConfig: RootConfig) {\n const rootDir = rootConfig.rootDir;\n const workspaceRoot = searchForWorkspaceRoot(rootDir);\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n\n for (const dirPath of elementsInclude) {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!directoryContains(rootDir, elementsDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be within the project's workspace (${workspaceRoot})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n\n return elementsDirs;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport {Manifest} from 'vite';\n\nimport {RootConfig} from '../../core/config';\nimport {ElementGraph} from '../../node/element-graph';\nimport {isJsFile} from '../../utils/fsutils';\n\nimport {Asset, AssetMap} from './asset-map';\n\nexport type BuildAssetManifest = Record<\n string,\n {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n>;\n\nexport class BuildAssetMap implements AssetMap {\n private rootConfig: RootConfig;\n private srcToAsset: Map<string, BuildAsset>;\n\n constructor(rootConfig: RootConfig) {\n this.rootConfig = rootConfig;\n this.srcToAsset = new Map();\n }\n\n async get(src: string): Promise<Asset | null> {\n const asset = this.srcToAsset.get(src);\n if (asset) {\n return asset;\n }\n // Try resolving the realpath of the asset, following symlinks.\n const realSrc = realPathRelativeTo(this.rootConfig.rootDir, src);\n if (realSrc !== src) {\n const asset = this.srcToAsset.get(realSrc);\n if (asset) {\n return asset;\n }\n }\n console.log(`could not find build asset: ${src}`);\n return null;\n }\n\n private add(asset: BuildAsset) {\n this.srcToAsset.set(asset.src, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const src of this.srcToAsset.keys()) {\n result[src] = this.srcToAsset.get(src)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n rootConfig: RootConfig,\n clientManifest: Manifest,\n elementsGraph: ElementGraph\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n\n const elementFiles = new Set();\n Object.values(elementsGraph.sourceFiles).forEach((elementSource) => {\n elementFiles.add(elementSource.relPath);\n // Vite will resolve symlinks, so we need to follow the src and add the\n // realpath to the element files.\n const realSrc = realPathRelativeTo(\n rootConfig.rootDir,\n elementSource.relPath\n );\n if (realSrc !== elementSource.filePath) {\n elementFiles.add(realSrc);\n }\n });\n\n Object.keys(clientManifest).forEach((manifestKey) => {\n const src = manifestKey;\n const manifestChunk = clientManifest[manifestKey];\n const isElement = elementFiles.has(src);\n // NOTES(stevenle): routes/ files are included in the manifest for\n // their CSS deps, but do not have an asset URL.\n const assetUrl =\n src.startsWith('routes/') && isJsFile(src)\n ? ''\n : `/${manifestChunk.file}`;\n const assetData = {\n src: src,\n assetUrl: assetUrl,\n importedModules: manifestChunk.imports || [],\n importedCss: (manifestChunk.css || []).map((relPath) => `/${relPath}`),\n isElement: isElement,\n };\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n\n return assetMap;\n }\n\n static fromRootManifest(\n rootConfig: RootConfig,\n rootManifest: BuildAssetManifest\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n Object.keys(rootManifest).forEach((moduleId) => {\n const assetData = rootManifest[moduleId];\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n}\n\n/**\n * Returns the realpath of a src file, relative to the rootDir.\n */\nfunction realPathRelativeTo(rootDir: string, src: string) {\n const fullPath = path.resolve(rootDir, src);\n if (!fs.existsSync(fullPath)) {\n return src;\n }\n const realpath = fs.realpathSync(path.resolve(rootDir, src));\n return path.relative(rootDir, realpath);\n}\n\nexport class BuildAsset {\n src: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.src = assetData.src;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (src) => {\n const importedAsset = (await this.assetMap.get(src)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.importedCss) {\n asset.importedCss.forEach((cssUrl) => urls.add(cssUrl));\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectCss(importedAsset, urls, visited);\n })\n );\n }\n\n toJson() {\n return {\n src: this.src,\n assetUrl: this.assetUrl,\n importedModules: this.importedModules,\n importedCss: this.importedCss,\n isElement: this.isElement,\n };\n }\n}\n","export async function batchAsyncCalls<T, U>(\n data: T[],\n batchSize: number,\n asyncFunction: (item: T) => Promise<U>\n): Promise<U[]> {\n const result: U[] = [];\n const batches = Math.ceil(data.length / batchSize);\n for (let i = 0; i < batches; i++) {\n const batch = data.slice(i * batchSize, (i + 1) * batchSize);\n const batchResults = await Promise.all(batch.map(asyncFunction));\n result.push(...batchResults);\n }\n return result;\n}\n","import path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\nimport glob from 'tiny-glob';\n\nimport {RootConfig} from '../../core/config.js';\nimport {configureServerPlugins} from '../../core/plugin.js';\nimport {Server, Request, Response, NextFunction} from '../../core/types.js';\nimport {hooksMiddleware} from '../../middleware/hooks.js';\nimport {\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../../middleware/middleware.js';\nimport {redirectsMiddleware} from '../../middleware/redirects.js';\nimport {sessionMiddleware} from '../../middleware/session.js';\nimport {getElements, getElementsDirs} from '../../node/element-graph.js';\nimport {loadRootConfig} from '../../node/load-config.js';\nimport {createViteServer} from '../../node/vite.js';\nimport {DevServerAssetMap} from '../../render/asset-map/dev-asset-map.js';\nimport {dirExists, isDirectory, isJsFile} from '../../utils/fsutils.js';\nimport {findOpenPort} from '../../utils/ports.js';\nimport {randString} from '../../utils/rand.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ntype RenderModule = typeof import('../../render/render.js');\n\nexport interface DevOptions {\n host?: string;\n}\n\nexport async function dev(rootProjectDir?: string, options?: DevOptions) {\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const defaultPort = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n const port = await findOpenPort(defaultPort, defaultPort + 10);\n const server = await createDevServer({rootDir, port});\n const rootConfig: RootConfig = server.get('rootConfig');\n const basePath = rootConfig.base || '';\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}${basePath}`);\n if (testCmsEnabled(rootConfig)) {\n console.log(`${dim('┃')} cms: http://${host}:${port}/cms/`);\n }\n console.log(`${dim('┃')} mode: development`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createDevServer(options?: {\n rootDir?: string;\n port?: number;\n}): Promise<Server> {\n const rootDir = path.resolve(options?.rootDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir, {command: 'dev'});\n const port = options?.port;\n\n const server: Server = express();\n server.set('rootConfig', rootConfig);\n server.disable('x-powered-by');\n\n // Inject req context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await viteServerMiddleware({rootConfig, port}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret =\n rootConfig.server?.sessionCookieSecret || randString(36);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n for (const middleware of userMiddlewares) {\n server.use(middleware);\n }\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add static file middleware.\n const publicDir = path.join(rootDir, 'public');\n if (await dirExists(publicDir)) {\n server.use(sirv(publicDir, {dev: false}));\n }\n\n // Add the root.js dev server middlewares.\n server.use(trailingSlashMiddleware({rootConfig}));\n server.use(rootDevServerMiddleware());\n server.use(rootDevServer404Middleware());\n server.use(rootDevServer500Middleware());\n },\n plugins,\n {type: 'dev', rootConfig}\n );\n\n return server;\n}\n\n/**\n * Middleware that initializes a vite server and injects it into the request\n * context.\n */\nasync function viteServerMiddleware(options: {\n rootConfig: RootConfig;\n port?: number;\n}) {\n const rootConfig = options.rootConfig;\n const rootDir = rootConfig.rootDir;\n\n let elementGraph = await getElements(rootConfig);\n const elements = Object.values(elementGraph.sourceFiles).map((sourceFile) => {\n return sourceFile.relPath;\n });\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n\n const optimizeDeps = [...elements, ...bundleScripts];\n const viteServer = await createViteServer(rootConfig, {\n port: options.port,\n optimizeDeps: optimizeDeps,\n });\n\n // Watch for file changes and re-generate the elements graph if any elements\n // are added or deleted.\n function isInElementsDir(changedFilePath: string) {\n const filePath = path.resolve(changedFilePath);\n const elementsDirs = getElementsDirs(rootConfig);\n return elementsDirs.some((dirPath) => filePath.startsWith(dirPath));\n }\n viteServer.watcher.on('add', async (filePath: string) => {\n if (isInElementsDir(filePath)) {\n // Re-generate the elements graph.\n elementGraph = await getElements(rootConfig);\n console.log(`element added: ${filePath}`);\n }\n });\n viteServer.watcher.on('unlink', async (filePath: string) => {\n if (isInElementsDir(filePath)) {\n // Re-generate the elements graph.\n elementGraph = await getElements(rootConfig);\n console.log(`element deleted: ${filePath}`);\n }\n });\n\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n // Add the viteServer to the req.\n req.viteServer = viteServer;\n // Dynamically import the render.js module using vite's SSR import loader.\n const renderModulePath = path.resolve(__dirname, './render.js');\n const render = (await viteServer.ssrLoadModule(\n renderModulePath\n )) as RenderModule;\n // Create a dev asset map using Vite dev server's module graph.\n const assetMap = new DevServerAssetMap(\n rootConfig,\n viteServer.moduleGraph\n );\n // Add a renderer object to the req for plugins and other middleware to\n // use.\n req.renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n // Run the viteServer middlewares to handle vite-specific endpoints.\n viteServer.middlewares(req, res, next);\n } catch (e) {\n next(e);\n }\n };\n}\n\nfunction rootDevServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n const viteServer = req.viteServer!;\n try {\n await renderer.handle(req, res, next);\n } catch (err) {\n // If an error is caught, let Vite fix the stack trace so it maps back to\n // your actual source code.\n viteServer.ssrFixStacktrace(err);\n next(err);\n }\n };\n}\n\nfunction rootDevServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`❓ 404 ${req.originalUrl}`);\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderDevServer404(req);\n const html = data.html || '';\n res.status(404).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n res.status(404).set({'Content-Type': 'text/plain'}).end('404');\n };\n}\n\nfunction rootDevServer500Middleware() {\n return async (err: any, req: Request, res: Response, next: NextFunction) => {\n console.error(`❗ 500 ${req.originalUrl}`);\n console.error(String(err.stack || err));\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderDevServer500(req, err);\n const html = data.html || '';\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n next(err);\n };\n}\n\nfunction testCmsEnabled(rootConfig: RootConfig) {\n const plugins = rootConfig.plugins || [];\n return Boolean(plugins.find((plugin) => plugin.name === 'root-cms'));\n}\n","import {Request, Response, NextFunction} from '../core/types';\n\nexport function hooksMiddleware() {\n return (req: Request, res: Response, next: NextFunction) => {\n req.hooks = new Hooks();\n next();\n };\n}\n\nexport type HooksCallbackFn = (...args: any[]) => any;\n\nexport class Hooks {\n private callbacks: {[name: string]: HooksCallbackFn[]} = {};\n\n add(name: string, cb: (...args: any[]) => any) {\n this.callbacks[name] ??= [];\n this.callbacks[name].push(cb);\n }\n\n trigger(name: string, ...args: any[]) {\n const callbacks = this.callbacks[name] || [];\n callbacks.forEach((cb) => {\n cb(...args);\n });\n }\n}\n","import {RootRedirectConfig} from '../core/config';\nimport {NextFunction, Request, Response} from '../core/types';\nimport {RouteTrie} from '../render/route-trie';\n\nexport interface RedirectsMiddlewareOptions {\n redirects: RootRedirectConfig[];\n}\n\n/**\n * Middleware for handling server-side redirects from the `server.redirects`\n * config in `root.config.ts`.\n */\nexport function redirectsMiddleware(options: RedirectsMiddlewareOptions) {\n const routeTrie = new RouteTrie<RootRedirectConfig>();\n const redirects = options.redirects || [];\n redirects.forEach((redirect) => {\n if (!verifyRedirectConfig(redirect)) {\n console.warn('ignoring invalid redirect config:', redirect);\n return;\n }\n routeTrie.add(redirect.source!, redirect);\n });\n\n return (req: Request, res: Response, next: NextFunction) => {\n const [redirect, params] = routeTrie.get(req.path);\n if (redirect) {\n const destination = replaceParams(redirect.destination!, params);\n const code = redirect.type || 302;\n res.redirect(code, destination);\n return;\n }\n next();\n };\n}\n\nfunction verifyRedirectConfig(redirect: RootRedirectConfig) {\n if (!redirect.source) {\n return false;\n }\n if (!redirect.destination) {\n return false;\n }\n // TODO(stevenle): verify all destination params exist within source.\n return true;\n}\n\nfunction replaceParams(urlPathFormat: string, params: Record<string, string>) {\n const urlPath = urlPathFormat.replaceAll(\n /\\[\\[?(\\.\\.\\.)?([\\w\\-_]*)\\]?\\]/g,\n (match: string, _wildcard: string, key: string) => {\n const val = params[key];\n if (!val) {\n throw new Error(`unreplaced param ${match} in url: ${urlPathFormat}`);\n }\n return val;\n }\n );\n return urlPath;\n}\n","import path from 'node:path';\n\nimport {ModuleGraph, ModuleNode, searchForWorkspaceRoot} from 'vite';\n\nimport {RootConfig} from '../../core/config';\nimport {directoryContains} from '../../utils/fsutils';\n\nimport {Asset, AssetMap} from './asset-map';\n\nexport class DevServerAssetMap implements AssetMap {\n private rootConfig: RootConfig;\n private moduleGraph: ModuleGraph;\n\n constructor(rootConfig: RootConfig, moduleGraph: ModuleGraph) {\n this.rootConfig = rootConfig;\n this.moduleGraph = moduleGraph;\n }\n\n async get(src: string): Promise<Asset | null> {\n const file = path.resolve(this.rootConfig.rootDir, src);\n\n const viteModules = this.moduleGraph.getModulesByFile(file);\n if (viteModules && viteModules.size > 0) {\n const [viteModule] = viteModules;\n return new DevServerAsset(src, {\n assetMap: this,\n viteModule: viteModule,\n });\n }\n\n // On dev, in some cases the module doesn't make it into the module graph\n // so return a generic asset.\n if (file.startsWith(this.rootConfig.rootDir)) {\n const assetUrl = file.slice(this.rootConfig.rootDir.length);\n return {\n src: src,\n assetUrl: assetUrl,\n getCssDeps: async () => [],\n getJsDeps: async () => [assetUrl],\n };\n }\n const workspaceRoot = searchForWorkspaceRoot(this.rootConfig.rootDir);\n if (await directoryContains(workspaceRoot, file)) {\n const assetUrl = `/@fs/${file}`;\n return {\n src: src,\n assetUrl: assetUrl,\n getCssDeps: async () => [],\n getJsDeps: async () => [assetUrl],\n };\n }\n\n console.log(`could not find asset in asset map: ${src}`);\n return null;\n }\n\n filePathToSrc(file: string) {\n return path.relative(this.rootConfig.rootDir, file);\n }\n}\n\nexport class DevServerAsset implements Asset {\n src: string;\n moduleId: string;\n assetUrl: string;\n private assetMap: DevServerAssetMap;\n private viteModule: ModuleNode;\n\n constructor(\n src: string,\n options: {\n assetMap: DevServerAssetMap;\n viteModule: ModuleNode;\n }\n ) {\n this.src = src;\n this.assetMap = options.assetMap;\n this.viteModule = options.viteModule;\n this.moduleId = this.viteModule.id!;\n this.assetUrl = this.viteModule.url;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n getImportedModules() {\n return this.viteModule.importedModules;\n }\n\n private collectJs(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.moduleId) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n const parts = path.parse(asset.assetUrl);\n if (\n ['.js', '.jsx', '.ts', '.tsx'].includes(parts.ext) &&\n asset.moduleId.includes('/elements/')\n ) {\n urls.add(asset.assetUrl);\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.file) {\n const src = this.assetMap.filePathToSrc(viteModule.file);\n const importedAsset = new DevServerAsset(src, {\n assetMap: this.assetMap,\n viteModule: viteModule,\n });\n this.collectJs(importedAsset, urls, visited);\n }\n });\n }\n\n private collectCss(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.assetUrl) {\n return;\n }\n if (visited.has(asset.assetUrl)) {\n return;\n }\n visited.add(asset.assetUrl);\n if (asset.src.endsWith('.scss')) {\n const parts = path.parse(asset.src);\n if (!parts.name.startsWith('_')) {\n urls.add(asset.assetUrl);\n }\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.file) {\n const src = this.assetMap.filePathToSrc(viteModule.file);\n const importedAsset = new DevServerAsset(src, {\n assetMap: this.assetMap,\n viteModule: viteModule,\n });\n this.collectCss(importedAsset, urls, visited);\n }\n });\n }\n}\n","import {createServer} from 'node:net';\n\n/**\n * Checks whether a port is open.\n */\nexport function isPortOpen(port: number): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n resolve(false);\n return;\n }\n reject(err);\n });\n server.on('close', () => {\n resolve(true);\n });\n server.listen(port, () => {\n server.close((err) => {\n if (err) {\n console.log(`error closing server: ${err}`);\n reject(err);\n }\n });\n });\n });\n}\n\n/**\n * Finds the first open port between two values.\n */\nexport async function findOpenPort(min: number, max: number): Promise<number> {\n let port = min;\n while (port <= max) {\n const isOpen = await isPortOpen(port);\n if (isOpen) {\n return port;\n }\n port += 1;\n }\n throw new Error(`no ports open between ${min} and ${max}`);\n}\n","export function randString(len: number): string {\n const result = [];\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n for (let i = 0; i < len; i++) {\n const rand = Math.floor(Math.random() * chars.length);\n result.push(chars.charAt(rand));\n }\n return result.join('');\n}\n","import path from 'node:path';\n\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\n\nimport {RootConfig} from '../../core/config';\nimport {configureServerPlugins} from '../../core/plugin';\nimport {Request, Response, NextFunction, Server} from '../../core/types.js';\nimport {hooksMiddleware} from '../../middleware/hooks';\nimport {\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../../middleware/middleware';\nimport {redirectsMiddleware} from '../../middleware/redirects';\nimport {sessionMiddleware} from '../../middleware/session';\nimport {ElementGraph} from '../../node/element-graph.js';\nimport {loadBundledConfig} from '../../node/load-config';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../../render/asset-map/build-asset-map';\nimport {fileExists, loadJson} from '../../utils/fsutils';\nimport {randString} from '../../utils/rand';\n\ntype RenderModule = typeof import('../../render/render.js');\n\nexport interface PreviewOptions {\n host?: string;\n}\n\nexport async function preview(\n rootProjectDir?: string,\n options?: PreviewOptions\n) {\n // TODO(stevenle): figure out standard practice for NODE_ENV when using the\n // preview command.\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createPreviewServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}`);\n console.log(`${dim('┃')} mode: preview`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createPreviewServer(options: {\n rootDir: string;\n}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadBundledConfig(rootDir, {command: 'preview'});\n const distDir = path.join(rootDir, 'dist');\n\n const server: Server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await rootPreviewRendererMiddleware({rootConfig, distDir}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret =\n rootConfig.server?.sessionCookieSecret || randString(36);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // Add the root.js preview server middlewares.\n server.use(trailingSlashMiddleware({rootConfig}));\n server.use(rootPreviewServerMiddleware());\n\n // Add error handlers.\n server.use(rootPreviewServer404Middleware());\n server.use(rootPreviewServer500Middleware());\n },\n plugins,\n {type: 'preview', rootConfig}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootPreviewRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, '.root/manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const elementGraphJsonPath = path.join(distDir, '.root/elements.json');\n if (!(await fileExists(elementGraphJsonPath))) {\n throw new Error(\n `could not find ${elementGraphJsonPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootConfig, rootManifest);\n const elementGraphJson = await loadJson<any>(elementGraphJsonPath);\n const elementGraph = ElementGraph.fromJson(elementGraphJson);\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Preview server request handler.\n */\nfunction rootPreviewServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n try {\n await renderer.handle(req, res, next);\n } catch (e) {\n try {\n console.error(`error rendering ${req.originalUrl}`);\n console.error(e.stack || e);\n const {html} = await renderer.renderDevServer500(req, e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootPreviewServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`❓ 404 ${req.originalUrl}`);\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.render404({currentPath: url});\n const html = data.html || '';\n res.status(404).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n res.status(404).set({'Content-Type': 'text/plain'}).end('404');\n };\n}\n\nfunction rootPreviewServer500Middleware() {\n return async (err: any, req: Request, res: Response, next: NextFunction) => {\n console.error(`❗ 500 ${req.originalUrl}`);\n console.error(String(err.stack || err));\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderDevServer500(req, err);\n const html = data.html || '';\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n next(err);\n };\n}\n","import path from 'node:path';\n\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\n\nimport {RootConfig} from '../../core/config';\nimport {configureServerPlugins} from '../../core/plugin';\nimport {Request, Response, NextFunction, Server} from '../../core/types.js';\nimport {hooksMiddleware} from '../../middleware/hooks';\nimport {\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../../middleware/middleware';\nimport {redirectsMiddleware} from '../../middleware/redirects';\nimport {sessionMiddleware} from '../../middleware/session';\nimport {ElementGraph} from '../../node/element-graph';\nimport {loadBundledConfig} from '../../node/load-config';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../../render/asset-map/build-asset-map';\nimport {fileExists, loadJson} from '../../utils/fsutils';\nimport {randString} from '../../utils/rand';\n\ntype RenderModule = typeof import('../../render/render.js');\n\nexport interface StartOptions {\n host?: string;\n}\n\nexport async function start(rootProjectDir?: string, options?: StartOptions) {\n process.env.NODE_ENV = 'production';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createProdServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}`);\n console.log(`${dim('┃')} mode: production`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createProdServer(options: {\n rootDir: string;\n}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadBundledConfig(rootDir, {command: 'start'});\n const distDir = path.join(rootDir, 'dist');\n\n const server: Server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await rootProdRendererMiddleware({rootConfig, distDir}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret =\n rootConfig.server?.sessionCookieSecret || randString(36);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // Add the root.js preview server middlewares.\n server.use(trailingSlashMiddleware({rootConfig}));\n server.use(rootProdServerMiddleware());\n\n // Add error handlers.\n server.use(rootProdServer404Middleware());\n server.use(rootProdServer500Middleware());\n },\n plugins,\n {type: 'prod', rootConfig}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootProdRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, '.root/manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const elementGraphJsonPath = path.join(distDir, '.root/elements.json');\n if (!(await fileExists(elementGraphJsonPath))) {\n throw new Error(\n `could not find ${elementGraphJsonPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootConfig, rootManifest);\n const elementGraphJson = await loadJson<any>(elementGraphJsonPath);\n const elementGraph = ElementGraph.fromJson(elementGraphJson);\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Prod server request handler.\n */\nfunction rootProdServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n try {\n await renderer.handle(req, res, next);\n } catch (e) {\n try {\n console.error(`error rendering ${req.originalUrl}`);\n console.error(e.stack || e);\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootProdServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`❓ 404 ${req.originalUrl}`);\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.render404({currentPath: url});\n const html = data.html || '';\n res.status(404).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n res.status(404).set({'Content-Type': 'text/plain'}).end('404');\n };\n}\n\nfunction rootProdServer500Middleware() {\n return async (err: any, req: Request, res: Response, next: NextFunction) => {\n console.error(`❗ 500 ${req.originalUrl}`);\n console.error(String(err.stack || err));\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderError(err);\n const html = data.html || '';\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n next(err);\n };\n}\n"],"mappings":"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","names":["path","glob","fs","path","asset","path","fs","path","glob","fileSize","path","fileURLToPath","dim","glob","path","searchForWorkspaceRoot","path","searchForWorkspaceRoot","__dirname","path","fileURLToPath","dim","_a","glob","path","cookieParser","express","dim","sirv","path","dim","express","cookieParser","_a","sirv","path","compression","cookieParser","express","dim","sirv","path","dim","express","compression","cookieParser","_a","sirv"]}