123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- 'use strict';
- const path = require('path');
- const fs = require('fs');
- const BaseCommand = require('common-bin');
- class Command extends BaseCommand {
- constructor(rawArgv) {
- super(rawArgv);
- this.parserOptions = {
- execArgv: true,
- removeAlias: true,
- };
- // common-bin setter, don't care about override at sub class
- // https://github.com/node-modules/common-bin/blob/master/lib/command.js#L158
- this.options = {
- typescript: {
- description: 'whether enable typescript support, will load tscompiler on startup',
- type: 'boolean',
- alias: 'ts',
- default: undefined,
- },
- declarations: {
- description: 'whether create dts, will load options.eggTsHelper',
- type: 'boolean',
- alias: 'dts',
- default: undefined,
- },
- tscompiler: {
- description: 'ts compiler, like ts-node、ts-eager、esbuild-register etc.',
- type: 'string',
- alias: 'tsc',
- default: undefined,
- },
- eggTsHelper: {
- description: 'egg-ts-helper register, default use `egg-ts-helper/register`',
- type: 'string',
- alias: 'ets',
- default: undefined,
- },
- };
- }
- /**
- * default error handler
- * @param {Error} err - err obj
- */
- errorHandler(err) {
- console.error(err);
- process.nextTick(() => process.exit(1));
- }
- get context() {
- const context = super.context;
- const { argv, debugPort, execArgvObj, cwd, env } = context;
- // compatible
- if (debugPort) context.debug = debugPort;
- // remove unuse args
- argv.$0 = undefined;
- // read package.json
- let baseDir = argv.baseDir || cwd;
- if (!path.isAbsolute(baseDir)) baseDir = path.join(cwd, baseDir);
- const pkgFile = path.join(baseDir, 'package.json');
- const pkgInfo = fs.existsSync(pkgFile) ? require(pkgFile) : null;
- const eggInfo = (pkgInfo && pkgInfo.egg) || {};
- execArgvObj.require = execArgvObj.require || [];
- // read `egg.typescript` from package.json if not pass argv
- if (argv.typescript === undefined && typeof eggInfo.typescript === 'boolean') {
- argv.typescript = eggInfo.typescript;
- }
- // read `egg.declarations` from package.json if not pass argv
- if (argv.declarations === undefined && typeof eggInfo.declarations === 'boolean') {
- argv.declarations = eggInfo.declarations;
- }
- // read `egg.tscompiler` from package.json if not pass argv
- // try to load from `cwd` while tscompipler has value or app has ts-node deps
- if (argv.tscompiler === undefined && !eggInfo.tscompiler) {
- const useAppTsNode = pkgInfo && (
- (pkgInfo.dependencies && pkgInfo.dependencies['ts-node']) ||
- (pkgInfo.devDependencies && pkgInfo.devDependencies['ts-node'])
- );
- argv.tscompiler = require.resolve('ts-node/register', useAppTsNode ? { paths: [ cwd ] } : undefined);
- } else {
- argv.tscompiler = argv.tscompiler || eggInfo.tscompiler;
- argv.tscompiler = require.resolve(argv.tscompiler, { paths: [ cwd ] });
- }
- // read `egg.require` from package.json
- if (eggInfo.require && Array.isArray(eggInfo.require)) {
- execArgvObj.require = execArgvObj.require.concat(eggInfo.require);
- }
- // load ts-node
- if (argv.typescript) {
- execArgvObj.require.push(argv.tscompiler);
- // tell egg loader to load ts file
- env.EGG_TYPESCRIPT = 'true';
- // load files from tsconfig on startup
- env.TS_NODE_FILES = process.env.TS_NODE_FILES || 'true';
- }
- // read egg-ts-helper
- if (argv.eggTsHelper === undefined) {
- argv.eggTsHelper = require.resolve('egg-ts-helper/register');
- } else {
- argv.eggTsHelper = require.resolve(argv.eggTsHelper, { paths: [ cwd ] });
- }
- // load egg-ts-helper
- if (argv.declarations) {
- execArgvObj.require.push(argv.eggTsHelper);
- }
- return context;
- }
- }
- module.exports = Command;
|