@create-node-app/core 0.1.4 → 0.1.6
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.d.ts +3 -3
- package/dist/index.js +72 -90
- package/dist/index.mjs +72 -90
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type
|
|
1
|
+
type TemplateOrExtension = {
|
|
2
2
|
url: string;
|
|
3
3
|
ignorePackage?: boolean;
|
|
4
4
|
};
|
|
@@ -15,7 +15,7 @@ type CnaOptions = {
|
|
|
15
15
|
useNpm?: boolean;
|
|
16
16
|
nodeps?: boolean;
|
|
17
17
|
template?: string;
|
|
18
|
-
|
|
18
|
+
templatesOrExtensions?: TemplateOrExtension[];
|
|
19
19
|
};
|
|
20
20
|
type CnaOptionsTransform = (options: CnaOptions) => Promise<CnaOptions>;
|
|
21
21
|
/**
|
|
@@ -32,7 +32,7 @@ type CnaOptionsTransform = (options: CnaOptions) => Promise<CnaOptions>;
|
|
|
32
32
|
* @param options.nodeps - Generate package.json file without installing dependencies
|
|
33
33
|
* @param options.template - Template to bootstrap the aplication
|
|
34
34
|
* @param options.extend - Extensions to apply for the boilerplate generation
|
|
35
|
-
* @param options.
|
|
35
|
+
* @param options.templatesOrExtensions - Official extensions to apply
|
|
36
36
|
* @param transformOptions - Function to transform the options
|
|
37
37
|
*/
|
|
38
38
|
declare const createNodeApp: (programName: string, options: CnaOptions, transformOptions: CnaOptionsTransform) => Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -216,7 +216,6 @@ var import_child_process2 = __toESM(require("child_process"));
|
|
|
216
216
|
var import_path = __toESM(require("path"));
|
|
217
217
|
var import_util = require("util");
|
|
218
218
|
var import_fs = __toESM(require("fs"));
|
|
219
|
-
var import_download = __toESM(require("download"));
|
|
220
219
|
var import_debug = __toESM(require("debug"));
|
|
221
220
|
var log = (0, import_debug.default)("cna:git");
|
|
222
221
|
var exec = (0, import_util.promisify)(import_child_process2.default.exec);
|
|
@@ -232,75 +231,45 @@ var pull = async (cwd) => {
|
|
|
232
231
|
await exec("git pull", { cwd });
|
|
233
232
|
};
|
|
234
233
|
var downloadRepository = async ({
|
|
235
|
-
|
|
236
|
-
zip,
|
|
234
|
+
url = "",
|
|
237
235
|
offline = false,
|
|
238
236
|
target = "./",
|
|
239
237
|
branch = "main",
|
|
240
|
-
way = "git",
|
|
241
238
|
targetId,
|
|
242
239
|
cacheDir: optsCacheDir
|
|
243
240
|
}) => {
|
|
244
241
|
const absoluteTarget = import_path.default.isAbsolute(target) ? target : import_path.default.resolve(target);
|
|
245
|
-
const isGithub = /^[^/]+\/[^/]+$/.test(
|
|
246
|
-
const gitUrl = isGithub ? `https://github.com/${
|
|
247
|
-
const
|
|
248
|
-
const id = targetId || Buffer.from(`${git}@${branch}`).toString("base64");
|
|
242
|
+
const isGithub = /^[^/]+\/[^/]+$/.test(url);
|
|
243
|
+
const gitUrl = isGithub ? `https://github.com/${url}` : url;
|
|
244
|
+
const id = targetId || Buffer.from(`${gitUrl}@${branch}`).toString("base64");
|
|
249
245
|
let cacheDir = optsCacheDir || import_path.default.join(import_os.default.homedir(), ".cache", "cna", id);
|
|
250
246
|
cacheDir = import_path.default.isAbsolute(cacheDir) ? cacheDir : import_path.default.resolve(cacheDir);
|
|
251
247
|
log("cache folder: %s", cacheDir);
|
|
252
|
-
log("git url: %s", gitUrl);
|
|
253
|
-
log("zip url: %s", zipUrl);
|
|
254
248
|
const cached = import_fs.default.existsSync(cacheDir);
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
setTimeout(() => {
|
|
275
|
-
import_fs.default.cpSync(cacheDir, absoluteTarget, {
|
|
276
|
-
force: true,
|
|
277
|
-
filter: filterGit,
|
|
278
|
-
recursive: true
|
|
279
|
-
});
|
|
280
|
-
}, 400);
|
|
281
|
-
};
|
|
282
|
-
const createByZip = async () => {
|
|
283
|
-
log("zip mode");
|
|
284
|
-
if (!zipUrl) {
|
|
285
|
-
throw new Error(
|
|
286
|
-
`Expect parameter opts.zip when opts.way is 'zip', but got ${zipUrl}`
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
await (0, import_download.default)(zipUrl, target, { extract: true });
|
|
290
|
-
};
|
|
291
|
-
switch (way) {
|
|
292
|
-
case "git":
|
|
293
|
-
return createByGit();
|
|
294
|
-
case "zip":
|
|
295
|
-
return createByZip();
|
|
296
|
-
default:
|
|
297
|
-
throw new Error(`Expect parameter opts.way is 'git' or 'zip'`);
|
|
298
|
-
}
|
|
249
|
+
if (!cached) {
|
|
250
|
+
await clone(gitUrl, cacheDir, branch);
|
|
251
|
+
}
|
|
252
|
+
if (offline) {
|
|
253
|
+
import_fs.default.cpSync(cacheDir, absoluteTarget, {
|
|
254
|
+
force: true,
|
|
255
|
+
filter: filterGit,
|
|
256
|
+
recursive: true
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
await pull(cacheDir);
|
|
261
|
+
setTimeout(() => {
|
|
262
|
+
import_fs.default.cpSync(cacheDir, absoluteTarget, {
|
|
263
|
+
force: true,
|
|
264
|
+
filter: filterGit,
|
|
265
|
+
recursive: true
|
|
266
|
+
});
|
|
267
|
+
}, 400);
|
|
299
268
|
};
|
|
300
269
|
|
|
301
270
|
// paths.ts
|
|
302
|
-
var
|
|
303
|
-
const url = new URL(
|
|
271
|
+
var solveValuesFromTemplateOrExtensionUrl = (templateOrExtension) => {
|
|
272
|
+
const url = new URL(templateOrExtension);
|
|
304
273
|
const origin = `${url.protocol}//${url.host}`;
|
|
305
274
|
const [org, repo, , branch = "", ...subdir] = url.pathname.slice(1).split("/");
|
|
306
275
|
const ignorePackage = url.searchParams.get("ignorePackage") === "true";
|
|
@@ -323,7 +292,7 @@ var solveRepositoryPath = async ({
|
|
|
323
292
|
const target = import_path2.default.join(import_os2.default.homedir(), ".cna", targetId);
|
|
324
293
|
try {
|
|
325
294
|
await downloadRepository({
|
|
326
|
-
|
|
295
|
+
url,
|
|
327
296
|
branch,
|
|
328
297
|
target,
|
|
329
298
|
targetId
|
|
@@ -332,9 +301,9 @@ var solveRepositoryPath = async ({
|
|
|
332
301
|
}
|
|
333
302
|
return { dir: target, subdir };
|
|
334
303
|
};
|
|
335
|
-
var
|
|
304
|
+
var solveTemplateOrExtensionPath = async (templateOrExtension) => {
|
|
336
305
|
try {
|
|
337
|
-
const { url, branch, subdir, protocol, host, pathname, ignorePackage } =
|
|
306
|
+
const { url, branch, subdir, protocol, host, pathname, ignorePackage } = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);
|
|
338
307
|
if (protocol === "file:") {
|
|
339
308
|
return {
|
|
340
309
|
dir: import_path2.default.resolve(host, pathname),
|
|
@@ -349,27 +318,36 @@ var solveAddonPath = async (addon) => {
|
|
|
349
318
|
return { ...gitData, ignorePackage };
|
|
350
319
|
} catch {
|
|
351
320
|
return {
|
|
352
|
-
dir: import_path2.default.resolve(
|
|
321
|
+
dir: import_path2.default.resolve(
|
|
322
|
+
__dirname,
|
|
323
|
+
"..",
|
|
324
|
+
"templatesOrExtensions",
|
|
325
|
+
templateOrExtension
|
|
326
|
+
),
|
|
353
327
|
ignorePackage: void 0
|
|
354
328
|
};
|
|
355
329
|
}
|
|
356
330
|
};
|
|
357
|
-
var
|
|
331
|
+
var getPackagePath = async (templateOrExtension, name = "package", ignorePackage = false) => {
|
|
358
332
|
const {
|
|
359
333
|
dir,
|
|
360
334
|
subdir,
|
|
361
|
-
ignorePackage:
|
|
362
|
-
} = await
|
|
363
|
-
if (name === "package.json" && (ignorePackage ||
|
|
364
|
-
throw new Error(
|
|
335
|
+
ignorePackage: templateOrExtensionIgnorePackage
|
|
336
|
+
} = await solveTemplateOrExtensionPath(templateOrExtension);
|
|
337
|
+
if (name === "package.json" && (ignorePackage || templateOrExtensionIgnorePackage)) {
|
|
338
|
+
throw new Error(
|
|
339
|
+
"package.json should be ignored for file templateOrExtension"
|
|
340
|
+
);
|
|
365
341
|
}
|
|
366
342
|
if (subdir) {
|
|
367
343
|
return import_path2.default.resolve(dir, subdir, name);
|
|
368
344
|
}
|
|
369
345
|
return import_path2.default.resolve(dir, name);
|
|
370
346
|
};
|
|
371
|
-
var
|
|
372
|
-
const { dir, subdir = "" } = await
|
|
347
|
+
var getTemplateDirPath = async (templateOrExtensionUrl) => {
|
|
348
|
+
const { dir, subdir = "" } = await solveTemplateOrExtensionPath(
|
|
349
|
+
templateOrExtensionUrl
|
|
350
|
+
);
|
|
373
351
|
let templateDirPath = import_path2.default.resolve(dir, subdir);
|
|
374
352
|
const templateDirPathWithTemplate = import_path2.default.resolve(templateDirPath, "template");
|
|
375
353
|
return new Promise((resolve, reject) => {
|
|
@@ -404,37 +382,37 @@ var requireIfExists = (path4) => {
|
|
|
404
382
|
}
|
|
405
383
|
throw new Error(`file ${path4} not exists`);
|
|
406
384
|
};
|
|
407
|
-
var
|
|
408
|
-
|
|
385
|
+
var loadPackages = async ({
|
|
386
|
+
templatesOrExtensions = [],
|
|
409
387
|
ignorePackage: globalIgnorePackage = false,
|
|
410
388
|
...config
|
|
411
389
|
}) => {
|
|
412
|
-
const setup = await
|
|
413
|
-
async (setupPromise, { url:
|
|
390
|
+
const setup = await templatesOrExtensions.reduce(
|
|
391
|
+
async (setupPromise, { url: templateOrExtension, ignorePackage }) => {
|
|
414
392
|
let packageJson = await setupPromise;
|
|
415
393
|
try {
|
|
416
394
|
const template = requireIfExists(
|
|
417
|
-
await
|
|
395
|
+
await getPackagePath(templateOrExtension, "template.json")
|
|
418
396
|
);
|
|
419
397
|
packageJson = (0, import_lodash.default)(packageJson, template.package || {});
|
|
420
398
|
} catch {
|
|
421
399
|
}
|
|
422
400
|
try {
|
|
423
|
-
const
|
|
424
|
-
await
|
|
425
|
-
|
|
401
|
+
const templateOrExtensionPackageJson = requireIfExists(
|
|
402
|
+
await getPackagePath(
|
|
403
|
+
templateOrExtension,
|
|
426
404
|
"package.json",
|
|
427
405
|
globalIgnorePackage || ignorePackage
|
|
428
406
|
)
|
|
429
407
|
);
|
|
430
|
-
return (0, import_lodash.default)(packageJson,
|
|
408
|
+
return (0, import_lodash.default)(packageJson, templateOrExtensionPackageJson);
|
|
431
409
|
} catch {
|
|
432
410
|
}
|
|
433
411
|
try {
|
|
434
|
-
const
|
|
435
|
-
await
|
|
412
|
+
const resolveTemplateOrExtensionPackage = requireIfExists(
|
|
413
|
+
await getPackagePath(templateOrExtension)
|
|
436
414
|
);
|
|
437
|
-
packageJson =
|
|
415
|
+
packageJson = resolveTemplateOrExtensionPackage(packageJson, config);
|
|
438
416
|
} catch {
|
|
439
417
|
}
|
|
440
418
|
return packageJson;
|
|
@@ -587,7 +565,7 @@ var fileLoader = ({
|
|
|
587
565
|
};
|
|
588
566
|
var loadFiles = async ({
|
|
589
567
|
root,
|
|
590
|
-
|
|
568
|
+
templatesOrExtensions = [],
|
|
591
569
|
appName,
|
|
592
570
|
originalDirectory,
|
|
593
571
|
alias,
|
|
@@ -596,8 +574,8 @@ var loadFiles = async ({
|
|
|
596
574
|
runCommand,
|
|
597
575
|
installCommand
|
|
598
576
|
}) => {
|
|
599
|
-
for await (const { url:
|
|
600
|
-
const templateDir = await
|
|
577
|
+
for await (const { url: templateOrExtensionUrl } of templatesOrExtensions) {
|
|
578
|
+
const templateDir = await getTemplateDirPath(templateOrExtensionUrl);
|
|
601
579
|
if (!import_fs4.default.statSync(templateDir).isDirectory()) {
|
|
602
580
|
continue;
|
|
603
581
|
}
|
|
@@ -699,7 +677,7 @@ var run = async ({
|
|
|
699
677
|
originalDirectory,
|
|
700
678
|
verbose = false,
|
|
701
679
|
useYarn = false,
|
|
702
|
-
|
|
680
|
+
templatesOrExtensions = [],
|
|
703
681
|
dependencies = [],
|
|
704
682
|
devDependencies = [],
|
|
705
683
|
alias = "",
|
|
@@ -712,15 +690,19 @@ var run = async ({
|
|
|
712
690
|
if (useYarn) {
|
|
713
691
|
isOnline = await checkIfOnline(useYarn);
|
|
714
692
|
}
|
|
715
|
-
if (import_underscore2.default.isEmpty(
|
|
693
|
+
if (import_underscore2.default.isEmpty(templatesOrExtensions)) {
|
|
716
694
|
console.log();
|
|
717
|
-
console.log(
|
|
695
|
+
console.log(
|
|
696
|
+
import_chalk3.default.yellow(
|
|
697
|
+
"No templatesOrExtensions specified to bootstrap application."
|
|
698
|
+
)
|
|
699
|
+
);
|
|
718
700
|
console.log();
|
|
719
701
|
process.exit(0);
|
|
720
702
|
}
|
|
721
703
|
await loadFiles({
|
|
722
704
|
root,
|
|
723
|
-
|
|
705
|
+
templatesOrExtensions,
|
|
724
706
|
appName,
|
|
725
707
|
originalDirectory,
|
|
726
708
|
alias,
|
|
@@ -810,7 +792,7 @@ var createApp = async ({
|
|
|
810
792
|
name,
|
|
811
793
|
verbose = false,
|
|
812
794
|
useNpm = false,
|
|
813
|
-
|
|
795
|
+
templatesOrExtensions = [],
|
|
814
796
|
alias = "",
|
|
815
797
|
installDependencies = true,
|
|
816
798
|
ignorePackage = false,
|
|
@@ -825,8 +807,8 @@ var createApp = async ({
|
|
|
825
807
|
console.log();
|
|
826
808
|
const useYarn = useNpm ? false : shouldUseYarn();
|
|
827
809
|
const command = useYarn ? "yarn" : "npm run";
|
|
828
|
-
const { packageJson, dependencies, devDependencies } = await
|
|
829
|
-
|
|
810
|
+
const { packageJson, dependencies, devDependencies } = await loadPackages({
|
|
811
|
+
templatesOrExtensions,
|
|
830
812
|
appName,
|
|
831
813
|
command,
|
|
832
814
|
ignorePackage,
|
|
@@ -886,7 +868,7 @@ Please update to npm 3 or higher for a better, fully supported experience.
|
|
|
886
868
|
originalDirectory,
|
|
887
869
|
verbose,
|
|
888
870
|
useYarn,
|
|
889
|
-
|
|
871
|
+
templatesOrExtensions,
|
|
890
872
|
dependencies,
|
|
891
873
|
devDependencies,
|
|
892
874
|
alias,
|
package/dist/index.mjs
CHANGED
|
@@ -188,7 +188,6 @@ import childProcess from "child_process";
|
|
|
188
188
|
import path from "path";
|
|
189
189
|
import { promisify } from "util";
|
|
190
190
|
import fs from "fs";
|
|
191
|
-
import download from "download";
|
|
192
191
|
import debug from "debug";
|
|
193
192
|
var log = debug("cna:git");
|
|
194
193
|
var exec = promisify(childProcess.exec);
|
|
@@ -204,75 +203,45 @@ var pull = async (cwd) => {
|
|
|
204
203
|
await exec("git pull", { cwd });
|
|
205
204
|
};
|
|
206
205
|
var downloadRepository = async ({
|
|
207
|
-
|
|
208
|
-
zip,
|
|
206
|
+
url = "",
|
|
209
207
|
offline = false,
|
|
210
208
|
target = "./",
|
|
211
209
|
branch = "main",
|
|
212
|
-
way = "git",
|
|
213
210
|
targetId,
|
|
214
211
|
cacheDir: optsCacheDir
|
|
215
212
|
}) => {
|
|
216
213
|
const absoluteTarget = path.isAbsolute(target) ? target : path.resolve(target);
|
|
217
|
-
const isGithub = /^[^/]+\/[^/]+$/.test(
|
|
218
|
-
const gitUrl = isGithub ? `https://github.com/${
|
|
219
|
-
const
|
|
220
|
-
const id = targetId || Buffer.from(`${git}@${branch}`).toString("base64");
|
|
214
|
+
const isGithub = /^[^/]+\/[^/]+$/.test(url);
|
|
215
|
+
const gitUrl = isGithub ? `https://github.com/${url}` : url;
|
|
216
|
+
const id = targetId || Buffer.from(`${gitUrl}@${branch}`).toString("base64");
|
|
221
217
|
let cacheDir = optsCacheDir || path.join(os.homedir(), ".cache", "cna", id);
|
|
222
218
|
cacheDir = path.isAbsolute(cacheDir) ? cacheDir : path.resolve(cacheDir);
|
|
223
219
|
log("cache folder: %s", cacheDir);
|
|
224
|
-
log("git url: %s", gitUrl);
|
|
225
|
-
log("zip url: %s", zipUrl);
|
|
226
220
|
const cached = fs.existsSync(cacheDir);
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
setTimeout(() => {
|
|
247
|
-
fs.cpSync(cacheDir, absoluteTarget, {
|
|
248
|
-
force: true,
|
|
249
|
-
filter: filterGit,
|
|
250
|
-
recursive: true
|
|
251
|
-
});
|
|
252
|
-
}, 400);
|
|
253
|
-
};
|
|
254
|
-
const createByZip = async () => {
|
|
255
|
-
log("zip mode");
|
|
256
|
-
if (!zipUrl) {
|
|
257
|
-
throw new Error(
|
|
258
|
-
`Expect parameter opts.zip when opts.way is 'zip', but got ${zipUrl}`
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
await download(zipUrl, target, { extract: true });
|
|
262
|
-
};
|
|
263
|
-
switch (way) {
|
|
264
|
-
case "git":
|
|
265
|
-
return createByGit();
|
|
266
|
-
case "zip":
|
|
267
|
-
return createByZip();
|
|
268
|
-
default:
|
|
269
|
-
throw new Error(`Expect parameter opts.way is 'git' or 'zip'`);
|
|
270
|
-
}
|
|
221
|
+
if (!cached) {
|
|
222
|
+
await clone(gitUrl, cacheDir, branch);
|
|
223
|
+
}
|
|
224
|
+
if (offline) {
|
|
225
|
+
fs.cpSync(cacheDir, absoluteTarget, {
|
|
226
|
+
force: true,
|
|
227
|
+
filter: filterGit,
|
|
228
|
+
recursive: true
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
await pull(cacheDir);
|
|
233
|
+
setTimeout(() => {
|
|
234
|
+
fs.cpSync(cacheDir, absoluteTarget, {
|
|
235
|
+
force: true,
|
|
236
|
+
filter: filterGit,
|
|
237
|
+
recursive: true
|
|
238
|
+
});
|
|
239
|
+
}, 400);
|
|
271
240
|
};
|
|
272
241
|
|
|
273
242
|
// paths.ts
|
|
274
|
-
var
|
|
275
|
-
const url = new URL(
|
|
243
|
+
var solveValuesFromTemplateOrExtensionUrl = (templateOrExtension) => {
|
|
244
|
+
const url = new URL(templateOrExtension);
|
|
276
245
|
const origin = `${url.protocol}//${url.host}`;
|
|
277
246
|
const [org, repo, , branch = "", ...subdir] = url.pathname.slice(1).split("/");
|
|
278
247
|
const ignorePackage = url.searchParams.get("ignorePackage") === "true";
|
|
@@ -295,7 +264,7 @@ var solveRepositoryPath = async ({
|
|
|
295
264
|
const target = path2.join(os2.homedir(), ".cna", targetId);
|
|
296
265
|
try {
|
|
297
266
|
await downloadRepository({
|
|
298
|
-
|
|
267
|
+
url,
|
|
299
268
|
branch,
|
|
300
269
|
target,
|
|
301
270
|
targetId
|
|
@@ -304,9 +273,9 @@ var solveRepositoryPath = async ({
|
|
|
304
273
|
}
|
|
305
274
|
return { dir: target, subdir };
|
|
306
275
|
};
|
|
307
|
-
var
|
|
276
|
+
var solveTemplateOrExtensionPath = async (templateOrExtension) => {
|
|
308
277
|
try {
|
|
309
|
-
const { url, branch, subdir, protocol, host, pathname, ignorePackage } =
|
|
278
|
+
const { url, branch, subdir, protocol, host, pathname, ignorePackage } = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);
|
|
310
279
|
if (protocol === "file:") {
|
|
311
280
|
return {
|
|
312
281
|
dir: path2.resolve(host, pathname),
|
|
@@ -321,27 +290,36 @@ var solveAddonPath = async (addon) => {
|
|
|
321
290
|
return { ...gitData, ignorePackage };
|
|
322
291
|
} catch {
|
|
323
292
|
return {
|
|
324
|
-
dir: path2.resolve(
|
|
293
|
+
dir: path2.resolve(
|
|
294
|
+
__dirname,
|
|
295
|
+
"..",
|
|
296
|
+
"templatesOrExtensions",
|
|
297
|
+
templateOrExtension
|
|
298
|
+
),
|
|
325
299
|
ignorePackage: void 0
|
|
326
300
|
};
|
|
327
301
|
}
|
|
328
302
|
};
|
|
329
|
-
var
|
|
303
|
+
var getPackagePath = async (templateOrExtension, name = "package", ignorePackage = false) => {
|
|
330
304
|
const {
|
|
331
305
|
dir,
|
|
332
306
|
subdir,
|
|
333
|
-
ignorePackage:
|
|
334
|
-
} = await
|
|
335
|
-
if (name === "package.json" && (ignorePackage ||
|
|
336
|
-
throw new Error(
|
|
307
|
+
ignorePackage: templateOrExtensionIgnorePackage
|
|
308
|
+
} = await solveTemplateOrExtensionPath(templateOrExtension);
|
|
309
|
+
if (name === "package.json" && (ignorePackage || templateOrExtensionIgnorePackage)) {
|
|
310
|
+
throw new Error(
|
|
311
|
+
"package.json should be ignored for file templateOrExtension"
|
|
312
|
+
);
|
|
337
313
|
}
|
|
338
314
|
if (subdir) {
|
|
339
315
|
return path2.resolve(dir, subdir, name);
|
|
340
316
|
}
|
|
341
317
|
return path2.resolve(dir, name);
|
|
342
318
|
};
|
|
343
|
-
var
|
|
344
|
-
const { dir, subdir = "" } = await
|
|
319
|
+
var getTemplateDirPath = async (templateOrExtensionUrl) => {
|
|
320
|
+
const { dir, subdir = "" } = await solveTemplateOrExtensionPath(
|
|
321
|
+
templateOrExtensionUrl
|
|
322
|
+
);
|
|
345
323
|
let templateDirPath = path2.resolve(dir, subdir);
|
|
346
324
|
const templateDirPathWithTemplate = path2.resolve(templateDirPath, "template");
|
|
347
325
|
return new Promise((resolve, reject) => {
|
|
@@ -376,37 +354,37 @@ var requireIfExists = (path4) => {
|
|
|
376
354
|
}
|
|
377
355
|
throw new Error(`file ${path4} not exists`);
|
|
378
356
|
};
|
|
379
|
-
var
|
|
380
|
-
|
|
357
|
+
var loadPackages = async ({
|
|
358
|
+
templatesOrExtensions = [],
|
|
381
359
|
ignorePackage: globalIgnorePackage = false,
|
|
382
360
|
...config
|
|
383
361
|
}) => {
|
|
384
|
-
const setup = await
|
|
385
|
-
async (setupPromise, { url:
|
|
362
|
+
const setup = await templatesOrExtensions.reduce(
|
|
363
|
+
async (setupPromise, { url: templateOrExtension, ignorePackage }) => {
|
|
386
364
|
let packageJson = await setupPromise;
|
|
387
365
|
try {
|
|
388
366
|
const template = requireIfExists(
|
|
389
|
-
await
|
|
367
|
+
await getPackagePath(templateOrExtension, "template.json")
|
|
390
368
|
);
|
|
391
369
|
packageJson = merge(packageJson, template.package || {});
|
|
392
370
|
} catch {
|
|
393
371
|
}
|
|
394
372
|
try {
|
|
395
|
-
const
|
|
396
|
-
await
|
|
397
|
-
|
|
373
|
+
const templateOrExtensionPackageJson = requireIfExists(
|
|
374
|
+
await getPackagePath(
|
|
375
|
+
templateOrExtension,
|
|
398
376
|
"package.json",
|
|
399
377
|
globalIgnorePackage || ignorePackage
|
|
400
378
|
)
|
|
401
379
|
);
|
|
402
|
-
return merge(packageJson,
|
|
380
|
+
return merge(packageJson, templateOrExtensionPackageJson);
|
|
403
381
|
} catch {
|
|
404
382
|
}
|
|
405
383
|
try {
|
|
406
|
-
const
|
|
407
|
-
await
|
|
384
|
+
const resolveTemplateOrExtensionPackage = requireIfExists(
|
|
385
|
+
await getPackagePath(templateOrExtension)
|
|
408
386
|
);
|
|
409
|
-
packageJson =
|
|
387
|
+
packageJson = resolveTemplateOrExtensionPackage(packageJson, config);
|
|
410
388
|
} catch {
|
|
411
389
|
}
|
|
412
390
|
return packageJson;
|
|
@@ -559,7 +537,7 @@ var fileLoader = ({
|
|
|
559
537
|
};
|
|
560
538
|
var loadFiles = async ({
|
|
561
539
|
root,
|
|
562
|
-
|
|
540
|
+
templatesOrExtensions = [],
|
|
563
541
|
appName,
|
|
564
542
|
originalDirectory,
|
|
565
543
|
alias,
|
|
@@ -568,8 +546,8 @@ var loadFiles = async ({
|
|
|
568
546
|
runCommand,
|
|
569
547
|
installCommand
|
|
570
548
|
}) => {
|
|
571
|
-
for await (const { url:
|
|
572
|
-
const templateDir = await
|
|
549
|
+
for await (const { url: templateOrExtensionUrl } of templatesOrExtensions) {
|
|
550
|
+
const templateDir = await getTemplateDirPath(templateOrExtensionUrl);
|
|
573
551
|
if (!fs3.statSync(templateDir).isDirectory()) {
|
|
574
552
|
continue;
|
|
575
553
|
}
|
|
@@ -671,7 +649,7 @@ var run = async ({
|
|
|
671
649
|
originalDirectory,
|
|
672
650
|
verbose = false,
|
|
673
651
|
useYarn = false,
|
|
674
|
-
|
|
652
|
+
templatesOrExtensions = [],
|
|
675
653
|
dependencies = [],
|
|
676
654
|
devDependencies = [],
|
|
677
655
|
alias = "",
|
|
@@ -684,15 +662,19 @@ var run = async ({
|
|
|
684
662
|
if (useYarn) {
|
|
685
663
|
isOnline = await checkIfOnline(useYarn);
|
|
686
664
|
}
|
|
687
|
-
if (_2.isEmpty(
|
|
665
|
+
if (_2.isEmpty(templatesOrExtensions)) {
|
|
688
666
|
console.log();
|
|
689
|
-
console.log(
|
|
667
|
+
console.log(
|
|
668
|
+
chalk3.yellow(
|
|
669
|
+
"No templatesOrExtensions specified to bootstrap application."
|
|
670
|
+
)
|
|
671
|
+
);
|
|
690
672
|
console.log();
|
|
691
673
|
process.exit(0);
|
|
692
674
|
}
|
|
693
675
|
await loadFiles({
|
|
694
676
|
root,
|
|
695
|
-
|
|
677
|
+
templatesOrExtensions,
|
|
696
678
|
appName,
|
|
697
679
|
originalDirectory,
|
|
698
680
|
alias,
|
|
@@ -782,7 +764,7 @@ var createApp = async ({
|
|
|
782
764
|
name,
|
|
783
765
|
verbose = false,
|
|
784
766
|
useNpm = false,
|
|
785
|
-
|
|
767
|
+
templatesOrExtensions = [],
|
|
786
768
|
alias = "",
|
|
787
769
|
installDependencies = true,
|
|
788
770
|
ignorePackage = false,
|
|
@@ -797,8 +779,8 @@ var createApp = async ({
|
|
|
797
779
|
console.log();
|
|
798
780
|
const useYarn = useNpm ? false : shouldUseYarn();
|
|
799
781
|
const command = useYarn ? "yarn" : "npm run";
|
|
800
|
-
const { packageJson, dependencies, devDependencies } = await
|
|
801
|
-
|
|
782
|
+
const { packageJson, dependencies, devDependencies } = await loadPackages({
|
|
783
|
+
templatesOrExtensions,
|
|
802
784
|
appName,
|
|
803
785
|
command,
|
|
804
786
|
ignorePackage,
|
|
@@ -858,7 +840,7 @@ Please update to npm 3 or higher for a better, fully supported experience.
|
|
|
858
840
|
originalDirectory,
|
|
859
841
|
verbose,
|
|
860
842
|
useYarn,
|
|
861
|
-
|
|
843
|
+
templatesOrExtensions,
|
|
862
844
|
dependencies,
|
|
863
845
|
devDependencies,
|
|
864
846
|
alias,
|