@giteeteam/apps-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/index.js +426 -0
- package/package.json +58 -0
package/README.md
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var commander = require('commander');
|
|
5
|
+
var rollup = require('rollup');
|
|
6
|
+
var path = require('path');
|
|
7
|
+
var fs = require('fs');
|
|
8
|
+
var fse = require('fs-extra');
|
|
9
|
+
var esbuild$1 = require('esbuild');
|
|
10
|
+
var pluginNodeResolve = require('@rollup/plugin-node-resolve');
|
|
11
|
+
var commonjs = require('@rollup/plugin-commonjs');
|
|
12
|
+
var archiver = require('archiver');
|
|
13
|
+
var ora = require('ora');
|
|
14
|
+
var yaml = require('yaml');
|
|
15
|
+
var inquirer = require('inquirer');
|
|
16
|
+
var simpleGit = require('simple-git');
|
|
17
|
+
var uuid = require('uuid');
|
|
18
|
+
var chalk = require('chalk');
|
|
19
|
+
var readline = require('readline');
|
|
20
|
+
var execa = require('execa');
|
|
21
|
+
|
|
22
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
23
|
+
|
|
24
|
+
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
|
|
25
|
+
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
26
|
+
var fse__default = /*#__PURE__*/_interopDefaultLegacy(fse);
|
|
27
|
+
var commonjs__default = /*#__PURE__*/_interopDefaultLegacy(commonjs);
|
|
28
|
+
var archiver__default = /*#__PURE__*/_interopDefaultLegacy(archiver);
|
|
29
|
+
var ora__default = /*#__PURE__*/_interopDefaultLegacy(ora);
|
|
30
|
+
var inquirer__default = /*#__PURE__*/_interopDefaultLegacy(inquirer);
|
|
31
|
+
var simpleGit__default = /*#__PURE__*/_interopDefaultLegacy(simpleGit);
|
|
32
|
+
var readline__default = /*#__PURE__*/_interopDefaultLegacy(readline);
|
|
33
|
+
var execa__default = /*#__PURE__*/_interopDefaultLegacy(execa);
|
|
34
|
+
|
|
35
|
+
var version = "0.1.0";
|
|
36
|
+
|
|
37
|
+
const defaultOptions = {
|
|
38
|
+
treeShaking: true,
|
|
39
|
+
format: 'esm',
|
|
40
|
+
loader: 'tsx',
|
|
41
|
+
};
|
|
42
|
+
function esbuild(options) {
|
|
43
|
+
options = { ...defaultOptions, ...options };
|
|
44
|
+
return {
|
|
45
|
+
name: 'esbuild',
|
|
46
|
+
resolveId(source, importer, opts) {
|
|
47
|
+
// console.log('resolveId:');
|
|
48
|
+
// console.dir({ source, importer, opts }, { depth: null });
|
|
49
|
+
if (!importer || ['.ts', '.tsx', '.js', '.jsx'].some(ext => source.endsWith(ext))) {
|
|
50
|
+
return source;
|
|
51
|
+
}
|
|
52
|
+
const dirPath = path.dirname(importer);
|
|
53
|
+
let path$1;
|
|
54
|
+
if (fs.existsSync((path$1 = path.resolve(dirPath, source, 'index.ts')))) {
|
|
55
|
+
return path$1;
|
|
56
|
+
}
|
|
57
|
+
else if (fs.existsSync((path$1 = path.resolve(dirPath, source, 'index.tsx')))) {
|
|
58
|
+
return path$1;
|
|
59
|
+
}
|
|
60
|
+
else if (fs.existsSync((path$1 = path.resolve(dirPath, source + '.ts')))) {
|
|
61
|
+
return path$1;
|
|
62
|
+
}
|
|
63
|
+
else if (fs.existsSync((path$1 = path.resolve(dirPath, source + '.tsx')))) {
|
|
64
|
+
return path$1;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.error({ source, importer, options: opts });
|
|
68
|
+
path$1 = path.relative('.', path.resolve(importer, source));
|
|
69
|
+
throw new Error(`ENOENT: ${path$1.replace(/\\/g, '/')}`);
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
async transform(src, id) {
|
|
73
|
+
options.sourcefile = id;
|
|
74
|
+
const { code, map } = await esbuild$1.transform(src, options);
|
|
75
|
+
if (!map)
|
|
76
|
+
return code;
|
|
77
|
+
return { code, map };
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
var MODE;
|
|
83
|
+
(function (MODE) {
|
|
84
|
+
MODE["DEV"] = "development";
|
|
85
|
+
MODE["PROD"] = "production";
|
|
86
|
+
})(MODE || (MODE = {}));
|
|
87
|
+
function getRollupOptions(input, outputFile, mode = MODE.DEV) {
|
|
88
|
+
const plugins = [pluginNodeResolve.nodeResolve(), commonjs__default["default"]()];
|
|
89
|
+
plugins.push(esbuild({
|
|
90
|
+
sourcemap: mode === MODE.DEV,
|
|
91
|
+
minify: mode !== MODE.DEV,
|
|
92
|
+
target: 'es2018',
|
|
93
|
+
jsx: 'transform',
|
|
94
|
+
jsxFactory: 'NebulaUI.createElement',
|
|
95
|
+
jsxFragment: 'NebulaUI.Fragment',
|
|
96
|
+
}));
|
|
97
|
+
const inputOptions = {
|
|
98
|
+
input,
|
|
99
|
+
plugins,
|
|
100
|
+
};
|
|
101
|
+
const outputOptions = {
|
|
102
|
+
file: outputFile,
|
|
103
|
+
format: 'es',
|
|
104
|
+
sourcemap: mode === MODE.DEV,
|
|
105
|
+
};
|
|
106
|
+
return { inputOptions, outputOptions };
|
|
107
|
+
}
|
|
108
|
+
async function bundle(opts) {
|
|
109
|
+
const { fileName, inputDir, outputDir, mode = MODE.DEV } = opts;
|
|
110
|
+
const input = path__default["default"].join(inputDir, `${fileName}.ts`);
|
|
111
|
+
if (!fs__default["default"].existsSync(input)) {
|
|
112
|
+
console.error(`${input} is not exist`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const outputFile = path__default["default"].join(outputDir, `${fileName}.js`);
|
|
116
|
+
const { inputOptions, outputOptions } = getRollupOptions(input, outputFile, mode);
|
|
117
|
+
await fse__default["default"].emptyDir(outputDir);
|
|
118
|
+
const build = await rollup.rollup(inputOptions);
|
|
119
|
+
await build.write(outputOptions);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const packageApp = async (outputDir, manifest, _copyFiles = []) => {
|
|
123
|
+
// add copy file manifest
|
|
124
|
+
const copyFiles = ['manifest.yml', ..._copyFiles];
|
|
125
|
+
const { resources } = manifest;
|
|
126
|
+
if (resources) {
|
|
127
|
+
for (const { key, path: resourcePath } of resources) {
|
|
128
|
+
const src = path__default["default"].resolve(path__default["default"].join('./', resourcePath));
|
|
129
|
+
const dest = path__default["default"].join(outputDir, key);
|
|
130
|
+
await fse__default["default"].copy(src, dest);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// copy的文件
|
|
134
|
+
for (const file of copyFiles) {
|
|
135
|
+
const srcFile = path__default["default"].resolve(file);
|
|
136
|
+
const destFile = path__default["default"].join(outputDir, file);
|
|
137
|
+
await fse__default["default"].copy(srcFile, destFile);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const readPkgName = () => {
|
|
142
|
+
const fileBuffer = fs__default["default"].readFileSync(path__default["default"].resolve('./package.json'));
|
|
143
|
+
const fileStr = fileBuffer.toString();
|
|
144
|
+
const fileJson = JSON.parse(fileStr);
|
|
145
|
+
return fileJson === null || fileJson === void 0 ? void 0 : fileJson.name;
|
|
146
|
+
};
|
|
147
|
+
const archiveApp = (archiveDir) => {
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
const pkgName = readPkgName();
|
|
150
|
+
const outputFile = path__default["default"].resolve(`./${pkgName}.zip`);
|
|
151
|
+
const output = fs__default["default"].createWriteStream(outputFile);
|
|
152
|
+
const archive = archiver__default["default"]('zip', {
|
|
153
|
+
zlib: { level: 9 }, // Sets the compression level.
|
|
154
|
+
});
|
|
155
|
+
// listen for all archive data to be written
|
|
156
|
+
// 'close' event is fired only when a file descriptor is involved
|
|
157
|
+
output.on('close', function () {
|
|
158
|
+
// console.log(archive.pointer() + ' total bytes');
|
|
159
|
+
// console.log('archiver has been finalized and the output file descriptor has closed.');
|
|
160
|
+
resolve();
|
|
161
|
+
});
|
|
162
|
+
// output.on('end', function () {
|
|
163
|
+
// console.log('Data has been drained');
|
|
164
|
+
// });
|
|
165
|
+
// good practice to catch warnings (ie stat failures and other non-blocking errors)
|
|
166
|
+
archive.on('warning', function (err) {
|
|
167
|
+
console.log(err);
|
|
168
|
+
if (err.code === 'ENOENT') ;
|
|
169
|
+
else {
|
|
170
|
+
// throw error
|
|
171
|
+
reject(err);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// good practice to catch this error explicitly
|
|
175
|
+
archive.on('error', function (err) {
|
|
176
|
+
console.log(err);
|
|
177
|
+
reject(err);
|
|
178
|
+
});
|
|
179
|
+
// pipe archive data to the file
|
|
180
|
+
archive.pipe(output);
|
|
181
|
+
// append files from a sub-directory, putting its contents at the root of archive
|
|
182
|
+
archive.directory(archiveDir, false);
|
|
183
|
+
archive.finalize();
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const bundleApp = async (opts) => {
|
|
188
|
+
var _a, _b;
|
|
189
|
+
const { manifest, mode, outputDir, inputDir } = opts;
|
|
190
|
+
const fileNames = new Set();
|
|
191
|
+
(_b = (_a = manifest.modules) === null || _a === void 0 ? void 0 : _a.function) === null || _b === void 0 ? void 0 : _b.forEach(({ handler }) => {
|
|
192
|
+
const filename = handler.split('.')[0];
|
|
193
|
+
fileNames.add(filename);
|
|
194
|
+
});
|
|
195
|
+
const bundlePromise = [...fileNames].map(async (fileName) => {
|
|
196
|
+
await bundle({
|
|
197
|
+
inputDir,
|
|
198
|
+
fileName,
|
|
199
|
+
outputDir,
|
|
200
|
+
mode,
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
await Promise.all(bundlePromise);
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
const execActionWithSpinner = async (message, action) => {
|
|
207
|
+
const spinner = ora__default["default"](message.start).start();
|
|
208
|
+
try {
|
|
209
|
+
await action();
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
console.error(e.message);
|
|
213
|
+
spinner.fail(message.error);
|
|
214
|
+
throw e;
|
|
215
|
+
}
|
|
216
|
+
spinner.succeed(message.succeed);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const getManifestObject = async () => {
|
|
220
|
+
const manifestFile = path__default["default"].resolve('./manifest.yml');
|
|
221
|
+
const strBuffer = await fse__default["default"].readFile(manifestFile);
|
|
222
|
+
const obj = yaml.parse(strBuffer.toString());
|
|
223
|
+
return obj;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
var run$1 = async (opts) => {
|
|
227
|
+
const { outputDir, inputDir, prod, copyFiles } = opts;
|
|
228
|
+
const manifest = await getManifestObject();
|
|
229
|
+
// bundle
|
|
230
|
+
await execActionWithSpinner({
|
|
231
|
+
start: 'start bundle',
|
|
232
|
+
error: 'bundle failed',
|
|
233
|
+
succeed: 'bundle success',
|
|
234
|
+
}, () => bundleApp({ outputDir, inputDir, manifest, mode: prod ? MODE.PROD : MODE.DEV }));
|
|
235
|
+
// package
|
|
236
|
+
await execActionWithSpinner({
|
|
237
|
+
start: 'start package',
|
|
238
|
+
error: 'package failed',
|
|
239
|
+
succeed: 'package success',
|
|
240
|
+
}, () => packageApp(outputDir, manifest, copyFiles));
|
|
241
|
+
// archive
|
|
242
|
+
await execActionWithSpinner({
|
|
243
|
+
start: 'start archive',
|
|
244
|
+
error: 'archive failed',
|
|
245
|
+
succeed: 'archive success',
|
|
246
|
+
}, () => archiveApp(outputDir));
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
var build = async (options) => {
|
|
250
|
+
await run$1({
|
|
251
|
+
outputDir: path__default["default"].resolve('dist'),
|
|
252
|
+
inputDir: path__default["default"].resolve('src'),
|
|
253
|
+
prod: !!options.prod,
|
|
254
|
+
copyFiles: options.copy,
|
|
255
|
+
});
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
const fileExists = (profilePath) => fs__default["default"].existsSync(profilePath);
|
|
259
|
+
|
|
260
|
+
const init = async (projectPath) => {
|
|
261
|
+
const git = simpleGit__default["default"](projectPath);
|
|
262
|
+
await git.init();
|
|
263
|
+
return;
|
|
264
|
+
};
|
|
265
|
+
const clone = async (repoUrl, projectPath) => {
|
|
266
|
+
if (!fileExists(projectPath)) {
|
|
267
|
+
fs__default["default"].mkdirSync(projectPath);
|
|
268
|
+
}
|
|
269
|
+
const git = simpleGit__default["default"](projectPath);
|
|
270
|
+
await git.clone(repoUrl, projectPath);
|
|
271
|
+
return;
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
const templateURL = 'https://github.com/moriahq/nebula-app-template.git';
|
|
275
|
+
var TemplateType;
|
|
276
|
+
(function (TemplateType) {
|
|
277
|
+
TemplateType["micro"] = "micro";
|
|
278
|
+
TemplateType["uikit"] = "uikit";
|
|
279
|
+
})(TemplateType || (TemplateType = {}));
|
|
280
|
+
// 重写替换文件内带模版的地方。格式为 {{field}}
|
|
281
|
+
// options为字段变量
|
|
282
|
+
const rewriteTemplateField = async (path, options) => {
|
|
283
|
+
return new Promise(resolve => {
|
|
284
|
+
if (!fileExists(path)) {
|
|
285
|
+
return resolve();
|
|
286
|
+
}
|
|
287
|
+
const content = fs__default["default"].readFileSync(path, { encoding: 'utf-8' });
|
|
288
|
+
fs__default["default"].writeFile(path, content.replace(/{{(\w+)}}/g, (match, key) => (typeof options[key] === 'string' ? options[key] : match)), () => {
|
|
289
|
+
resolve();
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
const toStartOfLine = (stream) => {
|
|
295
|
+
if (!chalk.supportsColor) {
|
|
296
|
+
stream.write('\r');
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
readline__default["default"].cursorTo(stream, 0);
|
|
300
|
+
};
|
|
301
|
+
const renderProgressBar = (curr, total) => {
|
|
302
|
+
const ratio = Math.min(Math.max(curr / total, 0), 1);
|
|
303
|
+
const bar = ` ${curr}/${total}`;
|
|
304
|
+
const availableSpace = Math.max(0, process.stderr.columns - bar.length - 3);
|
|
305
|
+
const width = Math.min(total, availableSpace);
|
|
306
|
+
const completeLength = Math.round(width * ratio);
|
|
307
|
+
const complete = `#`.repeat(completeLength);
|
|
308
|
+
const incomplete = `-`.repeat(width - completeLength);
|
|
309
|
+
toStartOfLine(process.stderr);
|
|
310
|
+
process.stderr.write(`[${complete}${incomplete}]${bar}`);
|
|
311
|
+
};
|
|
312
|
+
const executeCommand = (command, args, cwd, env) => {
|
|
313
|
+
return new Promise((resolve, reject) => {
|
|
314
|
+
var _a;
|
|
315
|
+
const child = execa__default["default"](command, args, {
|
|
316
|
+
cwd,
|
|
317
|
+
stdio: ['inherit', 'inherit', 'pipe'],
|
|
318
|
+
env,
|
|
319
|
+
});
|
|
320
|
+
(_a = child.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (buffer) => {
|
|
321
|
+
const str = buffer.toString();
|
|
322
|
+
if (/warning/.test(str)) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const progressBarMatch = str.match(/\[.*] (\d+)\/(\d+)/);
|
|
326
|
+
if (progressBarMatch) {
|
|
327
|
+
renderProgressBar(parseFloat(progressBarMatch[1]), parseFloat(progressBarMatch[2]));
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
process.stderr.write(buffer);
|
|
331
|
+
});
|
|
332
|
+
child.on('close', (code) => {
|
|
333
|
+
if (code !== 0) {
|
|
334
|
+
reject(new Error(`command failed: ${command} ${args.join(' ')}`));
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
resolve();
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
};
|
|
341
|
+
const command = {
|
|
342
|
+
executeCommand,
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
const selectTemplate = async () => {
|
|
346
|
+
const prompt = inquirer__default["default"].createPromptModule();
|
|
347
|
+
const result = await prompt({
|
|
348
|
+
type: 'list',
|
|
349
|
+
name: '请选择插件类型',
|
|
350
|
+
choices: Object.keys(TemplateType),
|
|
351
|
+
});
|
|
352
|
+
return Object.values(result)[0];
|
|
353
|
+
};
|
|
354
|
+
const cloneRepo = async (repoUrl, projectPath) => {
|
|
355
|
+
await execActionWithSpinner({
|
|
356
|
+
start: '开始克隆仓库',
|
|
357
|
+
error: '仓库克隆失败',
|
|
358
|
+
succeed: '仓库克隆完毕',
|
|
359
|
+
}, () => clone(repoUrl, projectPath));
|
|
360
|
+
};
|
|
361
|
+
const dependenciesInstall = async (projectPath) => {
|
|
362
|
+
await execActionWithSpinner({
|
|
363
|
+
start: '开始安装依赖',
|
|
364
|
+
error: '依赖安装失败',
|
|
365
|
+
succeed: '依赖安装成功',
|
|
366
|
+
}, () => command.executeCommand('yarn', ['install'], projectPath));
|
|
367
|
+
};
|
|
368
|
+
var run = async (options) => {
|
|
369
|
+
const { cwd, packageName } = options;
|
|
370
|
+
const projectPath = path__default["default"].join(cwd, packageName);
|
|
371
|
+
if (fileExists(projectPath)) {
|
|
372
|
+
console.error('项目文件夹已存在!请删除或者换个项目名');
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
const templateType = await selectTemplate();
|
|
376
|
+
await cloneRepo(templateURL, projectPath);
|
|
377
|
+
// 将指定模板复制到跟目录
|
|
378
|
+
await fse__default["default"].copy(path__default["default"].join(projectPath, templateType), projectPath);
|
|
379
|
+
// 删除各个模板文件夹
|
|
380
|
+
for (const t of Object.values(TemplateType)) {
|
|
381
|
+
await fse__default["default"].remove(path__default["default"].join(projectPath, t));
|
|
382
|
+
}
|
|
383
|
+
await fse__default["default"].remove(path__default["default"].join(projectPath, './.git'));
|
|
384
|
+
const appId = uuid.v4();
|
|
385
|
+
const files = [
|
|
386
|
+
'./manifest.yml',
|
|
387
|
+
'./package.json',
|
|
388
|
+
'./static/micro/package.json',
|
|
389
|
+
'./static/micro/webpack.config.js',
|
|
390
|
+
'./static/micro/public/index.html',
|
|
391
|
+
'./static/micro/src/App.tsx',
|
|
392
|
+
'./static/micro/src/index.tsx',
|
|
393
|
+
];
|
|
394
|
+
for (let i = 0; i < files.length; i++) {
|
|
395
|
+
await rewriteTemplateField(path__default["default"].join(projectPath, files[i]), {
|
|
396
|
+
appId,
|
|
397
|
+
projectName: packageName,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
await dependenciesInstall(projectPath);
|
|
401
|
+
await init(projectPath);
|
|
402
|
+
console.log('项目初始化成功!');
|
|
403
|
+
console.log('项目路径:' + projectPath);
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
var create = async (packageName) => {
|
|
407
|
+
const cwd = process.cwd();
|
|
408
|
+
if (!packageName) {
|
|
409
|
+
console.error('Please input your project name');
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
await run({
|
|
413
|
+
cwd,
|
|
414
|
+
packageName,
|
|
415
|
+
});
|
|
416
|
+
};
|
|
417
|
+
|
|
418
|
+
const program = new commander.Command();
|
|
419
|
+
program.version(version).description('Nebula Cli');
|
|
420
|
+
program
|
|
421
|
+
.command('build')
|
|
422
|
+
.option('--prod', 'build in production')
|
|
423
|
+
.option('-c --copy [letters...]', 'copy files')
|
|
424
|
+
.action(build);
|
|
425
|
+
program.command('create [name]').action(create);
|
|
426
|
+
program.parse(process.argv);
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@giteeteam/apps-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Nebula cli",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"typescript",
|
|
7
|
+
"nebula"
|
|
8
|
+
],
|
|
9
|
+
"bin": {
|
|
10
|
+
"nebula": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"license": "ISC",
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/moriahq/nebula/issues"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/moriahq/nebula/tree/master/packages/cli",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/moriahq/nebula.git"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"dev": "tsc -w",
|
|
27
|
+
"build": "rimraf dist && rollup -c",
|
|
28
|
+
"prepare": "npm run build",
|
|
29
|
+
"unlink": "yarn unlink",
|
|
30
|
+
"link": "chmod +x ./dist/index.js && yarn link && yarn link '@giteeteam/apps-cli' -g",
|
|
31
|
+
"build-link": "yarn run build && yarn run link"
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"allowBranch": "master",
|
|
35
|
+
"conventionalCommits": true,
|
|
36
|
+
"access": "public",
|
|
37
|
+
"registry": "https://registry.npmjs.org/"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@giteeteam/apps-bundler": "^0.1.0",
|
|
41
|
+
"archiver": "^5.3.1",
|
|
42
|
+
"chalk": "^4.1.2",
|
|
43
|
+
"commander": "^9.3.0",
|
|
44
|
+
"execa": "^5.1.1",
|
|
45
|
+
"fs-extra": "^10.1.0",
|
|
46
|
+
"inquirer": "^8.2.4",
|
|
47
|
+
"ora": "^5.4.1",
|
|
48
|
+
"simple-git": "^3.7.1",
|
|
49
|
+
"uuid": "^8.3.2",
|
|
50
|
+
"yaml": "^2.1.1"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/archiver": "^5.3.1",
|
|
54
|
+
"@types/fs-extra": "^9.0.13",
|
|
55
|
+
"@types/inquirer": "^8.2.1",
|
|
56
|
+
"@types/uuid": "^8.3.4"
|
|
57
|
+
}
|
|
58
|
+
}
|