command.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. 'use strict';
  2. const path = require('path');
  3. const fs = require('fs');
  4. const BaseCommand = require('common-bin');
  5. class Command extends BaseCommand {
  6. constructor(rawArgv) {
  7. super(rawArgv);
  8. this.parserOptions = {
  9. execArgv: true,
  10. removeAlias: true,
  11. };
  12. // common-bin setter, don't care about override at sub class
  13. // https://github.com/node-modules/common-bin/blob/master/lib/command.js#L158
  14. this.options = {
  15. typescript: {
  16. description: 'whether enable typescript support, will load tscompiler on startup',
  17. type: 'boolean',
  18. alias: 'ts',
  19. default: undefined,
  20. },
  21. declarations: {
  22. description: 'whether create dts, will load options.eggTsHelper',
  23. type: 'boolean',
  24. alias: 'dts',
  25. default: undefined,
  26. },
  27. tscompiler: {
  28. description: 'ts compiler, like ts-node、ts-eager、esbuild-register etc.',
  29. type: 'string',
  30. alias: 'tsc',
  31. default: undefined,
  32. },
  33. eggTsHelper: {
  34. description: 'egg-ts-helper register, default use `egg-ts-helper/register`',
  35. type: 'string',
  36. alias: 'ets',
  37. default: undefined,
  38. },
  39. };
  40. }
  41. /**
  42. * default error handler
  43. * @param {Error} err - err obj
  44. */
  45. errorHandler(err) {
  46. console.error(err);
  47. process.nextTick(() => process.exit(1));
  48. }
  49. get context() {
  50. const context = super.context;
  51. const { argv, debugPort, execArgvObj, cwd, env } = context;
  52. // compatible
  53. if (debugPort) context.debug = debugPort;
  54. // remove unuse args
  55. argv.$0 = undefined;
  56. // read package.json
  57. let baseDir = argv.baseDir || cwd;
  58. if (!path.isAbsolute(baseDir)) baseDir = path.join(cwd, baseDir);
  59. const pkgFile = path.join(baseDir, 'package.json');
  60. const pkgInfo = fs.existsSync(pkgFile) ? require(pkgFile) : null;
  61. const eggInfo = (pkgInfo && pkgInfo.egg) || {};
  62. execArgvObj.require = execArgvObj.require || [];
  63. // read `egg.typescript` from package.json if not pass argv
  64. if (argv.typescript === undefined && typeof eggInfo.typescript === 'boolean') {
  65. argv.typescript = eggInfo.typescript;
  66. }
  67. // read `egg.declarations` from package.json if not pass argv
  68. if (argv.declarations === undefined && typeof eggInfo.declarations === 'boolean') {
  69. argv.declarations = eggInfo.declarations;
  70. }
  71. // read `egg.tscompiler` from package.json if not pass argv
  72. // try to load from `cwd` while tscompipler has value or app has ts-node deps
  73. if (argv.tscompiler === undefined && !eggInfo.tscompiler) {
  74. const useAppTsNode = pkgInfo && (
  75. (pkgInfo.dependencies && pkgInfo.dependencies['ts-node']) ||
  76. (pkgInfo.devDependencies && pkgInfo.devDependencies['ts-node'])
  77. );
  78. argv.tscompiler = require.resolve('ts-node/register', useAppTsNode ? { paths: [ cwd ] } : undefined);
  79. } else {
  80. argv.tscompiler = argv.tscompiler || eggInfo.tscompiler;
  81. argv.tscompiler = require.resolve(argv.tscompiler, { paths: [ cwd ] });
  82. }
  83. // read `egg.require` from package.json
  84. if (eggInfo.require && Array.isArray(eggInfo.require)) {
  85. execArgvObj.require = execArgvObj.require.concat(eggInfo.require);
  86. }
  87. // load ts-node
  88. if (argv.typescript) {
  89. execArgvObj.require.push(argv.tscompiler);
  90. // tell egg loader to load ts file
  91. env.EGG_TYPESCRIPT = 'true';
  92. // load files from tsconfig on startup
  93. env.TS_NODE_FILES = process.env.TS_NODE_FILES || 'true';
  94. }
  95. // read egg-ts-helper
  96. if (argv.eggTsHelper === undefined) {
  97. argv.eggTsHelper = require.resolve('egg-ts-helper/register');
  98. } else {
  99. argv.eggTsHelper = require.resolve(argv.eggTsHelper, { paths: [ cwd ] });
  100. }
  101. // load egg-ts-helper
  102. if (argv.declarations) {
  103. execArgvObj.require.push(argv.eggTsHelper);
  104. }
  105. return context;
  106. }
  107. }
  108. module.exports = Command;