@sfmc-bds/cli 0.2.0-beta.6 → 0.2.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,297 +0,0 @@
1
- import { confirm, intro, isCancel, note, outro, select, tasks, text } from "@clack/prompts";
2
- import { spawn } from "node:child_process";
3
- import { existsSync } from "node:fs";
4
- import path from "node:path";
5
- import process from "node:process";
6
- import { t } from "./i18n/index.js";
7
- import { cmdModuleEnable } from "./module-commands.js";
8
- import { pickDirectory, resolveUserPath } from "./interactive-prompts.js";
9
- import { ROOT, resolveFetchModule, resolveNewModule } from "./runtime.js";
10
- import { c } from "./theme.js";
11
- function isInteractive() {
12
- return Boolean(process.stdin.isTTY);
13
- }
14
- function cancelMessage() {
15
- return c.dim(t("common.cancelled"));
16
- }
17
- function spawnTool(script, args) {
18
- return new Promise((resolve) => {
19
- const proc = spawn(process.execPath, [script, ...args], {
20
- stdio: ["ignore", "pipe", "pipe"],
21
- env: { ...process.env, SFMC_ROOT: ROOT }
22
- });
23
- let output = "";
24
- proc.stdout?.on("data", (d) => {
25
- output += d.toString();
26
- });
27
- proc.stderr?.on("data", (d) => {
28
- output += d.toString();
29
- });
30
- proc.on("exit", (code) => resolve({ code, output }));
31
- proc.on("error", (e) => resolve({ code: 1, output: `${output}${e.message}` }));
32
- });
33
- }
34
- async function runFetchModuleLink(folderId, pkgPath) {
35
- const fetchScript = resolveFetchModule();
36
- if (!fetchScript) {
37
- return { ok: false, output: c.red(t("modwiz.noFetch")) };
38
- }
39
- const fromArg = `dir:${path.resolve(pkgPath)}`;
40
- const { code, output } = await spawnTool(fetchScript, ["install", folderId, "--from", fromArg, "--link"]);
41
- return { ok: code === 0, output };
42
- }
43
- async function maybeEnableModule(folderId) {
44
- const enable = await confirm({ message: t("modwiz.enableModule"), initialValue: true });
45
- if (isCancel(enable) || !enable) return void 0;
46
- return (await cmdModuleEnable([folderId])).message;
47
- }
48
- async function maybeBuildDeploy() {
49
- const buildDeploy = await confirm({
50
- message: t("modwiz.buildDeploy"),
51
- initialValue: true
52
- });
53
- if (isCancel(buildDeploy) || !buildDeploy) return;
54
- const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import("./commands-behavior-pack.js");
55
- await tasks([
56
- {
57
- title: t("modwiz.task.build"),
58
- task: async () => {
59
- const r = await cmdBehaviorPackBuild([]);
60
- if (!r.ok) throw new Error(r.message.trim());
61
- return t("common.done");
62
- }
63
- },
64
- {
65
- title: t("modwiz.task.deploy"),
66
- task: async () => {
67
- const r = await cmdBehaviorPackDeploy([]);
68
- if (!r.ok) throw new Error(r.message.trim());
69
- return t("common.done");
70
- }
71
- }
72
- ]);
73
- note(c.yellow(t("modwiz.reloadHint")), t("common.hint"));
74
- }
75
- function validateFolderId(value) {
76
- if (!value?.trim()) return t("common.required");
77
- if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(value.trim())) {
78
- return t("modwiz.kebab");
79
- }
80
- return void 0;
81
- }
82
- async function listTemplatesFromTool() {
83
- const script = resolveNewModule();
84
- if (!script) return [];
85
- const { code, output } = await spawnTool(script, ["--list-templates"]);
86
- if (code !== 0) return [];
87
- const out = [];
88
- for (const line of output.split(/\r?\n/)) {
89
- const trimmed = line.trim();
90
- if (!trimmed) continue;
91
- const [id, ...flags] = trimmed.split(" ");
92
- if (!id) continue;
93
- out.push({ id, isDefault: flags.includes("default") });
94
- }
95
- return out;
96
- }
97
- function tplLabel(id) {
98
- const label = t(`modwiz.tpl.${id}`);
99
- return label === `modwiz.tpl.${id}` ? id : label;
100
- }
101
- function tplHint(id) {
102
- const hint = t(`modwiz.tpl.${id}Hint`);
103
- return hint === `modwiz.tpl.${id}Hint` ? void 0 : hint;
104
- }
105
- async function runModuleCreateWizard() {
106
- if (!isInteractive()) {
107
- return c.yellow(t("modwiz.needTty.create"));
108
- }
109
- intro(c.bold(t("modwiz.createIntro")));
110
- note(c.dim(t("modwiz.standaloneHint")), t("common.hint"));
111
- const idRaw = await text({
112
- message: t("modwiz.folderId"),
113
- placeholder: "my-feature",
114
- validate: validateFolderId
115
- });
116
- if (isCancel(idRaw) || !idRaw) {
117
- outro(cancelMessage());
118
- return cancelMessage();
119
- }
120
- const folderId = idRaw.trim();
121
- const defaultTarget = path.resolve(process.cwd(), folderId);
122
- const picked = await pickDirectory(t("modwiz.pickPackageRoot"), path.dirname(defaultTarget));
123
- if (isCancel(picked) || !picked) {
124
- outro(cancelMessage());
125
- return cancelMessage();
126
- }
127
- const parentDir = resolveUserPath(String(picked), ROOT);
128
- const target = path.join(parentDir, folderId);
129
- if (existsSync(target)) {
130
- outro(c.red(t("modwiz.dirExists", { path: target })));
131
- return c.red(t("modwiz.dirExists", { path: target }));
132
- }
133
- const nameRaw = await text({
134
- message: t("modwiz.displayName"),
135
- initialValue: folderId,
136
- validate: (v) => !v?.trim() ? t("common.required") : void 0
137
- });
138
- if (isCancel(nameRaw) || !nameRaw) {
139
- outro(cancelMessage());
140
- return cancelMessage();
141
- }
142
- const templates = await listTemplatesFromTool();
143
- if (templates.length === 0) {
144
- outro(c.red(t("modwiz.noNewModule")));
145
- return c.red(t("modwiz.noNewModule"));
146
- }
147
- const defaultTpl = templates.find((tpl) => tpl.isDefault) ?? templates[0];
148
- const template = await select({
149
- message: t("modwiz.template"),
150
- initialValue: defaultTpl.id,
151
- options: templates.map((tpl) => {
152
- const opt = {
153
- value: tpl.id,
154
- label: tplLabel(tpl.id)
155
- };
156
- const hint = tplHint(tpl.id);
157
- if (hint) opt.hint = hint;
158
- return opt;
159
- })
160
- });
161
- if (isCancel(template)) {
162
- outro(cancelMessage());
163
- return cancelMessage();
164
- }
165
- const newModuleScript = resolveNewModule();
166
- if (!newModuleScript) {
167
- outro(c.red(t("modwiz.noNewModule")));
168
- return c.red(t("modwiz.noNewModule"));
169
- }
170
- const { mkdirSync } = await import("node:fs");
171
- mkdirSync(target, { recursive: true });
172
- let scaffoldOutput = "";
173
- try {
174
- await tasks([
175
- {
176
- title: t("modwiz.genPackage", { id: folderId }),
177
- task: async () => {
178
- const { spawn: spawnChild } = await import("node:child_process");
179
- const result = await new Promise((resolve) => {
180
- const proc = spawnChild(
181
- process.execPath,
182
- [newModuleScript, folderId, "--name", nameRaw.trim(), "--template", String(template)],
183
- {
184
- cwd: target,
185
- stdio: ["ignore", "pipe", "pipe"],
186
- env: { ...process.env, SFMC_ROOT: ROOT }
187
- }
188
- );
189
- let output = "";
190
- proc.stdout?.on("data", (d) => {
191
- output += d.toString();
192
- });
193
- proc.stderr?.on("data", (d) => {
194
- output += d.toString();
195
- });
196
- proc.on("exit", (code) => resolve({ code, output }));
197
- proc.on("error", (e) => resolve({ code: 1, output: e.message }));
198
- });
199
- scaffoldOutput = result.output;
200
- if (result.code !== 0) throw new Error(result.output.trim() || `exit ${result.code}`);
201
- return t("modwiz.skeletonWritten");
202
- }
203
- }
204
- ]);
205
- } catch (e) {
206
- outro(c.red(e.message));
207
- return c.red(e.message);
208
- }
209
- note(scaffoldOutput.trim() || c.green(t("modwiz.createdNote", { path: target })), t("modwiz.createIntro"));
210
- const doLink = await confirm({
211
- message: t("modwiz.linkAsk"),
212
- initialValue: true
213
- });
214
- if (!isCancel(doLink) && doLink) {
215
- const { ok, output } = await runFetchModuleLink(folderId, target);
216
- note(output.trim(), ok ? t("modwiz.link") : t("modwiz.linkFailed"));
217
- if (ok) {
218
- const enableMsg = await maybeEnableModule(folderId);
219
- if (enableMsg) note(enableMsg, t("modwiz.enable"));
220
- await maybeBuildDeploy();
221
- }
222
- }
223
- outro(c.green(t("modwiz.createDone", { path: target })));
224
- return c.green(t("modwiz.moduleCreated", { id: folderId }));
225
- }
226
- async function runModuleLinkWizard() {
227
- if (!isInteractive()) {
228
- return c.yellow(t("modwiz.needTty.link"));
229
- }
230
- intro(c.bold(t("modwiz.linkIntro")));
231
- const picked = await pickDirectory(t("modwiz.pickAuthorPkg"), process.cwd());
232
- if (isCancel(picked) || !picked) {
233
- outro(cancelMessage());
234
- return cancelMessage();
235
- }
236
- const pkgPath = resolveUserPath(String(picked), ROOT);
237
- if (!existsSync(path.join(pkgPath, "sapi", "manifest.json"))) {
238
- outro(c.red(t("modwiz.notModulePkg", { path: pkgPath })));
239
- return c.red(t("modwiz.notModulePkg", { path: pkgPath }));
240
- }
241
- const fetchScript = resolveFetchModule();
242
- if (!fetchScript) {
243
- outro(c.red(t("modwiz.noFetch")));
244
- return c.red(t("modwiz.noFetch"));
245
- }
246
- let linkOutput = "";
247
- try {
248
- await tasks([
249
- {
250
- title: t("modwiz.linking", { id: path.basename(pkgPath) }),
251
- task: async () => {
252
- const { code, output } = await spawnTool(fetchScript, [
253
- "install",
254
- "--from",
255
- `dir:${pkgPath}`,
256
- "--link"
257
- ]);
258
- linkOutput = output;
259
- if (code !== 0) throw new Error(output.trim() || `exit ${code}`);
260
- return t("common.done");
261
- }
262
- }
263
- ]);
264
- } catch (e) {
265
- outro(c.red(e.message));
266
- return c.red(e.message);
267
- }
268
- note(linkOutput.trim(), t("modwiz.link"));
269
- const folderId = path.basename(pkgPath);
270
- const enableMsg = await maybeEnableModule(folderId);
271
- if (enableMsg) note(enableMsg, t("modwiz.enable"));
272
- await maybeBuildDeploy();
273
- outro(c.green(t("modwiz.linkDone", { id: folderId })));
274
- return c.green(t("modwiz.linkDone", { id: folderId }));
275
- }
276
- async function runModuleDevWizard() {
277
- if (!isInteractive()) {
278
- return c.yellow(t("modwiz.needTty.dev"));
279
- }
280
- intro(c.bold(t("modwiz.devIntro")));
281
- note(c.text(t("modwiz.devStandalone")), t("common.hint"));
282
- const doReload = await confirm({
283
- message: t("modwiz.buildDeploy"),
284
- initialValue: false
285
- });
286
- if (!isCancel(doReload) && doReload) {
287
- await maybeBuildDeploy();
288
- }
289
- outro(c.green(t("modwiz.reloadHint")));
290
- return c.dim(t("modwiz.reloadHint"));
291
- }
292
- export {
293
- runModuleCreateWizard,
294
- runModuleDevWizard,
295
- runModuleLinkWizard
296
- };
297
- //# sourceMappingURL=module-wizard.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/module-wizard.ts"],
4
- "sourcesContent": ["/**\r\n * module-wizard.ts \u2014 \u6A21\u5757\u811A\u624B\u67B6 / \u672C\u5730\u8054\u8C03\u4EA4\u4E92\u5411\u5BFC\r\n *\r\n * \u5355\u5305\u6839\uFF08template \u540C\u6784\uFF09\uFF1A\u4E0D\u5199\u5165\u65C1\u8DEF sfmc-modules monorepo\u3002\r\n */\r\n\r\nimport { confirm, intro, isCancel, note, outro, select, tasks, text } from \"@clack/prompts\";\r\nimport { spawn } from \"node:child_process\";\r\nimport { existsSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport process from \"node:process\";\r\nimport { t, type MessageKey } from \"./i18n/index.js\";\r\nimport { cmdModuleEnable } from \"./module-commands.js\";\r\nimport { pickDirectory, resolveUserPath } from \"./interactive-prompts.js\";\r\nimport { ROOT, resolveFetchModule, resolveNewModule } from \"./runtime.js\";\r\nimport { c } from \"./theme.js\";\r\n\r\nfunction isInteractive(): boolean {\r\n return Boolean(process.stdin.isTTY);\r\n}\r\n\r\nfunction cancelMessage(): string {\r\n return c.dim(t(\"common.cancelled\"));\r\n}\r\n\r\n/** \u5B50\u8FDB\u7A0B\u6267\u884C\u5DE5\u5177\u811A\u672C\uFF1B\u7528\u53C2\u6570\u6570\u7EC4\u907F\u514D Windows \u542B # \u8DEF\u5F84\u88AB shell \u8BEF\u89E3\u6790\u3002 */\r\nfunction spawnTool(script: string, args: string[]): Promise<{ code: number | null; output: string }> {\r\n return new Promise((resolve) => {\r\n const proc = spawn(process.execPath, [script, ...args], {\r\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n env: { ...process.env, SFMC_ROOT: ROOT },\r\n });\r\n let output = \"\";\r\n proc.stdout?.on(\"data\", (d: Buffer) => {\r\n output += d.toString();\r\n });\r\n proc.stderr?.on(\"data\", (d: Buffer) => {\r\n output += d.toString();\r\n });\r\n proc.on(\"exit\", (code) => resolve({ code, output }));\r\n proc.on(\"error\", (e) => resolve({ code: 1, output: `${output}${e.message}` }));\r\n });\r\n}\r\n\r\nasync function runFetchModuleLink(folderId: string, pkgPath: string): Promise<{ ok: boolean; output: string }> {\r\n const fetchScript = resolveFetchModule();\r\n if (!fetchScript) {\r\n return { ok: false, output: c.red(t(\"modwiz.noFetch\")) };\r\n }\r\n const fromArg = `dir:${path.resolve(pkgPath)}`;\r\n const { code, output } = await spawnTool(fetchScript, [\"install\", folderId, \"--from\", fromArg, \"--link\"]);\r\n return { ok: code === 0, output };\r\n}\r\n\r\nasync function maybeEnableModule(folderId: string): Promise<string | undefined> {\r\n const enable = await confirm({ message: t(\"modwiz.enableModule\"), initialValue: true });\r\n if (isCancel(enable) || !enable) return undefined;\r\n return (await cmdModuleEnable([folderId])).message;\r\n}\r\n\r\nasync function maybeBuildDeploy(): Promise<void> {\r\n const buildDeploy = await confirm({\r\n message: t(\"modwiz.buildDeploy\"),\r\n initialValue: true,\r\n });\r\n if (isCancel(buildDeploy) || !buildDeploy) return;\r\n\r\n const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\r\n await tasks([\r\n {\r\n title: t(\"modwiz.task.build\"),\r\n task: async () => {\r\n const r = await cmdBehaviorPackBuild([]);\r\n if (!r.ok) throw new Error(r.message.trim());\r\n return t(\"common.done\");\r\n },\r\n },\r\n {\r\n title: t(\"modwiz.task.deploy\"),\r\n task: async () => {\r\n const r = await cmdBehaviorPackDeploy([]);\r\n if (!r.ok) throw new Error(r.message.trim());\r\n return t(\"common.done\");\r\n },\r\n },\r\n ]);\r\n note(c.yellow(t(\"modwiz.reloadHint\")), t(\"common.hint\"));\r\n}\r\n\r\nfunction validateFolderId(value: string | undefined): string | undefined {\r\n if (!value?.trim()) return t(\"common.required\");\r\n if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(value.trim())) {\r\n return t(\"modwiz.kebab\");\r\n }\r\n return undefined;\r\n}\r\n\r\ntype TemplateMeta = { id: string; isDefault: boolean };\r\n\r\nasync function listTemplatesFromTool(): Promise<TemplateMeta[]> {\r\n const script = resolveNewModule();\r\n if (!script) return [];\r\n const { code, output } = await spawnTool(script, [\"--list-templates\"]);\r\n if (code !== 0) return [];\r\n const out: TemplateMeta[] = [];\r\n for (const line of output.split(/\\r?\\n/)) {\r\n const trimmed = line.trim();\r\n if (!trimmed) continue;\r\n const [id, ...flags] = trimmed.split(\"\\t\");\r\n if (!id) continue;\r\n out.push({ id, isDefault: flags.includes(\"default\") });\r\n }\r\n return out;\r\n}\r\n\r\nfunction tplLabel(id: string): string {\r\n const label = t(`modwiz.tpl.${id}` as MessageKey);\r\n return label === `modwiz.tpl.${id}` ? id : label;\r\n}\r\nfunction tplHint(id: string): string | undefined {\r\n const hint = t(`modwiz.tpl.${id}Hint` as MessageKey);\r\n return hint === `modwiz.tpl.${id}Hint` ? undefined : hint;\r\n}\r\n\r\n/** \u4EA4\u4E92\u5F0F\u521B\u5EFA\u5355\u5305\u6A21\u5757\uFF08cwd \u6216\u6307\u5B9A\u7A7A\u76EE\u5F55\uFF09\uFF0C\u53EF\u9009 link / enable / build+deploy\u3002 */\r\nexport async function runModuleCreateWizard(): Promise<string> {\r\n if (!isInteractive()) {\r\n return c.yellow(t(\"modwiz.needTty.create\"));\r\n }\r\n\r\n intro(c.bold(t(\"modwiz.createIntro\")));\r\n note(c.dim(t(\"modwiz.standaloneHint\")), t(\"common.hint\"));\r\n\r\n const idRaw = await text({\r\n message: t(\"modwiz.folderId\"),\r\n placeholder: \"my-feature\",\r\n validate: validateFolderId,\r\n });\r\n if (isCancel(idRaw) || !idRaw) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n const folderId = idRaw.trim();\r\n\r\n const defaultTarget = path.resolve(process.cwd(), folderId);\r\n const picked = await pickDirectory(t(\"modwiz.pickPackageRoot\"), path.dirname(defaultTarget));\r\n if (isCancel(picked) || !picked) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n const parentDir = resolveUserPath(String(picked), ROOT);\r\n const target = path.join(parentDir, folderId);\r\n if (existsSync(target)) {\r\n outro(c.red(t(\"modwiz.dirExists\", { path: target })));\r\n return c.red(t(\"modwiz.dirExists\", { path: target }));\r\n }\r\n\r\n const nameRaw = await text({\r\n message: t(\"modwiz.displayName\"),\r\n initialValue: folderId,\r\n validate: (v) => (!v?.trim() ? t(\"common.required\") : undefined),\r\n });\r\n if (isCancel(nameRaw) || !nameRaw) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n\r\n const templates = await listTemplatesFromTool();\r\n if (templates.length === 0) {\r\n outro(c.red(t(\"modwiz.noNewModule\")));\r\n return c.red(t(\"modwiz.noNewModule\"));\r\n }\r\n const defaultTpl = templates.find((tpl) => tpl.isDefault) ?? templates[0]!;\r\n const template = await select({\r\n message: t(\"modwiz.template\"),\r\n initialValue: defaultTpl.id,\r\n options: templates.map((tpl) => {\r\n const opt: { value: string; label: string; hint?: string } = {\r\n value: tpl.id,\r\n label: tplLabel(tpl.id),\r\n };\r\n const hint = tplHint(tpl.id);\r\n if (hint) opt.hint = hint;\r\n return opt;\r\n }),\r\n });\r\n if (isCancel(template)) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n\r\n const newModuleScript = resolveNewModule();\r\n if (!newModuleScript) {\r\n outro(c.red(t(\"modwiz.noNewModule\")));\r\n return c.red(t(\"modwiz.noNewModule\"));\r\n }\r\n\r\n const { mkdirSync } = await import(\"node:fs\");\r\n mkdirSync(target, { recursive: true });\r\n\r\n let scaffoldOutput = \"\";\r\n try {\r\n await tasks([\r\n {\r\n title: t(\"modwiz.genPackage\", { id: folderId }),\r\n task: async () => {\r\n const { spawn: spawnChild } = await import(\"node:child_process\");\r\n const result = await new Promise<{ code: number | null; output: string }>((resolve) => {\r\n const proc = spawnChild(\r\n process.execPath,\r\n [newModuleScript, folderId, \"--name\", nameRaw.trim(), \"--template\", String(template)],\r\n {\r\n cwd: target,\r\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n env: { ...process.env, SFMC_ROOT: ROOT },\r\n }\r\n );\r\n let output = \"\";\r\n proc.stdout?.on(\"data\", (d: Buffer) => {\r\n output += d.toString();\r\n });\r\n proc.stderr?.on(\"data\", (d: Buffer) => {\r\n output += d.toString();\r\n });\r\n proc.on(\"exit\", (code) => resolve({ code, output }));\r\n proc.on(\"error\", (e) => resolve({ code: 1, output: e.message }));\r\n });\r\n scaffoldOutput = result.output;\r\n if (result.code !== 0) throw new Error(result.output.trim() || `exit ${result.code}`);\r\n return t(\"modwiz.skeletonWritten\");\r\n },\r\n },\r\n ]);\r\n } catch (e) {\r\n outro(c.red((e as Error).message));\r\n return c.red((e as Error).message);\r\n }\r\n\r\n note(scaffoldOutput.trim() || c.green(t(\"modwiz.createdNote\", { path: target })), t(\"modwiz.createIntro\"));\r\n\r\n const doLink = await confirm({\r\n message: t(\"modwiz.linkAsk\"),\r\n initialValue: true,\r\n });\r\n if (!isCancel(doLink) && doLink) {\r\n const { ok, output } = await runFetchModuleLink(folderId, target);\r\n note(output.trim(), ok ? t(\"modwiz.link\") : t(\"modwiz.linkFailed\"));\r\n if (ok) {\r\n const enableMsg = await maybeEnableModule(folderId);\r\n if (enableMsg) note(enableMsg, t(\"modwiz.enable\"));\r\n await maybeBuildDeploy();\r\n }\r\n }\r\n\r\n outro(c.green(t(\"modwiz.createDone\", { path: target })));\r\n return c.green(t(\"modwiz.moduleCreated\", { id: folderId }));\r\n}\r\n\r\n/** \u9009\u62E9\u672C\u5730\u4F5C\u8005\u4ED3\u76EE\u5F55\u5E76 --link \u5B89\u88C5\u3002 */\r\nexport async function runModuleLinkWizard(): Promise<string> {\r\n if (!isInteractive()) {\r\n return c.yellow(t(\"modwiz.needTty.link\"));\r\n }\r\n\r\n intro(c.bold(t(\"modwiz.linkIntro\")));\r\n\r\n const picked = await pickDirectory(t(\"modwiz.pickAuthorPkg\"), process.cwd());\r\n if (isCancel(picked) || !picked) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n const pkgPath = resolveUserPath(String(picked), ROOT);\r\n if (!existsSync(path.join(pkgPath, \"sapi\", \"manifest.json\"))) {\r\n outro(c.red(t(\"modwiz.notModulePkg\", { path: pkgPath })));\r\n return c.red(t(\"modwiz.notModulePkg\", { path: pkgPath }));\r\n }\r\n\r\n const fetchScript = resolveFetchModule();\r\n if (!fetchScript) {\r\n outro(c.red(t(\"modwiz.noFetch\")));\r\n return c.red(t(\"modwiz.noFetch\"));\r\n }\r\n\r\n let linkOutput = \"\";\r\n try {\r\n await tasks([\r\n {\r\n title: t(\"modwiz.linking\", { id: path.basename(pkgPath) }),\r\n task: async () => {\r\n const { code, output } = await spawnTool(fetchScript, [\r\n \"install\",\r\n \"--from\",\r\n `dir:${pkgPath}`,\r\n \"--link\",\r\n ]);\r\n linkOutput = output;\r\n if (code !== 0) throw new Error(output.trim() || `exit ${code}`);\r\n return t(\"common.done\");\r\n },\r\n },\r\n ]);\r\n } catch (e) {\r\n outro(c.red((e as Error).message));\r\n return c.red((e as Error).message);\r\n }\r\n\r\n note(linkOutput.trim(), t(\"modwiz.link\"));\r\n const folderId = path.basename(pkgPath);\r\n const enableMsg = await maybeEnableModule(folderId);\r\n if (enableMsg) note(enableMsg, t(\"modwiz.enable\"));\r\n await maybeBuildDeploy();\r\n\r\n outro(c.green(t(\"modwiz.linkDone\", { id: folderId })));\r\n return c.green(t(\"modwiz.linkDone\", { id: folderId }));\r\n}\r\n\r\n/** \u672C\u5730\u5F00\u53D1\u63D0\u793A\uFF08\u4E0D\u518D\u4F9D\u8D56\u65C1\u8DEF sfmc-modules\uFF09\u3002 */\r\nexport async function runModuleDevWizard(): Promise<string> {\r\n if (!isInteractive()) {\r\n return c.yellow(t(\"modwiz.needTty.dev\"));\r\n }\r\n intro(c.bold(t(\"modwiz.devIntro\")));\r\n note(c.text(t(\"modwiz.devStandalone\")), t(\"common.hint\"));\r\n const doReload = await confirm({\r\n message: t(\"modwiz.buildDeploy\"),\r\n initialValue: false,\r\n });\r\n if (!isCancel(doReload) && doReload) {\r\n await maybeBuildDeploy();\r\n }\r\n outro(c.green(t(\"modwiz.reloadHint\")));\r\n return c.dim(t(\"modwiz.reloadHint\"));\r\n}\r\n"],
5
- "mappings": "AAMA,SAAS,SAAS,OAAO,UAAU,MAAM,OAAO,QAAQ,OAAO,YAAY;AAC3E,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,SAAS,SAA0B;AACnC,SAAS,uBAAuB;AAChC,SAAS,eAAe,uBAAuB;AAC/C,SAAS,MAAM,oBAAoB,wBAAwB;AAC3D,SAAS,SAAS;AAElB,SAAS,gBAAyB;AAChC,SAAO,QAAQ,QAAQ,MAAM,KAAK;AACpC;AAEA,SAAS,gBAAwB;AAC/B,SAAO,EAAE,IAAI,EAAE,kBAAkB,CAAC;AACpC;AAGA,SAAS,UAAU,QAAgB,MAAkE;AACnG,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,OAAO,MAAM,QAAQ,UAAU,CAAC,QAAQ,GAAG,IAAI,GAAG;AAAA,MACtD,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,EAAE,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,IACzC,CAAC;AACD,QAAI,SAAS;AACb,SAAK,QAAQ,GAAG,QAAQ,CAAC,MAAc;AACrC,gBAAU,EAAE,SAAS;AAAA,IACvB,CAAC;AACD,SAAK,QAAQ,GAAG,QAAQ,CAAC,MAAc;AACrC,gBAAU,EAAE,SAAS;AAAA,IACvB,CAAC;AACD,SAAK,GAAG,QAAQ,CAAC,SAAS,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC;AACnD,SAAK,GAAG,SAAS,CAAC,MAAM,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,EAC/E,CAAC;AACH;AAEA,eAAe,mBAAmB,UAAkB,SAA2D;AAC7G,QAAM,cAAc,mBAAmB;AACvC,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,IAAI,OAAO,QAAQ,EAAE,IAAI,EAAE,gBAAgB,CAAC,EAAE;AAAA,EACzD;AACA,QAAM,UAAU,OAAO,KAAK,QAAQ,OAAO,CAAC;AAC5C,QAAM,EAAE,MAAM,OAAO,IAAI,MAAM,UAAU,aAAa,CAAC,WAAW,UAAU,UAAU,SAAS,QAAQ,CAAC;AACxG,SAAO,EAAE,IAAI,SAAS,GAAG,OAAO;AAClC;AAEA,eAAe,kBAAkB,UAA+C;AAC9E,QAAM,SAAS,MAAM,QAAQ,EAAE,SAAS,EAAE,qBAAqB,GAAG,cAAc,KAAK,CAAC;AACtF,MAAI,SAAS,MAAM,KAAK,CAAC,OAAQ,QAAO;AACxC,UAAQ,MAAM,gBAAgB,CAAC,QAAQ,CAAC,GAAG;AAC7C;AAEA,eAAe,mBAAkC;AAC/C,QAAM,cAAc,MAAM,QAAQ;AAAA,IAChC,SAAS,EAAE,oBAAoB;AAAA,IAC/B,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,SAAS,WAAW,KAAK,CAAC,YAAa;AAE3C,QAAM,EAAE,sBAAsB,sBAAsB,IAAI,MAAM,OAAO,6BAA6B;AAClG,QAAM,MAAM;AAAA,IACV;AAAA,MACE,OAAO,EAAE,mBAAmB;AAAA,MAC5B,MAAM,YAAY;AAChB,cAAM,IAAI,MAAM,qBAAqB,CAAC,CAAC;AACvC,YAAI,CAAC,EAAE,GAAI,OAAM,IAAI,MAAM,EAAE,QAAQ,KAAK,CAAC;AAC3C,eAAO,EAAE,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,EAAE,oBAAoB;AAAA,MAC7B,MAAM,YAAY;AAChB,cAAM,IAAI,MAAM,sBAAsB,CAAC,CAAC;AACxC,YAAI,CAAC,EAAE,GAAI,OAAM,IAAI,MAAM,EAAE,QAAQ,KAAK,CAAC;AAC3C,eAAO,EAAE,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAC;AACD,OAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,GAAG,EAAE,aAAa,CAAC;AACzD;AAEA,SAAS,iBAAiB,OAA+C;AACvE,MAAI,CAAC,OAAO,KAAK,EAAG,QAAO,EAAE,iBAAiB;AAC9C,MAAI,CAAC,gCAAgC,KAAK,MAAM,KAAK,CAAC,GAAG;AACvD,WAAO,EAAE,cAAc;AAAA,EACzB;AACA,SAAO;AACT;AAIA,eAAe,wBAAiD;AAC9D,QAAM,SAAS,iBAAiB;AAChC,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,EAAE,MAAM,OAAO,IAAI,MAAM,UAAU,QAAQ,CAAC,kBAAkB,CAAC;AACrE,MAAI,SAAS,EAAG,QAAO,CAAC;AACxB,QAAM,MAAsB,CAAC;AAC7B,aAAW,QAAQ,OAAO,MAAM,OAAO,GAAG;AACxC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,UAAM,CAAC,IAAI,GAAG,KAAK,IAAI,QAAQ,MAAM,GAAI;AACzC,QAAI,CAAC,GAAI;AACT,QAAI,KAAK,EAAE,IAAI,WAAW,MAAM,SAAS,SAAS,EAAE,CAAC;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAAS,SAAS,IAAoB;AACpC,QAAM,QAAQ,EAAE,cAAc,EAAE,EAAgB;AAChD,SAAO,UAAU,cAAc,EAAE,KAAK,KAAK;AAC7C;AACA,SAAS,QAAQ,IAAgC;AAC/C,QAAM,OAAO,EAAE,cAAc,EAAE,MAAoB;AACnD,SAAO,SAAS,cAAc,EAAE,SAAS,SAAY;AACvD;AAGA,eAAsB,wBAAyC;AAC7D,MAAI,CAAC,cAAc,GAAG;AACpB,WAAO,EAAE,OAAO,EAAE,uBAAuB,CAAC;AAAA,EAC5C;AAEA,QAAM,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC;AACrC,OAAK,EAAE,IAAI,EAAE,uBAAuB,CAAC,GAAG,EAAE,aAAa,CAAC;AAExD,QAAM,QAAQ,MAAM,KAAK;AAAA,IACvB,SAAS,EAAE,iBAAiB;AAAA,IAC5B,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AACD,MAAI,SAAS,KAAK,KAAK,CAAC,OAAO;AAC7B,UAAM,cAAc,CAAC;AACrB,WAAO,cAAc;AAAA,EACvB;AACA,QAAM,WAAW,MAAM,KAAK;AAE5B,QAAM,gBAAgB,KAAK,QAAQ,QAAQ,IAAI,GAAG,QAAQ;AAC1D,QAAM,SAAS,MAAM,cAAc,EAAE,wBAAwB,GAAG,KAAK,QAAQ,aAAa,CAAC;AAC3F,MAAI,SAAS,MAAM,KAAK,CAAC,QAAQ;AAC/B,UAAM,cAAc,CAAC;AACrB,WAAO,cAAc;AAAA,EACvB;AACA,QAAM,YAAY,gBAAgB,OAAO,MAAM,GAAG,IAAI;AACtD,QAAM,SAAS,KAAK,KAAK,WAAW,QAAQ;AAC5C,MAAI,WAAW,MAAM,GAAG;AACtB,UAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;AACpD,WAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC,CAAC;AAAA,EACtD;AAEA,QAAM,UAAU,MAAM,KAAK;AAAA,IACzB,SAAS,EAAE,oBAAoB;AAAA,IAC/B,cAAc;AAAA,IACd,UAAU,CAAC,MAAO,CAAC,GAAG,KAAK,IAAI,EAAE,iBAAiB,IAAI;AAAA,EACxD,CAAC;AACD,MAAI,SAAS,OAAO,KAAK,CAAC,SAAS;AACjC,UAAM,cAAc,CAAC;AACrB,WAAO,cAAc;AAAA,EACvB;AAEA,QAAM,YAAY,MAAM,sBAAsB;AAC9C,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;AACpC,WAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC;AAAA,EACtC;AACA,QAAM,aAAa,UAAU,KAAK,CAAC,QAAQ,IAAI,SAAS,KAAK,UAAU,CAAC;AACxE,QAAM,WAAW,MAAM,OAAO;AAAA,IAC5B,SAAS,EAAE,iBAAiB;AAAA,IAC5B,cAAc,WAAW;AAAA,IACzB,SAAS,UAAU,IAAI,CAAC,QAAQ;AAC9B,YAAM,MAAuD;AAAA,QAC3D,OAAO,IAAI;AAAA,QACX,OAAO,SAAS,IAAI,EAAE;AAAA,MACxB;AACA,YAAM,OAAO,QAAQ,IAAI,EAAE;AAC3B,UAAI,KAAM,KAAI,OAAO;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACD,MAAI,SAAS,QAAQ,GAAG;AACtB,UAAM,cAAc,CAAC;AACrB,WAAO,cAAc;AAAA,EACvB;AAEA,QAAM,kBAAkB,iBAAiB;AACzC,MAAI,CAAC,iBAAiB;AACpB,UAAM,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;AACpC,WAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC;AAAA,EACtC;AAEA,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,SAAS;AAC5C,YAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAErC,MAAI,iBAAiB;AACrB,MAAI;AACF,UAAM,MAAM;AAAA,MACV;AAAA,QACE,OAAO,EAAE,qBAAqB,EAAE,IAAI,SAAS,CAAC;AAAA,QAC9C,MAAM,YAAY;AAChB,gBAAM,EAAE,OAAO,WAAW,IAAI,MAAM,OAAO,oBAAoB;AAC/D,gBAAM,SAAS,MAAM,IAAI,QAAiD,CAAC,YAAY;AACrF,kBAAM,OAAO;AAAA,cACX,QAAQ;AAAA,cACR,CAAC,iBAAiB,UAAU,UAAU,QAAQ,KAAK,GAAG,cAAc,OAAO,QAAQ,CAAC;AAAA,cACpF;AAAA,gBACE,KAAK;AAAA,gBACL,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,gBAChC,KAAK,EAAE,GAAG,QAAQ,KAAK,WAAW,KAAK;AAAA,cACzC;AAAA,YACF;AACA,gBAAI,SAAS;AACb,iBAAK,QAAQ,GAAG,QAAQ,CAAC,MAAc;AACrC,wBAAU,EAAE,SAAS;AAAA,YACvB,CAAC;AACD,iBAAK,QAAQ,GAAG,QAAQ,CAAC,MAAc;AACrC,wBAAU,EAAE,SAAS;AAAA,YACvB,CAAC;AACD,iBAAK,GAAG,QAAQ,CAAC,SAAS,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC;AACnD,iBAAK,GAAG,SAAS,CAAC,MAAM,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,UACjE,CAAC;AACD,2BAAiB,OAAO;AACxB,cAAI,OAAO,SAAS,EAAG,OAAM,IAAI,MAAM,OAAO,OAAO,KAAK,KAAK,QAAQ,OAAO,IAAI,EAAE;AACpF,iBAAO,EAAE,wBAAwB;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,SAAS,GAAG;AACV,UAAM,EAAE,IAAK,EAAY,OAAO,CAAC;AACjC,WAAO,EAAE,IAAK,EAAY,OAAO;AAAA,EACnC;AAEA,OAAK,eAAe,KAAK,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,EAAE,oBAAoB,CAAC;AAEzG,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,SAAS,EAAE,gBAAgB;AAAA,IAC3B,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,CAAC,SAAS,MAAM,KAAK,QAAQ;AAC/B,UAAM,EAAE,IAAI,OAAO,IAAI,MAAM,mBAAmB,UAAU,MAAM;AAChE,SAAK,OAAO,KAAK,GAAG,KAAK,EAAE,aAAa,IAAI,EAAE,mBAAmB,CAAC;AAClE,QAAI,IAAI;AACN,YAAM,YAAY,MAAM,kBAAkB,QAAQ;AAClD,UAAI,UAAW,MAAK,WAAW,EAAE,eAAe,CAAC;AACjD,YAAM,iBAAiB;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;AACvD,SAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,IAAI,SAAS,CAAC,CAAC;AAC5D;AAGA,eAAsB,sBAAuC;AAC3D,MAAI,CAAC,cAAc,GAAG;AACpB,WAAO,EAAE,OAAO,EAAE,qBAAqB,CAAC;AAAA,EAC1C;AAEA,QAAM,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAEnC,QAAM,SAAS,MAAM,cAAc,EAAE,sBAAsB,GAAG,QAAQ,IAAI,CAAC;AAC3E,MAAI,SAAS,MAAM,KAAK,CAAC,QAAQ;AAC/B,UAAM,cAAc,CAAC;AACrB,WAAO,cAAc;AAAA,EACvB;AACA,QAAM,UAAU,gBAAgB,OAAO,MAAM,GAAG,IAAI;AACpD,MAAI,CAAC,WAAW,KAAK,KAAK,SAAS,QAAQ,eAAe,CAAC,GAAG;AAC5D,UAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC;AACxD,WAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC,CAAC;AAAA,EAC1D;AAEA,QAAM,cAAc,mBAAmB;AACvC,MAAI,CAAC,aAAa;AAChB,UAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAChC,WAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC;AAAA,EAClC;AAEA,MAAI,aAAa;AACjB,MAAI;AACF,UAAM,MAAM;AAAA,MACV;AAAA,QACE,OAAO,EAAE,kBAAkB,EAAE,IAAI,KAAK,SAAS,OAAO,EAAE,CAAC;AAAA,QACzD,MAAM,YAAY;AAChB,gBAAM,EAAE,MAAM,OAAO,IAAI,MAAM,UAAU,aAAa;AAAA,YACpD;AAAA,YACA;AAAA,YACA,OAAO,OAAO;AAAA,YACd;AAAA,UACF,CAAC;AACD,uBAAa;AACb,cAAI,SAAS,EAAG,OAAM,IAAI,MAAM,OAAO,KAAK,KAAK,QAAQ,IAAI,EAAE;AAC/D,iBAAO,EAAE,aAAa;AAAA,QACxB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,SAAS,GAAG;AACV,UAAM,EAAE,IAAK,EAAY,OAAO,CAAC;AACjC,WAAO,EAAE,IAAK,EAAY,OAAO;AAAA,EACnC;AAEA,OAAK,WAAW,KAAK,GAAG,EAAE,aAAa,CAAC;AACxC,QAAM,WAAW,KAAK,SAAS,OAAO;AACtC,QAAM,YAAY,MAAM,kBAAkB,QAAQ;AAClD,MAAI,UAAW,MAAK,WAAW,EAAE,eAAe,CAAC;AACjD,QAAM,iBAAiB;AAEvB,QAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC;AACrD,SAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,SAAS,CAAC,CAAC;AACvD;AAGA,eAAsB,qBAAsC;AAC1D,MAAI,CAAC,cAAc,GAAG;AACpB,WAAO,EAAE,OAAO,EAAE,oBAAoB,CAAC;AAAA,EACzC;AACA,QAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;AAClC,OAAK,EAAE,KAAK,EAAE,sBAAsB,CAAC,GAAG,EAAE,aAAa,CAAC;AACxD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,SAAS,EAAE,oBAAoB;AAAA,IAC/B,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,CAAC,SAAS,QAAQ,KAAK,UAAU;AACnC,UAAM,iBAAiB;AAAA,EACzB;AACA,QAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;AACrC,SAAO,EAAE,IAAI,EAAE,mBAAmB,CAAC;AACrC;",
6
- "names": []
7
- }