create-pubinfo 0.3.2 → 0.4.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/dist/index.cjs CHANGED
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  "use strict";
2
3
  var __create = Object.create;
3
4
  var __defProp = Object.defineProperty;
@@ -5,10 +6,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
7
  var __getProtoOf = Object.getPrototypeOf;
7
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
9
  var __copyProps = (to, from, except, desc) => {
13
10
  if (from && typeof from === "object" || typeof from === "function") {
14
11
  for (let key of __getOwnPropNames(from))
@@ -25,92 +22,315 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
22
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
23
  mod
27
24
  ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
25
 
30
26
  // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- download: () => download
34
- });
35
- module.exports = __toCommonJS(src_exports);
27
+ var import_commander = require("commander");
28
+ var import_consola6 = __toESM(require("consola"), 1);
29
+
30
+ // package.json
31
+ var package_default = {
32
+ name: "create-pubinfo",
33
+ type: "module",
34
+ version: "0.4.0",
35
+ description: "\u521D\u59CB\u5316\u9879\u76EE\u6846\u67B6",
36
+ author: "Werheng <werheng.zhang@gmail.com>",
37
+ license: "MIT",
38
+ repository: "https://github.com/werheng/pubinfo-cli",
39
+ bugs: {
40
+ url: "https://github.com/werheng/pubinfo-cli/issues"
41
+ },
42
+ bin: {
43
+ pubinfo: "./dist/index.js"
44
+ },
45
+ files: [
46
+ "dist"
47
+ ],
48
+ scripts: {
49
+ dev: "tsup --watch src",
50
+ build: "tsup",
51
+ cli: "tsx src/index.ts",
52
+ "cli:clean": "rimraf ./my-app"
53
+ },
54
+ dependencies: {
55
+ "@inquirer/prompts": "^4.3.3",
56
+ "ansi-colors": "^4.1.3",
57
+ cfonts: "^3.2.0",
58
+ commander: "^12.0.0",
59
+ confbox: "^0.1.7",
60
+ consola: "^3.2.3",
61
+ giget: "^1.2.3",
62
+ ofetch: "^1.3.4",
63
+ ora: "^8.0.1",
64
+ rimraf: "^5.0.5",
65
+ semver: "^7.6.0"
66
+ }
67
+ };
36
68
 
37
69
  // src/download.ts
70
+ var import_node_process = __toESM(require("process"), 1);
38
71
  var import_giget = require("giget");
39
72
  var import_consola = __toESM(require("consola"), 1);
40
-
41
- // src/progress.ts
42
- var import_node_process = __toESM(require("process"), 1);
43
- var import_cli_progress = require("cli-progress");
44
73
  var import_ansi_colors = __toESM(require("ansi-colors"), 1);
45
- var import_fake_progress = __toESM(require("fake-progress"), 1);
46
- function createMockProgressBar() {
47
- const fakeProgress = new import_fake_progress.default({
48
- timeConstant: 10 * 1e3
49
- });
50
- let complete = false;
51
- const bar = new import_cli_progress.SingleBar(
52
- {
53
- format: `${import_ansi_colors.default.bold.green("Download:")} ${import_ansi_colors.default.blueBright("{bar}")}| {percentage}% || {value}/{total} || Speed: {speed}`,
54
- barCompleteChar: "\u2588",
55
- barIncompleteChar: "\u2591",
56
- hideCursor: true,
57
- linewrap: true,
58
- barsize: 40,
59
- clearOnComplete: true,
60
- stopOnComplete: true
61
- },
62
- import_cli_progress.Presets.shades_classic
63
- );
64
- function interval() {
65
- const startTime = Date.now();
66
- fakeProgress.start();
67
- console.log("\n");
68
- bar.start(100, 0, {
69
- speed: "N/A"
70
- });
71
- const timer = setInterval(() => {
72
- const count = Number((fakeProgress.progress * 100).toFixed(0));
73
- bar.update(count);
74
- if (complete) {
75
- bar.update(100);
76
- console.log(`${import_ansi_colors.default.bold.green("Download complete in")} ${import_ansi_colors.default.bold.yellow(`${Date.now() - startTime}`)} ${import_ansi_colors.default.bold.green("ms.")}`);
77
- clearInterval(timer);
78
- import_node_process.default.exit(0);
79
- }
80
- }, 100);
81
- }
82
- function stop() {
83
- complete = true;
84
- }
85
- interval();
86
- return stop;
87
- }
88
-
89
- // src/download.ts
90
- var pubinfo = async (input, { auth }) => {
74
+ var import_ora = __toESM(require("ora"), 1);
75
+ var import_semver = require("semver");
76
+ var pubinfo = async (input2, { auth }) => {
77
+ const semver = (0, import_semver.coerce)(input2);
91
78
  return {
92
79
  name: "pubinfo",
93
- version: input,
80
+ version: input2,
94
81
  headers: { Authorization: `token ${auth}` },
95
- tar: "http://124.223.184.245:10000/monorepo-project-template.tar.gz"
82
+ tar: `http://124.223.184.245:10000/templates/monorepo-project-template-${semver?.version}.tar.gz`
96
83
  };
97
84
  };
98
- async function download(options = {}) {
99
- const stop = createMockProgressBar();
85
+ async function download(options) {
86
+ const finish = loading();
100
87
  try {
101
- await (0, import_giget.downloadTemplate)("pubinfo:monorepo-project-template", {
88
+ await (0, import_giget.downloadTemplate)(`pubinfo:monorepo-project-template-${options.version}`, {
102
89
  providers: { pubinfo },
103
90
  force: true,
104
- auth: options.auth,
91
+ forceClean: true,
92
+ // auth: options.auth,
105
93
  dir: options.dir
106
94
  });
107
95
  } catch (error) {
108
- import_consola.default.error(error);
96
+ import_consola.default.error(`\u4E0B\u8F7D\u5931\u8D25: ${error}`);
97
+ import_node_process.default.exit(1);
98
+ } finally {
99
+ finish();
100
+ }
101
+ }
102
+ function loading() {
103
+ const startTime = Date.now();
104
+ const spinner = (0, import_ora.default)({
105
+ text: "\u4E0B\u8F7D\u4E2D...",
106
+ color: "green"
107
+ });
108
+ spinner.start();
109
+ return () => {
110
+ const { green, yellow } = import_ansi_colors.default;
111
+ spinner.stop();
112
+ import_consola.default.success(`${green("\u4E0B\u8F7D\u5B8C\u6210, \u7528\u65F6")} ${yellow(`${Date.now() - startTime}`)} ${green("ms.")}`);
113
+ };
114
+ }
115
+
116
+ // src/rewrite.ts
117
+ var import_node_process2 = __toESM(require("process"), 1);
118
+ var import_node_path = require("path");
119
+ var import_node_fs2 = require("fs");
120
+ var import_rimraf = require("rimraf");
121
+ var import_consola3 = __toESM(require("consola"), 1);
122
+
123
+ // src/utils.ts
124
+ var import_node_fs = require("fs");
125
+ var import_promises = require("fs/promises");
126
+ var import_consola2 = __toESM(require("consola"), 1);
127
+ var import_confbox = require("confbox");
128
+ function rewriteFile(path, fn) {
129
+ if (!(0, import_node_fs.existsSync)(path)) {
130
+ import_consola2.default.error(`RewriteFile fail: ${path} does not exist`);
131
+ return;
132
+ }
133
+ try {
134
+ const content = (0, import_node_fs.readFileSync)(path, { encoding: "utf-8" });
135
+ (0, import_node_fs.writeFileSync)(path, fn(content));
136
+ } catch (error) {
137
+ import_consola2.default.error(`RewriteFile fail: ${error}`);
138
+ }
139
+ }
140
+ async function readJSON(path) {
141
+ const blob = await (0, import_promises.readFile)(path, "utf-8");
142
+ let parsed;
143
+ try {
144
+ parsed = (0, import_confbox.parseJSON)(blob);
145
+ } catch {
146
+ parsed = (0, import_confbox.parseJSONC)(blob);
147
+ }
148
+ return parsed;
149
+ }
150
+ async function writeJSON(path, json) {
151
+ await (0, import_promises.writeFile)(path, (0, import_confbox.stringifyJSON)(json));
152
+ }
153
+ function assignValues(target, source) {
154
+ for (const [key, value] of Object.entries(source))
155
+ target[key] = value;
156
+ }
157
+
158
+ // src/constant.ts
159
+ var SETTING_FILE_PATH = "src/settings.default.ts";
160
+ var APPS_DIR = "apps";
161
+ var APPS = [
162
+ { name: "\u7528\u6237\u6743\u9650\u7CFB\u7EDF\uFF08rbac\uFF09", value: "rbac" }
163
+ // { name: '初始化项目模板(admin)', value: 'admin' },
164
+ ];
165
+ var METADATA_DIR = "configs/metadata";
166
+ var META_FILENAME = "pubinfo.json";
167
+
168
+ // src/rewrite.ts
169
+ async function rewrite(options) {
170
+ const { dir } = options;
171
+ const root = import_node_process2.default.cwd();
172
+ const projectDir = (0, import_node_path.resolve)(root, dir);
173
+ writeMetaJSON((0, import_node_path.resolve)(projectDir, METADATA_DIR), options);
174
+ writeApps((0, import_node_path.resolve)(projectDir, APPS_DIR), options);
175
+ }
176
+ async function writeMetaJSON(metaDir, options) {
177
+ const { key, version, apps } = options;
178
+ const path = (0, import_node_path.resolve)(metaDir, META_FILENAME);
179
+ try {
180
+ const json = await readJSON(path);
181
+ assignValues(json, {
182
+ key,
183
+ version,
184
+ apps
185
+ });
186
+ await writeJSON(path, json);
187
+ } catch (error) {
188
+ import_consola3.default.error(`\u521D\u59CB\u5316 metadata \u5931\u8D25: ${error}`);
189
+ }
190
+ }
191
+ function writeApps(appsDir, options) {
192
+ const { key, apps = [] } = options;
193
+ if (!(0, import_node_fs2.existsSync)(appsDir)) {
194
+ import_consola3.default.error(`\u521D\u59CB\u5316 apps \u5931\u8D25: ${appsDir} \u4E0D\u5B58\u5728`);
195
+ return;
196
+ }
197
+ try {
198
+ (0, import_node_fs2.readdirSync)(appsDir).forEach((app) => {
199
+ const appPath = (0, import_node_path.resolve)(appsDir, app);
200
+ const settingPath = (0, import_node_path.resolve)(appPath, SETTING_FILE_PATH);
201
+ if (!apps.includes(app)) {
202
+ (0, import_rimraf.rimrafSync)(appPath);
203
+ return;
204
+ }
205
+ rewriteFile(settingPath, (content) => {
206
+ return content.replace(/storagePrefix:\s*'([^']*)'/g, `storagePrefix: '${key}'`);
207
+ });
208
+ });
209
+ } catch (error) {
210
+ import_consola3.default.error(`\u521D\u59CB\u5316 apps \u5931\u8D25: ${error}`);
211
+ }
212
+ }
213
+
214
+ // src/log.ts
215
+ var import_cfonts = __toESM(require("cfonts"), 1);
216
+ function bootstrop() {
217
+ printLoGo("PUBINFO");
218
+ function printLoGo(logo) {
219
+ import_cfonts.default.say(logo, {
220
+ font: "simple3d",
221
+ align: "left",
222
+ background: "transparent",
223
+ letterSpacing: 1,
224
+ lineHeight: 1,
225
+ space: true,
226
+ maxLength: 0,
227
+ spaceless: false,
228
+ gradient: ["blue", "magenta"],
229
+ independentGradient: false,
230
+ transitionGradient: false,
231
+ env: "node"
232
+ });
233
+ }
234
+ }
235
+
236
+ // src/command/init.ts
237
+ var import_node_process4 = __toESM(require("process"), 1);
238
+ var import_node_fs3 = require("fs");
239
+ var import_prompts = require("@inquirer/prompts");
240
+ var import_consola5 = __toESM(require("consola"), 1);
241
+ var import_ansi_colors2 = __toESM(require("ansi-colors"), 1);
242
+
243
+ // src/fetch.ts
244
+ var import_node_process3 = __toESM(require("process"), 1);
245
+ var import_consola4 = __toESM(require("consola"), 1);
246
+ var import_ofetch = require("ofetch");
247
+ var import_ora2 = __toESM(require("ora"), 1);
248
+ var import_semver2 = require("semver");
249
+ async function fetchVersion() {
250
+ const versions = await (0, import_ofetch.ofetch)("http://124.223.184.245:10000/templates/version.json");
251
+ versions.sort((v1, v2) => -(0, import_semver2.compare)(v1, v2));
252
+ return {
253
+ latest: versions[0],
254
+ list: versions
255
+ };
256
+ }
257
+ async function fetchData() {
258
+ const spinner = (0, import_ora2.default)({
259
+ text: "\u68C0\u6D4B\u7F51\u7EDC\u8FDE\u63A5...",
260
+ color: "blue"
261
+ });
262
+ spinner.start();
263
+ try {
264
+ const version = await fetchVersion();
265
+ return {
266
+ version
267
+ };
268
+ } catch (error) {
269
+ import_consola4.default.error(`\u7F51\u7EDC\u8FDE\u63A5\u5F02\u5E38: ${error}`);
270
+ import_node_process3.default.exit(1);
109
271
  } finally {
110
- stop();
272
+ spinner.stop();
111
273
  }
112
274
  }
113
- // Annotate the CommonJS export names for ESM import in node:
114
- 0 && (module.exports = {
115
- download
116
- });
275
+
276
+ // src/command/init.ts
277
+ async function init() {
278
+ const { version } = await fetchData();
279
+ const answer = {};
280
+ try {
281
+ answer.dir = await (0, import_prompts.input)({ message: "\u76EE\u5F55\u540D\u79F0\uFF08dir\uFF09", default: "my-app" });
282
+ answer.key = await (0, import_prompts.input)({ message: "\u9879\u76EE\u6807\u8BC6\uFF08key\uFF09", default: answer.dir });
283
+ if ((0, import_node_fs3.existsSync)(answer.dir)) {
284
+ const overwrite = await (0, import_prompts.confirm)({ message: `\u76EE\u5F55 ${import_ansi_colors2.default.cyan(answer.dir)} \u5DF2\u5B58\u5728\uFF0C\u662F\u5426\u8986\u76D6\uFF1F` });
285
+ if (!overwrite)
286
+ throw Error;
287
+ }
288
+ answer.version = await (0, import_prompts.input)({
289
+ message: "\u6846\u67B6\u7248\u672C\u53F7\uFF08version\uFF09",
290
+ default: version.latest,
291
+ validate: (input2) => {
292
+ if (!version.list.includes(input2))
293
+ return `\u7248\u672C\u53F7: ${import_ansi_colors2.default.bold(input2)} \u4E0D\u5B58\u5728, \u5F53\u524D\u6700\u65B0\u7248\u672C\u53F7: ${import_ansi_colors2.default.bold(version.latest)}.`;
294
+ return true;
295
+ }
296
+ });
297
+ answer.apps = await (0, import_prompts.checkbox)({
298
+ message: "\u9009\u62E9\u5E94\u7528\u6A21\u5757\uFF08apps\uFF09",
299
+ choices: APPS,
300
+ validate: (input2) => {
301
+ if (input2.length === 0)
302
+ return "\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u5E94\u7528";
303
+ return true;
304
+ }
305
+ });
306
+ return answer;
307
+ } catch (error) {
308
+ import_consola5.default.fail("\u64CD\u4F5C\u7EC8\u6B62");
309
+ import_node_process4.default.exit(1);
310
+ }
311
+ }
312
+
313
+ // src/index.ts
314
+ async function main() {
315
+ const program = new import_commander.Command();
316
+ program.name(package_default.name).description(package_default.description).version(package_default.version);
317
+ program.description("\u521D\u59CB\u5316\u6846\u67B6").action(async () => {
318
+ bootstrop();
319
+ try {
320
+ const answer = await init();
321
+ await download(answer);
322
+ await rewrite(answer);
323
+ } catch (error) {
324
+ import_consola6.default.error(error);
325
+ }
326
+ });
327
+ program.command("create").description("\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684\u5E94\u7528").argument("<app-name>", "\u5E94\u7528\u540D\u79F0").action((name) => {
328
+ import_consola6.default.info("\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684\u5E94\u7528", name);
329
+ });
330
+ program.command("status").description("\u67E5\u770B\u6846\u67B6\u72B6\u6001").action(() => {
331
+ });
332
+ program.command("update").description("\u66F4\u65B0\u6846\u67B6\u7248\u672C").action(() => {
333
+ });
334
+ program.parse();
335
+ }
336
+ main();
package/dist/index.js CHANGED
@@ -1,6 +1,313 @@
1
- import {
2
- download
3
- } from "./chunk-6FAJDUJL.js";
4
- export {
5
- download
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import { Command } from "commander";
5
+ import consola6 from "consola";
6
+
7
+ // package.json
8
+ var package_default = {
9
+ name: "create-pubinfo",
10
+ type: "module",
11
+ version: "0.4.0",
12
+ description: "\u521D\u59CB\u5316\u9879\u76EE\u6846\u67B6",
13
+ author: "Werheng <werheng.zhang@gmail.com>",
14
+ license: "MIT",
15
+ repository: "https://github.com/werheng/pubinfo-cli",
16
+ bugs: {
17
+ url: "https://github.com/werheng/pubinfo-cli/issues"
18
+ },
19
+ bin: {
20
+ pubinfo: "./dist/index.js"
21
+ },
22
+ files: [
23
+ "dist"
24
+ ],
25
+ scripts: {
26
+ dev: "tsup --watch src",
27
+ build: "tsup",
28
+ cli: "tsx src/index.ts",
29
+ "cli:clean": "rimraf ./my-app"
30
+ },
31
+ dependencies: {
32
+ "@inquirer/prompts": "^4.3.3",
33
+ "ansi-colors": "^4.1.3",
34
+ cfonts: "^3.2.0",
35
+ commander: "^12.0.0",
36
+ confbox: "^0.1.7",
37
+ consola: "^3.2.3",
38
+ giget: "^1.2.3",
39
+ ofetch: "^1.3.4",
40
+ ora: "^8.0.1",
41
+ rimraf: "^5.0.5",
42
+ semver: "^7.6.0"
43
+ }
6
44
  };
45
+
46
+ // src/download.ts
47
+ import process from "node:process";
48
+ import { downloadTemplate } from "giget";
49
+ import consola from "consola";
50
+ import colors from "ansi-colors";
51
+ import ora from "ora";
52
+ import { coerce } from "semver";
53
+ var pubinfo = async (input2, { auth }) => {
54
+ const semver = coerce(input2);
55
+ return {
56
+ name: "pubinfo",
57
+ version: input2,
58
+ headers: { Authorization: `token ${auth}` },
59
+ tar: `http://124.223.184.245:10000/templates/monorepo-project-template-${semver?.version}.tar.gz`
60
+ };
61
+ };
62
+ async function download(options) {
63
+ const finish = loading();
64
+ try {
65
+ await downloadTemplate(`pubinfo:monorepo-project-template-${options.version}`, {
66
+ providers: { pubinfo },
67
+ force: true,
68
+ forceClean: true,
69
+ // auth: options.auth,
70
+ dir: options.dir
71
+ });
72
+ } catch (error) {
73
+ consola.error(`\u4E0B\u8F7D\u5931\u8D25: ${error}`);
74
+ process.exit(1);
75
+ } finally {
76
+ finish();
77
+ }
78
+ }
79
+ function loading() {
80
+ const startTime = Date.now();
81
+ const spinner = ora({
82
+ text: "\u4E0B\u8F7D\u4E2D...",
83
+ color: "green"
84
+ });
85
+ spinner.start();
86
+ return () => {
87
+ const { green, yellow } = colors;
88
+ spinner.stop();
89
+ consola.success(`${green("\u4E0B\u8F7D\u5B8C\u6210, \u7528\u65F6")} ${yellow(`${Date.now() - startTime}`)} ${green("ms.")}`);
90
+ };
91
+ }
92
+
93
+ // src/rewrite.ts
94
+ import process2 from "node:process";
95
+ import { resolve } from "node:path";
96
+ import { existsSync as existsSync2, readdirSync } from "node:fs";
97
+ import { rimrafSync } from "rimraf";
98
+ import consola3 from "consola";
99
+
100
+ // src/utils.ts
101
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
102
+ import { readFile, writeFile } from "node:fs/promises";
103
+ import consola2 from "consola";
104
+ import { parseJSON, parseJSONC, stringifyJSON } from "confbox";
105
+ function rewriteFile(path, fn) {
106
+ if (!existsSync(path)) {
107
+ consola2.error(`RewriteFile fail: ${path} does not exist`);
108
+ return;
109
+ }
110
+ try {
111
+ const content = readFileSync(path, { encoding: "utf-8" });
112
+ writeFileSync(path, fn(content));
113
+ } catch (error) {
114
+ consola2.error(`RewriteFile fail: ${error}`);
115
+ }
116
+ }
117
+ async function readJSON(path) {
118
+ const blob = await readFile(path, "utf-8");
119
+ let parsed;
120
+ try {
121
+ parsed = parseJSON(blob);
122
+ } catch {
123
+ parsed = parseJSONC(blob);
124
+ }
125
+ return parsed;
126
+ }
127
+ async function writeJSON(path, json) {
128
+ await writeFile(path, stringifyJSON(json));
129
+ }
130
+ function assignValues(target, source) {
131
+ for (const [key, value] of Object.entries(source))
132
+ target[key] = value;
133
+ }
134
+
135
+ // src/constant.ts
136
+ var SETTING_FILE_PATH = "src/settings.default.ts";
137
+ var APPS_DIR = "apps";
138
+ var APPS = [
139
+ { name: "\u7528\u6237\u6743\u9650\u7CFB\u7EDF\uFF08rbac\uFF09", value: "rbac" }
140
+ // { name: '初始化项目模板(admin)', value: 'admin' },
141
+ ];
142
+ var METADATA_DIR = "configs/metadata";
143
+ var META_FILENAME = "pubinfo.json";
144
+
145
+ // src/rewrite.ts
146
+ async function rewrite(options) {
147
+ const { dir } = options;
148
+ const root = process2.cwd();
149
+ const projectDir = resolve(root, dir);
150
+ writeMetaJSON(resolve(projectDir, METADATA_DIR), options);
151
+ writeApps(resolve(projectDir, APPS_DIR), options);
152
+ }
153
+ async function writeMetaJSON(metaDir, options) {
154
+ const { key, version, apps } = options;
155
+ const path = resolve(metaDir, META_FILENAME);
156
+ try {
157
+ const json = await readJSON(path);
158
+ assignValues(json, {
159
+ key,
160
+ version,
161
+ apps
162
+ });
163
+ await writeJSON(path, json);
164
+ } catch (error) {
165
+ consola3.error(`\u521D\u59CB\u5316 metadata \u5931\u8D25: ${error}`);
166
+ }
167
+ }
168
+ function writeApps(appsDir, options) {
169
+ const { key, apps = [] } = options;
170
+ if (!existsSync2(appsDir)) {
171
+ consola3.error(`\u521D\u59CB\u5316 apps \u5931\u8D25: ${appsDir} \u4E0D\u5B58\u5728`);
172
+ return;
173
+ }
174
+ try {
175
+ readdirSync(appsDir).forEach((app) => {
176
+ const appPath = resolve(appsDir, app);
177
+ const settingPath = resolve(appPath, SETTING_FILE_PATH);
178
+ if (!apps.includes(app)) {
179
+ rimrafSync(appPath);
180
+ return;
181
+ }
182
+ rewriteFile(settingPath, (content) => {
183
+ return content.replace(/storagePrefix:\s*'([^']*)'/g, `storagePrefix: '${key}'`);
184
+ });
185
+ });
186
+ } catch (error) {
187
+ consola3.error(`\u521D\u59CB\u5316 apps \u5931\u8D25: ${error}`);
188
+ }
189
+ }
190
+
191
+ // src/log.ts
192
+ import fonts from "cfonts";
193
+ function bootstrop() {
194
+ printLoGo("PUBINFO");
195
+ function printLoGo(logo) {
196
+ fonts.say(logo, {
197
+ font: "simple3d",
198
+ align: "left",
199
+ background: "transparent",
200
+ letterSpacing: 1,
201
+ lineHeight: 1,
202
+ space: true,
203
+ maxLength: 0,
204
+ spaceless: false,
205
+ gradient: ["blue", "magenta"],
206
+ independentGradient: false,
207
+ transitionGradient: false,
208
+ env: "node"
209
+ });
210
+ }
211
+ }
212
+
213
+ // src/command/init.ts
214
+ import process4 from "node:process";
215
+ import { existsSync as existsSync3 } from "node:fs";
216
+ import { checkbox, confirm, input } from "@inquirer/prompts";
217
+ import consola5 from "consola";
218
+ import colors2 from "ansi-colors";
219
+
220
+ // src/fetch.ts
221
+ import process3 from "node:process";
222
+ import consola4 from "consola";
223
+ import { ofetch } from "ofetch";
224
+ import ora2 from "ora";
225
+ import { compare } from "semver";
226
+ async function fetchVersion() {
227
+ const versions = await ofetch("http://124.223.184.245:10000/templates/version.json");
228
+ versions.sort((v1, v2) => -compare(v1, v2));
229
+ return {
230
+ latest: versions[0],
231
+ list: versions
232
+ };
233
+ }
234
+ async function fetchData() {
235
+ const spinner = ora2({
236
+ text: "\u68C0\u6D4B\u7F51\u7EDC\u8FDE\u63A5...",
237
+ color: "blue"
238
+ });
239
+ spinner.start();
240
+ try {
241
+ const version = await fetchVersion();
242
+ return {
243
+ version
244
+ };
245
+ } catch (error) {
246
+ consola4.error(`\u7F51\u7EDC\u8FDE\u63A5\u5F02\u5E38: ${error}`);
247
+ process3.exit(1);
248
+ } finally {
249
+ spinner.stop();
250
+ }
251
+ }
252
+
253
+ // src/command/init.ts
254
+ async function init() {
255
+ const { version } = await fetchData();
256
+ const answer = {};
257
+ try {
258
+ answer.dir = await input({ message: "\u76EE\u5F55\u540D\u79F0\uFF08dir\uFF09", default: "my-app" });
259
+ answer.key = await input({ message: "\u9879\u76EE\u6807\u8BC6\uFF08key\uFF09", default: answer.dir });
260
+ if (existsSync3(answer.dir)) {
261
+ const overwrite = await confirm({ message: `\u76EE\u5F55 ${colors2.cyan(answer.dir)} \u5DF2\u5B58\u5728\uFF0C\u662F\u5426\u8986\u76D6\uFF1F` });
262
+ if (!overwrite)
263
+ throw Error;
264
+ }
265
+ answer.version = await input({
266
+ message: "\u6846\u67B6\u7248\u672C\u53F7\uFF08version\uFF09",
267
+ default: version.latest,
268
+ validate: (input2) => {
269
+ if (!version.list.includes(input2))
270
+ return `\u7248\u672C\u53F7: ${colors2.bold(input2)} \u4E0D\u5B58\u5728, \u5F53\u524D\u6700\u65B0\u7248\u672C\u53F7: ${colors2.bold(version.latest)}.`;
271
+ return true;
272
+ }
273
+ });
274
+ answer.apps = await checkbox({
275
+ message: "\u9009\u62E9\u5E94\u7528\u6A21\u5757\uFF08apps\uFF09",
276
+ choices: APPS,
277
+ validate: (input2) => {
278
+ if (input2.length === 0)
279
+ return "\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u5E94\u7528";
280
+ return true;
281
+ }
282
+ });
283
+ return answer;
284
+ } catch (error) {
285
+ consola5.fail("\u64CD\u4F5C\u7EC8\u6B62");
286
+ process4.exit(1);
287
+ }
288
+ }
289
+
290
+ // src/index.ts
291
+ async function main() {
292
+ const program = new Command();
293
+ program.name(package_default.name).description(package_default.description).version(package_default.version);
294
+ program.description("\u521D\u59CB\u5316\u6846\u67B6").action(async () => {
295
+ bootstrop();
296
+ try {
297
+ const answer = await init();
298
+ await download(answer);
299
+ await rewrite(answer);
300
+ } catch (error) {
301
+ consola6.error(error);
302
+ }
303
+ });
304
+ program.command("create").description("\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684\u5E94\u7528").argument("<app-name>", "\u5E94\u7528\u540D\u79F0").action((name) => {
305
+ consola6.info("\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684\u5E94\u7528", name);
306
+ });
307
+ program.command("status").description("\u67E5\u770B\u6846\u67B6\u72B6\u6001").action(() => {
308
+ });
309
+ program.command("update").description("\u66F4\u65B0\u6846\u67B6\u7248\u672C").action(() => {
310
+ });
311
+ program.parse();
312
+ }
313
+ main();
package/package.json CHANGED
@@ -1,37 +1,37 @@
1
1
  {
2
2
  "name": "create-pubinfo",
3
3
  "type": "module",
4
- "version": "0.3.2",
5
- "description": "Start a Pubinfo project.",
4
+ "version": "0.4.0",
5
+ "description": "初始化项目框架",
6
6
  "author": "Werheng <werheng.zhang@gmail.com>",
7
7
  "license": "MIT",
8
8
  "repository": "https://github.com/werheng/pubinfo-cli",
9
9
  "bugs": {
10
10
  "url": "https://github.com/werheng/pubinfo-cli/issues"
11
11
  },
12
- "bin": "./dist/cli.js",
12
+ "bin": {
13
+ "pubinfo": "./dist/index.js"
14
+ },
13
15
  "files": [
14
16
  "dist"
15
17
  ],
16
18
  "dependencies": {
17
- "@inquirer/prompts": "^4.3.1",
19
+ "@inquirer/prompts": "^4.3.3",
18
20
  "ansi-colors": "^4.1.3",
19
- "boxen": "^7.1.1",
20
21
  "cfonts": "^3.2.0",
21
- "cli-progress": "^3.12.0",
22
22
  "commander": "^12.0.0",
23
+ "confbox": "^0.1.7",
23
24
  "consola": "^3.2.3",
24
- "fake-progress": "^1.0.4",
25
25
  "giget": "^1.2.3",
26
- "progress": "^2.0.3",
27
- "radash": "^12.1.0"
28
- },
29
- "devDependencies": {
30
- "@types/cli-progress": "^3.11.5"
26
+ "ofetch": "^1.3.4",
27
+ "ora": "^8.0.1",
28
+ "rimraf": "^5.0.5",
29
+ "semver": "^7.6.0"
31
30
  },
32
31
  "scripts": {
33
32
  "dev": "tsup --watch src",
34
33
  "build": "tsup",
35
- "cli": "tsx src/cli.ts"
34
+ "cli": "tsx src/index.ts",
35
+ "cli:clean": "rimraf ./my-app"
36
36
  }
37
37
  }
@@ -1,80 +0,0 @@
1
- // src/download.ts
2
- import { downloadTemplate } from "giget";
3
- import consola from "consola";
4
-
5
- // src/progress.ts
6
- import process from "node:process";
7
- import { Presets, SingleBar } from "cli-progress";
8
- import colors from "ansi-colors";
9
- import FackProgress from "fake-progress";
10
- function createMockProgressBar() {
11
- const fakeProgress = new FackProgress({
12
- timeConstant: 10 * 1e3
13
- });
14
- let complete = false;
15
- const bar = new SingleBar(
16
- {
17
- format: `${colors.bold.green("Download:")} ${colors.blueBright("{bar}")}| {percentage}% || {value}/{total} || Speed: {speed}`,
18
- barCompleteChar: "\u2588",
19
- barIncompleteChar: "\u2591",
20
- hideCursor: true,
21
- linewrap: true,
22
- barsize: 40,
23
- clearOnComplete: true,
24
- stopOnComplete: true
25
- },
26
- Presets.shades_classic
27
- );
28
- function interval() {
29
- const startTime = Date.now();
30
- fakeProgress.start();
31
- console.log("\n");
32
- bar.start(100, 0, {
33
- speed: "N/A"
34
- });
35
- const timer = setInterval(() => {
36
- const count = Number((fakeProgress.progress * 100).toFixed(0));
37
- bar.update(count);
38
- if (complete) {
39
- bar.update(100);
40
- console.log(`${colors.bold.green("Download complete in")} ${colors.bold.yellow(`${Date.now() - startTime}`)} ${colors.bold.green("ms.")}`);
41
- clearInterval(timer);
42
- process.exit(0);
43
- }
44
- }, 100);
45
- }
46
- function stop() {
47
- complete = true;
48
- }
49
- interval();
50
- return stop;
51
- }
52
-
53
- // src/download.ts
54
- var pubinfo = async (input, { auth }) => {
55
- return {
56
- name: "pubinfo",
57
- version: input,
58
- headers: { Authorization: `token ${auth}` },
59
- tar: "http://124.223.184.245:10000/monorepo-project-template.tar.gz"
60
- };
61
- };
62
- async function download(options = {}) {
63
- const stop = createMockProgressBar();
64
- try {
65
- await downloadTemplate("pubinfo:monorepo-project-template", {
66
- providers: { pubinfo },
67
- force: true,
68
- auth: options.auth,
69
- dir: options.dir
70
- });
71
- } catch (error) {
72
- consola.error(error);
73
- } finally {
74
- stop();
75
- }
76
- }
77
-
78
- export {
79
- download
80
- };
package/dist/cli.cjs DELETED
@@ -1,193 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
- // If the importer is in node compatibility mode or this is not an ESM
19
- // file that has been converted to a CommonJS file using a Babel-
20
- // compatible transform (i.e. "__esModule" has not been set), then set
21
- // "default" to the CommonJS "module.exports" for node compatibility.
22
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
- mod
24
- ));
25
-
26
- // src/cli.ts
27
- var import_commander = require("commander");
28
- var import_prompts = require("@inquirer/prompts");
29
- var import_consola2 = __toESM(require("consola"), 1);
30
-
31
- // package.json
32
- var package_default = {
33
- name: "create-pubinfo",
34
- type: "module",
35
- version: "0.3.2",
36
- description: "Start a Pubinfo project.",
37
- author: "Werheng <werheng.zhang@gmail.com>",
38
- license: "MIT",
39
- repository: "https://github.com/werheng/pubinfo-cli",
40
- bugs: {
41
- url: "https://github.com/werheng/pubinfo-cli/issues"
42
- },
43
- bin: "./dist/cli.js",
44
- files: [
45
- "dist"
46
- ],
47
- scripts: {
48
- dev: "tsup --watch src",
49
- build: "tsup",
50
- cli: "tsx src/cli.ts"
51
- },
52
- dependencies: {
53
- "@inquirer/prompts": "^4.3.1",
54
- "ansi-colors": "^4.1.3",
55
- boxen: "^7.1.1",
56
- cfonts: "^3.2.0",
57
- "cli-progress": "^3.12.0",
58
- commander: "^12.0.0",
59
- consola: "^3.2.3",
60
- "fake-progress": "^1.0.4",
61
- giget: "^1.2.3",
62
- progress: "^2.0.3",
63
- radash: "^12.1.0"
64
- },
65
- devDependencies: {
66
- "@types/cli-progress": "^3.11.5"
67
- }
68
- };
69
-
70
- // src/download.ts
71
- var import_giget = require("giget");
72
- var import_consola = __toESM(require("consola"), 1);
73
-
74
- // src/progress.ts
75
- var import_node_process = __toESM(require("process"), 1);
76
- var import_cli_progress = require("cli-progress");
77
- var import_ansi_colors = __toESM(require("ansi-colors"), 1);
78
- var import_fake_progress = __toESM(require("fake-progress"), 1);
79
- function createMockProgressBar() {
80
- const fakeProgress = new import_fake_progress.default({
81
- timeConstant: 10 * 1e3
82
- });
83
- let complete = false;
84
- const bar = new import_cli_progress.SingleBar(
85
- {
86
- format: `${import_ansi_colors.default.bold.green("Download:")} ${import_ansi_colors.default.blueBright("{bar}")}| {percentage}% || {value}/{total} || Speed: {speed}`,
87
- barCompleteChar: "\u2588",
88
- barIncompleteChar: "\u2591",
89
- hideCursor: true,
90
- linewrap: true,
91
- barsize: 40,
92
- clearOnComplete: true,
93
- stopOnComplete: true
94
- },
95
- import_cli_progress.Presets.shades_classic
96
- );
97
- function interval() {
98
- const startTime = Date.now();
99
- fakeProgress.start();
100
- console.log("\n");
101
- bar.start(100, 0, {
102
- speed: "N/A"
103
- });
104
- const timer = setInterval(() => {
105
- const count = Number((fakeProgress.progress * 100).toFixed(0));
106
- bar.update(count);
107
- if (complete) {
108
- bar.update(100);
109
- console.log(`${import_ansi_colors.default.bold.green("Download complete in")} ${import_ansi_colors.default.bold.yellow(`${Date.now() - startTime}`)} ${import_ansi_colors.default.bold.green("ms.")}`);
110
- clearInterval(timer);
111
- import_node_process.default.exit(0);
112
- }
113
- }, 100);
114
- }
115
- function stop() {
116
- complete = true;
117
- }
118
- interval();
119
- return stop;
120
- }
121
-
122
- // src/download.ts
123
- var pubinfo = async (input2, { auth }) => {
124
- return {
125
- name: "pubinfo",
126
- version: input2,
127
- headers: { Authorization: `token ${auth}` },
128
- tar: "http://124.223.184.245:10000/monorepo-project-template.tar.gz"
129
- };
130
- };
131
- async function download(options = {}) {
132
- const stop = createMockProgressBar();
133
- try {
134
- await (0, import_giget.downloadTemplate)("pubinfo:monorepo-project-template", {
135
- providers: { pubinfo },
136
- force: true,
137
- auth: options.auth,
138
- dir: options.dir
139
- });
140
- } catch (error) {
141
- import_consola.default.error(error);
142
- } finally {
143
- stop();
144
- }
145
- }
146
-
147
- // src/rewrite.ts
148
- async function rewrite(_) {
149
- }
150
-
151
- // src/log.ts
152
- var import_cfonts = __toESM(require("cfonts"), 1);
153
- function bootstrop() {
154
- printLoGo("PUBINFO");
155
- function printLoGo(logo) {
156
- import_cfonts.default.say(logo, {
157
- font: "simple3d",
158
- align: "left",
159
- background: "transparent",
160
- letterSpacing: 1,
161
- lineHeight: 1,
162
- space: true,
163
- maxLength: 0,
164
- spaceless: false,
165
- gradient: ["blue", "magenta"],
166
- independentGradient: false,
167
- transitionGradient: false,
168
- env: "node"
169
- });
170
- }
171
- }
172
-
173
- // src/cli.ts
174
- async function main() {
175
- const program = new import_commander.Command();
176
- program.name(package_default.name).description(package_default.description).version(package_default.version);
177
- program.parse();
178
- bootstrop();
179
- const answer = {};
180
- try {
181
- answer.dir = await (0, import_prompts.input)({ message: "\u8BF7\u8F93\u5165\u76EE\u5F55\u540D\u79F0", default: "my-app" });
182
- answer.key = await (0, import_prompts.input)({ message: "\u8BF7\u8F93\u5165\u9879\u76EE\u6807\u8BC6(key)", default: answer.dir });
183
- } catch (error) {
184
- import_consola2.default.fail("Operation cancelled");
185
- }
186
- try {
187
- await download(answer);
188
- await rewrite(answer);
189
- } catch (error) {
190
- import_consola2.default.error(error);
191
- }
192
- }
193
- main();
package/dist/cli.js DELETED
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- download
4
- } from "./chunk-6FAJDUJL.js";
5
-
6
- // src/cli.ts
7
- import { Command } from "commander";
8
- import { input } from "@inquirer/prompts";
9
- import consola from "consola";
10
-
11
- // package.json
12
- var package_default = {
13
- name: "create-pubinfo",
14
- type: "module",
15
- version: "0.3.2",
16
- description: "Start a Pubinfo project.",
17
- author: "Werheng <werheng.zhang@gmail.com>",
18
- license: "MIT",
19
- repository: "https://github.com/werheng/pubinfo-cli",
20
- bugs: {
21
- url: "https://github.com/werheng/pubinfo-cli/issues"
22
- },
23
- bin: "./dist/cli.js",
24
- files: [
25
- "dist"
26
- ],
27
- scripts: {
28
- dev: "tsup --watch src",
29
- build: "tsup",
30
- cli: "tsx src/cli.ts"
31
- },
32
- dependencies: {
33
- "@inquirer/prompts": "^4.3.1",
34
- "ansi-colors": "^4.1.3",
35
- boxen: "^7.1.1",
36
- cfonts: "^3.2.0",
37
- "cli-progress": "^3.12.0",
38
- commander: "^12.0.0",
39
- consola: "^3.2.3",
40
- "fake-progress": "^1.0.4",
41
- giget: "^1.2.3",
42
- progress: "^2.0.3",
43
- radash: "^12.1.0"
44
- },
45
- devDependencies: {
46
- "@types/cli-progress": "^3.11.5"
47
- }
48
- };
49
-
50
- // src/rewrite.ts
51
- async function rewrite(_) {
52
- }
53
-
54
- // src/log.ts
55
- import fonts from "cfonts";
56
- function bootstrop() {
57
- printLoGo("PUBINFO");
58
- function printLoGo(logo) {
59
- fonts.say(logo, {
60
- font: "simple3d",
61
- align: "left",
62
- background: "transparent",
63
- letterSpacing: 1,
64
- lineHeight: 1,
65
- space: true,
66
- maxLength: 0,
67
- spaceless: false,
68
- gradient: ["blue", "magenta"],
69
- independentGradient: false,
70
- transitionGradient: false,
71
- env: "node"
72
- });
73
- }
74
- }
75
-
76
- // src/cli.ts
77
- async function main() {
78
- const program = new Command();
79
- program.name(package_default.name).description(package_default.description).version(package_default.version);
80
- program.parse();
81
- bootstrop();
82
- const answer = {};
83
- try {
84
- answer.dir = await input({ message: "\u8BF7\u8F93\u5165\u76EE\u5F55\u540D\u79F0", default: "my-app" });
85
- answer.key = await input({ message: "\u8BF7\u8F93\u5165\u9879\u76EE\u6807\u8BC6(key)", default: answer.dir });
86
- } catch (error) {
87
- consola.fail("Operation cancelled");
88
- }
89
- try {
90
- await download(answer);
91
- await rewrite(answer);
92
- } catch (error) {
93
- consola.error(error);
94
- }
95
- }
96
- main();