@lakutata/cli 2.17.1 → 3.0.0-beta.0
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/README.md +455 -28
- package/dist/esm/CLIApp.js +6 -0
- package/dist/esm/Config.js +53 -0
- package/dist/esm/controllers/CommandLineController.js +180 -0
- package/dist/esm/controllers/I18nController.js +67 -0
- package/dist/esm/controllers/MigrationController.js +66 -0
- package/dist/esm/controllers/NativeController.js +41 -0
- package/dist/esm/controllers/PackController.js +88 -0
- package/dist/esm/controllers/WorkspaceController.js +91 -0
- package/dist/esm/dtos/AddPackageDTO.js +25 -0
- package/dist/esm/dtos/BundleDTO.js +29 -0
- package/dist/esm/dtos/CleanDTO.js +17 -0
- package/dist/esm/dtos/CreateProjectDTO.js +61 -0
- package/dist/esm/dtos/ExecutableDTO.js +37 -0
- package/dist/esm/dtos/I18nDTO.js +41 -0
- package/dist/esm/dtos/InstallerDTO.js +33 -0
- package/dist/{options/ListTemplatesOptions.js → esm/dtos/ListTemplatesDTO.js} +5 -14
- package/dist/esm/dtos/MigrationDTO.js +45 -0
- package/dist/esm/dtos/NativeDTO.js +41 -0
- package/dist/esm/dtos/RunScriptDTO.js +33 -0
- package/dist/esm/dtos/VersionDTO.js +29 -0
- package/dist/esm/lib/AddPackage.js +487 -0
- package/dist/esm/lib/Builder.js +21 -0
- package/dist/esm/lib/Clean.js +146 -0
- package/dist/esm/lib/Environment.js +11 -0
- package/dist/esm/lib/I18n.js +67 -0
- package/dist/esm/lib/Language.js +24 -0
- package/dist/esm/lib/Migration.js +94 -0
- package/dist/esm/lib/Output.js +40 -0
- package/dist/esm/lib/Processes.js +54 -0
- package/dist/esm/lib/ProjectCreator.js +191 -0
- package/dist/esm/lib/Registry.js +152 -0
- package/dist/esm/lib/Settings.js +25 -0
- package/dist/esm/lib/Tar.js +145 -0
- package/dist/esm/lib/TemplateCatalog.js +195 -0
- package/dist/esm/lib/TemplateFeatures.js +141 -0
- package/dist/esm/lib/Versions.js +58 -0
- package/dist/esm/lib/native/CMake.js +357 -0
- package/dist/esm/lib/native/Gyp.js +398 -0
- package/dist/esm/lib/native/NativeProject.js +370 -0
- package/dist/esm/lib/native/TextEdits.js +68 -0
- package/dist/esm/lib/native/Toml.js +325 -0
- package/dist/esm/lib/workspace/Run.js +111 -0
- package/dist/esm/lib/workspace/Version.js +144 -0
- package/dist/esm/lib/workspace/Workspace.js +231 -0
- package/dist/esm/locales/zh-CN.json +194 -0
- package/dist/esm/locales/zh-TW.json +194 -0
- package/dist/esm/types/ProcessResult.js +1 -0
- package/package.json +32 -43
- package/CHANGELOG.md +0 -460
- package/dist/CLIApp.d.ts +0 -3
- package/dist/CLIApp.d.ts.map +0 -1
- package/dist/CLIApp.js +0 -45
- package/dist/config/Config.d.ts +0 -3
- package/dist/config/Config.d.ts.map +0 -1
- package/dist/config/Config.js +0 -63
- package/dist/config/SetupCLIEntrypoint.d.ts +0 -3
- package/dist/config/SetupCLIEntrypoint.d.ts.map +0 -1
- package/dist/config/SetupCLIEntrypoint.js +0 -31
- package/dist/controllers/CommandLineController.d.ts +0 -25
- package/dist/controllers/CommandLineController.d.ts.map +0 -1
- package/dist/controllers/CommandLineController.js +0 -78
- package/dist/lib/ConvertDTO2Inquirer.d.ts +0 -3
- package/dist/lib/ConvertDTO2Inquirer.d.ts.map +0 -1
- package/dist/lib/ConvertDTO2Inquirer.js +0 -61
- package/dist/lib/GetDataDirectory.d.ts +0 -2
- package/dist/lib/GetDataDirectory.d.ts.map +0 -1
- package/dist/lib/GetDataDirectory.js +0 -11
- package/dist/lib/GetLocalDataFilename.d.ts +0 -2
- package/dist/lib/GetLocalDataFilename.d.ts.map +0 -1
- package/dist/lib/GetLocalDataFilename.js +0 -12
- package/dist/lib/ListTemplateNames.d.ts +0 -2
- package/dist/lib/ListTemplateNames.d.ts.map +0 -1
- package/dist/lib/ListTemplateNames.js +0 -44
- package/dist/lib/SpecialChar.d.ts +0 -9
- package/dist/lib/SpecialChar.d.ts.map +0 -1
- package/dist/lib/SpecialChar.js +0 -11
- package/dist/lib/components/DeGitPuller.d.ts +0 -19
- package/dist/lib/components/DeGitPuller.d.ts.map +0 -1
- package/dist/lib/components/DeGitPuller.js +0 -65
- package/dist/lib/components/Spinner.d.ts +0 -23
- package/dist/lib/components/Spinner.d.ts.map +0 -1
- package/dist/lib/components/Spinner.js +0 -61
- package/dist/lib/providers/Creator.d.ts +0 -46
- package/dist/lib/providers/Creator.d.ts.map +0 -1
- package/dist/lib/providers/Creator.js +0 -179
- package/dist/lib/providers/Information.d.ts +0 -91
- package/dist/lib/providers/Information.d.ts.map +0 -1
- package/dist/lib/providers/Information.js +0 -225
- package/dist/lib/providers/OnlineLatestVersion.d.ts +0 -14
- package/dist/lib/providers/OnlineLatestVersion.d.ts.map +0 -1
- package/dist/lib/providers/OnlineLatestVersion.js +0 -47
- package/dist/lib/providers/TemplateManager.d.ts +0 -36
- package/dist/lib/providers/TemplateManager.d.ts.map +0 -1
- package/dist/lib/providers/TemplateManager.js +0 -164
- package/dist/options/CreateProjectOptions.d.ts +0 -15
- package/dist/options/CreateProjectOptions.d.ts.map +0 -1
- package/dist/options/CreateProjectOptions.js +0 -94
- package/dist/options/ListTemplatesOptions.d.ts +0 -5
- package/dist/options/ListTemplatesOptions.d.ts.map +0 -1
- package/tsconfig.json +0 -7
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { newestVersion } from '../Registry.js';
|
|
5
|
+
/**
|
|
6
|
+
* The fields of the dependencies of a package
|
|
7
|
+
*/
|
|
8
|
+
export const DEPENDENCY_FIELDS = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];
|
|
9
|
+
/**
|
|
10
|
+
* A JSON file, written back with its indentation and its final newline
|
|
11
|
+
*/
|
|
12
|
+
export class JSONFile {
|
|
13
|
+
constructor(file, data, indent, newline) {
|
|
14
|
+
this.file = file;
|
|
15
|
+
this.data = data;
|
|
16
|
+
this.indent = indent;
|
|
17
|
+
this.newline = newline;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Read a JSON file
|
|
21
|
+
* @param file
|
|
22
|
+
*/
|
|
23
|
+
static async read(file) {
|
|
24
|
+
const text = await readFile(file, 'utf8');
|
|
25
|
+
const indent = /^[ \t]+(?=")/m.exec(text)?.[0] ?? ' ';
|
|
26
|
+
return new JSONFile(file, JSON.parse(text), indent, text.endsWith('\n'));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Write the file back
|
|
30
|
+
*/
|
|
31
|
+
async write() {
|
|
32
|
+
await writeFile(this.file, `${JSON.stringify(this.data, null, this.indent)}${this.newline ? '\n' : ''}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether a name matches a pattern with "*" wildcards
|
|
37
|
+
* @param name
|
|
38
|
+
* @param pattern
|
|
39
|
+
*/
|
|
40
|
+
export function matchName(name, pattern) {
|
|
41
|
+
return new RegExp(`^${pattern.split('*').map((part) => part.replace(/[.+?^${}()|[\]\\/]/g, '\\$&')).join('.*')}$`).test(name);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The directories matching a workspace pattern ("packages/*", "apps/**", "tools/cli")
|
|
45
|
+
* @param root
|
|
46
|
+
* @param pattern
|
|
47
|
+
*/
|
|
48
|
+
async function expandPattern(root, pattern) {
|
|
49
|
+
const segments = pattern.replace(/^\.\//, '').replace(/\/+$/, '').split('/').filter((segment) => !!segment);
|
|
50
|
+
const walk = async (directory, index) => {
|
|
51
|
+
if (index === segments.length)
|
|
52
|
+
return [directory];
|
|
53
|
+
const segment = segments[index];
|
|
54
|
+
if (!segment.includes('*'))
|
|
55
|
+
return existsSync(path.join(directory, segment)) ? walk(path.join(directory, segment), index + 1) : [];
|
|
56
|
+
let entries;
|
|
57
|
+
try {
|
|
58
|
+
entries = (await readdir(directory, { withFileTypes: true }))
|
|
59
|
+
.filter((entry) => entry.isDirectory() && entry.name !== 'node_modules' && !entry.name.startsWith('.'))
|
|
60
|
+
.map((entry) => entry.name);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
const found = [];
|
|
66
|
+
if (segment === '**') {
|
|
67
|
+
//Any depth, including none
|
|
68
|
+
found.push(...await walk(directory, index + 1));
|
|
69
|
+
for (const entry of entries)
|
|
70
|
+
found.push(...await walk(path.join(directory, entry), index));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
for (const entry of entries)
|
|
74
|
+
if (matchName(entry, segment))
|
|
75
|
+
found.push(...await walk(path.join(directory, entry), index + 1));
|
|
76
|
+
}
|
|
77
|
+
return found;
|
|
78
|
+
};
|
|
79
|
+
return walk(root, 0);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The patterns of the packages of a pnpm workspace
|
|
83
|
+
* @param file
|
|
84
|
+
*/
|
|
85
|
+
async function pnpmPatterns(file) {
|
|
86
|
+
const patterns = [];
|
|
87
|
+
let inPackages = false;
|
|
88
|
+
for (const line of (await readFile(file, 'utf8')).split('\n')) {
|
|
89
|
+
if (/^packages:\s*$/.test(line)) {
|
|
90
|
+
inPackages = true;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (inPackages) {
|
|
94
|
+
const matched = /^\s+-\s+['"]?([^'"#]+?)['"]?\s*(#.*)?$/.exec(line);
|
|
95
|
+
if (matched)
|
|
96
|
+
patterns.push(matched[1]);
|
|
97
|
+
else if (/^\S/.test(line))
|
|
98
|
+
inPackages = false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return patterns;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* A workspace: its root, its packages and their fixed version
|
|
105
|
+
*/
|
|
106
|
+
export class Workspace {
|
|
107
|
+
constructor(root, manifest, packages, lerna) {
|
|
108
|
+
this.root = root;
|
|
109
|
+
this.manifest = manifest;
|
|
110
|
+
this.packages = packages;
|
|
111
|
+
this.lerna = lerna;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The workspace of a directory: the nearest directory declaring workspaces
|
|
115
|
+
* @param start
|
|
116
|
+
*/
|
|
117
|
+
static async find(start = process.cwd()) {
|
|
118
|
+
for (let directory = path.resolve(start);; directory = path.dirname(directory)) {
|
|
119
|
+
const manifestFile = path.join(directory, 'package.json');
|
|
120
|
+
if (existsSync(manifestFile)) {
|
|
121
|
+
const manifest = await JSONFile.read(manifestFile);
|
|
122
|
+
const declared = manifest.data.workspaces;
|
|
123
|
+
let patterns = Array.isArray(declared) ? declared : Array.isArray(declared?.packages) ? declared.packages : undefined;
|
|
124
|
+
if (!patterns && existsSync(path.join(directory, 'pnpm-workspace.yaml')))
|
|
125
|
+
patterns = await pnpmPatterns(path.join(directory, 'pnpm-workspace.yaml'));
|
|
126
|
+
if (patterns)
|
|
127
|
+
return await this.load(directory, manifest, patterns);
|
|
128
|
+
}
|
|
129
|
+
if (path.dirname(directory) === directory)
|
|
130
|
+
throw new Error(`${path.resolve(start)} is not in a workspace (a package.json declaring "workspaces", or a pnpm-workspace.yaml)`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Load the packages of a workspace
|
|
135
|
+
* @param root
|
|
136
|
+
* @param manifest
|
|
137
|
+
* @param patterns
|
|
138
|
+
*/
|
|
139
|
+
static async load(root, manifest, patterns) {
|
|
140
|
+
const included = new Set();
|
|
141
|
+
for (const pattern of patterns.filter((pattern) => !pattern.startsWith('!')))
|
|
142
|
+
for (const directory of await expandPattern(root, pattern))
|
|
143
|
+
included.add(directory);
|
|
144
|
+
for (const pattern of patterns.filter((pattern) => pattern.startsWith('!')))
|
|
145
|
+
for (const directory of await expandPattern(root, pattern.slice(1)))
|
|
146
|
+
included.delete(directory);
|
|
147
|
+
const packages = [];
|
|
148
|
+
for (const directory of [...included].sort()) {
|
|
149
|
+
if (!existsSync(path.join(directory, 'package.json')))
|
|
150
|
+
continue;
|
|
151
|
+
const packageManifest = await JSONFile.read(path.join(directory, 'package.json'));
|
|
152
|
+
if (typeof packageManifest.data.name !== 'string')
|
|
153
|
+
continue;
|
|
154
|
+
packages.push({
|
|
155
|
+
name: packageManifest.data.name,
|
|
156
|
+
version: packageManifest.data.version,
|
|
157
|
+
directory: directory,
|
|
158
|
+
manifest: packageManifest,
|
|
159
|
+
private: packageManifest.data.private === true,
|
|
160
|
+
scripts: packageManifest.data.scripts ?? {},
|
|
161
|
+
dependencies: []
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
const names = new Set(packages.map((pkg) => pkg.name));
|
|
165
|
+
for (const pkg of packages) {
|
|
166
|
+
const dependencies = new Set();
|
|
167
|
+
for (const field of DEPENDENCY_FIELDS)
|
|
168
|
+
for (const name of Object.keys(pkg.manifest.data[field] ?? {}))
|
|
169
|
+
if (names.has(name) && name !== pkg.name)
|
|
170
|
+
dependencies.add(name);
|
|
171
|
+
pkg.dependencies = [...dependencies];
|
|
172
|
+
}
|
|
173
|
+
const lernaFile = path.join(root, 'lerna.json');
|
|
174
|
+
return new Workspace(root, manifest, packages, existsSync(lernaFile) ? await JSONFile.read(lernaFile) : undefined);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* A package by name
|
|
178
|
+
* @param name
|
|
179
|
+
*/
|
|
180
|
+
get(name) {
|
|
181
|
+
return this.packages.find((pkg) => pkg.name === name);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The packages a package depends on, directly or not
|
|
185
|
+
* @param pkg
|
|
186
|
+
*/
|
|
187
|
+
transitiveDependencies(pkg) {
|
|
188
|
+
const found = new Set();
|
|
189
|
+
const visit = (name) => {
|
|
190
|
+
for (const dependency of this.get(name)?.dependencies ?? []) {
|
|
191
|
+
if (found.has(dependency))
|
|
192
|
+
continue;
|
|
193
|
+
found.add(dependency);
|
|
194
|
+
visit(dependency);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
visit(pkg.name);
|
|
198
|
+
found.delete(pkg.name);
|
|
199
|
+
return found;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* The cycles of the dependencies, as lists of package names
|
|
203
|
+
*/
|
|
204
|
+
cycles() {
|
|
205
|
+
const cycles = [];
|
|
206
|
+
const state = new Map();
|
|
207
|
+
const stack = [];
|
|
208
|
+
const visit = (name) => {
|
|
209
|
+
state.set(name, 'visiting');
|
|
210
|
+
stack.push(name);
|
|
211
|
+
for (const dependency of this.get(name)?.dependencies ?? []) {
|
|
212
|
+
if (state.get(dependency) === 'visiting')
|
|
213
|
+
cycles.push([...stack.slice(stack.indexOf(dependency)), dependency]);
|
|
214
|
+
else if (!state.has(dependency))
|
|
215
|
+
visit(dependency);
|
|
216
|
+
}
|
|
217
|
+
stack.pop();
|
|
218
|
+
state.set(name, 'done');
|
|
219
|
+
};
|
|
220
|
+
for (const pkg of this.packages)
|
|
221
|
+
if (!state.has(pkg.name))
|
|
222
|
+
visit(pkg.name);
|
|
223
|
+
return cycles;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* The fixed version of the workspace: the one of lerna.json, of the root package.json, or the highest of the packages
|
|
227
|
+
*/
|
|
228
|
+
get version() {
|
|
229
|
+
return this.lerna?.data.version ?? this.manifest.data.version ?? newestVersion(this.packages.map((pkg) => pkg.version).filter((version) => !!version));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cli": {
|
|
3
|
+
"description": "lakutata 框架的命令行工具:从模板创建项目,运行工作区各包的脚本并管理版本,打包应用并生成可执行文件。",
|
|
4
|
+
"commands": {
|
|
5
|
+
"create": {
|
|
6
|
+
"description": "从模板创建一个 lakutata 项目",
|
|
7
|
+
"options": {
|
|
8
|
+
"name": "应用的名称",
|
|
9
|
+
"id": "应用的 ID(包名),默认是名称的小写形式",
|
|
10
|
+
"template": "模板:官方模板的名称(lakutata templates 会列出)、npm:<包名>、github:<所有者>/<仓库> 或一个目录",
|
|
11
|
+
"path": "在哪个目录下创建项目目录",
|
|
12
|
+
"init": "直接在该目录中创建项目,目录可以已存在且非空",
|
|
13
|
+
"description": "应用的描述",
|
|
14
|
+
"author": "应用的作者",
|
|
15
|
+
"license": "应用的许可证",
|
|
16
|
+
"packageManager": "安装依赖使用的包管理器,默认是运行本工具的那个(none 表示不安装)",
|
|
17
|
+
"with": "启用模板的可选功能,多个用逗号分隔(lakutata templates 会列出):i18n",
|
|
18
|
+
"git": "初始化 git 仓库",
|
|
19
|
+
"yes": "不经确认直接创建项目"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"templates": {
|
|
23
|
+
"description": "列出项目模板",
|
|
24
|
+
"options": {
|
|
25
|
+
"refresh": "重新获取模板目录,即使已有缓存"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"clean": {
|
|
29
|
+
"description": "删除当前目录所在包下的路径,在各平台上都可用(默认是其 tsconfig.json 的 outDir)",
|
|
30
|
+
"arguments": {
|
|
31
|
+
"paths": "要删除的路径,相对于包(默认是其 tsconfig.json 的 outDir 和 declarationDir)"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"info": {
|
|
35
|
+
"description": "显示本工具和框架的版本"
|
|
36
|
+
},
|
|
37
|
+
"run": {
|
|
38
|
+
"description": "按依赖顺序在工作区的各包中运行一个脚本",
|
|
39
|
+
"arguments": {
|
|
40
|
+
"script": "要运行的脚本,在拥有它的包中运行"
|
|
41
|
+
},
|
|
42
|
+
"options": {
|
|
43
|
+
"concurrency": "同时运行的包数(默认是处理器数量)",
|
|
44
|
+
"bail": "遇到第一个失败就停止",
|
|
45
|
+
"parallel": "所有包同时运行,不等待它们的依赖(开发服务器、监视进程)",
|
|
46
|
+
"scope": "要运行的包,按名称(可使用 * 通配符)"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"version": {
|
|
50
|
+
"description": "为工作区的各包设置下一个版本,并更新它们之间的依赖",
|
|
51
|
+
"arguments": {
|
|
52
|
+
"bump": "major、minor、patch、premajor、preminor、prepatch、prerelease,或一个版本号"
|
|
53
|
+
},
|
|
54
|
+
"options": {
|
|
55
|
+
"preid": "预发布版本的标识(如 beta)",
|
|
56
|
+
"git": "提交这些修改并打上标签 v<版本>",
|
|
57
|
+
"yes": "不经确认直接设置版本"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"add": {
|
|
61
|
+
"description": "向工作区添加一个包(packages/<名称>):TypeScript 包,或用 --native [gyp|cmake|rust] 添加原生插件",
|
|
62
|
+
"arguments": {
|
|
63
|
+
"name": "包的名称(工作区的 packages/<名称>)"
|
|
64
|
+
},
|
|
65
|
+
"options": {
|
|
66
|
+
"native": "原生插件,按构建系统:gyp(C++,node-gyp,默认)、cmake(C++,cmake-js)或 rust(napi-rs)",
|
|
67
|
+
"to": "依赖它的工作区包"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"list": {
|
|
71
|
+
"description": "列出工作区的包"
|
|
72
|
+
},
|
|
73
|
+
"package": {
|
|
74
|
+
"description": "打包编译后的应用:打包成一个 JavaScript 文件、可执行文件或安装包",
|
|
75
|
+
"bundle": {
|
|
76
|
+
"description": "把编译后的应用及其依赖打包成一个由 node 运行的文件",
|
|
77
|
+
"options": {
|
|
78
|
+
"entry": "应用编译后的入口(默认是 package.json 的 main)",
|
|
79
|
+
"outfile": "打包输出的文件(默认 dist/<名称>.cjs)",
|
|
80
|
+
"minify": "压缩打包结果",
|
|
81
|
+
"external": "不打进包里的模块,运行时从旁边的 node_modules 加载(原生插件会自动处理)"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"exe": {
|
|
85
|
+
"description": "为当前平台生成编译后应用的可执行文件,无需安装 Node.js 即可运行",
|
|
86
|
+
"options": {
|
|
87
|
+
"entry": "应用编译后的入口(默认是 package.json 的 main)",
|
|
88
|
+
"outdir": "可执行文件所在的目录(默认 dist)",
|
|
89
|
+
"minify": "压缩嵌入可执行文件的包",
|
|
90
|
+
"external": "不打进包里的模块(它们不在可执行文件中,而是从旁边的 node_modules 加载)",
|
|
91
|
+
"runtime": "嵌入可执行文件的运行时:node(Node.js 的单可执行应用,默认)或 bun(Bun,安装在项目中或系统上)",
|
|
92
|
+
"layout": "单个文件,原生插件和资源嵌入其中(file,默认);或一个目录:可执行文件及其旁边的原生插件和资源(directory)"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"installer": {
|
|
96
|
+
"description": "为当前平台生成编译后应用的安装包:安装可执行文件、原生插件和资源,把程序加入 PATH,并注册系统服务",
|
|
97
|
+
"options": {
|
|
98
|
+
"target": "要生成的安装包:Linux 上为 deb、rpm、apk、archlinux、tar.gz,macOS 上为 pkg、tar.gz,Windows 上为 nsis、msi、zip(默认取 package.json 的 lakutata.installer)",
|
|
99
|
+
"outdir": "安装包所在的目录(默认 dist/installer)",
|
|
100
|
+
"entry": "应用编译后的入口(默认是 package.json 的 main)",
|
|
101
|
+
"minify": "压缩嵌入可执行文件的包",
|
|
102
|
+
"external": "不打进包里的模块"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"migration": {
|
|
107
|
+
"description": "生成、创建、执行、回滚或查看应用数据库的迁移",
|
|
108
|
+
"arguments": {
|
|
109
|
+
"action": "generate:根据实体的变化生成迁移;create <名称>:创建空迁移;run:执行待执行的迁移;revert:回滚最近执行的迁移;show:查看已执行和待执行的迁移",
|
|
110
|
+
"name": "要创建的迁移的名称(create)"
|
|
111
|
+
},
|
|
112
|
+
"options": {
|
|
113
|
+
"dir": "迁移所在的目录,相对于包(generate、create)",
|
|
114
|
+
"script": "构建并启动应用的包脚本(generate、run、revert、show)",
|
|
115
|
+
"package": "应用所在的工作区包(默认是当前目录)",
|
|
116
|
+
"database": "数据库:其 Database 组件或提供者的名称(默认全部;应用有多个数据库时,回滚必须指定)",
|
|
117
|
+
"transaction": "执行或回滚迁移的事务方式:all(一个事务,默认)、each(每个迁移一个)或 none",
|
|
118
|
+
"fake": "只标记迁移为已执行或已回滚,不实际执行"
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"native": {
|
|
122
|
+
"description": "修改当前目录原生插件的构建(binding.gyp、CMakeLists.txt、Cargo.toml):链接库、添加头文件目录、定义宏",
|
|
123
|
+
"arguments": {
|
|
124
|
+
"action": "link:链接一个库;include:添加头文件目录;define:定义宏(NAME 或 NAME=value)",
|
|
125
|
+
"value": "库(系统库,或包内的文件:.a .lib .so .dylib .dll)、目录或宏"
|
|
126
|
+
},
|
|
127
|
+
"options": {
|
|
128
|
+
"platform": "修改所针对的平台(默认是库文件所属的平台,否则为所有平台)",
|
|
129
|
+
"pkgConfig": "该库是 pkg-config 的包",
|
|
130
|
+
"framework": "该库是 macOS 的 framework",
|
|
131
|
+
"crate": "该库是一个 crate(Rust 插件,使用 cargo add)",
|
|
132
|
+
"target": "要修改的构建目标(默认是唯一的那个)"
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"i18n": {
|
|
136
|
+
"description": "检查各语言的翻译、声明键名的类型,或添加一种语言",
|
|
137
|
+
"arguments": {
|
|
138
|
+
"action": "check:检查各语言翻译的问题;types:声明消息的键名及其参数的类型;add <语言>:以默认语言的消息为模板添加一种语言",
|
|
139
|
+
"locale": "要添加的语言(add):zh-CN、ja、pt-BR"
|
|
140
|
+
},
|
|
141
|
+
"options": {
|
|
142
|
+
"dir": "翻译所在的目录:每种语言一个文件(zh-CN.json)或一个目录(zh-CN/);多个目录用逗号分隔",
|
|
143
|
+
"default": "默认语言:检查其他语言时的基准,生成类型声明和新语言时的来源",
|
|
144
|
+
"out": "类型声明文件(types)",
|
|
145
|
+
"module": "应用引入 i18n 的模块(types):lakutata/com/i18n 或 @lakutata/i18n",
|
|
146
|
+
"strict": "警告也视为检查失败(check)"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"help": {
|
|
151
|
+
"usage": "用法:",
|
|
152
|
+
"arguments": "参数:",
|
|
153
|
+
"options": "选项:",
|
|
154
|
+
"commands": "命令:",
|
|
155
|
+
"helpOption": "显示命令的帮助",
|
|
156
|
+
"helpCommand": "显示命令的帮助",
|
|
157
|
+
"versionOption": "显示版本号",
|
|
158
|
+
"default": "默认:{value}",
|
|
159
|
+
"choices": "可选:{choices}",
|
|
160
|
+
"negate": "关闭 {flag}",
|
|
161
|
+
"hints": "({hints})",
|
|
162
|
+
"separator": ","
|
|
163
|
+
},
|
|
164
|
+
"prompt": {
|
|
165
|
+
"json": "不是 JSON 对象"
|
|
166
|
+
},
|
|
167
|
+
"prompts": {
|
|
168
|
+
"features": "项目的功能",
|
|
169
|
+
"create": "创建这个项目吗?",
|
|
170
|
+
"notCreated": "项目未创建",
|
|
171
|
+
"version": "设置这个版本吗?",
|
|
172
|
+
"notVersioned": "版本未修改"
|
|
173
|
+
},
|
|
174
|
+
"plan": {
|
|
175
|
+
"title": "项目",
|
|
176
|
+
"name": "名称",
|
|
177
|
+
"id": "ID",
|
|
178
|
+
"description": "描述",
|
|
179
|
+
"author": "作者",
|
|
180
|
+
"license": "许可证",
|
|
181
|
+
"template": "模板",
|
|
182
|
+
"features": "功能",
|
|
183
|
+
"none": "无",
|
|
184
|
+
"directory": "目录",
|
|
185
|
+
"dependencies": "依赖",
|
|
186
|
+
"notInstalled": "不安装",
|
|
187
|
+
"installed": "用 {manager} 安装",
|
|
188
|
+
"git": "Git",
|
|
189
|
+
"initialized": "初始化",
|
|
190
|
+
"notInitialized": "不初始化",
|
|
191
|
+
"version": "版本 {from} → {to}"
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cli": {
|
|
3
|
+
"description": "lakutata 框架的命令列工具:從範本建立專案,執行工作區各套件的指令碼並管理版本,打包應用程式並產生可執行檔。",
|
|
4
|
+
"commands": {
|
|
5
|
+
"create": {
|
|
6
|
+
"description": "從範本建立一個 lakutata 專案",
|
|
7
|
+
"options": {
|
|
8
|
+
"name": "應用程式的名稱",
|
|
9
|
+
"id": "應用程式的 ID(套件名稱),預設為名稱的小寫形式",
|
|
10
|
+
"template": "範本:官方範本的名稱(lakutata templates 會列出)、npm:<套件名稱>、github:<擁有者>/<儲存庫> 或一個目錄",
|
|
11
|
+
"path": "在哪個目錄下建立專案目錄",
|
|
12
|
+
"init": "直接在該目錄中建立專案,目錄可以已存在且非空",
|
|
13
|
+
"description": "應用程式的描述",
|
|
14
|
+
"author": "應用程式的作者",
|
|
15
|
+
"license": "應用程式的授權條款",
|
|
16
|
+
"packageManager": "安裝相依套件使用的套件管理器,預設是執行本工具的那個(none 表示不安裝)",
|
|
17
|
+
"with": "啟用範本的可選功能,多個用逗號分隔(lakutata templates 會列出):i18n",
|
|
18
|
+
"git": "初始化 git 儲存庫",
|
|
19
|
+
"yes": "不經確認直接建立專案"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"templates": {
|
|
23
|
+
"description": "列出專案範本",
|
|
24
|
+
"options": {
|
|
25
|
+
"refresh": "重新取得範本目錄,即使已有快取"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"clean": {
|
|
29
|
+
"description": "刪除目前目錄所在套件下的路徑,在各平台上都可用(預設是其 tsconfig.json 的 outDir)",
|
|
30
|
+
"arguments": {
|
|
31
|
+
"paths": "要刪除的路徑,相對於套件(預設是其 tsconfig.json 的 outDir 和 declarationDir)"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"info": {
|
|
35
|
+
"description": "顯示本工具和框架的版本"
|
|
36
|
+
},
|
|
37
|
+
"run": {
|
|
38
|
+
"description": "依相依關係的順序在工作區的各套件中執行一個指令碼",
|
|
39
|
+
"arguments": {
|
|
40
|
+
"script": "要執行的指令碼,在擁有它的套件中執行"
|
|
41
|
+
},
|
|
42
|
+
"options": {
|
|
43
|
+
"concurrency": "同時執行的套件數(預設是處理器數量)",
|
|
44
|
+
"bail": "遇到第一個失敗就停止",
|
|
45
|
+
"parallel": "所有套件同時執行,不等待它們的相依套件(開發伺服器、監看程序)",
|
|
46
|
+
"scope": "要執行的套件,依名稱(可使用 * 萬用字元)"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"version": {
|
|
50
|
+
"description": "為工作區的各套件設定下一個版本,並更新它們之間的相依關係",
|
|
51
|
+
"arguments": {
|
|
52
|
+
"bump": "major、minor、patch、premajor、preminor、prepatch、prerelease,或一個版本號"
|
|
53
|
+
},
|
|
54
|
+
"options": {
|
|
55
|
+
"preid": "預先發行版本的識別碼(如 beta)",
|
|
56
|
+
"git": "提交這些修改並打上標籤 v<版本>",
|
|
57
|
+
"yes": "不經確認直接設定版本"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"add": {
|
|
61
|
+
"description": "向工作區新增一個套件(packages/<名稱>):TypeScript 套件,或用 --native [gyp|cmake|rust] 新增原生外掛",
|
|
62
|
+
"arguments": {
|
|
63
|
+
"name": "套件的名稱(工作區的 packages/<名稱>)"
|
|
64
|
+
},
|
|
65
|
+
"options": {
|
|
66
|
+
"native": "原生外掛,依建置系統:gyp(C++,node-gyp,預設)、cmake(C++,cmake-js)或 rust(napi-rs)",
|
|
67
|
+
"to": "相依於它的工作區套件"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"list": {
|
|
71
|
+
"description": "列出工作區的套件"
|
|
72
|
+
},
|
|
73
|
+
"package": {
|
|
74
|
+
"description": "打包編譯後的應用程式:打包成一個 JavaScript 檔案、可執行檔或安裝套件",
|
|
75
|
+
"bundle": {
|
|
76
|
+
"description": "把編譯後的應用程式及其相依套件打包成一個由 node 執行的檔案",
|
|
77
|
+
"options": {
|
|
78
|
+
"entry": "應用程式編譯後的入口(預設是 package.json 的 main)",
|
|
79
|
+
"outfile": "打包輸出的檔案(預設 dist/<名稱>.cjs)",
|
|
80
|
+
"minify": "壓縮打包結果",
|
|
81
|
+
"external": "不打包進去的模組,執行時從旁邊的 node_modules 載入(原生外掛會自動處理)"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"exe": {
|
|
85
|
+
"description": "為目前平台產生編譯後應用程式的可執行檔,無需安裝 Node.js 即可執行",
|
|
86
|
+
"options": {
|
|
87
|
+
"entry": "應用程式編譯後的入口(預設是 package.json 的 main)",
|
|
88
|
+
"outdir": "可執行檔所在的目錄(預設 dist)",
|
|
89
|
+
"minify": "壓縮嵌入可執行檔的打包結果",
|
|
90
|
+
"external": "不打包進去的模組(它們不在可執行檔中,而是從旁邊的 node_modules 載入)",
|
|
91
|
+
"runtime": "嵌入可執行檔的執行環境:node(Node.js 的單一可執行應用程式,預設)或 bun(Bun,安裝在專案中或系統上)",
|
|
92
|
+
"layout": "單一檔案,原生外掛程式和資源嵌入其中(file,預設);或一個目錄:可執行檔及其旁邊的原生外掛程式和資源(directory)"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"installer": {
|
|
96
|
+
"description": "為目前平台產生編譯後應用程式的安裝套件:安裝可執行檔、原生外掛程式和資源,把程式加入 PATH,並註冊系統服務",
|
|
97
|
+
"options": {
|
|
98
|
+
"target": "要產生的安裝套件:Linux 上為 deb、rpm、apk、archlinux、tar.gz,macOS 上為 pkg、tar.gz,Windows 上為 nsis、msi、zip(預設取 package.json 的 lakutata.installer)",
|
|
99
|
+
"outdir": "安裝套件所在的目錄(預設 dist/installer)",
|
|
100
|
+
"entry": "應用程式編譯後的入口(預設是 package.json 的 main)",
|
|
101
|
+
"minify": "壓縮嵌入可執行檔的打包結果",
|
|
102
|
+
"external": "不打包進去的模組"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"migration": {
|
|
107
|
+
"description": "產生、建立、執行、復原或檢視應用程式資料庫的遷移",
|
|
108
|
+
"arguments": {
|
|
109
|
+
"action": "generate:根據實體的變化產生遷移;create <名稱>:建立空遷移;run:執行待執行的遷移;revert:復原最近執行的遷移;show:檢視已執行和待執行的遷移",
|
|
110
|
+
"name": "要建立的遷移的名稱(create)"
|
|
111
|
+
},
|
|
112
|
+
"options": {
|
|
113
|
+
"dir": "遷移所在的目錄,相對於套件(generate、create)",
|
|
114
|
+
"script": "建置並啟動應用程式的套件指令碼(generate、run、revert、show)",
|
|
115
|
+
"package": "應用程式所在的工作區套件(預設是目前目錄)",
|
|
116
|
+
"database": "資料庫:其 Database 元件或提供者的名稱(預設全部;應用程式有多個資料庫時,復原必須指定)",
|
|
117
|
+
"transaction": "執行或復原遷移的交易方式:all(一個交易,預設)、each(每個遷移一個)或 none",
|
|
118
|
+
"fake": "只標記遷移為已執行或已復原,不實際執行"
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"native": {
|
|
122
|
+
"description": "修改目前目錄原生外掛的建置(binding.gyp、CMakeLists.txt、Cargo.toml):連結程式庫、新增標頭檔目錄、定義巨集",
|
|
123
|
+
"arguments": {
|
|
124
|
+
"action": "link:連結一個程式庫;include:新增標頭檔目錄;define:定義巨集(NAME 或 NAME=value)",
|
|
125
|
+
"value": "程式庫(系統程式庫,或套件內的檔案:.a .lib .so .dylib .dll)、目錄或巨集"
|
|
126
|
+
},
|
|
127
|
+
"options": {
|
|
128
|
+
"platform": "修改所針對的平台(預設是程式庫檔案所屬的平台,否則為所有平台)",
|
|
129
|
+
"pkgConfig": "該程式庫是 pkg-config 的套件",
|
|
130
|
+
"framework": "該程式庫是 macOS 的 framework",
|
|
131
|
+
"crate": "該程式庫是一個 crate(Rust 外掛,使用 cargo add)",
|
|
132
|
+
"target": "要修改的建置目標(預設是唯一的那個)"
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"i18n": {
|
|
136
|
+
"description": "檢查各語言的翻譯、宣告鍵名的型別,或新增一種語言",
|
|
137
|
+
"arguments": {
|
|
138
|
+
"action": "check:檢查各語言翻譯的問題;types:宣告訊息的鍵名及其參數的型別;add <語言>:以預設語言的訊息為範本新增一種語言",
|
|
139
|
+
"locale": "要新增的語言(add):zh-CN、ja、pt-BR"
|
|
140
|
+
},
|
|
141
|
+
"options": {
|
|
142
|
+
"dir": "翻譯所在的目錄:每種語言一個檔案(zh-CN.json)或一個目錄(zh-CN/);多個目錄用逗號分隔",
|
|
143
|
+
"default": "預設語言:檢查其他語言時的基準,產生型別宣告和新語言時的來源",
|
|
144
|
+
"out": "型別宣告檔案(types)",
|
|
145
|
+
"module": "應用程式匯入 i18n 的模組(types):lakutata/com/i18n 或 @lakutata/i18n",
|
|
146
|
+
"strict": "警告也視為檢查失敗(check)"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"help": {
|
|
151
|
+
"usage": "用法:",
|
|
152
|
+
"arguments": "參數:",
|
|
153
|
+
"options": "選項:",
|
|
154
|
+
"commands": "命令:",
|
|
155
|
+
"helpOption": "顯示命令的說明",
|
|
156
|
+
"helpCommand": "顯示命令的說明",
|
|
157
|
+
"versionOption": "顯示版本號",
|
|
158
|
+
"default": "預設:{value}",
|
|
159
|
+
"choices": "可選:{choices}",
|
|
160
|
+
"negate": "關閉 {flag}",
|
|
161
|
+
"hints": "({hints})",
|
|
162
|
+
"separator": ","
|
|
163
|
+
},
|
|
164
|
+
"prompt": {
|
|
165
|
+
"json": "不是 JSON 物件"
|
|
166
|
+
},
|
|
167
|
+
"prompts": {
|
|
168
|
+
"features": "專案的功能",
|
|
169
|
+
"create": "建立這個專案嗎?",
|
|
170
|
+
"notCreated": "專案未建立",
|
|
171
|
+
"version": "設定這個版本嗎?",
|
|
172
|
+
"notVersioned": "版本未修改"
|
|
173
|
+
},
|
|
174
|
+
"plan": {
|
|
175
|
+
"title": "專案",
|
|
176
|
+
"name": "名稱",
|
|
177
|
+
"id": "ID",
|
|
178
|
+
"description": "描述",
|
|
179
|
+
"author": "作者",
|
|
180
|
+
"license": "授權條款",
|
|
181
|
+
"template": "範本",
|
|
182
|
+
"features": "功能",
|
|
183
|
+
"none": "無",
|
|
184
|
+
"directory": "目錄",
|
|
185
|
+
"dependencies": "相依套件",
|
|
186
|
+
"notInstalled": "不安裝",
|
|
187
|
+
"installed": "用 {manager} 安裝",
|
|
188
|
+
"git": "Git",
|
|
189
|
+
"initialized": "初始化",
|
|
190
|
+
"notInitialized": "不初始化",
|
|
191
|
+
"version": "版本 {from} → {to}"
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|