UNPKG

6.11 kBJavaScriptView Raw
1#!/usr/bin/env node
2"use strict";
3Object.defineProperty(exports, "__esModule", { value: true });
4const tslib_1 = require("tslib");
5const cac_1 = tslib_1.__importDefault(require("cac"));
6const fs_1 = require("./fs");
7const path_1 = tslib_1.__importDefault(require("path"));
8const logger_1 = require("./logger");
9const utils_1 = require("./utils");
10const task_manager_1 = require("./task-manager");
11const defaultCli = cac_1.default();
12let defaultArgv = [];
13let taskArgv = [];
14{
15 const argv = process.argv.slice(2);
16 const defaultOptions = new Map([
17 ['--config', 1],
18 ['-c', 1],
19 ['--require', 1],
20 ['-r', 1],
21 ['--init', 1],
22 ['-i', 1],
23 ]);
24 let i = 0;
25 for (i = 0; i < argv.length; i++) {
26 const arg = argv[i];
27 let valLen = defaultOptions.get(arg);
28 if (utils_1.Is.defed(valLen)) {
29 let end = i + valLen;
30 defaultArgv.push(...argv.slice(i, end + 1));
31 i = end;
32 }
33 else {
34 break;
35 }
36 }
37 taskArgv = argv.slice(i);
38}
39defaultArgv = process.argv.slice(0, 2).concat(defaultArgv);
40taskArgv = process.argv.slice(0, 2).concat(taskArgv);
41function addDefaultOptions(cli) {
42 return cli
43 .option(`--config, -c <...files>`, 'The Foyfiles')
44 .option(`--require, -r <...names>`, 'Require the given modules')
45 .option(`--init, -i [ext]`, 'Generate the Foyfile, [ext] can be "ts" | "js", default is "js"');
46}
47addDefaultOptions(defaultCli).parse(defaultArgv);
48if (defaultCli.options.init) {
49 let ext = defaultCli.options.init;
50 if (!utils_1.Is.str(ext)) {
51 ext = 'js';
52 }
53 ext = ext.replace(/^\./, '');
54 const file = `./Foyfile.${ext}`;
55 if (fs_1.fs.existsSync(file)) {
56 throw new Error(`Foyfile already exists: ${path_1.default.resolve(file)}`);
57 }
58 fs_1.fs.writeFileSync(file, `${ext === 'js'
59 ? `const { task, desc, option, fs } = require('foy')`
60 : `import { task, desc, option, fs } from 'foy'`}
61
62task('build', async ctx => {
63 // Your build tasks
64 await ctx.exec('tsc')
65})
66
67`);
68 process.exit();
69}
70let foyFiles = arrify(defaultCli.options.config);
71let registers = arrify(defaultCli.options.require);
72function arrify(arr) {
73 if (!Array.isArray(arr)) {
74 return arr == null ? [] : [arr];
75 }
76 return arr;
77}
78if (foyFiles.length) {
79 foyFiles = foyFiles.map(c => path_1.default.resolve(process.cwd(), c));
80}
81else {
82 let findFoyfiles = (baseDir) => {
83 let cwdFoyfiles = fs_1.fs.readdirSync(baseDir).filter(f => f.startsWith('Foyfile.'));
84 if (cwdFoyfiles.length) {
85 if (cwdFoyfiles.length > 1) {
86 logger_1.logger.warn(`Find more than 1 Foyfile in current directory, only first one will be used: \n${cwdFoyfiles.join('\n')}`);
87 }
88 foyFiles = [path_1.default.join(baseDir, cwdFoyfiles[0])];
89 }
90 };
91 findFoyfiles(process.cwd());
92 if (!foyFiles.length) {
93 let maxDepth = 5;
94 let dir = process.cwd();
95 while (maxDepth-- && dir !== '/' && dir && !foyFiles.length) {
96 dir = path_1.default.dirname(dir);
97 findFoyfiles(dir);
98 }
99 }
100}
101for (const file of foyFiles) {
102 if (!fs_1.fs.existsSync(file)) {
103 throw new TypeError(`Cannot find Foyfile: ${file}`);
104 }
105}
106if (registers.length) {
107 for (let mod of registers) {
108 try {
109 require(mod);
110 }
111 catch (error) {
112 require(path_1.default.resolve(process.cwd(), mod));
113 }
114 }
115}
116try {
117 if (!require.extensions['.ts']) {
118 require('ts-node').register({
119 transpileOnly: true,
120 compilerOptions: {
121 module: 'commonjs',
122 },
123 });
124 }
125}
126catch (error) {
127 // ignore
128}
129{
130 // Add global installed foy to module.paths
131 const Module = require('module');
132 const nodeModulePaths = Module._nodeModulePaths;
133 const globalFoyPath = path_1.default.join(__dirname, '..', '..');
134 if (nodeModulePaths) {
135 Module._nodeModulePaths = (...args) => {
136 let paths = nodeModulePaths.apply(Module, args);
137 if (Array.isArray(paths)) {
138 paths.push(globalFoyPath);
139 }
140 return paths;
141 };
142 }
143}
144for (const file of foyFiles) {
145 require(file);
146}
147const taskCli = cac_1.default();
148let taskManager = task_manager_1.getGlobalTaskManager();
149taskManager.getTasks().forEach(t => {
150 let strict = taskManager.globalOptions.strict || t.strict;
151 let cmd = taskCli.command(t.name, t.desc, { allowUnknownOptions: !strict });
152 if (t.optionDefs) {
153 t.optionDefs.forEach(def => cmd.option(...def));
154 }
155 cmd.action((...args) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
156 let options = args.pop();
157 let { globalOptions } = taskManager;
158 globalOptions.rawArgs = taskCli.rawArgs;
159 globalOptions.options = options;
160 yield taskManager.run(t.name, {
161 options,
162 rawArgs: taskCli.rawArgs.slice(3),
163 }).catch(err => {
164 logger_1.logger.error(err);
165 throw err;
166 });
167 }));
168});
169taskCli.on('command:*', () => {
170 console.error(`error: Unknown command \`${taskCli.args.join(' ')}\`\n\n`);
171 process.exit(1);
172});
173taskCli.help(sections => {
174 if (!taskCli.matchedCommand) {
175 let last = sections[sections.length - 1];
176 let lines = last.body.split('\n');
177 lines.pop();
178 last.body = lines
179 .concat(' -h, --help Display this message', ' --init, -i [ext] Generate the Foyfile, <ext> can be "ts" | "js", default is "js"', ' --config, -c <...files> The Foyfiles', ' --require, -r <...names> Require the given modules')
180 .join('\n');
181 }
182 console.log(sections
183 .map(section => {
184 return section.title ? `${section.title}:\n${section.body}` : section.body;
185 })
186 .join('\n\n'));
187 process.exit(0);
188});
189taskCli.parse(taskArgv);
190if (process.argv.length === 2) {
191 taskCli.outputHelp();
192}
193//# sourceMappingURL=cli.js.map
\No newline at end of file