diff --git a/package.json b/package.json index 2127baa..a130bdf 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "cli-spinners": "^2.4.0", "execa": "^4.0.3", "figures": "^3.2.0", + "require-from-string": "^2.0.2", "shell-parser": "^1.0.0", "strip-ansi": "^6.0.0", "tslib": "^2.0.1", diff --git a/src/cli.ts b/src/cli.ts index 4da6a50..f7c931c 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -8,68 +8,59 @@ import { logger } from './logger' import { Is } from './utils' import { getGlobalTaskManager } from './task-manager' import chalk from 'chalk' -import { defaultHelpMsg, taskArgv, defaultCli, outputCompletion, loadConfigPromises } from './default-cli' +import { defaultHelpMsg, taskArgv, defaultCli, outputCompletion } from './default-cli' -async function main() { - if (loadConfigPromises.length) { - await Promise.all(loadConfigPromises) - } - const taskCli = cac() +const taskCli = cac() - let taskManager = getGlobalTaskManager() - taskManager.getTasks().forEach((t) => { - let strict = taskManager.globalOptions.strict || t.strict - let cmd = taskCli.command(t.name, t.desc, { allowUnknownOptions: !strict }) - if (t.optionDefs) { - t.optionDefs.forEach((def) => cmd.option(...def)) - } - cmd.action(async (...args) => { - let options = args.pop() - let { globalOptions } = taskManager - globalOptions.rawArgs = taskCli.rawArgs - globalOptions.options = options - await taskManager - .run(t.name, { - options, - rawArgs: taskCli.rawArgs.slice(3), - }) - .catch((err) => { - logger.error(err) - throw err - }) - }) +let taskManager = getGlobalTaskManager() +taskManager.getTasks().forEach((t) => { + let strict = taskManager.globalOptions.strict || t.strict + let cmd = taskCli.command(t.name, t.desc, { allowUnknownOptions: !strict }) + if (t.optionDefs) { + t.optionDefs.forEach((def) => cmd.option(...def)) + } + cmd.action(async (...args) => { + let options = args.pop() + let { globalOptions } = taskManager + globalOptions.rawArgs = taskCli.rawArgs + globalOptions.options = options + await taskManager + .run(t.name, { + options, + rawArgs: taskCli.rawArgs.slice(3), + }) + .catch((err) => { + logger.error(err) + throw err + }) }) +}) - taskCli.help((sections) => { - if (!taskCli.matchedCommand) { - let last = sections[sections.length - 1] - let lines = last.body.split('\n') - lines.pop() - last.body = defaultHelpMsg - } - console.log( - sections - .map((section) => { - return section.title ? `${section.title}:\n${section.body}` : section.body - }) - .join('\n\n'), - ) - process.exit(0) - }) - taskCli.parse(taskArgv) +taskCli.help((sections) => { + if (!taskCli.matchedCommand) { + let last = sections[sections.length - 1] + let lines = last.body.split('\n') + lines.pop() + last.body = defaultHelpMsg + } + console.log( + sections + .map((section) => { + return section.title ? `${section.title}:\n${section.body}` : section.body + }) + .join('\n\n'), + ) + process.exit(0) +}) +taskCli.parse(taskArgv) - outputCompletion(taskCli) +outputCompletion(taskCli) - taskCli.on('command:*', () => { - console.error(`error: Unknown command \`${taskCli.args.join(' ')}\`\n\n`) - process.exit(1) - }) +taskCli.on('command:*', () => { + console.error(`error: Unknown command \`${taskCli.args.join(' ')}\`\n\n`) + process.exit(1) +}) - if (process.argv.length === 2) { - taskCli.outputHelp() - } +if (process.argv.length === 2) { + taskCli.outputHelp() } - -main().catch(e => { - throw e -}) diff --git a/src/default-cli.ts b/src/default-cli.ts index 1221682..5c726e6 100644 --- a/src/default-cli.ts +++ b/src/default-cli.ts @@ -5,6 +5,7 @@ import os from 'os' import { logger } from './logger' import { Is } from './utils' import { getGlobalTaskManager } from './task-manager' +import requireStr from 'require-from-string' export const defaultCli = cac() // generate default argv because cac cannot handle `foy command` + `foy options` @@ -171,15 +172,18 @@ function isESM() { return false } } +const tsnodeOptions = { + transpileOnly: true, + compilerOptions: { + module: 'commonjs', + esModuleInterop: true, + moduleResolution: 'node', + }, +} try { if (foyFiles.some((f) => f.endsWith('.ts')) && !require.extensions['.ts']) { - let options = { - transpileOnly: true, - compilerOptions: { - module: 'commonjs', - }, - } - require('ts-node').register(options) + + require('ts-node').register(tsnodeOptions) } } catch (error) { // ignore @@ -201,13 +205,19 @@ try { } } -export const loadConfigPromises:Promise[]=[] // load foyfiles -for (const file of foyFiles) { - if (isESM()) { - loadConfigPromises.push(import(file)) - } else { - require(file) +{ + let tsnode: any + for (const file of foyFiles) { + if (isESM()) { + // use tsnode to transpile ESM + if (!tsnode) { + tsnode = require('ts-node').create(tsnodeOptions) + } + requireStr(tsnode.compile(fs.readFileSync(file, 'utf-8'), file), file.replace('.ts', '.cjs')) + } else { + require(file) + } } } diff --git a/yarn.lock b/yarn.lock index 540f52e..1d5df03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1103,6 +1103,11 @@ repeat-string@^1.6.1: resolved "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"