@ubean/build 0.6.6 → 0.6.7

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-BL0s5Pyq.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-CUlE95gB.js";
@@ -810,6 +810,8 @@ async function generatePageTypes(result, options) {
810
810
  " filePath: string;",
811
811
  " layout?: string;",
812
812
  " reuseTarget?: string;",
813
+ " /** 是否参与路由注册(false = 只进页面清单)。 */",
814
+ " routable?: boolean;",
813
815
  " }",
814
816
  "",
815
817
  " export interface LayoutInfo {",
@@ -819,7 +821,7 @@ async function generatePageTypes(result, options) {
819
821
  " }",
820
822
  ""
821
823
  ];
822
- const pageNames = pages.map((p) => JSON.stringify(p.name));
824
+ const pageNames = pages.filter((p) => p.routable !== false).map((p) => JSON.stringify(p.name));
823
825
  if (pageNames.length > 0) {
824
826
  lines.push(" export type RouteName =");
825
827
  lines.push(pageNames.map((n) => ` | ${n}`).join("\n"));
@@ -834,6 +836,7 @@ async function generatePageTypes(result, options) {
834
836
  } else lines.push(" export type LayoutName = string;");
835
837
  lines.push("");
836
838
  lines.push(" export const pages: Record<RouteName, PageInfo>;");
839
+ lines.push(" export const pageEntries: Record<string, PageInfo>;");
837
840
  lines.push(" export const layouts: Record<LayoutName, LayoutInfo>;");
838
841
  lines.push("}");
839
842
  const content = `${lines.join("\n")}\n`;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { a as VirtualModuleTransform, c as defineVirtualModulePrefix, i as VirtualModuleResolver, l as resetVirtualRegistry, n as VirtualModuleContext, o as createVirtualRegistry, r as VirtualModuleRegistry, s as defineVirtualModule, t as VirtualModule, u as useVirtualRegistry } from "./virtual-registry-CaU8k-YP.js";
2
+ import "@ubean/vue/vite";
2
3
  import { CompiledLayout, CompiledMiddleware, CompiledPage, CompiledRoute } from "@ubean/routes";
3
4
  import { ScannedApiRoute, ScannedLocale, ScannedMiddleware, ScannedPageRoute } from "@ubean/scan";
4
5
  //#region src/macros.d.ts
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-CsmYnd9W.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-B3aE-Fmn.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
@@ -65,6 +65,7 @@ function collectPrerenderRoutes(pages, options = {}) {
65
65
  ];
66
66
  const allPageRoutes = [];
67
67
  for (const page of pages) {
68
+ if (page.routable === false) continue;
68
69
  const path = normalizePagePath(page.path);
69
70
  if (!isDynamicPath(path)) allPageRoutes.push(path);
70
71
  }
@@ -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-Dva-CNKw.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--HujaLpA.js";
@@ -1,98 +1,82 @@
1
1
  import { _ as defineVirtualModule } from "./ssr-singleton-CUHZLgiO.js";
2
+ import { extractScriptBlocks, parseScriptAst, statementCall } from "@ubean/vue/vite";
2
3
  import { isAbsolute, relative } from "pathe";
3
4
  //#region src/macros.ts
5
+ /**
6
+ * 宏剥除(`definePage` 等编译期宏从产物中移除)。
7
+ *
8
+ * 实现方式:解析成 AST 后,按节点 `start` / `end` 区间**删除整条语句**。
9
+ *
10
+ * 此前是手写的括号平衡扫描 + 字符串切片,有两个静默故障面:
11
+ *
12
+ * 1. 提到宏的字符串/注释被一起切掉 —— `const doc = "definePage({...})"`
13
+ * 变成 `const doc = ""`,`// 用法:definePage({...})` 变成 `// 用法:`;
14
+ * 2. 正则字面量里的括号让括号计数错位(`const re = /\\(/g`)。
15
+ *
16
+ * 区间删除天然不会碰到这两种情况:拼接出的字符串里不存在 `definePage` 这个词,
17
+ * 注释与正则都只存在于 AST 之外。
18
+ *
19
+ * 解析器来自 `@ubean/vue/vite`(基于 `vue/compiler-sfc` 的 `babelParse`),与
20
+ * `definePage` 元数据提取共用同一份实现 —— 一处解析,两个消费者。
21
+ */
4
22
  const MACRO_NAMES = ["definePage"];
5
- function findBalancedCall(code, funcName, startSearch = 0) {
6
- const pattern = new RegExp(`\\b${funcName}\\s*\\(`, "g");
7
- pattern.lastIndex = startSearch;
8
- const match = pattern.exec(code);
9
- if (!match) return null;
10
- const startIdx = match.index;
11
- const parenStart = match.index + match[0].length;
12
- let depth = 1;
13
- let i = parenStart;
14
- let inString = null;
15
- let escaped = false;
16
- let inTemplateExpr = 0;
17
- while (i < code.length && depth > 0) {
18
- const ch = code[i];
19
- if (escaped) {
20
- escaped = false;
21
- i++;
22
- continue;
23
- }
24
- if (ch === "\\") {
25
- escaped = true;
26
- i++;
27
- continue;
28
- }
29
- if (inString) {
30
- if (inString === "`" && ch === "$" && code[i + 1] === "{") {
31
- inTemplateExpr++;
32
- i += 2;
33
- continue;
34
- }
35
- if (inString === "`" && ch === "}" && inTemplateExpr > 0) {
36
- inTemplateExpr--;
37
- i++;
38
- continue;
39
- }
40
- if (ch === inString) inString = null;
41
- i++;
42
- continue;
43
- }
44
- if (ch === "\"" || ch === "'" || ch === "`") {
45
- inString = ch;
46
- i++;
47
- continue;
48
- }
49
- if (ch === "/" && code[i + 1] === "/") {
50
- while (i < code.length && code[i] !== "\n") i++;
51
- continue;
52
- }
53
- if (ch === "/" && code[i + 1] === "*") {
54
- i += 2;
55
- while (i < code.length && !(code[i] === "*" && code[i + 1] === "/")) i++;
56
- i += 2;
57
- continue;
58
- }
59
- if (ch === "(" || ch === "{" || ch === "[") depth++;
60
- else if (ch === ")" || ch === "}" || ch === "]") {
61
- depth--;
62
- if (depth === 0 && ch === ")") return {
63
- start: startIdx,
64
- end: i + 1
65
- };
66
- }
67
- i++;
23
+ /**
24
+ * 判断一条**顶层语句**是否需要整条删除,返回其源码区间。
25
+ *
26
+ * 支持三种形状:
27
+ * - `definePage({...});` → `ExpressionStatement`
28
+ * - `export default definePage({...});` → `ExportDefaultDeclaration`
29
+ * (`.reuse.ts` / `.meta.ts` 的写法;只删 `definePage(...)` 会留下悬空的
30
+ * `export default`,语法错误)
31
+ * - 语句外的包裹(如 `if (x) definePage(...)`)不删 —— 那意味着宏写在条件分支里,
32
+ * 属于用户错误,整条删掉会连带删掉条件本身。
33
+ */
34
+ function macroStatementRange(statement, macro) {
35
+ if (!statementCall(statement, macro)) return null;
36
+ const start = statement.start;
37
+ const end = statement.end;
38
+ if (typeof start !== "number" || typeof end !== "number") return null;
39
+ return {
40
+ start,
41
+ end
42
+ };
43
+ }
44
+ /**
45
+ * 删除源码中给定区间,额外吞掉紧邻的空白与一个尾随分号。
46
+ *
47
+ * 之所以要吞分号:`ExpressionStatement` 的 `end` 在 babel 里**不含**尾随
48
+ * 分号(它属于 `statement.start`..`expression.end` 之外的 extra 信息),
49
+ * 不吞就会在产物里留下一个孤立的 `;`。
50
+ */
51
+ function spliceOut(code, ranges) {
52
+ const sorted = [...ranges].sort((a, b) => b.start - a.start);
53
+ let result = code;
54
+ for (const { start, end } of sorted) {
55
+ let from = start;
56
+ let to = end;
57
+ let cursor = to;
58
+ while (cursor < result.length && (result[cursor] === " " || result[cursor] === " ")) cursor++;
59
+ if (result[cursor] === ";") to = cursor + 1;
60
+ while (from > 0 && (result[from - 1] === " " || result[from - 1] === " ")) from--;
61
+ result = result.slice(0, from) + result.slice(to);
68
62
  }
69
- return null;
63
+ return result;
70
64
  }
71
- function stripStatement(code, callStart, callEnd) {
72
- let start = callStart;
73
- let end = callEnd;
74
- while (start > 0 && /[ \t]/.test(code[start - 1])) start--;
75
- const exportDefaultMatch = code.slice(0, start).match(/export\s+default\s*$/);
76
- if (exportDefaultMatch) {
77
- start -= exportDefaultMatch[0].length;
78
- while (start > 0 && /[ \t\n\r]/.test(code[start - 1])) start--;
65
+ /** 在单个脚本块内剥除宏。 */
66
+ function stripMacrosFromCode(code, macros, fileName = "page.ts") {
67
+ if (macros.length === 0) return code;
68
+ const ast = parseScriptAst(code, fileName);
69
+ if (!ast) return code;
70
+ const body = ast.program.body ?? [];
71
+ const ranges = [];
72
+ for (const statement of body) for (const macro of macros) {
73
+ const range = macroStatementRange(statement, macro);
74
+ if (range) ranges.push(range);
79
75
  }
80
- if (code[end] === ";") end++;
81
- while (end < code.length && /[ \t]/.test(code[end])) end++;
82
- return code.slice(0, start) + code.slice(end);
76
+ return ranges.length > 0 ? spliceOut(code, ranges) : code;
83
77
  }
84
78
  function stripMacros(code, macros = MACRO_NAMES) {
85
- let result = code;
86
- for (const macro of macros) {
87
- let offset = 0;
88
- while (true) {
89
- const found = findBalancedCall(result, macro, offset);
90
- if (!found) break;
91
- result = stripStatement(result, found.start, found.end);
92
- offset = found.start;
93
- }
94
- }
95
- return result;
79
+ return stripMacrosFromCode(code, macros);
96
80
  }
97
81
  function transformMacros(code, id) {
98
82
  if (!(id.includes("/src/pages/") || id.includes("/src/routes/") || id.includes("/src/middleware/"))) return null;
@@ -114,12 +98,32 @@ const PLAIN_SCRIPT_RE = /<script(?![^>]*\bsetup\b)[^>]*>/;
114
98
  * 而 `definePage` 是宏、必被剥掉 —— 一个只有 loader 的页面正好落在坑里。
115
99
  */
116
100
  const EMPTY_SETUP_KEEP_ALIVE = "\n// ubean: 宏已剥离,保留此块以维持组件的默认导出(见 builder/src/macros.ts)\n";
101
+ /**
102
+ * SFC 宏剥除。
103
+ *
104
+ * 用 `extractScriptBlocks`(即 `@vue/compiler-sfc` 的 `parse`)拿到每个 `<script>`
105
+ * 块在**原文件**中的精确区间,逐块删除后按偏移倒序回写 —— 而不是用
106
+ * `/<script([^>]*)>([\s\S]*?)<\/script>/g` 猜标签边界(该正则在 `<script>` 出现在
107
+ * 字符串或注释里时会错位)。
108
+ */
117
109
  function transformVueMacros(code) {
110
+ const blocks = extractScriptBlocks(code, "page.vue");
111
+ if (!blocks || blocks.length === 0) return code;
118
112
  const hasPlainScript = PLAIN_SCRIPT_RE.test(code);
119
- return code.replace(/<script([^>]*)>([\s\S]*?)<\/script>/g, (_match, attrs, content) => {
120
- const stripped = stripMacros(content);
121
- return `<script${attrs}>${/\bsetup\b/.test(attrs) && hasPlainScript && !stripped.trim() ? EMPTY_SETUP_KEEP_ALIVE : stripped}<\/script>`;
122
- });
113
+ const edits = [];
114
+ for (const block of blocks) {
115
+ const stripped = stripMacrosFromCode(block.content, MACRO_NAMES, `page.${block.lang || "ts"}`);
116
+ const keepAlive = block.setup && hasPlainScript && !stripped.trim() ? EMPTY_SETUP_KEEP_ALIVE : stripped;
117
+ if (keepAlive !== block.content) edits.push({
118
+ start: block.start,
119
+ end: block.end,
120
+ text: keepAlive
121
+ });
122
+ }
123
+ if (edits.length === 0) return code;
124
+ let result = code;
125
+ for (const edit of [...edits].sort((a, b) => b.start - a.start)) result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);
126
+ return result;
123
127
  }
124
128
  //#endregion
125
129
  //#region src/virtual-modules.ts
@@ -145,7 +149,7 @@ function createRoutingVirtualModule(routes, middlewares, cwd) {
145
149
  }
146
150
  function createPagesVirtualModule(pages, layouts, cwd) {
147
151
  return defineVirtualModule("ubean:pages", () => {
148
- 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)}, reuseTarget: ${JSON.stringify(p.reuseTarget)} }`).join(",\n")}\n};\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 type RouteName = ${pages.map((p) => JSON.stringify(p.name)).join(" | ") || "string"};\nexport type LayoutName = ${layouts.map((l) => JSON.stringify(l.name)).join(" | ") || "string"};\nexport default { pages, layouts };`;
152
+ 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)}, reuseTarget: ${JSON.stringify(p.reuseTarget)}, routable: ${p.routable !== false}, pageMeta: ${JSON.stringify(p.pageMeta ?? 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 type RouteName = ${pages.filter((p) => p.routable !== false).map((p) => JSON.stringify(p.name)).join(" | ") || "string"};\nexport type LayoutName = ${layouts.map((l) => JSON.stringify(l.name)).join(" | ") || "string"};\nexport default { pages, layouts, pageEntries };`;
149
153
  });
150
154
  }
151
155
  function createMetaVirtualModule() {
@@ -171,6 +175,8 @@ function createAppVirtualModule(apiRoutes, middlewares, pages, srcDir) {
171
175
  name: p.name,
172
176
  route: p.route,
173
177
  isReuse: p.isReuse,
178
+ isMeta: p.isMeta,
179
+ routable: p.routable,
174
180
  layout: p.layout
175
181
  }));
176
182
  const viteSrcDir = toVitePath(srcDir);
@@ -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-CsmYnd9W.js";
3
- import { a as generateOpenApiTypes, i as generateTypes } from "./codegen-BL0s5Pyq.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-q7rHFo73.js";
2
+ import { a as createRoutingVirtualModule, i as createPagesVirtualModule, n as createLocalesVirtualModule, r as createMetaVirtualModule, s as transformMacros, t as createAppVirtualModule } from "./virtual-modules-B3aE-Fmn.js";
3
+ import { a as generateOpenApiTypes, i as generateTypes } from "./codegen-CUlE95gB.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-Z4wVSxSE.js";
5
5
  import { createStaticSsgRenderer } from "./static-render.js";
6
6
  import { prerender, resolvePrerenderStaticDir } from "./prerender.js";
7
7
  import { dirname, isAbsolute, join, relative, resolve } from "pathe";
@@ -87,6 +87,8 @@ const _pageToRoute = p => {
87
87
 
88
88
  const _routeGroups = new Map();
89
89
  for (const _p of _pages) {
90
+ // routable: false 的页面不建路由(与客户端 virtual:ubean-pages 同形)。
91
+ if (_p.routable === false) continue;
90
92
  const _key = _p.route;
91
93
  const _group = _routeGroups.get(_key) || { slots: [] };
92
94
  if (_p.slot) _group.slots.push(_p);
@@ -1433,6 +1435,8 @@ function serializePagesForEntry(pages) {
1433
1435
  layout: p.layout,
1434
1436
  cache: p.cache,
1435
1437
  isReuse: p.isReuse,
1438
+ isMeta: p.isMeta,
1439
+ routable: p.routable,
1436
1440
  isMarkdown: p.isMarkdown,
1437
1441
  reuseTarget: p.reuseTarget,
1438
1442
  pageMeta: p.pageMeta,
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-q7rHFo73.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-Dva-CNKw.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-Z4wVSxSE.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--HujaLpA.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,6 +1,7 @@
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-BL0s5Pyq.js";
2
+ import { D as resolveComponentsConfig, E as resolveAutoImportsConfig, O as toArray, S as getAutoImportPresets, f as COMPONENT_HALF_GLOBS } from "./codegen-CUlE95gB.js";
3
3
  import { createRequire } from "node:module";
4
+ import { generatePagesModuleSource } from "@ubean/vue/vite";
4
5
  import { isAbsolute, join, normalize, relative, resolve } from "pathe";
5
6
  import { existsSync } from "node:fs";
6
7
  import { loadUbeanConfig, localePathsOf } from "@ubean/config";
@@ -8,7 +9,6 @@ import { scanProject } from "@ubean/scan";
8
9
  import { applyServerConfig, createUbeanApp } from "@ubean/app";
9
10
  import { getVueLocaleParam, toVueRouterLocalePath } from "@ubean/i18n";
10
11
  import { getColorModeScript, getPartyTownScript, resolveColorModeConfig, resolvePartyTownConfig } from "@ubean/client";
11
- import { generatePagesModuleSource } from "@ubean/vue/vite";
12
12
  import { transformWithOxc } from "vite";
13
13
  import vue from "@vitejs/plugin-vue";
14
14
  import Components from "unplugin-vue-components/vite";
@@ -49,9 +49,10 @@ function toVueRouterPagePath(route) {
49
49
  function buildDevSsrRoutes(options) {
50
50
  const { pages, layouts, loadComponent, localeVueParam, notFoundPage } = options;
51
51
  const defaultLayout = layouts.find((l) => l.isDefault)?.name ?? null;
52
+ const routablePages = pages.filter((p) => p.routable !== false);
52
53
  const withLocale = (path) => localeVueParam ? toVueRouterLocalePath(path, localeVueParam) : path;
53
54
  const pageByName = /* @__PURE__ */ new Map();
54
- for (const page of pages) pageByName.set(page.name, page);
55
+ for (const page of routablePages) pageByName.set(page.name, page);
55
56
  const componentFor = (page) => {
56
57
  const fullPath = (page.isReuse && page.reuseTarget ? pageByName.get(page.reuseTarget) : void 0)?.fullPath || page.fullPath;
57
58
  return async () => await loadComponent(fullPath);
@@ -67,7 +68,7 @@ function buildDevSsrRoutes(options) {
67
68
  }
68
69
  });
69
70
  const grouped = /* @__PURE__ */ new Map();
70
- for (const page of pages) {
71
+ for (const page of routablePages) {
71
72
  const group = grouped.get(page.route) ?? { slots: [] };
72
73
  if (page.slot) group.slots.push(page);
73
74
  else if (!group.default) group.default = page;
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-q7rHFo73.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-Z4wVSxSE.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ubean/build",
3
- "version": "0.6.6",
3
+ "version": "0.6.7",
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.6.6",
53
- "@ubean/client": "0.6.6",
54
- "@ubean/config": "0.6.6",
55
- "@ubean/i18n": "0.6.6",
56
- "@ubean/islands": "0.6.6",
57
- "@ubean/markdown": "0.6.6",
58
- "@ubean/pages": "0.6.6",
59
- "@ubean/preset": "0.6.6",
60
- "@ubean/routes": "0.6.6",
61
- "@ubean/scan": "0.6.6",
62
- "@ubean/server": "0.6.6",
63
- "@ubean/shared": "0.6.6",
64
- "@ubean/vue": "0.6.6",
52
+ "@ubean/app": "0.6.7",
53
+ "@ubean/client": "0.6.7",
54
+ "@ubean/config": "0.6.7",
55
+ "@ubean/i18n": "0.6.7",
56
+ "@ubean/islands": "0.6.7",
57
+ "@ubean/markdown": "0.6.7",
58
+ "@ubean/pages": "0.6.7",
59
+ "@ubean/preset": "0.6.7",
60
+ "@ubean/routes": "0.6.7",
61
+ "@ubean/scan": "0.6.7",
62
+ "@ubean/server": "0.6.7",
63
+ "@ubean/shared": "0.6.7",
64
+ "@ubean/vue": "0.6.7",
65
65
  "@vitejs/plugin-vue": "^6.0.10",
66
66
  "openapi-typescript": "^7.13.0",
67
67
  "pathe": "^2.0.3",