egg-ts-helper
Version:
egg typescript helper
434 lines • 35.6 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 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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