@finesoft/front 0.1.2 → 0.1.11

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.cjs CHANGED
@@ -48,6 +48,7 @@ __export(index_exports, {
48
48
  LruMap: () => LruMap,
49
49
  PrefetchedIntents: () => PrefetchedIntents,
50
50
  Router: () => Router,
51
+ SSR_PLACEHOLDERS: () => SSR_PLACEHOLDERS,
51
52
  buildUrl: () => buildUrl,
52
53
  createPrefetchedIntentsFromDom: () => createPrefetchedIntentsFromDom,
53
54
  createSSRApp: () => createSSRApp,
@@ -89,7 +90,7 @@ __export(index_exports, {
89
90
  });
90
91
  module.exports = __toCommonJS(index_exports);
91
92
 
92
- // ../core/dist/index.js
93
+ // ../core/src/actions/types.ts
93
94
  var ACTION_KINDS = {
94
95
  FLOW: "flow",
95
96
  EXTERNAL_URL: "externalUrl",
@@ -110,6 +111,8 @@ function makeFlowAction(url, presentationContext) {
110
111
  function makeExternalUrlAction(url) {
111
112
  return { kind: ACTION_KINDS.EXTERNAL_URL, url };
112
113
  }
114
+
115
+ // ../core/src/actions/dispatcher.ts
113
116
  var ActionDispatcher = class {
114
117
  handlers = /* @__PURE__ */ new Map();
115
118
  wiredActions = /* @__PURE__ */ new Set();
@@ -142,6 +145,8 @@ var ActionDispatcher = class {
142
145
  await handler(action);
143
146
  }
144
147
  };
148
+
149
+ // ../core/src/intents/dispatcher.ts
145
150
  var IntentDispatcher = class {
146
151
  controllers = /* @__PURE__ */ new Map();
147
152
  /** 注册一个 IntentController */
@@ -163,6 +168,8 @@ var IntentDispatcher = class {
163
168
  return this.controllers.has(intentId);
164
169
  }
165
170
  };
171
+
172
+ // ../core/src/dependencies/container.ts
166
173
  var Container = class {
167
174
  registrations = /* @__PURE__ */ new Map();
168
175
  /** 注册依赖(默认单例) */
@@ -196,12 +203,16 @@ var Container = class {
196
203
  this.registrations.clear();
197
204
  }
198
205
  };
206
+
207
+ // ../core/src/logger/base.ts
199
208
  var BaseLogger = class {
200
209
  category;
201
210
  constructor(category) {
202
211
  this.category = category;
203
212
  }
204
213
  };
214
+
215
+ // ../core/src/logger/local-storage-filter.ts
205
216
  var LEVEL_TO_NUM = {
206
217
  "*": 4,
207
218
  debug: 4,
@@ -261,6 +272,8 @@ function resetFilterCache() {
261
272
  cachedRules = void 0;
262
273
  cachedRaw = void 0;
263
274
  }
275
+
276
+ // ../core/src/logger/console.ts
264
277
  var ConsoleLogger = class extends BaseLogger {
265
278
  debug(...args) {
266
279
  if (shouldLog(this.category, "debug")) {
@@ -290,6 +303,8 @@ var ConsoleLoggerFactory = class {
290
303
  return new ConsoleLogger(category);
291
304
  }
292
305
  };
306
+
307
+ // ../core/src/dependencies/make-dependencies.ts
293
308
  var DEP_KEYS = {
294
309
  LOGGER: "logger",
295
310
  LOGGER_FACTORY: "loggerFactory",
@@ -380,6 +395,8 @@ function makeDependencies(container, options = {}) {
380
395
  );
381
396
  container.register(DEP_KEYS.FETCH, () => fetchFn);
382
397
  }
398
+
399
+ // ../core/src/router/router.ts
383
400
  var Router = class {
384
401
  routes = [];
385
402
  /** 添加路由规则 */
@@ -448,6 +465,8 @@ var Router = class {
448
465
  }
449
466
  }
450
467
  };
468
+
469
+ // ../core/src/logger/composite.ts
451
470
  var CompositeLoggerFactory = class {
452
471
  constructor(factories) {
453
472
  this.factories = factories;
@@ -481,6 +500,8 @@ var CompositeLogger = class {
481
500
  return "";
482
501
  }
483
502
  };
503
+
504
+ // ../core/src/prefetched-intents/stable-stringify.ts
484
505
  function stableStringify(obj) {
485
506
  if (obj === null || obj === void 0) return String(obj);
486
507
  if (typeof obj !== "object") return JSON.stringify(obj);
@@ -493,6 +514,8 @@ function stableStringify(obj) {
493
514
  );
494
515
  return "{" + parts.join(",") + "}";
495
516
  }
517
+
518
+ // ../core/src/prefetched-intents/prefetched-intents.ts
496
519
  var PrefetchedIntents = class _PrefetchedIntents {
497
520
  intents;
498
521
  constructor(intents) {
@@ -535,6 +558,8 @@ var PrefetchedIntents = class _PrefetchedIntents {
535
558
  return this.intents.size;
536
559
  }
537
560
  };
561
+
562
+ // ../core/src/framework.ts
538
563
  var Framework = class _Framework {
539
564
  container;
540
565
  intentDispatcher;
@@ -609,6 +634,8 @@ var Framework = class _Framework {
609
634
  this.container.dispose();
610
635
  }
611
636
  };
637
+
638
+ // ../core/src/http/client.ts
612
639
  var HttpError = class extends Error {
613
640
  constructor(status, statusText, body) {
614
641
  super(`HTTP ${status}: ${statusText}`);
@@ -687,6 +714,8 @@ var HttpClient = class {
687
714
  return `${url.pathname}${url.search}`;
688
715
  }
689
716
  };
717
+
718
+ // ../core/src/intents/base-controller.ts
690
719
  var BaseController = class {
691
720
  /**
692
721
  * 错误回退 — 子类可选覆写
@@ -718,6 +747,8 @@ var BaseController = class {
718
747
  }
719
748
  }
720
749
  };
750
+
751
+ // ../core/src/data/mapper.ts
721
752
  function pipe(...mappers) {
722
753
  return (input) => mappers.reduce((acc, mapper) => mapper(acc), input);
723
754
  }
@@ -733,6 +764,8 @@ function pipeAsync(...mappers) {
733
764
  function mapEach(mapper) {
734
765
  return (items) => items.map(mapper);
735
766
  }
767
+
768
+ // ../core/src/bootstrap/define-routes.ts
736
769
  function defineRoutes(framework, definitions) {
737
770
  const registeredIntents = /* @__PURE__ */ new Set();
738
771
  for (const def of definitions) {
@@ -743,6 +776,8 @@ function defineRoutes(framework, definitions) {
743
776
  framework.router.add(def.path, def.intentId);
744
777
  }
745
778
  }
779
+
780
+ // ../core/src/utils/lru-map.ts
746
781
  var LruMap = class {
747
782
  map = /* @__PURE__ */ new Map();
748
783
  capacity;
@@ -781,12 +816,16 @@ var LruMap = class {
781
816
  this.map.clear();
782
817
  }
783
818
  };
819
+
820
+ // ../core/src/utils/optional.ts
784
821
  function isSome(value) {
785
822
  return value !== null && value !== void 0;
786
823
  }
787
824
  function isNone(value) {
788
825
  return value === null || value === void 0;
789
826
  }
827
+
828
+ // ../core/src/utils/url.ts
790
829
  function removeScheme(url) {
791
830
  return url.replace(/^https?:\/\//, "");
792
831
  }
@@ -815,6 +854,8 @@ function buildUrl(path, params) {
815
854
  const qs = searchParams.toString();
816
855
  return qs ? `${path}?${qs}` : path;
817
856
  }
857
+
858
+ // ../core/src/utils/uuid.ts
818
859
  function generateUuid() {
819
860
  if (typeof crypto !== "undefined" && crypto.randomUUID) {
820
861
  return crypto.randomUUID();
@@ -826,7 +867,7 @@ function generateUuid() {
826
867
  });
827
868
  }
828
869
 
829
- // ../browser/dist/index.js
870
+ // ../browser/src/action-handlers/external-url-action.ts
830
871
  function registerExternalUrlHandler(deps) {
831
872
  const { framework, log } = deps;
832
873
  framework.onAction(
@@ -837,6 +878,8 @@ function registerExternalUrlHandler(deps) {
837
878
  }
838
879
  );
839
880
  }
881
+
882
+ // ../browser/src/utils/try-scroll.ts
840
883
  var MAX_TRIES = 100;
841
884
  var FUDGE = 16;
842
885
  var pendingFrame = null;
@@ -876,6 +919,8 @@ function tryScroll(log, getScrollableElement, scrollY) {
876
919
  pendingFrame = null;
877
920
  });
878
921
  }
922
+
923
+ // ../browser/src/utils/history.ts
879
924
  var HISTORY_SIZE_LIMIT = 10;
880
925
  var History = class {
881
926
  entries;
@@ -962,6 +1007,8 @@ var History = class {
962
1007
  }
963
1008
  }
964
1009
  };
1010
+
1011
+ // ../browser/src/action-handlers/flow-action.ts
965
1012
  function registerFlowActionHandler(deps) {
966
1013
  const { framework, log, callbacks, updateApp } = deps;
967
1014
  let isFirstPage = true;
@@ -1066,6 +1113,8 @@ function registerFlowActionHandler(deps) {
1066
1113
  })();
1067
1114
  }
1068
1115
  }
1116
+
1117
+ // ../browser/src/action-handlers/register.ts
1069
1118
  function registerActionHandlers(deps) {
1070
1119
  const { framework, log, callbacks, updateApp } = deps;
1071
1120
  registerFlowActionHandler({
@@ -1076,6 +1125,8 @@ function registerActionHandlers(deps) {
1076
1125
  });
1077
1126
  registerExternalUrlHandler({ framework, log });
1078
1127
  }
1128
+
1129
+ // ../browser/src/server-data.ts
1079
1130
  var SERVER_DATA_ID = "serialized-server-data";
1080
1131
  function deserializeServerData() {
1081
1132
  const script = document.getElementById(SERVER_DATA_ID);
@@ -1094,8 +1145,16 @@ function createPrefetchedIntentsFromDom() {
1094
1145
  }
1095
1146
  return PrefetchedIntents.fromArray(data);
1096
1147
  }
1148
+
1149
+ // ../browser/src/start-app.ts
1097
1150
  async function startBrowserApp(config) {
1098
- const { bootstrap, defaultLocale = "en", mount, callbacks } = config;
1151
+ const {
1152
+ bootstrap,
1153
+ defaultLocale = "en",
1154
+ mountId = "app",
1155
+ mount,
1156
+ callbacks
1157
+ } = config;
1099
1158
  const prefetchedIntents = createPrefetchedIntentsFromDom();
1100
1159
  const framework = Framework.create({ prefetchedIntents });
1101
1160
  bootstrap(framework);
@@ -1107,7 +1166,7 @@ async function startBrowserApp(config) {
1107
1166
  window.location.pathname + window.location.search
1108
1167
  );
1109
1168
  const locale = document.documentElement.lang || defaultLocale;
1110
- const target = document.getElementById("app");
1169
+ const target = document.getElementById(mountId);
1111
1170
  const updateApp = mount(target, { framework, locale });
1112
1171
  registerActionHandlers({
1113
1172
  framework,
@@ -1125,7 +1184,7 @@ async function startBrowserApp(config) {
1125
1184
  }
1126
1185
  }
1127
1186
 
1128
- // ../ssr/dist/index.js
1187
+ // ../ssr/src/render.ts
1129
1188
  async function ssrRender(options) {
1130
1189
  const { url, frameworkConfig, bootstrap, getErrorPage, renderApp } = options;
1131
1190
  const framework = Framework.create(frameworkConfig);
@@ -1154,6 +1213,8 @@ async function ssrRender(options) {
1154
1213
  serverData
1155
1214
  };
1156
1215
  }
1216
+
1217
+ // ../ssr/src/create-render.ts
1157
1218
  function createSSRRender(config) {
1158
1219
  const { bootstrap, getErrorPage, renderApp, frameworkConfig } = config;
1159
1220
  return (url, locale) => ssrRender({
@@ -1164,12 +1225,25 @@ function createSSRRender(config) {
1164
1225
  renderApp: (page) => renderApp(page, locale)
1165
1226
  });
1166
1227
  }
1228
+
1229
+ // ../ssr/src/inject.ts
1230
+ var SSR_PLACEHOLDERS = {
1231
+ LANG: "<!--ssr-lang-->",
1232
+ HEAD: "<!--ssr-head-->",
1233
+ BODY: "<!--ssr-body-->",
1234
+ DATA: "<!--ssr-data-->"
1235
+ };
1167
1236
  function injectSSRContent(options) {
1168
1237
  const { template, locale, head, css, html, serializedData } = options;
1169
1238
  const cssTag = css ? `<style>${css}</style>` : "";
1170
- return template.replace("<!--ssr-lang-->", locale).replace("<!--ssr-head-->", `${head}
1171
- ${cssTag}`).replace("<!--ssr-body-->", html).replace("<!--ssr-data-->", serializedData);
1239
+ return template.replace(SSR_PLACEHOLDERS.LANG, locale).replace(SSR_PLACEHOLDERS.HEAD, `${head}
1240
+ ${cssTag}`).replace(SSR_PLACEHOLDERS.BODY, html).replace(
1241
+ SSR_PLACEHOLDERS.DATA,
1242
+ `<script id="serialized-server-data" type="application/json">${serializedData}</script>`
1243
+ );
1172
1244
  }
1245
+
1246
+ // ../ssr/src/server-data.ts
1173
1247
  var HTML_REPLACEMENTS = {
1174
1248
  "<": "\\u003C",
1175
1249
  ">": "\\u003E",
@@ -1186,15 +1260,14 @@ function serializeServerData(data) {
1186
1260
  );
1187
1261
  }
1188
1262
 
1189
- // ../server/dist/index.js
1263
+ // ../server/src/app.ts
1190
1264
  var import_hono = require("hono");
1191
- var import_hono2 = require("hono");
1192
- var import_hono3 = require("hono");
1193
- var import_meta = {};
1194
- var DEFAULT_SUPPORTED = ["zh", "en"];
1195
- var DEFAULT_LOCALE = "en";
1196
- function parseAcceptLanguage(header, supported = DEFAULT_SUPPORTED, fallback = DEFAULT_LOCALE) {
1197
- if (!header) return fallback;
1265
+
1266
+ // ../server/src/locale.ts
1267
+ function parseAcceptLanguage(header, supported, fallback) {
1268
+ const effectiveSupported = supported ?? ["zh", "en"];
1269
+ const effectiveFallback = fallback ?? effectiveSupported[0] ?? "en";
1270
+ if (!header) return effectiveFallback;
1198
1271
  const langs = header.split(",").map((part) => {
1199
1272
  const [lang, q] = part.trim().split(";q=");
1200
1273
  return {
@@ -1204,12 +1277,15 @@ function parseAcceptLanguage(header, supported = DEFAULT_SUPPORTED, fallback = D
1204
1277
  }).sort((a, b) => b.q - a.q);
1205
1278
  for (const { lang } of langs) {
1206
1279
  const prefix = lang.split("-")[0];
1207
- if (supported.includes(prefix)) {
1280
+ if (effectiveSupported.includes(prefix)) {
1208
1281
  return prefix;
1209
1282
  }
1210
1283
  }
1211
- return fallback;
1284
+ return effectiveFallback;
1212
1285
  }
1286
+
1287
+ // ../server/src/app.ts
1288
+ var import_meta = {};
1213
1289
  function createSSRApp(options) {
1214
1290
  const {
1215
1291
  root,
@@ -1223,8 +1299,14 @@ function createSSRApp(options) {
1223
1299
  const app = new import_hono.Hono();
1224
1300
  async function readTemplate(url) {
1225
1301
  if (!isProduction && vite) {
1226
- const { readFileSync: readFileSync2 } = await import("fs");
1227
- const { resolve: resolve2 } = await import("path");
1302
+ const { readFileSync: readFileSync2 } = await import(
1303
+ /* @vite-ignore */
1304
+ "fs"
1305
+ );
1306
+ const { resolve: resolve2 } = await import(
1307
+ /* @vite-ignore */
1308
+ "path"
1309
+ );
1228
1310
  const raw = readFileSync2(resolve2(root, "index.html"), "utf-8");
1229
1311
  return vite.transformIndexHtml(url, raw);
1230
1312
  }
@@ -1234,8 +1316,14 @@ function createSSRApp(options) {
1234
1316
  new URL("../dist/client/index.html", import_meta.url)
1235
1317
  );
1236
1318
  }
1237
- const { readFileSync } = await import("fs");
1238
- const { resolve } = await import("path");
1319
+ const { readFileSync } = await import(
1320
+ /* @vite-ignore */
1321
+ "fs"
1322
+ );
1323
+ const { resolve } = await import(
1324
+ /* @vite-ignore */
1325
+ "path"
1326
+ );
1239
1327
  return readFileSync(resolve(root, "dist/client/index.html"), "utf-8");
1240
1328
  }
1241
1329
  async function loadSSRModule() {
@@ -1281,6 +1369,11 @@ function createSSRApp(options) {
1281
1369
  });
1282
1370
  return app;
1283
1371
  }
1372
+
1373
+ // ../server/src/create-server.ts
1374
+ var import_hono3 = require("hono");
1375
+
1376
+ // ../server/src/runtime.ts
1284
1377
  function detectRuntime() {
1285
1378
  return {
1286
1379
  isDeno: typeof globalThis.Deno !== "undefined",
@@ -1298,40 +1391,89 @@ async function resolveRoot(importMetaUrl, levelsUp = 0) {
1298
1391
  }
1299
1392
  return url.pathname;
1300
1393
  }
1301
- const { dirname, resolve, normalize } = await import("path");
1302
- const { fileURLToPath } = await import("url");
1394
+ const { dirname, resolve, normalize } = await import(
1395
+ /* @vite-ignore */
1396
+ "path"
1397
+ );
1398
+ const { fileURLToPath } = await import(
1399
+ /* @vite-ignore */
1400
+ "url"
1401
+ );
1303
1402
  let dir = normalize(dirname(fileURLToPath(importMetaUrl)));
1304
1403
  for (let i = 0; i < levelsUp; i++) {
1305
1404
  dir = resolve(dir, "..");
1306
1405
  }
1307
1406
  return dir;
1308
1407
  }
1408
+
1409
+ // ../server/src/start.ts
1410
+ var import_hono2 = require("hono");
1309
1411
  async function startServer(options) {
1310
- const { app, root, port = 3e3, isProduction, vite } = options;
1412
+ const {
1413
+ app,
1414
+ root,
1415
+ port = 3e3,
1416
+ isProduction,
1417
+ vite,
1418
+ routes,
1419
+ locales,
1420
+ ssrEntryPath
1421
+ } = options;
1311
1422
  const { isDeno, isBun, isVercel } = options.runtime ?? detectRuntime();
1423
+ function printStartupBanner() {
1424
+ const lines = [
1425
+ `
1426
+ Server running at http://localhost:${port}
1427
+ `
1428
+ ];
1429
+ if (routes && routes.length > 0) {
1430
+ lines.push(" Routes:");
1431
+ for (const r of routes) {
1432
+ lines.push(` ${r}`);
1433
+ }
1434
+ lines.push("");
1435
+ }
1436
+ if (locales && locales.length > 0) {
1437
+ lines.push(` Locales: ${locales.join(", ")}`);
1438
+ }
1439
+ if (ssrEntryPath) {
1440
+ lines.push(` SSR Entry: ${ssrEntryPath}`);
1441
+ }
1442
+ if (locales?.length || ssrEntryPath) {
1443
+ lines.push("");
1444
+ }
1445
+ console.log(lines.join("\n"));
1446
+ }
1312
1447
  if (isVercel) {
1313
1448
  return { vite };
1314
1449
  }
1315
1450
  if (!isProduction) {
1316
1451
  let devVite = vite;
1317
1452
  if (!devVite) {
1318
- const { createServer: createViteServer } = await import("vite");
1453
+ const { createServer: createViteServer } = await import(
1454
+ /* @vite-ignore */
1455
+ "vite"
1456
+ );
1319
1457
  devVite = await createViteServer({
1320
1458
  root,
1321
1459
  server: { middlewareMode: true },
1322
1460
  appType: "custom"
1323
1461
  });
1324
1462
  }
1325
- const { getRequestListener } = await import("@hono/node-server");
1326
- const { createServer: createServer2 } = await import("http");
1463
+ const { getRequestListener } = await import(
1464
+ /* @vite-ignore */
1465
+ "@hono/node-server"
1466
+ );
1467
+ const { createServer: createServer2 } = await import(
1468
+ /* @vite-ignore */
1469
+ "http"
1470
+ );
1327
1471
  const listener = getRequestListener(app.fetch);
1328
1472
  const server = createServer2((req, res) => {
1329
1473
  devVite.middlewares(req, res, () => listener(req, res));
1330
1474
  });
1331
1475
  server.listen(port, () => {
1332
- console.log(`
1333
- Server running at http://localhost:${port}
1334
- `);
1476
+ printStartupBanner();
1335
1477
  });
1336
1478
  return { vite: devVite };
1337
1479
  }
@@ -1339,20 +1481,29 @@ async function startServer(options) {
1339
1481
  globalThis.Deno.serve({ port }, app.fetch);
1340
1482
  } else if (isBun) {
1341
1483
  } else {
1342
- const { serveStatic } = await import("@hono/node-server/serve-static");
1343
- const { resolve } = await import("path");
1344
- const prodApp = new import_hono3.Hono();
1484
+ const { serveStatic } = await import(
1485
+ /* @vite-ignore */
1486
+ "@hono/node-server/serve-static"
1487
+ );
1488
+ const { resolve } = await import(
1489
+ /* @vite-ignore */
1490
+ "path"
1491
+ );
1492
+ const prodApp = new import_hono2.Hono();
1345
1493
  prodApp.use("/*", serveStatic({ root: resolve(root, "dist/client") }));
1346
1494
  prodApp.route("/", app);
1347
- const { serve } = await import("@hono/node-server");
1495
+ const { serve } = await import(
1496
+ /* @vite-ignore */
1497
+ "@hono/node-server"
1498
+ );
1348
1499
  serve({ fetch: prodApp.fetch, port }, () => {
1349
- console.log(`
1350
- Server running at http://localhost:${port}
1351
- `);
1500
+ printStartupBanner();
1352
1501
  });
1353
1502
  }
1354
1503
  return { vite };
1355
1504
  }
1505
+
1506
+ // ../server/src/create-server.ts
1356
1507
  async function createServer(config = {}) {
1357
1508
  const {
1358
1509
  root: rootOverride,
@@ -1363,12 +1514,21 @@ async function createServer(config = {}) {
1363
1514
  ssr
1364
1515
  } = config;
1365
1516
  const root = rootOverride ?? process.cwd();
1366
- const { existsSync } = await import("fs");
1367
- const { resolve } = await import("path");
1517
+ const { existsSync } = await import(
1518
+ /* @vite-ignore */
1519
+ "fs"
1520
+ );
1521
+ const { resolve } = await import(
1522
+ /* @vite-ignore */
1523
+ "path"
1524
+ );
1368
1525
  const envPath = resolve(root, ".env");
1369
1526
  if (existsSync(envPath)) {
1370
1527
  try {
1371
- const { config: dotenvConfig } = await import("dotenv");
1528
+ const { config: dotenvConfig } = await import(
1529
+ /* @vite-ignore */
1530
+ "dotenv"
1531
+ );
1372
1532
  dotenvConfig({ path: envPath });
1373
1533
  } catch {
1374
1534
  }
@@ -1376,14 +1536,17 @@ async function createServer(config = {}) {
1376
1536
  const runtime = detectRuntime();
1377
1537
  let vite;
1378
1538
  if (!runtime.isProduction && !runtime.isVercel) {
1379
- const { createServer: createViteServer } = await import("vite");
1539
+ const { createServer: createViteServer } = await import(
1540
+ /* @vite-ignore */
1541
+ "vite"
1542
+ );
1380
1543
  vite = await createViteServer({
1381
1544
  root,
1382
1545
  server: { middlewareMode: true },
1383
1546
  appType: "custom"
1384
1547
  });
1385
1548
  }
1386
- const app = new import_hono2.Hono();
1549
+ const app = new import_hono3.Hono();
1387
1550
  if (setup) {
1388
1551
  await setup(app);
1389
1552
  }
@@ -1402,7 +1565,9 @@ async function createServer(config = {}) {
1402
1565
  port,
1403
1566
  isProduction: runtime.isProduction,
1404
1567
  vite,
1405
- runtime
1568
+ runtime,
1569
+ locales,
1570
+ ssrEntryPath: ssr?.ssrEntryPath
1406
1571
  });
1407
1572
  return { app, vite, runtime };
1408
1573
  }
@@ -1426,6 +1591,7 @@ async function createServer(config = {}) {
1426
1591
  LruMap,
1427
1592
  PrefetchedIntents,
1428
1593
  Router,
1594
+ SSR_PLACEHOLDERS,
1429
1595
  buildUrl,
1430
1596
  createPrefetchedIntentsFromDom,
1431
1597
  createSSRApp,