@ubean/build 0.7.2 → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- export { d as BUILTIN_PRESETS, t as CODEGEN_CONTRACT_VERSION, n as CODEGEN_FILES, r as CODEGEN_NON_CONTRACT_FILES, p as HONO_OPENAPI_PRESET, m as UBEAN_CLIENT_PRESET, h as UBEAN_SERVER_PRESET, g as VUE_I18N_PRESET, _ as VUE_MACROS_PRESET, v as VUE_PRESET, y as VUE_ROUTER_PRESET, b as generateAutoImports, l as generateI18nTypes, x as generateImportsTransform, a as generateOpenApiTypes, o as generateOpenApiTypesFromServer, s as generatePageTypes, c as generateRouteTypes, i as generateTypes, S as getAutoImportPresets, C as getBuiltinComposables, w as getUbeanAutoImportConfig, T as getUbeanComponentsConfig, u as messagesToTsType, E as resolveAutoImportsConfig, D as resolveComponentsConfig, O as toArray } from "../codegen-DqXlzw1Y.js";
1
+ export { d as BUILTIN_PRESETS, t as CODEGEN_CONTRACT_VERSION, n as CODEGEN_FILES, r as CODEGEN_NON_CONTRACT_FILES, p as HONO_OPENAPI_PRESET, m as UBEAN_CLIENT_PRESET, h as UBEAN_SERVER_PRESET, g as VUE_I18N_PRESET, _ as VUE_MACROS_PRESET, v as VUE_PRESET, y as VUE_ROUTER_PRESET, b as generateAutoImports, l as generateI18nTypes, x as generateImportsTransform, a as generateOpenApiTypes, o as generateOpenApiTypesFromServer, s as generatePageTypes, c as generateRouteTypes, i as generateTypes, S as getAutoImportPresets, C as getBuiltinComposables, w as getUbeanAutoImportConfig, T as getUbeanComponentsConfig, u as messagesToTsType, E as resolveAutoImportsConfig, D as resolveComponentsConfig, O as toArray } from "../codegen-DUQT79IR.js";
@@ -903,6 +903,10 @@ async function generatePageTypes(result, options) {
903
903
  " pageMeta?: unknown;",
904
904
  " /** `definePage({ redirect })`。 */",
905
905
  " redirect?: string | null;",
906
+ " /** 是否为框架内置路由(Root / NotFound)。宿主生成菜单时应过滤。 */",
907
+ " isBuiltin?: boolean;",
908
+ " /** 是否为全局捕获路由(`pages/404.vue`)。 */",
909
+ " isGlobalCatchAll?: boolean;",
906
910
  " }",
907
911
  "",
908
912
  " export interface LayoutInfo {",
package/dist/index.d.ts CHANGED
@@ -116,6 +116,8 @@ interface PagesModulePage extends CompiledPage {
116
116
  pageKind?: 'component' | 'reuse' | 'meta';
117
117
  pageMeta?: unknown;
118
118
  redirect?: string;
119
+ isBuiltin?: boolean;
120
+ isGlobalCatchAll?: boolean;
119
121
  }
120
122
  export declare function createRoutingVirtualModule(routes: CompiledRoute[], middlewares: CompiledMiddleware[], cwd: string): VirtualModule;
121
123
  export declare function createPagesVirtualModule(pages: PagesModulePage[], layouts: CompiledLayout[], cwd: string): VirtualModule;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import { _ as defineVirtualModule, a as ssrSingletonProdOptimizeExclude, b as useVirtualRegistry, c as getComponentResolvers, d as registerComponentResolver, f as registerCssImport, g as createVirtualRegistry, h as VirtualModuleRegistry, i as ssrSingletonDevPolicy, l as getCssImports, m as resetModuleRegistry, n as SSR_SINGLETON_OPTIMIZE_EXCLUDE, o as ssrSingletonProdSsr, p as registerHeadScript, r as SSR_SINGLETON_PACKAGES, t as SSR_SINGLETON_DEDUPE, u as getHeadScripts, v as defineVirtualModulePrefix, y as resetVirtualRegistry } from "./ssr-singleton-CUHZLgiO.js";
2
- import { a as createRoutingVirtualModule, i as createPagesVirtualModule, n as createLocalesVirtualModule, o as stripMacros, r as createMetaVirtualModule, s as transformMacros, t as createAppVirtualModule } from "./virtual-modules-DXIIB-zM.js";
2
+ import { a as createRoutingVirtualModule, i as createPagesVirtualModule, n as createLocalesVirtualModule, o as stripMacros, r as createMetaVirtualModule, s as transformMacros, t as createAppVirtualModule } from "./virtual-modules-AXf0lNb0.js";
3
3
  export { SSR_SINGLETON_DEDUPE, SSR_SINGLETON_OPTIMIZE_EXCLUDE, SSR_SINGLETON_PACKAGES, VirtualModuleRegistry, createAppVirtualModule, createLocalesVirtualModule, createMetaVirtualModule, createPagesVirtualModule, createRoutingVirtualModule, createVirtualRegistry, defineVirtualModule, defineVirtualModulePrefix, getComponentResolvers, getCssImports, getHeadScripts, registerComponentResolver, registerCssImport, registerHeadScript, resetModuleRegistry, resetVirtualRegistry, ssrSingletonDevPolicy, ssrSingletonProdOptimizeExclude, ssrSingletonProdSsr, stripMacros, transformMacros, useVirtualRegistry };
package/dist/prerender.js CHANGED
@@ -77,6 +77,7 @@ function collectPrerenderRoutes(pages, options = {}) {
77
77
  const allPageRoutes = [];
78
78
  for (const page of pages) {
79
79
  if (page.routable === false) continue;
80
+ if (page.isGlobalCatchAll) continue;
80
81
  if (isRedirectPage(page)) {
81
82
  redirectPaths.add(normalizePagePath(page.path));
82
83
  continue;
@@ -1 +1 @@
1
- export { T as buildWithEnvironments, v as createIslandsSsrStubPlugin, y as generateCloudflareWorkerEntry, b as generateNodeServerEntry, x as generateStandardHandlerEntry, S as generateVirtualModulesToDisk, C as getPresetBuildConfig, w as serializePagesForEntry } from "./vite-c-MoZSjh.js";
1
+ export { T as buildWithEnvironments, v as createIslandsSsrStubPlugin, y as generateCloudflareWorkerEntry, b as generateNodeServerEntry, x as generateStandardHandlerEntry, S as generateVirtualModulesToDisk, C as getPresetBuildConfig, w as serializePagesForEntry } from "./vite-iBmVy83j.js";
@@ -203,7 +203,7 @@ async function createStaticSsgRenderer(cwd, manifest, init) {
203
203
  return;
204
204
  }
205
205
  const renderStaticPage = mod.renderStaticPage;
206
- const compiled = init.pages.map(compilePageRoute);
206
+ const compiled = init.pages.filter((p) => !p.isGlobalCatchAll).map(compilePageRoute);
207
207
  const i18nEnabled = init.i18n != null && init.i18n.enabled !== false;
208
208
  const localeCodes = i18nEnabled ? (init.i18n?.locales || []).map((l) => typeof l === "string" ? l : l.code) : [];
209
209
  const strategy = i18nEnabled ? init.i18n?.strategy || "prefix_except_default" : "no_prefix";
@@ -150,7 +150,7 @@ function createRoutingVirtualModule(routes, middlewares, cwd) {
150
150
  }
151
151
  function createPagesVirtualModule(pages, layouts, cwd) {
152
152
  return defineVirtualModule("ubean:pages", () => {
153
- return `export const pages = {\n${pages.map((p) => ` ${JSON.stringify(p.name)}: { name: ${JSON.stringify(p.name)}, path: ${JSON.stringify(p.path)}, filePath: ${JSON.stringify(toPortableFilePath(p.filePath, cwd))}, layout: ${JSON.stringify(p.layout)}, pageKind: ${JSON.stringify(resolvePageKind(p))}, routable: ${p.routable !== false}, reuseTarget: ${JSON.stringify(p.reuseTarget)}, pageMeta: ${JSON.stringify(p.pageMeta ?? null)}, redirect: ${JSON.stringify(p.redirect ?? null)} }`).join(",\n")}\n};\nexport const pageEntries = pages;\nexport const layouts = {\n${layouts.map((l) => ` ${JSON.stringify(l.name)}: { name: ${JSON.stringify(l.name)}, filePath: ${JSON.stringify(toPortableFilePath(l.filePath, cwd))}, isDefault: ${l.isDefault} }`).join(",\n")}\n};\nexport default { pages, layouts, pageEntries };`;
153
+ return `export const pages = {\n${pages.map((p) => ` ${JSON.stringify(p.name)}: { name: ${JSON.stringify(p.name)}, path: ${JSON.stringify(p.path)}, filePath: ${JSON.stringify(toPortableFilePath(p.filePath, cwd))}, layout: ${JSON.stringify(p.layout)}, pageKind: ${JSON.stringify(resolvePageKind(p))}, routable: ${p.routable !== false}, reuseTarget: ${JSON.stringify(p.reuseTarget)}, pageMeta: ${JSON.stringify(p.pageMeta ?? null)}, redirect: ${JSON.stringify(p.redirect ?? null)}, isBuiltin: ${p.isBuiltin === true}, isGlobalCatchAll: ${p.isGlobalCatchAll === true} }`).join(",\n")}\n};\nexport const pageEntries = pages;\nexport const layouts = {\n${layouts.map((l) => ` ${JSON.stringify(l.name)}: { name: ${JSON.stringify(l.name)}, filePath: ${JSON.stringify(toPortableFilePath(l.filePath, cwd))}, isDefault: ${l.isDefault} }`).join(",\n")}\n};\nexport default { pages, layouts, pageEntries };`;
154
154
  });
155
155
  }
156
156
  function createMetaVirtualModule() {
@@ -1,7 +1,7 @@
1
1
  import { a as ssrSingletonProdOptimizeExclude, g as createVirtualRegistry, o as ssrSingletonProdSsr, x as __exportAll } from "./ssr-singleton-CUHZLgiO.js";
2
- import { a as createRoutingVirtualModule, i as createPagesVirtualModule, n as createLocalesVirtualModule, r as createMetaVirtualModule, s as transformMacros, t as createAppVirtualModule } from "./virtual-modules-DXIIB-zM.js";
3
- import { a as generateOpenApiTypes, i as generateTypes } from "./codegen-DqXlzw1Y.js";
4
- import { _ as sendWebResponse, a as createServerEntryVirtualModule, d as ensureDevApp, i as createClientEntryVirtualModule, n as ubeanVite, o as createVueAppEntryVirtualModule, r as composeHeadScripts, s as createVuePagesVirtualModule, v as toWebRequest, x as getDevScanCoordinator } from "./vue-DB75Lo-g.js";
2
+ import { a as createRoutingVirtualModule, i as createPagesVirtualModule, n as createLocalesVirtualModule, r as createMetaVirtualModule, s as transformMacros, t as createAppVirtualModule } from "./virtual-modules-AXf0lNb0.js";
3
+ import { a as generateOpenApiTypes, i as generateTypes } from "./codegen-DUQT79IR.js";
4
+ import { _ as sendWebResponse, a as createServerEntryVirtualModule, d as ensureDevApp, i as createClientEntryVirtualModule, n as ubeanVite, o as createVueAppEntryVirtualModule, r as composeHeadScripts, s as createVuePagesVirtualModule, v as toWebRequest, x as getDevScanCoordinator } from "./vue-CIn92ixI.js";
5
5
  import { createStaticSsgRenderer } from "./static-render.js";
6
6
  import { prerender, resolvePrerenderStaticDir } from "./prerender.js";
7
7
  import { resolvePageKind } from "@ubean/vue";
@@ -134,6 +134,10 @@ const _routeGroups = new Map();
134
134
  for (const _p of _pages) {
135
135
  // routable: false 的页面不建路由(与客户端 virtual:ubean-pages 同形)。
136
136
  if (_p.routable === false) continue;
137
+ // 内置全局捕获路由不在这里注册 —— 它的 URL 形态是 vue-router 的 repeatable 参数(客户端),
138
+ // 而 SSG 靠下面的静态 /404 路由渲染产物(静态段优先于 repeatable 参数,
139
+ // 不会被用户的 [...slug].vue 抢走)。两条都注册会得到重复的 'NotFound' 路由名。
140
+ if (_p.isGlobalCatchAll) continue;
137
141
  const _key = _p.route;
138
142
  const _group = _routeGroups.get(_key) || { slots: [] };
139
143
  if (_p.slot) _group.slots.push(_p);
@@ -1503,7 +1507,9 @@ function serializePagesForEntry(pages) {
1503
1507
  pageMeta: p.pageMeta,
1504
1508
  matchers: p.matchers,
1505
1509
  slot: p.slot,
1506
- redirect: p.redirect
1510
+ redirect: p.redirect,
1511
+ isBuiltin: p.isBuiltin,
1512
+ isGlobalCatchAll: p.isGlobalCatchAll
1507
1513
  })));
1508
1514
  }
1509
1515
  async function generateVirtualModulesToDisk(cwd, config, scanResult, virtualDir, preset, registry, contentSnapshot) {
@@ -1538,7 +1544,9 @@ async function generateVirtualModulesToDisk(cwd, config, scanResult, virtualDir,
1538
1544
  routable: p.routable,
1539
1545
  pageKind: p.pageKind,
1540
1546
  pageMeta: p.pageMeta,
1541
- redirect: p.redirect
1547
+ redirect: p.redirect,
1548
+ isBuiltin: p.isBuiltin,
1549
+ isGlobalCatchAll: p.isGlobalCatchAll
1542
1550
  })), scanResult.layouts.map((l) => ({
1543
1551
  name: l.name,
1544
1552
  filePath: l.fullPath,
@@ -2911,7 +2919,9 @@ function ubeanPlugin(options) {
2911
2919
  routable: p.routable,
2912
2920
  pageKind: p.pageKind,
2913
2921
  pageMeta: p.pageMeta,
2914
- redirect: p.redirect
2922
+ redirect: p.redirect,
2923
+ isBuiltin: p.isBuiltin,
2924
+ isGlobalCatchAll: p.isGlobalCatchAll
2915
2925
  })), result.layouts.map((l) => ({
2916
2926
  name: l.name,
2917
2927
  filePath: l.fullPath,
package/dist/vite.d.ts CHANGED
@@ -432,16 +432,14 @@ interface DevSsrRoutesOptions {
432
432
  loadComponent: (fullPath: string) => Promise<unknown>;
433
433
  /** 与客户端 `virtual:ubean-pages` 相同的 locale param(如 `:locale(zh)?`)。 */
434
434
  localeVueParam?: string;
435
- /** `pages/404.vue` 经扫描得到的条目;缺省则不注册 catch-all。 */
436
- notFoundPage?: ScannedPageRoute;
437
435
  }
438
436
  /**
439
437
  * 构建 SSR 路由表。
440
438
  *
441
439
  * 顺序与形状刻意对齐客户端:页面按扫描顺序、reuse 路由复用目标页面的组件、
442
- * 最后是 404 catch-all。catch-all 用 `/:locale?/:pathMatch(.*)*` —— SSR 渲染的是
443
- * **请求 URL 本身**(不像 SSG 渲染静态产物、可以用 `/404`),必须与客户端同形才能
444
- * 让两侧 `useRoute()` 解析出同一份 matched 结构。
440
+ * 全局捕获路由(`pages/404.vue` / `pages/not-found.vue`)排最后。catch-all 用
441
+ * `/:locale?/:pathMatch(.*)*` —— SSR 渲染的是**请求 URL 本身**(不像 SSG 渲染静态产物、
442
+ * 可以用 `/404`),必须与客户端同形才能让两侧 `useRoute()` 解析出同一份 matched 结构。
445
443
  */
446
444
  export declare function buildDevSsrRoutes(options: DevSsrRoutesOptions): DevSsrRoute[];
447
445
  //#endregion
@@ -494,6 +492,12 @@ interface EnhanceDevAppOptions {
494
492
  localeVueParam?: string;
495
493
  /** `backend` 模式无页面与 SSR,跳过 pageRenderer 创建。 */
496
494
  backend?: boolean;
495
+ /**
496
+ * SSR 是否启用(`config.ssr.enabled`)。`false` 时不创建渲染器,页面请求落到
497
+ * CSR 外壳 —— 与生产构建一致(`ssrEnabled` 在 `production.ts` / `build-app.ts`)。
498
+ * 默认 `true`,与生产侧的 `(mode === 'fullstack' && config.ssr.enabled)` 同义。
499
+ */
500
+ ssrEnabled?: boolean;
497
501
  /** crons 加载完后的启动钩子(CLI 传 `@ubean/server/cron` 的 `startCronScheduler`)。 */
498
502
  startCronScheduler?: () => unknown;
499
503
  /** 诊断用日志(默认 `console.error`,与原先行为一致)。 */
package/dist/vite.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { g as createVirtualRegistry } from "./ssr-singleton-CUHZLgiO.js";
2
- import { A as buildDevSsrRoutes, C as peekDevScanCoordinator, D as resolveDevSecurityHeaders, E as createDevAppReady, O as resolveLocaleVueParam, S as onDevScan, T as createDevApp, _ as sendWebResponse, b as createDevScanCoordinator, c as DEVTOOLS_PASS_THROUGH_PREFIXES, d as ensureDevApp, f as getDevApp, g as ubeanDevRequestPlugin, h as isViteResourceRequest, j as toVueRouterPagePath, k as enhanceDevApp, l as collectDevCssLinks, m as isFrameworkHtmlPage, p as injectStylesheetLinks, u as createUbeanRequestHandlers, v as toWebRequest, w as bootstrapDevApp, x as getDevScanCoordinator, y as DEV_SCAN_DIRS } from "./vue-DB75Lo-g.js";
3
- import { D as createCloudflarePreviewRunner, E as MINIFLARE_INSTALL_HINT, O as defaultLoadMiniflare, _ as ubeanPreviewPlugin, a as createEnvRunnerTransport, c as getDevWorkerEntrySource, d as attachPreviewMiddleware, f as createPreviewMiddleware, g as sendPreviewStatus, h as sendPreviewFile, i as bridgeEnvRunnerInvokes, k as readCompatibilityDate, l as invalidateDevWorkerModules, m as resolvePreviewFile, n as UBEAN_DEV_ENV_NAME, o as createUbeanDevEnvironmentFactory, p as previewMimeType, r as UbeanDevEnvironment, s as DEV_WORKER_FILE, t as ubeanPlugin, u as writeDevWorkerEntry } from "./vite-c-MoZSjh.js";
2
+ import { A as buildDevSsrRoutes, C as peekDevScanCoordinator, D as resolveDevSecurityHeaders, E as createDevAppReady, O as resolveLocaleVueParam, S as onDevScan, T as createDevApp, _ as sendWebResponse, b as createDevScanCoordinator, c as DEVTOOLS_PASS_THROUGH_PREFIXES, d as ensureDevApp, f as getDevApp, g as ubeanDevRequestPlugin, h as isViteResourceRequest, j as toVueRouterPagePath, k as enhanceDevApp, l as collectDevCssLinks, m as isFrameworkHtmlPage, p as injectStylesheetLinks, u as createUbeanRequestHandlers, v as toWebRequest, w as bootstrapDevApp, x as getDevScanCoordinator, y as DEV_SCAN_DIRS } from "./vue-CIn92ixI.js";
3
+ import { D as createCloudflarePreviewRunner, E as MINIFLARE_INSTALL_HINT, O as defaultLoadMiniflare, _ as ubeanPreviewPlugin, a as createEnvRunnerTransport, c as getDevWorkerEntrySource, d as attachPreviewMiddleware, f as createPreviewMiddleware, g as sendPreviewStatus, h as sendPreviewFile, i as bridgeEnvRunnerInvokes, k as readCompatibilityDate, l as invalidateDevWorkerModules, m as resolvePreviewFile, n as UBEAN_DEV_ENV_NAME, o as createUbeanDevEnvironmentFactory, p as previewMimeType, r as UbeanDevEnvironment, s as DEV_WORKER_FILE, t as ubeanPlugin, u as writeDevWorkerEntry } from "./vite-iBmVy83j.js";
4
4
  export { DEVTOOLS_PASS_THROUGH_PREFIXES, DEV_SCAN_DIRS, DEV_WORKER_FILE, MINIFLARE_INSTALL_HINT, UBEAN_DEV_ENV_NAME, UbeanDevEnvironment, attachPreviewMiddleware, bootstrapDevApp, bridgeEnvRunnerInvokes, buildDevSsrRoutes, collectDevCssLinks, createCloudflarePreviewRunner, createDevApp, createDevAppReady, createDevScanCoordinator, createEnvRunnerTransport, createPreviewMiddleware, createUbeanDevEnvironmentFactory, createUbeanRequestHandlers, createVirtualRegistry, defaultLoadMiniflare, enhanceDevApp, ensureDevApp, getDevApp, getDevScanCoordinator, getDevWorkerEntrySource, injectStylesheetLinks, invalidateDevWorkerModules, isFrameworkHtmlPage, isViteResourceRequest, onDevScan, peekDevScanCoordinator, previewMimeType, readCompatibilityDate, resolveDevSecurityHeaders, resolveLocaleVueParam, resolvePreviewFile, sendPreviewFile, sendPreviewStatus, sendWebResponse, toVueRouterPagePath, toWebRequest, ubeanDevRequestPlugin, ubeanPlugin, ubeanPreviewPlugin, writeDevWorkerEntry };
@@ -1,8 +1,8 @@
1
1
  import { _ as defineVirtualModule, c as getComponentResolvers, g as createVirtualRegistry, i as ssrSingletonDevPolicy, l as getCssImports, u as getHeadScripts } from "./ssr-singleton-CUHZLgiO.js";
2
- import { D as resolveComponentsConfig, E as resolveAutoImportsConfig, O as toArray, S as getAutoImportPresets, f as COMPONENT_HALF_GLOBS } from "./codegen-DqXlzw1Y.js";
2
+ import { D as resolveComponentsConfig, E as resolveAutoImportsConfig, O as toArray, S as getAutoImportPresets, f as COMPONENT_HALF_GLOBS } from "./codegen-DUQT79IR.js";
3
3
  import { createRequire } from "node:module";
4
4
  import { generatePagesModuleSource } from "@ubean/vue/vite";
5
- import { resolvePageKind } from "@ubean/vue";
5
+ import { NOT_FOUND_ROUTE_PATH, resolvePageKind, sortPagesForRouting } from "@ubean/vue";
6
6
  import { isAbsolute, join, normalize, relative, resolve } from "pathe";
7
7
  import { existsSync } from "node:fs";
8
8
  import { loadUbeanConfig, localePathsOf, resolvePageCompilers } from "@ubean/config";
@@ -56,14 +56,14 @@ function redirectTarget(target, localeVueParam) {
56
56
  * 构建 SSR 路由表。
57
57
  *
58
58
  * 顺序与形状刻意对齐客户端:页面按扫描顺序、reuse 路由复用目标页面的组件、
59
- * 最后是 404 catch-all。catch-all 用 `/:locale?/:pathMatch(.*)*` —— SSR 渲染的是
60
- * **请求 URL 本身**(不像 SSG 渲染静态产物、可以用 `/404`),必须与客户端同形才能
61
- * 让两侧 `useRoute()` 解析出同一份 matched 结构。
59
+ * 全局捕获路由(`pages/404.vue` / `pages/not-found.vue`)排最后。catch-all 用
60
+ * `/:locale?/:pathMatch(.*)*` —— SSR 渲染的是**请求 URL 本身**(不像 SSG 渲染静态产物、
61
+ * 可以用 `/404`),必须与客户端同形才能让两侧 `useRoute()` 解析出同一份 matched 结构。
62
62
  */
63
63
  function buildDevSsrRoutes(options) {
64
- const { pages, layouts, loadComponent, localeVueParam, notFoundPage } = options;
64
+ const { pages, layouts, loadComponent, localeVueParam } = options;
65
65
  const defaultLayout = layouts.find((l) => l.isDefault)?.name ?? null;
66
- const routablePages = pages.filter((p) => p.routable !== false);
66
+ const routablePages = sortPagesForRouting(pages.filter((p) => p.routable !== false));
67
67
  const withLocale = (path) => localeVueParam ? toVueRouterLocalePath(path, localeVueParam) : path;
68
68
  const pageByName = /* @__PURE__ */ new Map();
69
69
  for (const page of routablePages) pageByName.set(page.name, page);
@@ -72,7 +72,7 @@ function buildDevSsrRoutes(options) {
72
72
  return async () => await loadComponent(fullPath);
73
73
  };
74
74
  const routeFor = (page) => ({
75
- path: withLocale(toVueRouterPagePath(page.route)),
75
+ path: withLocale(page.isGlobalCatchAll ? NOT_FOUND_ROUTE_PATH : toVueRouterPagePath(page.route)),
76
76
  name: page.name,
77
77
  ...page.redirect ? { redirect: redirectTarget(page.redirect, localeVueParam) } : { component: componentFor(page) },
78
78
  meta: {
@@ -103,15 +103,6 @@ function buildDevSsrRoutes(options) {
103
103
  }
104
104
  routes.push(route);
105
105
  }
106
- if (notFoundPage) routes.push({
107
- path: withLocale("/:pathMatch(.*)*"),
108
- name: "NotFound",
109
- component: async () => await loadComponent(notFoundPage.fullPath),
110
- meta: {
111
- layout: notFoundPage.layout === false ? false : notFoundPage.layout || defaultLayout,
112
- pageName: "NotFound"
113
- }
114
- });
115
106
  return routes;
116
107
  }
117
108
  //#endregion
@@ -123,7 +114,7 @@ function buildDevSsrRoutes(options) {
123
114
  * HMR 后需要重新指向新的扫描结果与 Vite 模块图。
124
115
  */
125
116
  function enhanceDevApp(options) {
126
- const { app, layouts = [], loadModule, localeVueParam, backend, startCronScheduler, onCronError } = options;
117
+ const { app, layouts = [], loadModule, localeVueParam, backend, ssrEnabled = true, startCronScheduler, onCronError } = options;
127
118
  app.options.layouts = layouts;
128
119
  const routeLoaders = {};
129
120
  for (const route of app.options.routes || []) {
@@ -150,7 +141,7 @@ function enhanceDevApp(options) {
150
141
  if (onCronError) onCronError(error);
151
142
  else console.error("[ubean] Failed to load cron files:", error);
152
143
  });
153
- if (backend) {
144
+ if (backend || !ssrEnabled) {
154
145
  app.resetInit();
155
146
  return app;
156
147
  }
@@ -161,8 +152,7 @@ function enhanceDevApp(options) {
161
152
  pages: app.options.pages || [],
162
153
  layouts,
163
154
  localeVueParam,
164
- loadComponent: loadModule,
165
- notFoundPage: app.options.notFoundPage
155
+ loadComponent: loadModule
166
156
  });
167
157
  let appConfigModule = null;
168
158
  const getAppConfigModule = () => {
@@ -354,6 +344,7 @@ async function bootstrapDevApp(options) {
354
344
  createRenderer: options.createRenderer,
355
345
  localeVueParam: resolveLocaleVueParam(options.config),
356
346
  backend: options.config.mode === "backend",
347
+ ssrEnabled: options.config.ssr.enabled,
357
348
  startCronScheduler: options.startCronScheduler,
358
349
  onCronError: (error) => (options.logger ?? fallbackLogger).error(`[ubean] Failed to load cron files: ${String(error)}`)
359
350
  });
package/dist/vue.js CHANGED
@@ -1 +1 @@
1
- export { t as VUE_PLUGIN_INCLUDE, r as composeHeadScripts, i as createClientEntryVirtualModule, a as createServerEntryVirtualModule, o as createVueAppEntryVirtualModule, s as createVuePagesVirtualModule, n as default, n as ubeanVite } from "./vue-DB75Lo-g.js";
1
+ export { t as VUE_PLUGIN_INCLUDE, r as composeHeadScripts, i as createClientEntryVirtualModule, a as createServerEntryVirtualModule, o as createVueAppEntryVirtualModule, s as createVuePagesVirtualModule, n as default, n as ubeanVite } from "./vue-CIn92ixI.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ubean/build",
3
- "version": "0.7.2",
3
+ "version": "0.7.4",
4
4
  "description": "Vite plugins, production build, SSG prerender, type codegen, and Server Actions plugin for ubean",
5
5
  "files": [
6
6
  "dist"
@@ -49,19 +49,19 @@
49
49
  },
50
50
  "dependencies": {
51
51
  "@intlify/unplugin-vue-i18n": "11.2.7",
52
- "@ubean/app": "0.7.2",
53
- "@ubean/client": "0.7.2",
54
- "@ubean/config": "0.7.2",
55
- "@ubean/i18n": "0.7.2",
56
- "@ubean/islands": "0.7.2",
57
- "@ubean/markdown": "0.7.2",
58
- "@ubean/pages": "0.7.2",
59
- "@ubean/preset": "0.7.2",
60
- "@ubean/routes": "0.7.2",
61
- "@ubean/scan": "0.7.2",
62
- "@ubean/server": "0.7.2",
63
- "@ubean/shared": "0.7.2",
64
- "@ubean/vue": "0.7.2",
52
+ "@ubean/app": "0.7.4",
53
+ "@ubean/client": "0.7.4",
54
+ "@ubean/config": "0.7.4",
55
+ "@ubean/i18n": "0.7.4",
56
+ "@ubean/islands": "0.7.4",
57
+ "@ubean/markdown": "0.7.4",
58
+ "@ubean/pages": "0.7.4",
59
+ "@ubean/preset": "0.7.4",
60
+ "@ubean/routes": "0.7.4",
61
+ "@ubean/scan": "0.7.4",
62
+ "@ubean/server": "0.7.4",
63
+ "@ubean/shared": "0.7.4",
64
+ "@ubean/vue": "0.7.4",
65
65
  "@vitejs/plugin-vue": "^6.0.10",
66
66
  "@vitejs/plugin-vue-jsx": "^5.1.6",
67
67
  "openapi-typescript": "^7.13.0",