UNPKG

egg-ts-helper

Version:
434 lines 35.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generator = exports.BaseGenerator = exports.TsHelper = exports.defaultConfig = void 0; exports.getDefaultGeneratorConfig = getDefaultGeneratorConfig; exports.createTsHelperInstance = createTsHelperInstance; const node_assert_1 = __importDefault(require("node:assert")); const node_events_1 = require("node:events"); const node_fs_1 = __importDefault(require("node:fs")); const node_crypto_1 = __importDefault(require("node:crypto")); const chalk_1 = __importDefault(require("chalk")); const node_path_1 = __importDefault(require("node:path")); const generator = __importStar(require("./generator")); exports.generator = generator; const dot_prop_1 = require("dot-prop"); const config_1 = require("./config"); const watcher_1 = __importDefault(require("./watcher")); const base_1 = require("./generators/base"); Object.defineProperty(exports, "BaseGenerator", { enumerable: true, get: function () { return base_1.BaseGenerator; } }); const utils = __importStar(require("./utils")); const globby_1 = __importDefault(require("globby")); const node_util_1 = require("node:util"); const isInUnitTest = process.env.NODE_ENV === 'test'; const debug = (0, node_util_1.debuglog)('egg-ts-helper/core'); exports.defaultConfig = { cwd: utils.convertString(process.env.ETS_CWD, process.cwd()), framework: utils.convertString(process.env.ETS_FRAMEWORK, 'egg'), frameworkVersion: utils.convertString(process.env.ETS_FRAMEWORK_VERSION, ''), typings: utils.convertString(process.env.ETS_TYPINGS, './typings'), caseStyle: utils.convertString(process.env.ETS_CASE_STYLE, 'lower'), autoRemoveJs: utils.convertString(process.env.ETS_AUTO_REMOVE_JS, true), throttle: utils.convertString(process.env.ETS_THROTTLE, 500), watch: utils.convertString(process.env.ETS_WATCH, false), watchOptions: undefined, execAtInit: utils.convertString(process.env.ETS_EXEC_AT_INIT, false), silent: utils.convertString(process.env.ETS_SILENT, isInUnitTest), generatorConfig: {}, configFile: utils.convertString(process.env.ETS_CONFIG_FILE, '') || ['./tshelper', './tsHelper'], }; // default watch dir function getDefaultGeneratorConfig(opt) { const baseConfig = {}; // extend baseConfig.extend = { directory: 'app/extend', generator: 'extend', }; // controller baseConfig.controller = { directory: 'app/controller', interface: config_1.declMapping.controller, generator: 'class', }; // middleware baseConfig.middleware = { directory: 'app/middleware', interface: config_1.declMapping.middleware, generator: 'object', }; // proxy baseConfig.proxy = { directory: 'app/proxy', interface: 'IProxy', generator: 'class', enabled: false, }; // model baseConfig.model = { directory: 'app/model', generator: 'function', interface: 'IModel', caseStyle: 'upper', enabled: !(0, dot_prop_1.get)(opt?.eggInfo, 'config.customLoader.model'), }; // config baseConfig.config = { directory: 'config', generator: 'config', trigger: ['add', 'unlink', 'change'], }; // plugin baseConfig.plugin = { directory: 'config', generator: 'plugin', trigger: ['add', 'unlink', 'change'], }; // service baseConfig.service = { directory: 'app/service', interface: config_1.declMapping.service, generator: 'auto', }; // egg baseConfig.egg = { directory: 'app', generator: 'egg', watch: false, }; // custom loader baseConfig.customLoader = { generator: 'custom', trigger: ['add', 'unlink', 'change'], }; return baseConfig; } class TsHelper extends node_events_1.EventEmitter { constructor(options) { super(); this.watcherList = []; this.cacheDist = {}; this.dtsFileList = []; // utils this.utils = utils; // configure ets this.configure(options); // init watcher this.initWatcher(); } // build all watcher build() { // clean old files this.cleanFiles(); this.watcherList.forEach(watcher => watcher.execute()); return this; } // destroy destroy() { this.removeAllListeners(); this.watcherList.forEach(item => item.destroy()); this.watcherList.length = 0; } // log log(info, ignoreSilent) { if (!ignoreSilent && this.config.silent) { return; } utils.log(info); } warn(info) { this.log(chalk_1.default.yellow(info), !isInUnitTest); } // create oneForAll file createOneForAll(dist) { const config = this.config; const oneForAllDist = (typeof dist === 'string') ? dist : node_path_1.default.join(config.typings, './ets.d.ts'); const oneForAllDistDir = node_path_1.default.dirname(oneForAllDist); // create d.ts includes all types. const distContent = config_1.dtsComment + this.dtsFileList .map(file => { const importUrl = node_path_1.default .relative(oneForAllDistDir, file.replace(/\.d\.ts$/, '')) .replace(/\/|\\/g, '/'); return `import '${importUrl.startsWith('.') ? importUrl : `./${importUrl}`}';`; }) .join('\n'); this.emit('update', oneForAllDist); utils.writeFileSync(oneForAllDist, distContent); } // init watcher initWatcher() { Object.keys(this.config.generatorConfig).forEach(key => { this.registerWatcher(key, this.config.generatorConfig[key], false); }); } // destroy watcher destroyWatcher(...refs) { this.watcherList = this.watcherList.filter(w => { if (refs.includes(w.ref)) { w.destroy(); return false; } return true; }); } // clean old files in startup cleanFiles() { const cwd = this.config.typings; globby_1.default.sync(['**/*.d.ts', '!**/node_modules'], { cwd }) .forEach(file => { const fileUrl = node_path_1.default.resolve(cwd, file); const content = node_fs_1.default.readFileSync(fileUrl, 'utf-8'); const isGeneratedByEts = content.match(config_1.dtsCommentRE); if (isGeneratedByEts) node_fs_1.default.unlinkSync(fileUrl); }); } // register watcher registerWatcher(name, watchConfig, removeDuplicate = true) { if (removeDuplicate) { this.destroyWatcher(name); } if (watchConfig.hasOwnProperty('enabled') && !watchConfig.enabled) { return; } const directories = Array.isArray(watchConfig.directory) ? watchConfig.directory : [watchConfig.directory]; // support array directory. return directories.map(dir => { const options = { name, ref: name, execAtInit: this.config.execAtInit, ...watchConfig, }; if (dir) { options.directory = dir; } if (!this.config.watch) { options.watch = false; } const watcher = new watcher_1.default(this); watcher.on('update', this.generateTs.bind(this)); watcher.init(options); this.watcherList.push(watcher); return watcher; }); } loadWatcherConfig(config, options) { const configFile = options.configFile || config.configFile; const eggInfo = config.eggInfo; const getConfigFromPkg = pkg => (pkg.egg || {}).tsHelper; // read from enabled plugins if (eggInfo.plugins) { Object.keys(eggInfo.plugins) .forEach(k => { const pluginInfo = eggInfo.plugins[k]; if (pluginInfo.enable && pluginInfo.path) { this.mergeConfig(config, getConfigFromPkg(utils.getPkgInfo(pluginInfo.path))); } }); } // read from eggPaths if (eggInfo.eggPaths) { eggInfo.eggPaths.forEach(p => { this.mergeConfig(config, getConfigFromPkg(utils.getPkgInfo(p))); }); } // read from package.json this.mergeConfig(config, getConfigFromPkg(utils.getPkgInfo(config.cwd))); // read from local file( default to tshelper | tsHelper ) (Array.isArray(configFile) ? configFile : [configFile]).forEach(f => { this.mergeConfig(config, utils.requireFile(node_path_1.default.resolve(config.cwd, f))); }); // merge local config and options to config this.mergeConfig(config, options); // create extra config config.tsConfig = utils.loadTsConfig(node_path_1.default.resolve(config.cwd, './tsconfig.json')); } // configure // options > configFile > package.json configure(options) { if (options.cwd) { options.cwd = node_path_1.default.resolve(exports.defaultConfig.cwd, options.cwd); } // base config const config = { ...exports.defaultConfig }; config.id = node_crypto_1.default.randomBytes(16).toString('base64'); config.cwd = options.cwd || config.cwd; config.customLoader = config.customLoader || options.customLoader; // load egg info config.eggInfo = utils.getEggInfo({ cwd: config.cwd, cacheIndex: config.id, customLoader: config.customLoader, }); config.framework = options.framework || exports.defaultConfig.framework; config.frameworkVersion = options.frameworkVersion || exports.defaultConfig.frameworkVersion; if (!config.frameworkVersion) { const frameworkPackageJSONFile = utils.resolveModule(`${config.framework}/package.json`, config.cwd); if (frameworkPackageJSONFile) { const frameworkPackageJSON = utils.readJson(frameworkPackageJSONFile); config.frameworkVersion = frameworkPackageJSON.version; } } config.generatorConfig = getDefaultGeneratorConfig(config); config.typings = node_path_1.default.resolve(config.cwd, config.typings); this.config = config; debug('config %o', this.config); // load watcher config this.loadWatcherConfig(this.config, options); // deprecated framework when env.ETS_FRAMEWORK exists if (this.config.framework && this.config.framework !== exports.defaultConfig.framework && process.env.ETS_FRAMEWORK) { this.warn(`options.framework are deprecated, using default value(${exports.defaultConfig.framework}) instead`); } } generateTs(result, file, startTime) { const updateTs = (result, file) => { const config = this.config; const resultList = Array.isArray(result) ? result : [result]; for (const item of resultList) { // check cache if (this.isCached(item.dist, item.content)) { return; } if (item.content) { // create file const dtsContent = `${config_1.dtsComment}\nimport '${config.framework}';\n${item.content}`; utils.writeFileSync(item.dist, dtsContent); this.emit('update', item.dist, file); this.log(`create ${node_path_1.default.relative(this.config.cwd, item.dist)} (${Date.now() - startTime}ms)`); this.updateDistFiles(item.dist); } else { if (!node_fs_1.default.existsSync(item.dist)) { return; } // remove file node_fs_1.default.unlinkSync(item.dist); delete this.cacheDist[item.dist]; this.emit('remove', item.dist, file); this.log(`delete ${node_path_1.default.relative(this.config.cwd, item.dist)} (${Date.now() - startTime}ms)`); this.updateDistFiles(item.dist, true); } } }; if (typeof result.then === 'function') { return result .then(r => updateTs(r, file)) .catch(e => { this.log(e.message); }); } updateTs(result, file); } updateDistFiles(fileUrl, isRemove) { const index = this.dtsFileList.indexOf(fileUrl); if (index >= 0) { if (isRemove) { this.dtsFileList.splice(index, 1); } } else { this.dtsFileList.push(fileUrl); } } isCached(fileUrl, content) { const cacheItem = this.cacheDist[fileUrl]; if (content && cacheItem === content) { // no need to create file content is not changed. return true; } this.cacheDist[fileUrl] = content; return false; } // support dot prop config formatConfig(config) { const newConfig = {}; Object.keys(config).forEach(key => (0, dot_prop_1.set)(newConfig, key, config[key])); return newConfig; } // merge ts helper options mergeConfig(base, ...args) { args.forEach(opt => { if (!opt) return; const config = this.formatConfig(opt); // compatitable for alias of generatorCofig if (config.watchDirs) config.generatorConfig = config.watchDirs; Object.keys(config).forEach(key => { if (key !== 'generatorConfig') { base[key] = config[key] === undefined ? base[key] : config[key]; return; } const generatorConfig = config.generatorConfig || {}; Object.keys(generatorConfig).forEach(k => { const item = generatorConfig[k]; if (typeof item === 'boolean') { if (base.generatorConfig[k]) base.generatorConfig[k].enabled = item; } else if (item) { // check private generator (0, node_assert_1.default)(!generator.isPrivateGenerator(item.generator), `${item.generator} is a private generator, can not configure in config file`); // compatible for deprecated fields [ ['path', 'directory'], ].forEach(([oldValue, newValue]) => { if (item[oldValue]) { item[newValue] = item[oldValue]; } }); if (base.generatorConfig[k]) { Object.assign(base.generatorConfig[k], item); } else { base.generatorConfig[k] = item; } } }); }); }); } } exports.default = TsHelper; exports.TsHelper = TsHelper; function createTsHelperInstance(options) { return new TsHelper(options); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRGQSw4REEyRUM7QUFpVkQsd0RBRUM7QUF6ZkQsOERBQWlDO0FBQ2pDLDZDQUEyQztBQUMzQyxzREFBeUI7QUFDekIsOERBQWlDO0FBQ2pDLGtEQUEwQjtBQUMxQiwwREFBNkI7QUFDN0IsdURBQXlDO0FBcWZJLDhCQUFTO0FBcGZ0RCx1Q0FBMEQ7QUFDMUQscUNBQWlFO0FBQ2pFLHdEQUErQztBQUMvQyw0Q0FBa0Q7QUFpZnBCLDhGQWpmckIsb0JBQWEsT0FpZnFCO0FBaGYzQywrQ0FBaUM7QUFFakMsb0RBQTBCO0FBQzFCLHlDQUFxQztBQUVyQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFFckQsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLG9CQUFvQixDQUFDLENBQUM7QUF3RGhDLFFBQUEsYUFBYSxHQUFHO0lBQzNCLEdBQUcsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM1RCxTQUFTLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7SUFDaEUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztJQUM1RSxPQUFPLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7SUFDbEUsU0FBUyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FB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