done-coding-template 0.7.8-alpha.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/README.md +7 -0
- package/es/cli.mjs +8 -0
- package/es/index.mjs +28 -0
- package/es/main-b3266c2d.js +489 -0
- package/package.json +53 -0
- package/types/cli.d.ts +2 -0
- package/types/handler.d.ts +5 -0
- package/types/index.d.ts +5 -0
- package/types/injectInfo.json.d.ts +11 -0
- package/types/json/default.json.d.ts +38 -0
- package/types/main.d.ts +9 -0
- package/types/utils/compile.d.ts +16 -0
- package/types/utils/config.d.ts +3 -0
- package/types/utils/dealOptions.d.ts +21 -0
- package/types/utils/index.d.ts +6 -0
- package/types/utils/init.d.ts +6 -0
- package/types/utils/path.d.ts +4 -0
- package/types/utils/types.d.ts +82 -0
package/README.md
ADDED
package/es/cli.mjs
ADDED
package/es/index.mjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { M as r } from "./main-b3266c2d.js";
|
|
3
|
+
import { O as E, S as h, T as b, b as T, c as A, a as H, h as O, i as S } from "./main-b3266c2d.js";
|
|
4
|
+
import t from "node:path";
|
|
5
|
+
import { existsSync as n } from "node:fs";
|
|
6
|
+
import "@done-coding/cli-utils";
|
|
7
|
+
import "lodash.template";
|
|
8
|
+
import "lodash.assign";
|
|
9
|
+
const u = ({
|
|
10
|
+
rootDir: e,
|
|
11
|
+
configPath: o = r
|
|
12
|
+
}) => {
|
|
13
|
+
const a = t.resolve(e, o);
|
|
14
|
+
if (n(a))
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
export {
|
|
18
|
+
r as MODULE_DEFAULT_CONFIG_RELATIVE_PATH,
|
|
19
|
+
E as OutputModeEnum,
|
|
20
|
+
h as SubcommandEnum,
|
|
21
|
+
b as TemplateBindKeyEnum,
|
|
22
|
+
T as batchCompileHandler,
|
|
23
|
+
A as compileHandler,
|
|
24
|
+
H as crateAsSubcommand,
|
|
25
|
+
u as getConfigPath,
|
|
26
|
+
O as handler,
|
|
27
|
+
S as initHandler
|
|
28
|
+
};
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { getConfigFileCommonOptions as N, getUseDefaultConfig as V, initHandlerCommon as W, log as a, xPrompts as R, readConfigFile as G, _curry as T, createSubcommand as A, createMainCommand as Y } from "@done-coding/cli-utils";
|
|
3
|
+
import k from "node:path";
|
|
4
|
+
import f from "node:fs";
|
|
5
|
+
import O from "lodash.template";
|
|
6
|
+
import B from "lodash.assign";
|
|
7
|
+
var h = /* @__PURE__ */ ((e) => (e.INIT = "init", e.COMPILE = "compile", e))(h || {}), J = /* @__PURE__ */ ((e) => (e.REPOSITORY_URL = "REPOSITORY_URL", e))(J || {}), b = /* @__PURE__ */ ((e) => (e.OVERWRITE = "overwrite", e.APPEND = "append", e.REPLACE = "replace", e.RETURN = "return", e))(b || {});
|
|
8
|
+
const _ = {
|
|
9
|
+
name: "@done-coding/cli-template",
|
|
10
|
+
version: "0.7.8-alpha.1",
|
|
11
|
+
description: "预编译命令行工具",
|
|
12
|
+
cliConfig: {
|
|
13
|
+
namespaceDir: ".done-coding",
|
|
14
|
+
moduleName: "template"
|
|
15
|
+
}
|
|
16
|
+
}, {
|
|
17
|
+
cliConfig: { namespaceDir: K, moduleName: q }
|
|
18
|
+
} = _, z = `./${K}/${q}`, I = `${z}.json`, v = {
|
|
19
|
+
rollback: !1,
|
|
20
|
+
dealMarkdown: !1,
|
|
21
|
+
mode: b.OVERWRITE,
|
|
22
|
+
batch: !1,
|
|
23
|
+
rollbackDelNullFile: !1
|
|
24
|
+
}, S = (e) => {
|
|
25
|
+
const {
|
|
26
|
+
rollback: t,
|
|
27
|
+
dealMarkdown: s,
|
|
28
|
+
mode: c,
|
|
29
|
+
batch: l,
|
|
30
|
+
rootDir: o,
|
|
31
|
+
configPath: i,
|
|
32
|
+
rollbackDelNullFile: r,
|
|
33
|
+
...u
|
|
34
|
+
} = e, { rootDir: g, configPath: D } = N({
|
|
35
|
+
configPathDefault: I
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
rollback: t ?? v.rollback,
|
|
39
|
+
rollbackDelNullFile: r ?? v.rollbackDelNullFile,
|
|
40
|
+
dealMarkdown: s ?? v.dealMarkdown,
|
|
41
|
+
mode: c ?? v.mode,
|
|
42
|
+
batch: l ?? v.batch,
|
|
43
|
+
rootDir: o ?? g.default,
|
|
44
|
+
configPath: i ?? D.default,
|
|
45
|
+
...u
|
|
46
|
+
};
|
|
47
|
+
}, Z = () => ({
|
|
48
|
+
env: {
|
|
49
|
+
alias: "e",
|
|
50
|
+
describe: "环境数据文件JSON文件相对路径(优先级高于envData)",
|
|
51
|
+
type: "string"
|
|
52
|
+
},
|
|
53
|
+
envData: {
|
|
54
|
+
alias: "E",
|
|
55
|
+
describe: "环境变量数据(JSON字符串)",
|
|
56
|
+
type: "string"
|
|
57
|
+
},
|
|
58
|
+
input: {
|
|
59
|
+
alias: "i",
|
|
60
|
+
describe: "模板文件相对路径(优先级高于inputTemplate)",
|
|
61
|
+
type: "string"
|
|
62
|
+
},
|
|
63
|
+
inputData: {
|
|
64
|
+
alias: "I",
|
|
65
|
+
describe: "模板数据",
|
|
66
|
+
type: "string"
|
|
67
|
+
},
|
|
68
|
+
mode: {
|
|
69
|
+
alias: "m",
|
|
70
|
+
describe: "输出模式",
|
|
71
|
+
type: "string",
|
|
72
|
+
choices: [
|
|
73
|
+
b.OVERWRITE,
|
|
74
|
+
b.APPEND,
|
|
75
|
+
b.REPLACE,
|
|
76
|
+
b.RETURN
|
|
77
|
+
],
|
|
78
|
+
default: v.mode
|
|
79
|
+
},
|
|
80
|
+
output: {
|
|
81
|
+
alias: "o",
|
|
82
|
+
describe: "输出文件路径",
|
|
83
|
+
type: "string"
|
|
84
|
+
},
|
|
85
|
+
rollback: {
|
|
86
|
+
alias: "r",
|
|
87
|
+
describe: "是否回滚",
|
|
88
|
+
type: "boolean",
|
|
89
|
+
default: v.rollback
|
|
90
|
+
},
|
|
91
|
+
dealMarkdown: {
|
|
92
|
+
alias: "d",
|
|
93
|
+
describe: "(检测是markdown)是否处理(单个)代码块包裹",
|
|
94
|
+
type: "boolean",
|
|
95
|
+
default: v.dealMarkdown
|
|
96
|
+
},
|
|
97
|
+
batch: {
|
|
98
|
+
alias: "b",
|
|
99
|
+
describe: "是否批量处理",
|
|
100
|
+
type: "boolean",
|
|
101
|
+
default: v.batch
|
|
102
|
+
},
|
|
103
|
+
...N({
|
|
104
|
+
configPathDefault: I
|
|
105
|
+
})
|
|
106
|
+
}), Q = {
|
|
107
|
+
globalEnvData: {},
|
|
108
|
+
collectEnvDataForm: [
|
|
109
|
+
{
|
|
110
|
+
key: "name",
|
|
111
|
+
label: "项目名"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
key: "chineseName",
|
|
115
|
+
label: "项目中文名"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
key: "description",
|
|
119
|
+
label: "描述",
|
|
120
|
+
initial: "这是一个描述"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
key: "repositoryUrl",
|
|
124
|
+
label: "仓库地址",
|
|
125
|
+
initial: "",
|
|
126
|
+
bindKey: "REPOSITORY_URL"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
list: [
|
|
130
|
+
{
|
|
131
|
+
input: "./package.json",
|
|
132
|
+
output: "./package.json",
|
|
133
|
+
mode: "replace"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
input: "./README.md",
|
|
137
|
+
output: "./README.md",
|
|
138
|
+
mode: "replace"
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
}, X = () => N({
|
|
142
|
+
configPathDefault: I
|
|
143
|
+
}), ee = async (e) => {
|
|
144
|
+
let t = {};
|
|
145
|
+
if (e)
|
|
146
|
+
t = Q;
|
|
147
|
+
else {
|
|
148
|
+
const { globalEnvCount: s, collectEnvCount: c, compileFileCount: l } = await R([
|
|
149
|
+
{
|
|
150
|
+
name: "globalEnvCount",
|
|
151
|
+
type: "number",
|
|
152
|
+
message: "全局固定变量数量",
|
|
153
|
+
initial: 1,
|
|
154
|
+
format: (o) => Number(o) || 0,
|
|
155
|
+
validate: (o) => o >= 0
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
name: "collectEnvCount",
|
|
159
|
+
type: "number",
|
|
160
|
+
message: "采集变量数量",
|
|
161
|
+
initial: 1,
|
|
162
|
+
format: (o) => Number(o) || 0,
|
|
163
|
+
validate: (o) => o >= 0
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: "compileFileCount",
|
|
167
|
+
type: "number",
|
|
168
|
+
message: "预编译文件数量",
|
|
169
|
+
initial: 1,
|
|
170
|
+
format: (o) => Number(o) || 0,
|
|
171
|
+
validate: (o) => o >= 0
|
|
172
|
+
}
|
|
173
|
+
]);
|
|
174
|
+
s && (t.globalEnvData = Array.from({
|
|
175
|
+
length: s
|
|
176
|
+
}).reduce((o, i, r) => (o[`GLOBAL_${r}`] = "", o), {})), c && (t.collectEnvDataForm = Array.from({
|
|
177
|
+
length: c
|
|
178
|
+
}).map((o, i) => ({
|
|
179
|
+
key: `COLLECT_KEY_${i}`,
|
|
180
|
+
label: `COLLECT_LABEL_${i}`,
|
|
181
|
+
initial: void 0
|
|
182
|
+
}))), l && (t.list = Array.from({
|
|
183
|
+
length: l
|
|
184
|
+
}).map((o, i) => ({
|
|
185
|
+
input: `(相对于命令运行目录)需要编译的模板文件路径${i}`,
|
|
186
|
+
output: `(相对于命令运行目录)编译后输出的文件路径${i}`,
|
|
187
|
+
mode: b.REPLACE
|
|
188
|
+
})));
|
|
189
|
+
}
|
|
190
|
+
return t;
|
|
191
|
+
}, te = async (e) => {
|
|
192
|
+
const t = await V(), s = await ee(t);
|
|
193
|
+
await W(s, e, {
|
|
194
|
+
edit: !0,
|
|
195
|
+
onFileGenerated(c) {
|
|
196
|
+
t || a.success(`配置文件已生成:${c}
|
|
197
|
+
请具体需要替换
|
|
198
|
+
globalEnvData中的 GLOBAL_\${index}及其对应值
|
|
199
|
+
collectEnvDataForm各项中 COLLECT_KEY_\${index} COLLECT_LABEL_\${index}
|
|
200
|
+
list各项中的 input值 output值
|
|
201
|
+
`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}, x = ({
|
|
205
|
+
rootDir: e,
|
|
206
|
+
filePath: t,
|
|
207
|
+
dataInit: s,
|
|
208
|
+
limitJson: c,
|
|
209
|
+
filePathKey: l,
|
|
210
|
+
dataInitKey: o,
|
|
211
|
+
dealMarkdown: i = !1
|
|
212
|
+
}) => {
|
|
213
|
+
if (t) {
|
|
214
|
+
if (c && !t.endsWith(".json"))
|
|
215
|
+
return a.error(`${l}必须是json文件,请检查文件后缀名`), process.exit(1);
|
|
216
|
+
const r = f.readFileSync(
|
|
217
|
+
k.resolve(e, t),
|
|
218
|
+
"utf-8"
|
|
219
|
+
);
|
|
220
|
+
let u = r;
|
|
221
|
+
return i && t.endsWith(".md") && (u = r.replace(
|
|
222
|
+
/^\s*```[a-zA-Z0-9]+\s*[\r\n]+([\s\S]+?)```\s*$/,
|
|
223
|
+
"$1"
|
|
224
|
+
)), c ? JSON.parse(u) : u;
|
|
225
|
+
} else
|
|
226
|
+
return s ? (a.info(`${l} 为空,将使用${o}作为数据`), c ? JSON.parse(s) : s) : (a.error(`${l}与${o}不能同时为空`), process.exit(1));
|
|
227
|
+
}, P = (e, t) => {
|
|
228
|
+
if (!t)
|
|
229
|
+
return a.error(`${e}模式下output不能为空`), process.exit(1);
|
|
230
|
+
}, w = (e, t) => {
|
|
231
|
+
if (t && e === t)
|
|
232
|
+
return a.error("output与input不能相同"), process.exit(1);
|
|
233
|
+
}, ne = (e, t) => {
|
|
234
|
+
if (!t)
|
|
235
|
+
return a.error(`${e}模式下input不能为空`), process.exit(1);
|
|
236
|
+
}, M = async (e, {
|
|
237
|
+
rootDir: t,
|
|
238
|
+
rollbackDelFileAgree: s = !1
|
|
239
|
+
}) => {
|
|
240
|
+
const {
|
|
241
|
+
env: c,
|
|
242
|
+
input: l,
|
|
243
|
+
inputData: o,
|
|
244
|
+
output: i,
|
|
245
|
+
mode: r,
|
|
246
|
+
rollback: u,
|
|
247
|
+
rollbackDelNullFile: g,
|
|
248
|
+
dealMarkdown: D,
|
|
249
|
+
envData: E
|
|
250
|
+
} = e;
|
|
251
|
+
if (u)
|
|
252
|
+
switch (r) {
|
|
253
|
+
case b.REPLACE:
|
|
254
|
+
case b.RETURN: {
|
|
255
|
+
a.error(`${r}模式不支持回滚`);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
a.stage(`开始处理模板
|
|
260
|
+
mode: ${r}
|
|
261
|
+
rollback: ${u}
|
|
262
|
+
`);
|
|
263
|
+
const m = x({
|
|
264
|
+
rootDir: t,
|
|
265
|
+
filePath: l,
|
|
266
|
+
dataInit: o,
|
|
267
|
+
limitJson: !1,
|
|
268
|
+
filePathKey: "input",
|
|
269
|
+
dataInitKey: "inputData",
|
|
270
|
+
dealMarkdown: D
|
|
271
|
+
}), d = O(m), C = typeof E == "function" ? E() : E, p = d(C);
|
|
272
|
+
switch (r) {
|
|
273
|
+
case b.OVERWRITE: {
|
|
274
|
+
P(r, i), w(i, l);
|
|
275
|
+
const n = k.resolve(t, i);
|
|
276
|
+
if (f.mkdirSync(k.dirname(n), { recursive: !0 }), f.existsSync(n)) {
|
|
277
|
+
if (u)
|
|
278
|
+
if (s || (await R({
|
|
279
|
+
type: "confirm",
|
|
280
|
+
name: "remove",
|
|
281
|
+
message: `${r}模式下回滚将删除${n},是否继续?`
|
|
282
|
+
})).remove) {
|
|
283
|
+
f.rmSync(n, { force: !0 }), a.success(`${r}模式下${n}已删除`);
|
|
284
|
+
return;
|
|
285
|
+
} else {
|
|
286
|
+
a.warn(`${r}模式下${n}回滚取消`);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
a.info(`output:${n} 已存在,将覆盖`);
|
|
290
|
+
} else {
|
|
291
|
+
if (u) {
|
|
292
|
+
a.warn(`${r}模式下${n}不存在,无需回滚`);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
a.stage(`output:${n} 不存在,将创建`);
|
|
296
|
+
}
|
|
297
|
+
f.writeFileSync(n, p, "utf-8"), a.success(`模板处理完成,输出到 ${n}`);
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
case b.APPEND: {
|
|
301
|
+
P(r, i), w(i, l);
|
|
302
|
+
const n = k.resolve(t, i);
|
|
303
|
+
if (f.mkdirSync(k.dirname(n), { recursive: !0 }), f.existsSync(n)) {
|
|
304
|
+
const $ = f.readFileSync(n, "utf-8");
|
|
305
|
+
if (u) {
|
|
306
|
+
const L = $.replace(p, "");
|
|
307
|
+
L || !g ? f.writeFileSync(n, L, "utf-8") : (a.stage(`${r}模式下 文件为空 删除`), f.unlinkSync(n)), a.success(`${r}模式下${n}回滚完成`);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const y = $ + p;
|
|
311
|
+
f.writeFileSync(n, y, "utf-8"), a.success(`模板处理完成,追加到 ${n}`);
|
|
312
|
+
} else {
|
|
313
|
+
if (u) {
|
|
314
|
+
a.warn(`${r}模式下${n}不存在,无需回滚`);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
a.stage(`output:${n} 不存在,将创建`), f.writeFileSync(n, p, "utf-8"), a.success(`模板处理完成,输出到 ${n}`);
|
|
318
|
+
}
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
case b.REPLACE: {
|
|
322
|
+
if (i && a.warn(`output ${i} 将被忽略`), ne(r, l), c && c === l)
|
|
323
|
+
return a.error("env 与 input 不能相同"), process.exit(1);
|
|
324
|
+
const n = k.resolve(t, l);
|
|
325
|
+
let $ = n;
|
|
326
|
+
const y = O(n)(C);
|
|
327
|
+
y !== n && (a.success(`检测输入文件名也需要替换
|
|
328
|
+
${n} => ${y}`), f.rmSync(n), $ = y), f.mkdirSync(k.dirname($), { recursive: !0 }), f.writeFileSync($, p, "utf-8"), a.success(`模板处理完成,输出到 ${$}`);
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
case b.RETURN:
|
|
332
|
+
return a.success("模板处理完成,返回结果(函数调用才会拿到返回值)"), p;
|
|
333
|
+
default:
|
|
334
|
+
return a.error(`mode ${r} 不支持`), process.exit(1);
|
|
335
|
+
}
|
|
336
|
+
return p;
|
|
337
|
+
}, ae = async ({
|
|
338
|
+
rootDir: e,
|
|
339
|
+
configPath: t = I,
|
|
340
|
+
itemDefaultRollback: s = !1,
|
|
341
|
+
extraEnvData: c = {}
|
|
342
|
+
}, l) => {
|
|
343
|
+
let o;
|
|
344
|
+
if (l ? o = l : o = await G({
|
|
345
|
+
rootDir: e,
|
|
346
|
+
configPath: t
|
|
347
|
+
}), !o)
|
|
348
|
+
return a.error("读取配置文件失败"), process.exit(1);
|
|
349
|
+
const {
|
|
350
|
+
list: i = [],
|
|
351
|
+
globalEnvData: r = {},
|
|
352
|
+
collectEnvDataForm: u = []
|
|
353
|
+
} = o, g = {};
|
|
354
|
+
for (const m of u) {
|
|
355
|
+
let d, C, p;
|
|
356
|
+
typeof m == "string" ? (d = m, C = m, p = void 0) : (d = m.key, C = m.label, p = m.initial), g[d] = (await R({
|
|
357
|
+
type: "text",
|
|
358
|
+
name: d,
|
|
359
|
+
message: `请输入${C}`,
|
|
360
|
+
initial: p,
|
|
361
|
+
format: (n) => n.trim(),
|
|
362
|
+
validate: (n) => n.length > 0 || `${C}不能为空`
|
|
363
|
+
}))[d];
|
|
364
|
+
}
|
|
365
|
+
const D = i.map((m) => {
|
|
366
|
+
const { rollback: d = s } = m, {
|
|
367
|
+
envData: C,
|
|
368
|
+
env: p,
|
|
369
|
+
input: n,
|
|
370
|
+
output: $,
|
|
371
|
+
...y
|
|
372
|
+
} = S(m);
|
|
373
|
+
return p && a.warn(`批量处理中 env:${p} 将被忽略, 只读envData`), {
|
|
374
|
+
...y,
|
|
375
|
+
env: p,
|
|
376
|
+
input: n,
|
|
377
|
+
output: $,
|
|
378
|
+
envData: B(
|
|
379
|
+
{},
|
|
380
|
+
c,
|
|
381
|
+
r,
|
|
382
|
+
g,
|
|
383
|
+
C
|
|
384
|
+
),
|
|
385
|
+
rollback: d
|
|
386
|
+
};
|
|
387
|
+
}), E = [];
|
|
388
|
+
for (const m of D) {
|
|
389
|
+
const d = await M(m, {
|
|
390
|
+
rollbackDelFileAgree: !0,
|
|
391
|
+
rootDir: e
|
|
392
|
+
});
|
|
393
|
+
E.push(d);
|
|
394
|
+
}
|
|
395
|
+
return E;
|
|
396
|
+
}, oe = async (e) => {
|
|
397
|
+
const {
|
|
398
|
+
envData: t,
|
|
399
|
+
env: s,
|
|
400
|
+
input: c,
|
|
401
|
+
inputData: l,
|
|
402
|
+
output: o,
|
|
403
|
+
mode: i,
|
|
404
|
+
rollback: r,
|
|
405
|
+
rollbackDelNullFile: u,
|
|
406
|
+
dealMarkdown: g,
|
|
407
|
+
batch: D,
|
|
408
|
+
rootDir: E,
|
|
409
|
+
configPath: m
|
|
410
|
+
} = S(e);
|
|
411
|
+
if (D)
|
|
412
|
+
return a.stage("开始批量处理"), ae({
|
|
413
|
+
// 回滚默认值 基于全局
|
|
414
|
+
itemDefaultRollback: r,
|
|
415
|
+
rootDir: E,
|
|
416
|
+
configPath: m
|
|
417
|
+
});
|
|
418
|
+
a.stage("开始单个处理");
|
|
419
|
+
const d = x({
|
|
420
|
+
rootDir: E,
|
|
421
|
+
filePath: s,
|
|
422
|
+
dataInit: t,
|
|
423
|
+
limitJson: !0,
|
|
424
|
+
filePathKey: "env",
|
|
425
|
+
dataInitKey: "envData",
|
|
426
|
+
dealMarkdown: g
|
|
427
|
+
});
|
|
428
|
+
return M(
|
|
429
|
+
{
|
|
430
|
+
input: c,
|
|
431
|
+
inputData: l,
|
|
432
|
+
output: o,
|
|
433
|
+
mode: i,
|
|
434
|
+
rollback: r,
|
|
435
|
+
rollbackDelNullFile: u,
|
|
436
|
+
dealMarkdown: g,
|
|
437
|
+
envData: d
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
rootDir: E
|
|
441
|
+
}
|
|
442
|
+
);
|
|
443
|
+
}, U = async (e, t) => e === h.INIT ? te(t) : e === h.COMPILE ? oe(t) : (a.error(`无效的命令: ${e}`), process.exit(1)), {
|
|
444
|
+
version: re,
|
|
445
|
+
description: ie,
|
|
446
|
+
cliConfig: { moduleName: F }
|
|
447
|
+
} = _, le = {
|
|
448
|
+
command: h.INIT,
|
|
449
|
+
describe: "初始化模板配置文件",
|
|
450
|
+
options: X(),
|
|
451
|
+
handler: T(U)(
|
|
452
|
+
h.INIT
|
|
453
|
+
)
|
|
454
|
+
}, se = {
|
|
455
|
+
command: h.COMPILE,
|
|
456
|
+
describe: "编译模板",
|
|
457
|
+
options: Z(),
|
|
458
|
+
handler: T(U)(
|
|
459
|
+
h.COMPILE
|
|
460
|
+
)
|
|
461
|
+
}, j = {
|
|
462
|
+
describe: ie,
|
|
463
|
+
version: re,
|
|
464
|
+
subcommands: [le, se].map(
|
|
465
|
+
A
|
|
466
|
+
),
|
|
467
|
+
demandCommandCount: 1
|
|
468
|
+
}, H = (e = !1) => {
|
|
469
|
+
const t = e ? F : void 0, s = `$0${e ? ` ${F}` : ""} <command> [options]`;
|
|
470
|
+
return { command: t, usage: s };
|
|
471
|
+
}, de = async () => Y({
|
|
472
|
+
...j,
|
|
473
|
+
...H()
|
|
474
|
+
}), be = () => A({
|
|
475
|
+
...j,
|
|
476
|
+
...H(!0)
|
|
477
|
+
});
|
|
478
|
+
export {
|
|
479
|
+
I as M,
|
|
480
|
+
b as O,
|
|
481
|
+
h as S,
|
|
482
|
+
J as T,
|
|
483
|
+
be as a,
|
|
484
|
+
ae as b,
|
|
485
|
+
oe as c,
|
|
486
|
+
de as d,
|
|
487
|
+
U as h,
|
|
488
|
+
te as i
|
|
489
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "done-coding-template",
|
|
3
|
+
"version": "0.7.8-alpha.1",
|
|
4
|
+
"description": "预编译命令行工具",
|
|
5
|
+
"private": false,
|
|
6
|
+
"module": "es/index.mjs",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"types": "types/index.d.ts",
|
|
9
|
+
"bin": "es/cli.mjs",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./es/index.mjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"es",
|
|
17
|
+
"lib",
|
|
18
|
+
"types"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://gitee.com/justsosu/done-coding-cli.git",
|
|
24
|
+
"directory": "packages/template"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public",
|
|
28
|
+
"registry": "https://registry.npmjs.org/"
|
|
29
|
+
},
|
|
30
|
+
"author": "JustSoSu",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"sideEffects": false,
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@done-coding/cli-inject": "^0.5.8-alpha.0",
|
|
35
|
+
"@types/lodash.assign": "^4.2.9",
|
|
36
|
+
"@types/lodash.template": "^4.5.3",
|
|
37
|
+
"@types/node": "^18.0.0",
|
|
38
|
+
"@types/yargs": "^17.0.28",
|
|
39
|
+
"rimraf": "^6.0.1",
|
|
40
|
+
"typescript": "^5.2.2",
|
|
41
|
+
"vite": "^4.4.11",
|
|
42
|
+
"vite-plugin-dts": "^3.6.0"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18.0.0"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@done-coding/cli-utils": "^0.6.0-alpha.0",
|
|
49
|
+
"lodash.assign": "^4.2.0",
|
|
50
|
+
"lodash.template": "^4.5.0"
|
|
51
|
+
},
|
|
52
|
+
"gitHead": "5879161383e32e7bed351d71d3ef607d81dc021a"
|
|
53
|
+
}
|
package/types/cli.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CompileOptions, InitOptions } from './utils';
|
|
2
|
+
import { SubcommandEnum } from './utils';
|
|
3
|
+
import type { CliHandlerArgv } from "@done-coding/cli-utils";
|
|
4
|
+
/** 命令处理函数 */
|
|
5
|
+
export declare const handler: (command: SubcommandEnum, argv: CliHandlerArgv<InitOptions | CompileOptions>) => Promise<string | void | (string | undefined)[]>;
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
"globalEnvData": {},
|
|
3
|
+
"collectEnvDataForm": [
|
|
4
|
+
{
|
|
5
|
+
"key": "name",
|
|
6
|
+
"label": "项目名"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"key": "chineseName",
|
|
10
|
+
"label": "项目中文名"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"key": "description",
|
|
14
|
+
"label": "描述",
|
|
15
|
+
"initial": "这是一个描述"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"key": "repositoryUrl",
|
|
19
|
+
"label": "仓库地址",
|
|
20
|
+
"initial": "",
|
|
21
|
+
"bindKey": "REPOSITORY_URL"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"list": [
|
|
25
|
+
{
|
|
26
|
+
"input": "./package.json",
|
|
27
|
+
"output": "./package.json",
|
|
28
|
+
"mode": "replace"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"input": "./README.md",
|
|
32
|
+
"output": "./README.md",
|
|
33
|
+
"mode": "replace"
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default _default;
|
package/types/main.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="yargs" />
|
|
2
|
+
/** 作为主命令创建 */
|
|
3
|
+
export declare const createCommand: () => Promise<void | {
|
|
4
|
+
[x: string]: unknown;
|
|
5
|
+
_: (string | number)[];
|
|
6
|
+
$0: string;
|
|
7
|
+
}>;
|
|
8
|
+
/** 作为子命令创建 */
|
|
9
|
+
export declare const crateAsSubcommand: () => import("yargs").CommandModule<{}, {}>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CompileTemplateConfig } from '.';
|
|
2
|
+
import { type CompileOptions } from '.';
|
|
3
|
+
import type { CliHandlerArgv } from "@done-coding/cli-utils";
|
|
4
|
+
/** 批量编译模板 */
|
|
5
|
+
export declare const batchCompileHandler: ({ rootDir, configPath, itemDefaultRollback, extraEnvData, }: {
|
|
6
|
+
/** 项目更目录 */
|
|
7
|
+
rootDir: string;
|
|
8
|
+
/** 配置文件路径 */
|
|
9
|
+
configPath?: string | undefined;
|
|
10
|
+
/** item默认回滚? */
|
|
11
|
+
itemDefaultRollback?: boolean | undefined;
|
|
12
|
+
/** 额外环境变量 */
|
|
13
|
+
extraEnvData?: object | undefined;
|
|
14
|
+
}, paramsConfig?: CompileTemplateConfig) => Promise<(string | undefined)[]>;
|
|
15
|
+
/** 编译模板 */
|
|
16
|
+
export declare const compileHandler: (argv: CliHandlerArgv<CompileOptions>) => Promise<string | (string | undefined)[] | undefined>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type CliInfo } from "@done-coding/cli-utils";
|
|
2
|
+
import { OutputModeEnum, type CompileOptions } from "./types";
|
|
3
|
+
/** 编译默认选项 */
|
|
4
|
+
export declare const defaultCompileOptions: Pick<CompileOptions, "rollback" | "dealMarkdown" | "mode" | "batch" | "rollbackDelNullFile">;
|
|
5
|
+
/** 设置编译默认选项 */
|
|
6
|
+
export declare const completeDefaultCompileOptions: <T extends Pick<CompileOptions, "mode" | "rollback" | "rollbackDelNullFile" | "dealMarkdown" | "batch">>(options: T) => {
|
|
7
|
+
env?: string | undefined;
|
|
8
|
+
envData?: string | undefined;
|
|
9
|
+
input?: string | undefined;
|
|
10
|
+
inputData?: string | undefined;
|
|
11
|
+
output?: string | undefined;
|
|
12
|
+
rollback: boolean | undefined;
|
|
13
|
+
rollbackDelNullFile: boolean | undefined;
|
|
14
|
+
dealMarkdown: boolean | undefined;
|
|
15
|
+
mode: OutputModeEnum;
|
|
16
|
+
batch: boolean | undefined;
|
|
17
|
+
rootDir: string;
|
|
18
|
+
configPath: string;
|
|
19
|
+
};
|
|
20
|
+
/** 获取编译选项 */
|
|
21
|
+
export declare const getCompileOptions: () => CliInfo["options"];
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/// <reference types="yargs" />
|
|
2
|
+
import { type InitOptions } from '.';
|
|
3
|
+
import { type CliHandlerArgv } from "@done-coding/cli-utils";
|
|
4
|
+
export declare const getInitOptions: () => Record<keyof import("@done-coding/cli-utils").ConfigFileCommonOptions, import("yargs").Options>;
|
|
5
|
+
/** 初始化模板 */
|
|
6
|
+
export declare const initHandler: (argv: CliHandlerArgv<InitOptions>) => Promise<void>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { InitConfigFileOptions, ReadConfigFileOptions } from "@done-coding/cli-utils";
|
|
2
|
+
/** 子命令枚举 */
|
|
3
|
+
export declare enum SubcommandEnum {
|
|
4
|
+
/** 初始化模板 */
|
|
5
|
+
INIT = "init",
|
|
6
|
+
/** 编译模板 */
|
|
7
|
+
COMPILE = "compile"
|
|
8
|
+
}
|
|
9
|
+
export type InitOptions = InitConfigFileOptions;
|
|
10
|
+
/** 绑定的关键变量枚举 */
|
|
11
|
+
export declare enum TemplateBindKeyEnum {
|
|
12
|
+
/** 远程仓库地址 */
|
|
13
|
+
REPOSITORY_URL = "REPOSITORY_URL"
|
|
14
|
+
}
|
|
15
|
+
/** 输出模式 */
|
|
16
|
+
export declare enum OutputModeEnum {
|
|
17
|
+
/** 覆盖模式 */
|
|
18
|
+
OVERWRITE = "overwrite",
|
|
19
|
+
/** 追加模式 */
|
|
20
|
+
APPEND = "append",
|
|
21
|
+
/** 替换模式 */
|
|
22
|
+
REPLACE = "replace",
|
|
23
|
+
/** 返回模式--函数调用方式可用 */
|
|
24
|
+
RETURN = "return"
|
|
25
|
+
}
|
|
26
|
+
export interface CompileOptions {
|
|
27
|
+
/** 项目根目录 */
|
|
28
|
+
rootDir: string;
|
|
29
|
+
/** 配置文件路径 */
|
|
30
|
+
configPath?: string;
|
|
31
|
+
/** 环境数据(json)文件(优先级高于 envData ) */
|
|
32
|
+
env?: string;
|
|
33
|
+
/** 环境变量数据(JSON字符串) */
|
|
34
|
+
envData?: string;
|
|
35
|
+
/** 模板文件相对路径(优先级高于 inputData ) */
|
|
36
|
+
input?: string;
|
|
37
|
+
/** 模板数据 */
|
|
38
|
+
inputData?: string;
|
|
39
|
+
/** 输出文件相对路径 */
|
|
40
|
+
output?: string;
|
|
41
|
+
/** 输出模式 @default OutputModeEnum.OVERWRITE */
|
|
42
|
+
mode: OutputModeEnum;
|
|
43
|
+
/** 是否回滚 @default false */
|
|
44
|
+
rollback?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* 回滚删除空文件
|
|
47
|
+
* ---
|
|
48
|
+
* 只限 OutputModeEnum.APPEND 模式下生效
|
|
49
|
+
*/
|
|
50
|
+
rollbackDelNullFile?: boolean;
|
|
51
|
+
/** (检测是markdown)是否处理(单个)代码块包裹 */
|
|
52
|
+
dealMarkdown?: boolean;
|
|
53
|
+
/** 是否批量处理 */
|
|
54
|
+
batch?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 编译模板配置选项
|
|
58
|
+
*/
|
|
59
|
+
export type CompileTemplateConfigListItem = Omit<CompileOptions, "envData" | keyof ReadConfigFileOptions> & {
|
|
60
|
+
/** 已经解析为对象的envData */
|
|
61
|
+
envData: Record<string, any>;
|
|
62
|
+
};
|
|
63
|
+
/** 采集环境变量配置 */
|
|
64
|
+
export interface CollectFormItem {
|
|
65
|
+
/** 采集环境变量的key */
|
|
66
|
+
key: string;
|
|
67
|
+
/** 采集环境变量标签 */
|
|
68
|
+
label: string;
|
|
69
|
+
/** 采集环境变量初始值 */
|
|
70
|
+
initial?: string;
|
|
71
|
+
/** 绑定的关键变量 */
|
|
72
|
+
bindKey?: TemplateBindKeyEnum;
|
|
73
|
+
}
|
|
74
|
+
/** 编译模板配置 */
|
|
75
|
+
export interface CompileTemplateConfig {
|
|
76
|
+
/** 全局环境变量 */
|
|
77
|
+
globalEnvData?: Record<string, any>;
|
|
78
|
+
/** 采集环境变量表单配置 */
|
|
79
|
+
collectEnvDataForm?: (CollectFormItem | string)[];
|
|
80
|
+
/** 配置列表 */
|
|
81
|
+
list?: Omit<CompileOptions, keyof ReadConfigFileOptions>[];
|
|
82
|
+
}
|