takin
Version:
Front end engineering base toolchain and scaffold
80 lines • 3.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createHooks = exports.registerHooks = exports.registerHook = exports.isHookRegistered = void 0;
const tapable_1 = require("tapable");
const errors_1 = require("../errors");
const logger_1 = require("../logger");
// 自定义 hook
const CUSTOM_HOOK_FACTORIES = {};
/**
* 判定自定义 hook 工厂函数是否已被注册
* @param hookName - hook 名称
* @retuns `true` or `false`
*/
function isHookRegistered(hookName) {
return !!CUSTOM_HOOK_FACTORIES[hookName];
}
exports.isHookRegistered = isHookRegistered;
/**
* 自定义 hook 工厂, 用于拓展 RunnerHooks
* @param hookName - hook 名称
* @param hookFactory - 工厂函数
*/
function registerHook(hookName, hookFactory) {
if (hookName in CUSTOM_HOOK_FACTORIES) {
throw new errors_1.HookError(`自定义 HookFactory: ${hookName} 已被注册, 请检查`);
}
CUSTOM_HOOK_FACTORIES[hookName] = hookFactory;
}
exports.registerHook = registerHook;
/**
* 批量注册 hook 工厂函数
* @param hooks - Hook 工厂对象
*/
function registerHooks(hooks) {
Object.keys(hooks).forEach(function (hook) {
const hookName = hook;
registerHook(hookName, hooks[hookName]);
});
}
exports.registerHooks = registerHooks;
/**
* 创建 Runner 相关默认 Hooks
* @returns 创建的 hooks
*/
function createHooks() {
const hooks = {
initialize: new tapable_1.SyncHook(['runner']),
cli: new tapable_1.SyncHook(['cli']),
matchedCommand: new tapable_1.AsyncSeriesHook(['command']),
loadConfig: new tapable_1.AsyncSeriesHook(['command']),
modifyUserConfig: new tapable_1.AsyncSeriesWaterfallHook(['userConfig', 'command']),
registerUserConfig: new tapable_1.AsyncSeriesWaterfallHook(['schema', 'zod']),
shouldRun: new tapable_1.SyncBailHook(['runner']),
shouldValidateUserConfig: new tapable_1.SyncBailHook(['runner']),
userConfigValidated: new tapable_1.AsyncSeriesHook(['userConfig']),
beforeRun: new tapable_1.AsyncSeriesHook(['runner']),
run: new tapable_1.HookMap(() => new tapable_1.AsyncParallelHook(['command'])),
done: new tapable_1.AsyncParallelHook(['runner']),
failed: new tapable_1.AsyncSeriesHook(['error']),
shutdown: new tapable_1.AsyncSeriesHook(['runner'])
};
// 设置自定义 hook
function setCustomHook(name, hookFactory) {
if (hooks[name]) {
logger_1.logger.warn(`自定义 Hook: ${name} 已忽略, 原因: 已存在相同名称的 Hook`);
return;
}
hooks[name] = hookFactory();
}
// 添加自定义 hook
for (const hook in CUSTOM_HOOK_FACTORIES) {
const hookName = hook;
const hookFactory = CUSTOM_HOOK_FACTORIES[hookName];
if (hookFactory)
setCustomHook(hookName, hookFactory);
}
return hooks;
}
exports.createHooks = createHooks;
//# sourceMappingURL=hooks.js.map