1 | #!/usr/bin/env node
|
2 | "use strict";
|
3 | Object.defineProperty(exports, "__esModule", { value: true });
|
4 | const tslib_1 = require("tslib");
|
5 | const cac_1 = tslib_1.__importDefault(require("cac"));
|
6 | const fs_1 = require("./fs");
|
7 | const path_1 = tslib_1.__importDefault(require("path"));
|
8 | const logger_1 = require("./logger");
|
9 | const utils_1 = require("./utils");
|
10 | const task_manager_1 = require("./task-manager");
|
11 | const defaultCli = cac_1.default();
|
12 | let defaultArgv = [];
|
13 | let 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 | }
|
39 | defaultArgv = process.argv.slice(0, 2).concat(defaultArgv);
|
40 | taskArgv = process.argv.slice(0, 2).concat(taskArgv);
|
41 | function 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 | }
|
47 | addDefaultOptions(defaultCli).parse(defaultArgv);
|
48 | if (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 |
|
62 | task('build', async ctx => {
|
63 | // Your build tasks
|
64 | await ctx.exec('tsc')
|
65 | })
|
66 |
|
67 | `);
|
68 | process.exit();
|
69 | }
|
70 | let foyFiles = arrify(defaultCli.options.config);
|
71 | let registers = arrify(defaultCli.options.require);
|
72 | function arrify(arr) {
|
73 | if (!Array.isArray(arr)) {
|
74 | return arr == null ? [] : [arr];
|
75 | }
|
76 | return arr;
|
77 | }
|
78 | if (foyFiles.length) {
|
79 | foyFiles = foyFiles.map(c => path_1.default.resolve(process.cwd(), c));
|
80 | }
|
81 | else {
|
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 | }
|
101 | for (const file of foyFiles) {
|
102 | if (!fs_1.fs.existsSync(file)) {
|
103 | throw new TypeError(`Cannot find Foyfile: ${file}`);
|
104 | }
|
105 | }
|
106 | if (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 | }
|
116 | try {
|
117 | if (!require.extensions['.ts']) {
|
118 | require('ts-node').register({
|
119 | transpileOnly: true,
|
120 | compilerOptions: {
|
121 | module: 'commonjs',
|
122 | },
|
123 | });
|
124 | }
|
125 | }
|
126 | catch (error) {
|
127 |
|
128 | }
|
129 | {
|
130 |
|
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 | }
|
144 | for (const file of foyFiles) {
|
145 | require(file);
|
146 | }
|
147 | const taskCli = cac_1.default();
|
148 | let taskManager = task_manager_1.getGlobalTaskManager();
|
149 | taskManager.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 | });
|
169 | taskCli.on('command:*', () => {
|
170 | console.error(`error: Unknown command \`${taskCli.args.join(' ')}\`\n\n`);
|
171 | process.exit(1);
|
172 | });
|
173 | taskCli.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 | });
|
189 | taskCli.parse(taskArgv);
|
190 | if (process.argv.length === 2) {
|
191 | taskCli.outputHelp();
|
192 | }
|
193 |
|
\ | No newline at end of file |