@ynight/cli 0.0.0-stage → 0.0.1
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/LICENSE +21 -0
- package/README.md +251 -2
- package/config/client.json +14 -0
- package/config/server.json +16 -0
- package/dist/bin.d.ts +26 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +114 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands.d.ts +38 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +225 -0
- package/dist/commands.js.map +1 -0
- package/dist/dev-entry.d.ts +2 -0
- package/dist/dev-entry.d.ts.map +1 -0
- package/dist/dev-entry.js +348 -0
- package/dist/dev-entry.js.map +1 -0
- package/dist/dev-proxy.d.ts +21 -0
- package/dist/dev-proxy.d.ts.map +1 -0
- package/dist/dev-proxy.js +98 -0
- package/dist/dev-proxy.js.map +1 -0
- package/dist/dev-watcher.d.ts +24 -0
- package/dist/dev-watcher.d.ts.map +1 -0
- package/dist/dev-watcher.js +242 -0
- package/dist/dev-watcher.js.map +1 -0
- package/dist/generate-types.d.ts +14 -0
- package/dist/generate-types.d.ts.map +1 -0
- package/dist/generate-types.js +190 -0
- package/dist/generate-types.js.map +1 -0
- package/dist/output-safety.d.ts +47 -0
- package/dist/output-safety.d.ts.map +1 -0
- package/dist/output-safety.js +145 -0
- package/dist/output-safety.js.map +1 -0
- package/dist/project-config.d.ts +72 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +221 -0
- package/dist/project-config.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +84 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +176 -0
- package/dist/utils.js.map +1 -0
- package/dist/webpack-build.d.ts +87 -0
- package/dist/webpack-build.d.ts.map +1 -0
- package/dist/webpack-build.js +475 -0
- package/dist/webpack-build.js.map +1 -0
- package/package.json +64 -3
- package/tsconfig/client.json +3 -0
- package/tsconfig/server.json +3 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findFiles = findFiles;
|
|
4
|
+
exports.hasSourceFiles = hasSourceFiles;
|
|
5
|
+
exports.camelCase = camelCase;
|
|
6
|
+
exports.runNodeScript = runNodeScript;
|
|
7
|
+
exports.resolveTsc = resolveTsc;
|
|
8
|
+
exports.resolveVueTsc = resolveVueTsc;
|
|
9
|
+
exports.runTsc = runTsc;
|
|
10
|
+
exports.runVueTsc = runVueTsc;
|
|
11
|
+
exports.copyDirectory = copyDirectory;
|
|
12
|
+
const tslib_1 = require("tslib");
|
|
13
|
+
const node_fs_1 = tslib_1.__importDefault(require("node:fs"));
|
|
14
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
15
|
+
const node_child_process_1 = require("node:child_process");
|
|
16
|
+
/**
|
|
17
|
+
* 递归遍历目录,收集所有 `.ts` / `.js` / `.cjs` 后缀的源文件(自动跳过 `.d.ts`)。
|
|
18
|
+
*
|
|
19
|
+
* 设计要点:
|
|
20
|
+
* - 不跟随符号链接(依赖 `fs.readdirSync` 的默认行为)。
|
|
21
|
+
* - 跳过 `.d.ts` 以免类型声明文件被当作业务模块纳入生成逻辑。
|
|
22
|
+
* - 字典序排序保证跨平台稳定的输出顺序,方便 `generate:types` 做差分校验。
|
|
23
|
+
*
|
|
24
|
+
* @param root 起始目录;若不存在则直接返回空数组。
|
|
25
|
+
* @returns 收集到的所有源文件的绝对路径。
|
|
26
|
+
*/
|
|
27
|
+
function findFiles(root) {
|
|
28
|
+
if (!node_fs_1.default.existsSync(root)) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const result = [];
|
|
32
|
+
// 内层递归访问:先递归目录,再处理当前层的文件。
|
|
33
|
+
const visit = (directory) => {
|
|
34
|
+
node_fs_1.default.readdirSync(directory, { withFileTypes: true })
|
|
35
|
+
// 按名称排序,让扫描结果可复现,便于类型生成产物对比。
|
|
36
|
+
.sort((left, right) => left.name.localeCompare(right.name))
|
|
37
|
+
.forEach(entry => {
|
|
38
|
+
const filePath = node_path_1.default.resolve(directory, entry.name);
|
|
39
|
+
if (entry.isDirectory()) {
|
|
40
|
+
visit(filePath);
|
|
41
|
+
}
|
|
42
|
+
else if (/\.(?:ts|js|cjs)$/.test(entry.name) && !entry.name.endsWith('.d.ts')) {
|
|
43
|
+
result.push(filePath);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
visit(root);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 判断指定目录下是否存在匹配给定扩展名的源文件。
|
|
52
|
+
*
|
|
53
|
+
* 用于在执行 vue-tsc 等耗时工具前快速判断是否有必要调用:
|
|
54
|
+
* 零扩展项目的空目录是合法的,应当跳过校验。
|
|
55
|
+
*
|
|
56
|
+
* 跳过 `node_modules` 与 `dist`,避免扫描外部依赖或历史构建产物。
|
|
57
|
+
*
|
|
58
|
+
* @param root 待扫描目录;不存在时返回 `false`。
|
|
59
|
+
* @param extensions 需要匹配的扩展名列表(如 `['.vue']`)。
|
|
60
|
+
*/
|
|
61
|
+
function hasSourceFiles(root, extensions) {
|
|
62
|
+
if (!node_fs_1.default.existsSync(root)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const wanted = new Set(extensions);
|
|
66
|
+
// 递归查找任一匹配文件即可,使用短路语义尽早返回。
|
|
67
|
+
const visit = (directory) => node_fs_1.default.readdirSync(directory, { withFileTypes: true }).some(entry => {
|
|
68
|
+
if (entry.name === 'node_modules' || entry.name === 'dist') {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const filePath = node_path_1.default.resolve(directory, entry.name);
|
|
72
|
+
return entry.isDirectory() ? visit(filePath) : wanted.has(node_path_1.default.extname(entry.name));
|
|
73
|
+
});
|
|
74
|
+
return visit(root);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 将 kebab-case / snake_case 命名转换为 camelCase。
|
|
78
|
+
*
|
|
79
|
+
* 例:`user-profile` → `userProfile`、`api_client` → `apiClient`。
|
|
80
|
+
*
|
|
81
|
+
* 用于把文件名映射为生成类型对象的属性名(参见 `generate-types.ts`)。
|
|
82
|
+
*/
|
|
83
|
+
function camelCase(value) {
|
|
84
|
+
return value.replace(/[-_]([a-z])/gi, (_, char) => char.toUpperCase());
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 同步执行一个 Node 脚本,失败时抛出错误(用于把控制权交回调用方)。
|
|
88
|
+
*
|
|
89
|
+
* 与 `runTsc` 的区别:此函数面向任意 Node 脚本;后者针对 `tsc` 提供了更友好的报错文案。
|
|
90
|
+
*
|
|
91
|
+
* @param script 脚本绝对路径(通常是 `require.resolve` 的产物)。
|
|
92
|
+
* @param args 透传给脚本的命令行参数。
|
|
93
|
+
* @param cwd 子进程工作目录。
|
|
94
|
+
*/
|
|
95
|
+
function runNodeScript(script, args, cwd) {
|
|
96
|
+
const result = (0, node_child_process_1.spawnSync)(process.execPath, [script, ...args], { cwd, stdio: 'inherit' });
|
|
97
|
+
if (result.error) {
|
|
98
|
+
throw result.error;
|
|
99
|
+
}
|
|
100
|
+
if (result.status !== 0) {
|
|
101
|
+
throw new Error(`子进程执行失败,退出码: ${result.status ?? 'unknown'}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 解析当前 `node_modules/typescript` 中的 `tsc` 入口绝对路径。
|
|
106
|
+
*
|
|
107
|
+
* 不直接硬编码路径,使得业务工程即便使用了不同版本的 TypeScript 也能正确执行。
|
|
108
|
+
*/
|
|
109
|
+
function resolveTsc() {
|
|
110
|
+
return require.resolve('typescript/bin/tsc');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 解析 `vue-tsc` 入口绝对路径,与 `resolveTsc` 同一思路。
|
|
114
|
+
*/
|
|
115
|
+
function resolveVueTsc() {
|
|
116
|
+
return require.resolve('vue-tsc/bin/vue-tsc.js');
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 调用 `tsc` 同步执行 TypeScript 编译/检查。
|
|
120
|
+
*
|
|
121
|
+
* 失败时抛出包含退出码的错误,便于上层统一报告;不接管 stdin/stdout,
|
|
122
|
+
* 让 `tsc` 直接打印到父进程终端,保留原始诊断信息。
|
|
123
|
+
*
|
|
124
|
+
* @param root 工作目录。
|
|
125
|
+
* @param config tsconfig 路径(绝对路径)。
|
|
126
|
+
* @param extraArgs 透传给 `tsc` 的额外参数,例如 `['--noEmit']` 或 `['--outDir', dir]`。
|
|
127
|
+
*/
|
|
128
|
+
function runTsc(root, config, extraArgs = []) {
|
|
129
|
+
const result = (0, node_child_process_1.spawnSync)(process.execPath, [resolveTsc(), '-p', config, ...extraArgs], {
|
|
130
|
+
cwd: root,
|
|
131
|
+
stdio: 'inherit',
|
|
132
|
+
});
|
|
133
|
+
if (result.error) {
|
|
134
|
+
throw result.error;
|
|
135
|
+
}
|
|
136
|
+
if (result.status !== 0) {
|
|
137
|
+
throw new Error(`TypeScript 检查失败,退出码: ${result.status ?? 'unknown'}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 调用 `vue-tsc` 同步执行 Vue SFC 的 TypeScript 检查。
|
|
142
|
+
*
|
|
143
|
+
* 通过 `--noEmit` 避免产出 `.d.ts`,仅做类型检查。
|
|
144
|
+
* 与 `runTsc` 错误处理逻辑保持一致。
|
|
145
|
+
*
|
|
146
|
+
* @param root 工作目录。
|
|
147
|
+
* @param config tsconfig 路径(通常是 `tsconfig.client.json`)。
|
|
148
|
+
*/
|
|
149
|
+
function runVueTsc(root, config) {
|
|
150
|
+
const result = (0, node_child_process_1.spawnSync)(process.execPath, [resolveVueTsc(), '--noEmit', '-p', config], {
|
|
151
|
+
cwd: root,
|
|
152
|
+
stdio: 'inherit',
|
|
153
|
+
});
|
|
154
|
+
if (result.error) {
|
|
155
|
+
throw result.error;
|
|
156
|
+
}
|
|
157
|
+
if (result.status !== 0) {
|
|
158
|
+
throw new Error(`Vue TypeScript 检查失败,退出码: ${result.status ?? 'unknown'}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 递归复制整个目录到目标位置。
|
|
163
|
+
*
|
|
164
|
+
* 使用 `fs.cpSync` 的 `recursive` 选项,等价于 `cp -r` 语义。
|
|
165
|
+
* 若源目录不存在则视为无操作(避免业务工程未提供 `public/` 时报错)。
|
|
166
|
+
*
|
|
167
|
+
* @param source 源目录绝对路径。
|
|
168
|
+
* @param destination 目标目录绝对路径。
|
|
169
|
+
*/
|
|
170
|
+
function copyDirectory(source, destination) {
|
|
171
|
+
if (!node_fs_1.default.existsSync(source)) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
node_fs_1.default.cpSync(source, destination, { recursive: true });
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type Configuration, type Stats } from 'webpack';
|
|
2
|
+
import type { CliOptions } from './types';
|
|
3
|
+
import type { ElpisConfig } from '@ynight/framework/server';
|
|
4
|
+
/**
|
|
5
|
+
* 构造 webpack 配置所需的内部参数。
|
|
6
|
+
*
|
|
7
|
+
* - `root`:业务工程根目录;
|
|
8
|
+
* - `outputRoot`:产物输出根目录(dev 模式下与 `publicRoot` 相同);
|
|
9
|
+
* - `mode`:webpack 的 `mode`;
|
|
10
|
+
* - `webPort`:仅 dev 模式使用,对应 webpack-dev-server 端口;
|
|
11
|
+
* - `publicTitle` / `dashboardBase`:注入到 HTML 与 SPA 启动参数;
|
|
12
|
+
* - `config`:完整 Elpis 配置,提供 `public` / `client` / `dev` 等参数。
|
|
13
|
+
*/
|
|
14
|
+
interface FrontendOptions {
|
|
15
|
+
root: string;
|
|
16
|
+
outputRoot: string;
|
|
17
|
+
mode: 'development' | 'production';
|
|
18
|
+
webPort?: number;
|
|
19
|
+
publicTitle?: string;
|
|
20
|
+
dashboardBase?: string;
|
|
21
|
+
config: ElpisConfig;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 前端构建结果:包含产物清单与原始 webpack stats。
|
|
25
|
+
*
|
|
26
|
+
* `assets` 可被上层用来校验页面模板是否齐全。
|
|
27
|
+
*/
|
|
28
|
+
export interface WebpackResult {
|
|
29
|
+
assets: string[];
|
|
30
|
+
stats: Stats;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 开发模式前端实例。
|
|
34
|
+
*
|
|
35
|
+
* - `result`:等待 webpack 完成首次构建后 resolve;
|
|
36
|
+
* - `close()`:按顺序关停 HMR、Express、middleware 与 compiler,幂等可重入。
|
|
37
|
+
*/
|
|
38
|
+
export interface DevFrontend {
|
|
39
|
+
result: Promise<WebpackResult>;
|
|
40
|
+
close(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 基于前端选项构造 webpack 配置。
|
|
44
|
+
*
|
|
45
|
+
* 主要决策:
|
|
46
|
+
* - 使用 `virtual:` 模块让每个页面有独立 entry 与 HtmlWebpackPlugin 实例;
|
|
47
|
+
* - 开发模式下启用 HMR + `webpack-hot-middleware`,并把 HMR 路径固定为
|
|
48
|
+
* `/__webpack_hmr`(与 `dev-proxy.ts` 的代理策略对齐);
|
|
49
|
+
* - 生产模式使用 `MiniCssExtractPlugin` 抽离 CSS 并配合内容 hash;
|
|
50
|
+
* - 用 `esbuild-loader` 替代 babel,速度更快;
|
|
51
|
+
* - 通过 `VueLoaderPlugin` + `DefinePlugin` 关闭 Vue 生产环境的开发工具,减小体积。
|
|
52
|
+
*
|
|
53
|
+
* @param options 来自 `createFrontendOptions` 的统一配置。
|
|
54
|
+
*/
|
|
55
|
+
export declare function createWebpackConfig(options: FrontendOptions): Configuration;
|
|
56
|
+
/**
|
|
57
|
+
* 一次性构建:执行完成后关闭 compiler。
|
|
58
|
+
*
|
|
59
|
+
* @throws webpack 编译失败时抛出,便于上层捕获并回滚 staging 目录。
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildFrontend(options: FrontendOptions): Promise<WebpackResult>;
|
|
62
|
+
/**
|
|
63
|
+
* 启动开发模式的前端服务:webpack-dev-middleware + webpack-hot-middleware + express。
|
|
64
|
+
*
|
|
65
|
+
* 设计要点:
|
|
66
|
+
* - 监听 `127.0.0.1` 的 `webPort` 端口,仅本机可访问;
|
|
67
|
+
* - 只有在 webpack 首次构建完成且 express 监听成功后,promise 才会 resolve,
|
|
68
|
+
* 确保上层(dev-proxy)再开始把请求代理过来;
|
|
69
|
+
* - `close()` 顺序:先停 HMR SSE → server → middleware → compiler,
|
|
70
|
+
* 避免 hot-middleware 的长连接阻塞 server.close。
|
|
71
|
+
*/
|
|
72
|
+
export declare function startDevFrontend(options: FrontendOptions): DevFrontend;
|
|
73
|
+
/**
|
|
74
|
+
* 计算三个预置页面的 HTML 输出绝对路径列表,用于构建后做完整性校验。
|
|
75
|
+
*/
|
|
76
|
+
export declare function pageOutputPaths(outputRoot: string): string[];
|
|
77
|
+
/**
|
|
78
|
+
* 把 `CliOptions` 与 Elpis 配置统一映射成 `FrontendOptions`,供 dev/build 共用。
|
|
79
|
+
*
|
|
80
|
+
* 关键规则:
|
|
81
|
+
* - `webPort` 优先取 CLI 参数,再回退到 `config.dev.webPort`;
|
|
82
|
+
* - 仅当配置项有显式值时才传入 `publicTitle` / `dashboardBase`,
|
|
83
|
+
* 避免被 `undefined` 覆盖 webpack 内部默认值。
|
|
84
|
+
*/
|
|
85
|
+
export declare function createFrontendOptions(options: CliOptions, mode: 'development' | 'production', outputRoot: string, config: ElpisConfig): FrontendOptions;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=webpack-build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webpack-build.d.ts","sourceRoot":"","sources":["../src/webpack-build.ts"],"names":[],"mappings":"AAEA,OAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAiB,MAAM,SAAS,CAAC;AAWjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAc5D;;;;;;;;;GASG;AACH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAgED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAoJ3E;AAuED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CASpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,WAAW,CAsGtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,aAAa,GAAG,YAAY,EAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,GAClB,eAAe,CAkBjB"}
|