egg-ts-helper
Version:
egg typescript helper
422 lines • 34.1 kB
JavaScript
"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 isInUnitTest = process.env.NODE_ENV === 'test';
exports.defaultConfig = {
cwd: utils.convertString(process.env.ETS_CWD, process.cwd()),
framework: utils.convertString(process.env.ETS_FRAMEWORK, 'egg'),
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.generatorConfig = getDefaultGeneratorConfig(config);
config.typings = node_path_1.default.resolve(config.cwd, config.typings);
this.config = 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNGQSw4REEyRUM7QUF3VUQsd0RBRUM7QUExZUQsOERBQWlDO0FBQ2pDLDZDQUEyQztBQUMzQyxzREFBeUI7QUFDekIsOERBQWlDO0FBQ2pDLGtEQUEwQjtBQUMxQiwwREFBNkI7QUFDN0IsdURBQXlDO0FBc2VJLDhCQUFTO0FBcmV0RCx1Q0FBMEQ7QUFDMUQscUNBQWlFO0FBQ2pFLHdEQUErQztBQUMvQyw0Q0FBa0Q7QUFrZXBCLDhGQWxlckIsb0JBQWEsT0FrZXFCO0FBamUzQywrQ0FBaUM7QUFFakMsb0RBQTBCO0FBQzFCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQztBQXVEeEMsUUFBQSxhQUFhLEdBQUc7SUFDM0IsR0FBRyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzVELFNBQVMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQztJQUNoRSxPQUFPLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7SUFDbEUsU0FBUyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDO0lBQ25FLFlBQVksRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDO0lBQ3ZFLFFBQVEsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxH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