@ubean/build 0.6.6 → 0.6.8
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/codegen/index.js +1 -1
- package/dist/{codegen-BL0s5Pyq.js → codegen-CUlE95gB.js} +4 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +1 -1
- package/dist/prerender.js +1 -0
- package/dist/production.js +1 -1
- package/dist/{virtual-modules-CsmYnd9W.js → virtual-modules-C_Onkx4t.js} +99 -93
- package/dist/{vite-Dva-CNKw.js → vite-C8I25VzP.js} +46 -8
- package/dist/vite.js +2 -2
- package/dist/{vue-q7rHFo73.js → vue-QvsTw-R-.js} +31 -8
- package/dist/vue.js +1 -1
- package/package.json +15 -14
package/dist/codegen/index.js
CHANGED
|
@@ -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-
|
|
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
|
|
@@ -108,7 +109,12 @@ export declare function ssrSingletonProdOptimizeExclude(extra?: string[]): strin
|
|
|
108
109
|
export declare function createRoutingVirtualModule(routes: CompiledRoute[], middlewares: CompiledMiddleware[], cwd: string): VirtualModule;
|
|
109
110
|
export declare function createPagesVirtualModule(pages: CompiledPage[], layouts: CompiledLayout[], cwd: string): VirtualModule;
|
|
110
111
|
export declare function createMetaVirtualModule(): VirtualModule;
|
|
111
|
-
export declare function createAppVirtualModule(apiRoutes: ScannedApiRoute[], middlewares: ScannedMiddleware[], pages: ScannedPageRoute[], srcDir: string
|
|
112
|
+
export declare function createAppVirtualModule(apiRoutes: ScannedApiRoute[], middlewares: ScannedMiddleware[], pages: ScannedPageRoute[], srcDir: string,
|
|
113
|
+
/**
|
|
114
|
+
* 页面 glob 扩展名(逗号分隔,无点),来自 `pageGlobExtensions()`。
|
|
115
|
+
* 不传时用全开集合,仅兼容旧调用方式。
|
|
116
|
+
*/
|
|
117
|
+
pageExtensions?: string): VirtualModule;
|
|
112
118
|
export declare function createLocalesVirtualModule(_locales: ScannedLocale[], defaultLocale: string | undefined, srcDir?: string, i18nConfigJson?: string): VirtualModule;
|
|
113
119
|
//#endregion
|
|
114
120
|
export { type VirtualModule, type VirtualModuleContext, VirtualModuleRegistry, type VirtualModuleResolver, type VirtualModuleTransform, createVirtualRegistry, defineVirtualModule, defineVirtualModulePrefix, resetVirtualRegistry, useVirtualRegistry };
|
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-
|
|
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-C_Onkx4t.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
|
}
|
package/dist/production.js
CHANGED
|
@@ -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-
|
|
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-C8I25VzP.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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
63
|
+
return result;
|
|
70
64
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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() {
|
|
@@ -153,7 +157,7 @@ function createMetaVirtualModule() {
|
|
|
153
157
|
return `export const UBEAN_VERSION = "0.0.1";\nexport default { version: UBEAN_VERSION };`;
|
|
154
158
|
});
|
|
155
159
|
}
|
|
156
|
-
function createAppVirtualModule(apiRoutes, middlewares, pages, srcDir) {
|
|
160
|
+
function createAppVirtualModule(apiRoutes, middlewares, pages, srcDir, pageExtensions) {
|
|
157
161
|
return defineVirtualModule("ubean:app-config", () => {
|
|
158
162
|
const routesJson = apiRoutes.map((r) => JSON.stringify({
|
|
159
163
|
relativePath: r.relativePath,
|
|
@@ -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);
|
|
@@ -178,7 +184,7 @@ function createAppVirtualModule(apiRoutes, middlewares, pages, srcDir) {
|
|
|
178
184
|
return `
|
|
179
185
|
const routeModules = import.meta.glob([${JSON.stringify(`${prefix}/routes/**/*.{ts,js,mjs}`)}], { eager: false });
|
|
180
186
|
const middlewareModules = import.meta.glob([${JSON.stringify(`${prefix}/middleware/**/*.{ts,js,mjs}`)}], { eager: false });
|
|
181
|
-
const pageModules = import.meta.glob([${JSON.stringify(`${prefix}/pages/**/*.{vue,ts,tsx,js,jsx}`)}], { eager: false });
|
|
187
|
+
const pageModules = import.meta.glob([${JSON.stringify(`${prefix}/pages/**/*.{${pageExtensions ?? "vue,ts,tsx,js,jsx"}}`)}], { eager: false });
|
|
182
188
|
|
|
183
189
|
const _srcPrefix = ${JSON.stringify(prefix)};
|
|
184
190
|
function normalizeKey(p) {
|
|
@@ -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-
|
|
3
|
-
import { a as generateOpenApiTypes, i as generateTypes } from "./codegen-
|
|
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-
|
|
2
|
+
import { a as createRoutingVirtualModule, i as createPagesVirtualModule, n as createLocalesVirtualModule, r as createMetaVirtualModule, s as transformMacros, t as createAppVirtualModule } from "./virtual-modules-C_Onkx4t.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-QvsTw-R-.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";
|
|
@@ -35,6 +35,35 @@ function localeVueParamFromI18n(config) {
|
|
|
35
35
|
}) || void 0;
|
|
36
36
|
}
|
|
37
37
|
//#endregion
|
|
38
|
+
//#region src/page-glob.ts
|
|
39
|
+
/**
|
|
40
|
+
* 页面 glob 的扩展名集合。
|
|
41
|
+
*
|
|
42
|
+
* `import.meta.glob` 的范围必须与扫描器一致,否则会出现「扫描说不含 tsx、产物却
|
|
43
|
+
* 仍然把 `src/pages/*.tsx` 拉进构建」→ 构建期 `[PARSE_ERROR] Unexpected JSX expression`
|
|
44
|
+
* (关掉 JSX 时依然报错的真实原因)。
|
|
45
|
+
*
|
|
46
|
+
* 两类后缀与 `pages.extensions` 无关、始终参与:
|
|
47
|
+
* - `ts` / `js` —— `.reuse.ts` / `.meta.ts`(及其 `.js` 版本)是纯元数据文件
|
|
48
|
+
* (只含 `definePage`),扫描器用独立 pattern `**\/*.reuse.{ts,js}` /
|
|
49
|
+
* `**\/*.meta.{ts,js}` 收起,**不受 `extensions` 影响**。glob 缺了 ts/js,
|
|
50
|
+
* 元数据页能扫到却加载不到 → 路由表与实际可加载模块脱节。
|
|
51
|
+
* 顺带覆盖用户把 `ts` 显式写进 `extensions` 的情形。
|
|
52
|
+
* - `md` / `mdx` —— markdown 页面,由 `markdown` 开关决定加不加
|
|
53
|
+
*/
|
|
54
|
+
function pageGlobExtensions(extensions, markdownExts = []) {
|
|
55
|
+
const base = extensions && extensions.length > 0 ? extensions : [
|
|
56
|
+
"vue",
|
|
57
|
+
"tsx",
|
|
58
|
+
"jsx"
|
|
59
|
+
];
|
|
60
|
+
const all = new Set(base);
|
|
61
|
+
all.add("ts");
|
|
62
|
+
all.add("js");
|
|
63
|
+
for (const ext of markdownExts) all.add(ext);
|
|
64
|
+
return [...all].join(",");
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
38
67
|
//#region src/ssg-entry.ts
|
|
39
68
|
/**
|
|
40
69
|
* 生成 renderer setup 代码块(`_rendererRoutes` + `_pageRenderer`)。
|
|
@@ -87,6 +116,8 @@ const _pageToRoute = p => {
|
|
|
87
116
|
|
|
88
117
|
const _routeGroups = new Map();
|
|
89
118
|
for (const _p of _pages) {
|
|
119
|
+
// routable: false 的页面不建路由(与客户端 virtual:ubean-pages 同形)。
|
|
120
|
+
if (_p.routable === false) continue;
|
|
90
121
|
const _key = _p.route;
|
|
91
122
|
const _group = _routeGroups.get(_key) || { slots: [] };
|
|
92
123
|
if (_p.slot) _group.slots.push(_p);
|
|
@@ -1433,6 +1464,8 @@ function serializePagesForEntry(pages) {
|
|
|
1433
1464
|
layout: p.layout,
|
|
1434
1465
|
cache: p.cache,
|
|
1435
1466
|
isReuse: p.isReuse,
|
|
1467
|
+
isMeta: p.isMeta,
|
|
1468
|
+
routable: p.routable,
|
|
1436
1469
|
isMarkdown: p.isMarkdown,
|
|
1437
1470
|
reuseTarget: p.reuseTarget,
|
|
1438
1471
|
pageMeta: p.pageMeta,
|
|
@@ -1449,6 +1482,8 @@ async function generateVirtualModulesToDisk(cwd, config, scanResult, virtualDir,
|
|
|
1449
1482
|
const srcDirAbs = resolve(cwd, config.srcDir);
|
|
1450
1483
|
const viteSrcDir = toVitePath(relative(cwd, srcDirAbs));
|
|
1451
1484
|
const viteSrcPrefix = viteSrcDir ? `/${viteSrcDir}` : "";
|
|
1485
|
+
const mdPageExts = config.markdown?.enabled === false ? [] : config.markdown?.mdx === true ? ["md", "mdx"] : ["md"];
|
|
1486
|
+
const pagesExts = pageGlobExtensions(config.pages?.extensions, mdPageExts);
|
|
1452
1487
|
registry.register(createRoutingVirtualModule(scanResult.apiRoutes.map((r) => ({
|
|
1453
1488
|
method: r.method?.toUpperCase() || "ALL",
|
|
1454
1489
|
path: r.route,
|
|
@@ -1477,7 +1512,7 @@ async function generateVirtualModulesToDisk(cwd, config, scanResult, virtualDir,
|
|
|
1477
1512
|
registry.register(createVueAppEntryVirtualModule(scanResult.appEntry));
|
|
1478
1513
|
registry.register(createClientEntryVirtualModule());
|
|
1479
1514
|
}
|
|
1480
|
-
registry.register(createAppVirtualModule(scanResult.apiRoutes, scanResult.middlewares, hasPages ? scanResult.pages : [], viteSrcPrefix || "/"));
|
|
1515
|
+
registry.register(createAppVirtualModule(scanResult.apiRoutes, scanResult.middlewares, hasPages ? scanResult.pages : [], viteSrcPrefix || "/", pagesExts));
|
|
1481
1516
|
registry.register(createLocalesVirtualModule(scanResult.locales, scanResult.defaultLocale, viteSrcPrefix || "/", serializeI18nConfig(config.i18n)));
|
|
1482
1517
|
if (hasServer) registry.register(createServerEntryVirtualModule(scanResult.serverEntry));
|
|
1483
1518
|
async function writeModule(id, filename, header = "// Auto-generated by ubean\n") {
|
|
@@ -1497,7 +1532,7 @@ async function generateVirtualModulesToDisk(cwd, config, scanResult, virtualDir,
|
|
|
1497
1532
|
}
|
|
1498
1533
|
if (hasServer) await writeModule("virtual:ubean-server", "server-entry.ts", "");
|
|
1499
1534
|
await writeFile(join(virtualDir, "islands-registry.ts"), "export const islands = {};\n", "utf-8");
|
|
1500
|
-
const pagesGlob = JSON.stringify(`${viteSrcPrefix}/pages/**/*.{
|
|
1535
|
+
const pagesGlob = JSON.stringify(`${viteSrcPrefix}/pages/**/*.{${pagesExts}}`);
|
|
1501
1536
|
const routesGlob = JSON.stringify(`${viteSrcPrefix}/routes/**/*.{ts,js,mjs}`);
|
|
1502
1537
|
const middlewareGlob = JSON.stringify(`${viteSrcPrefix}/middleware/**/*.{ts,js,mjs}`);
|
|
1503
1538
|
const layoutsGlob = JSON.stringify(`${viteSrcPrefix}/layouts/**/*.{vue,ts}`);
|
|
@@ -2594,7 +2629,8 @@ function ubeanPlugin(options) {
|
|
|
2594
2629
|
cwd: ubeanConfig.rootDir,
|
|
2595
2630
|
srcDir: ubeanConfig.srcDir,
|
|
2596
2631
|
dirs: ubeanConfig.dir,
|
|
2597
|
-
ignore: ubeanConfig.scanOptions?.ignore
|
|
2632
|
+
ignore: ubeanConfig.scanOptions?.ignore,
|
|
2633
|
+
pageExtensions: ubeanConfig.pages?.extensions
|
|
2598
2634
|
});
|
|
2599
2635
|
const { snapshot: contentSnapshot } = await loadContentForBuild(ubeanConfig.rootDir, ubeanConfig.content);
|
|
2600
2636
|
await runEnvBuilds(builder, await prepareBuild(createBuildContext({
|
|
@@ -2678,6 +2714,7 @@ function ubeanPlugin(options) {
|
|
|
2678
2714
|
srcDir: ubeanConfig.srcDir,
|
|
2679
2715
|
dirs: ubeanConfig.dir,
|
|
2680
2716
|
ignore: ubeanConfig.scanOptions?.ignore,
|
|
2717
|
+
pageExtensions: ubeanConfig.pages?.extensions,
|
|
2681
2718
|
source,
|
|
2682
2719
|
scan: () => scanProjectOnce(),
|
|
2683
2720
|
reload: () => server.ws.send({ type: "full-reload" }),
|
|
@@ -2758,7 +2795,8 @@ function ubeanPlugin(options) {
|
|
|
2758
2795
|
cwd: ubeanConfig.rootDir,
|
|
2759
2796
|
srcDir: ubeanConfig.srcDir,
|
|
2760
2797
|
dirs: ubeanConfig.dir,
|
|
2761
|
-
ignore: ubeanConfig.scanOptions?.ignore
|
|
2798
|
+
ignore: ubeanConfig.scanOptions?.ignore,
|
|
2799
|
+
pageExtensions: ubeanConfig.pages?.extensions
|
|
2762
2800
|
});
|
|
2763
2801
|
}
|
|
2764
2802
|
async function scanAndRegister() {
|
|
@@ -2836,7 +2874,7 @@ function ubeanPlugin(options) {
|
|
|
2836
2874
|
isDefault: l.isDefault
|
|
2837
2875
|
})), ubeanConfig.rootDir));
|
|
2838
2876
|
virtualRegistry.register(createMetaVirtualModule());
|
|
2839
|
-
virtualRegistry.register(createAppVirtualModule(result.apiRoutes, result.middlewares, result.pages, viteSrcPrefix || "/"));
|
|
2877
|
+
virtualRegistry.register(createAppVirtualModule(result.apiRoutes, result.middlewares, result.pages, viteSrcPrefix || "/", pageGlobExtensions(ubeanConfig.pages?.extensions, ubeanConfig.markdown?.enabled === false ? [] : ubeanConfig.markdown?.mdx === true ? ["md", "mdx"] : ["md"])));
|
|
2840
2878
|
virtualRegistry.register(createLocalesVirtualModule(result.locales, result.defaultLocale, viteSrcPrefix || "/", serializeI18nConfig(ubeanConfig.i18n)));
|
|
2841
2879
|
await maybeGenerateRouteFiles(ubeanConfig, result).catch((err) => {
|
|
2842
2880
|
console.warn("[ubean:core] Route file generation failed:", err?.message || err);
|
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-
|
|
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-
|
|
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-QvsTw-R-.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-C8I25VzP.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,14 +1,14 @@
|
|
|
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-
|
|
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
|
-
import { loadUbeanConfig, localePathsOf } from "@ubean/config";
|
|
7
|
+
import { loadUbeanConfig, localePathsOf, resolvePageCompilers } from "@ubean/config";
|
|
7
8
|
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
|
|
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
|
|
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;
|
|
@@ -240,7 +241,8 @@ async function createDevApp(options) {
|
|
|
240
241
|
cwd: rootDir,
|
|
241
242
|
srcDir: config.srcDir,
|
|
242
243
|
dirs: config.dir,
|
|
243
|
-
ignore: config.scanOptions?.ignore
|
|
244
|
+
ignore: config.scanOptions?.ignore,
|
|
245
|
+
pageExtensions: config.pages?.extensions
|
|
244
246
|
});
|
|
245
247
|
const app = createUbeanApp({
|
|
246
248
|
rootDir,
|
|
@@ -1546,6 +1548,23 @@ export function resolveServerConfig(mode) {
|
|
|
1546
1548
|
//#endregion
|
|
1547
1549
|
//#region src/vue-plugin.ts
|
|
1548
1550
|
const VUE_PLUGIN_INCLUDE = [/\.vue$/, /\.md$/];
|
|
1551
|
+
/**
|
|
1552
|
+
* 懒加载 `@vitejs/plugin-vue-jsx`。
|
|
1553
|
+
*
|
|
1554
|
+
* 用 `createRequire` 而不是静态 import:只有真的写了 JSX 页面时才付 babel 链路的加载
|
|
1555
|
+
* 成本(`@babel/core` + `@babel/plugin-transform-typescript` + `@vue/babel-plugin-jsx`)。
|
|
1556
|
+
* 同时用 ESM interop 兼容默认导出与具名导出两种形状(不同版本各写过一种)。
|
|
1557
|
+
*/
|
|
1558
|
+
function createVueJsxPlugin() {
|
|
1559
|
+
const require = createRequire(import.meta.url);
|
|
1560
|
+
let mod;
|
|
1561
|
+
try {
|
|
1562
|
+
mod = require("@vitejs/plugin-vue-jsx");
|
|
1563
|
+
} catch {
|
|
1564
|
+
throw new Error("[ubean] `pages.extensions` 含 `tsx`/`jsx`,需要 `@vitejs/plugin-vue-jsx`,但未解析到该包。\n pnpm add -D @vitejs/plugin-vue-jsx\n 或从 `ubean.config.ts` 去掉 JSX 扩展名(`pages: { extensions: ['vue'] }`)。");
|
|
1565
|
+
}
|
|
1566
|
+
return (mod?.default?.default ?? mod?.default ?? mod)();
|
|
1567
|
+
}
|
|
1549
1568
|
const VIRTUAL_PAGES = "virtual:ubean-pages";
|
|
1550
1569
|
const VIRTUAL_APP = "virtual:ubean-app";
|
|
1551
1570
|
const VIRTUAL_CLIENT = "virtual:ubean-client-entry";
|
|
@@ -1619,7 +1638,8 @@ function ubeanVite(options) {
|
|
|
1619
1638
|
cwd: ubeanConfig.rootDir,
|
|
1620
1639
|
srcDir: ubeanConfig.srcDir,
|
|
1621
1640
|
dirs: ubeanConfig.dir,
|
|
1622
|
-
ignore: ubeanConfig.scanOptions?.ignore
|
|
1641
|
+
ignore: ubeanConfig.scanOptions?.ignore,
|
|
1642
|
+
pageExtensions: ubeanConfig.pages?.extensions
|
|
1623
1643
|
});
|
|
1624
1644
|
}
|
|
1625
1645
|
async function scanAndRegister() {
|
|
@@ -1736,6 +1756,7 @@ function ubeanVite(options) {
|
|
|
1736
1756
|
srcDir: ubeanConfig.srcDir,
|
|
1737
1757
|
dirs: ubeanConfig.dir,
|
|
1738
1758
|
ignore: ubeanConfig.scanOptions?.ignore,
|
|
1759
|
+
pageExtensions: ubeanConfig.pages?.extensions,
|
|
1739
1760
|
source,
|
|
1740
1761
|
scan: scanProjectOnce,
|
|
1741
1762
|
reload: () => server.ws.send({ type: "full-reload" }),
|
|
@@ -1755,10 +1776,12 @@ function ubeanVite(options) {
|
|
|
1755
1776
|
});
|
|
1756
1777
|
}
|
|
1757
1778
|
}];
|
|
1758
|
-
|
|
1779
|
+
const pageCompilers = resolvePageCompilers(ubeanConfig.pages?.extensions ?? []);
|
|
1780
|
+
if (options.vue !== false && pageCompilers.vue) plugins.unshift(vue({
|
|
1759
1781
|
include: VUE_PLUGIN_INCLUDE,
|
|
1760
1782
|
template: { compilerOptions: { isCustomElement: (tag) => tag.startsWith("ubean-") } }
|
|
1761
1783
|
}));
|
|
1784
|
+
if (pageCompilers.jsx) plugins.push(createVueJsxPlugin());
|
|
1762
1785
|
if (ubeanConfig.i18n?.enabled !== false) plugins.push(VueI18nPlugin({
|
|
1763
1786
|
include: [join(srcDir, "locales/**")],
|
|
1764
1787
|
ssr: true,
|
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-
|
|
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-QvsTw-R-.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ubean/build",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.8",
|
|
4
4
|
"description": "Vite plugins, production build, SSG prerender, type codegen, and Server Actions plugin for ubean",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -49,20 +49,21 @@
|
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@intlify/unplugin-vue-i18n": "11.2.7",
|
|
52
|
-
"@ubean/app": "0.6.
|
|
53
|
-
"@ubean/client": "0.6.
|
|
54
|
-
"@ubean/config": "0.6.
|
|
55
|
-
"@ubean/i18n": "0.6.
|
|
56
|
-
"@ubean/islands": "0.6.
|
|
57
|
-
"@ubean/markdown": "0.6.
|
|
58
|
-
"@ubean/pages": "0.6.
|
|
59
|
-
"@ubean/preset": "0.6.
|
|
60
|
-
"@ubean/routes": "0.6.
|
|
61
|
-
"@ubean/scan": "0.6.
|
|
62
|
-
"@ubean/server": "0.6.
|
|
63
|
-
"@ubean/shared": "0.6.
|
|
64
|
-
"@ubean/vue": "0.6.
|
|
52
|
+
"@ubean/app": "0.6.8",
|
|
53
|
+
"@ubean/client": "0.6.8",
|
|
54
|
+
"@ubean/config": "0.6.8",
|
|
55
|
+
"@ubean/i18n": "0.6.8",
|
|
56
|
+
"@ubean/islands": "0.6.8",
|
|
57
|
+
"@ubean/markdown": "0.6.8",
|
|
58
|
+
"@ubean/pages": "0.6.8",
|
|
59
|
+
"@ubean/preset": "0.6.8",
|
|
60
|
+
"@ubean/routes": "0.6.8",
|
|
61
|
+
"@ubean/scan": "0.6.8",
|
|
62
|
+
"@ubean/server": "0.6.8",
|
|
63
|
+
"@ubean/shared": "0.6.8",
|
|
64
|
+
"@ubean/vue": "0.6.8",
|
|
65
65
|
"@vitejs/plugin-vue": "^6.0.10",
|
|
66
|
+
"@vitejs/plugin-vue-jsx": "^5.1.6",
|
|
66
67
|
"openapi-typescript": "^7.13.0",
|
|
67
68
|
"pathe": "^2.0.3",
|
|
68
69
|
"tinyglobby": "^0.2.17",
|