UNPKG

3.51 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.name = exports.description = void 0;
7exports.run = run;
8exports.setup = setup;
9
10var _stubUtils = require("../lib/stubUtils.js");
11
12var _flowProjectUtils = require("../lib/flowProjectUtils.js");
13
14var _npmProjectUtils = require("../lib/npm/npmProjectUtils");
15
16var _node = require("../lib/node");
17
18const name = 'create-stub <packages...>';
19exports.name = name;
20const description = 'Create a libdef stub for an untyped npm package';
21exports.description = description;
22
23function setup(yargs) {
24 return yargs.usage(`$0 ${name} ...PACKAGE`).options({
25 overwrite: {
26 default: false,
27 alias: 'o',
28 describe: 'Overwrite an existing stub if it is already present in the ' + '`flow-typed` directory and has been modified',
29 type: 'boolean',
30 demandOption: false
31 },
32 typescript: {
33 default: false,
34 alias: 't',
35 describe: 'Generate libdef from TypeScript definitions',
36 type: 'boolean',
37 demandOption: false
38 },
39 maxDepth: {
40 alias: 'd',
41 describe: 'Allow to generate deeper template',
42 type: 'number',
43 demandOption: false
44 },
45 libdefDir: {
46 default: 'flow-typed',
47 alias: 'l',
48 describe: 'Use a custom directory to install libdefs',
49 type: 'string',
50 demandOption: false
51 },
52 rootDir: {
53 alias: 'r',
54 describe: 'Directory of .flowconfig relative to node_modules',
55 type: 'string'
56 }
57 }).positional('packages', {
58 describe: 'Please provide the names of one or more npm packages'
59 }).array('packages').example('$0 create-stub foo@^1.2.0', '').example('$0 create-stub foo bar baz', '').help('h').alias('h', 'help');
60}
61
62function failWithMessage(message) {
63 console.error(message);
64 return 1;
65}
66
67async function run(args) {
68 if (args.packages !== undefined && !Array.isArray(args.packages)) {
69 throw new Error('packages is not array');
70 }
71
72 const packages = (args.packages || []).map(dep => {
73 if (typeof dep !== 'string') {
74 throw new Error('packages should be array of strings');
75 }
76
77 return dep;
78 });
79 const cwd = typeof args.rootDir === 'string' ? _node.path.resolve(args.rootDir) : process.cwd(); // Find the project root
80
81 const projectRoot = await (0, _flowProjectUtils.findFlowRoot)(cwd);
82
83 if (projectRoot == null) {
84 return failWithMessage(`\nERROR: Unable to find a flow project in the current dir or any of ` + `it's parents!\nPlease run this command from within a Flow project.`);
85 }
86
87 const pnpResolver = await (0, _npmProjectUtils.loadPnpResolver)(await (0, _npmProjectUtils.getPackageJsonData)(projectRoot));
88 const plural = packages.length > 1 ? 'stubs' : 'stub';
89 console.log(`• Creating ${packages.length} ${plural}...`);
90 const results = await Promise.all(packages.map(pkg => {
91 let version = null;
92 /* Four cases to consider
93 * packageName
94 * packageName@version
95 * @scoped/packageName
96 * @scoped/packageName@version
97 */
98
99 let parts = pkg.split(/@/);
100 let packageName = parts[0];
101
102 if (parts[0] === '') {
103 // Scoped package
104 packageName = '@' + parts[1];
105 parts = parts.slice(1);
106 }
107
108 if (parts.length > 1) {
109 version = parts[1];
110 }
111
112 return (0, _stubUtils.createStub)(projectRoot, packageName, version, Boolean(args.overwrite), pnpResolver, Boolean(args.typescript), String(args.libdefDir), Number(args.maxDepth));
113 }));
114 return results.every(Boolean) ? 0 : 1;
115}
\No newline at end of file