@tarojs/runner-utils
Version:
Taro runner utilities.
79 lines (78 loc) • 3.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MultiPlatformPlugin = void 0;
const path = require("node:path");
const helper_1 = require("@tarojs/helper");
/**
* @description 此 enhance-resolve 插件用于根据当前编译的平台,解析多端文件的后缀
*
* @property {string} source resolver hook 类别
* @property {string} target 解析完成后需要触发的钩子
* @property {IOptions} options 插件配置项
*
* @example
* there's filepath 'src/index'
* when platform is weapp, we get 'src/index.weapp.[js|ts|jsx|tsx]'
* when platform is h5, we get 'src/index.h5.[js|ts|jsx|tsx]'
* by default, we get 'src/index.[js|ts|jsx|tsx]'
*
* @class MultiPlatformPlugin
*/
class MultiPlatformPlugin {
constructor(source, target, options) {
this.source = source;
this.target = target;
this.options = options || {};
}
apply(resolver) {
const target = resolver.ensureHook(this.target);
resolver
.getHook(this.source)
.tapAsync('MultiPlatformPlugin', (request, resolveContext, callback) => {
var _a, _b, _c;
const innerRequest = request.request || request.path;
if (!innerRequest || (request.context.hasOwnProperty('issuer') && !request.context.issuer))
return callback();
if (!path.extname(innerRequest)) {
let srcRequest;
if (path.isAbsolute(innerRequest)) {
// absolute path
srcRequest = innerRequest;
}
else if (!path.isAbsolute(innerRequest) && /^\./.test(innerRequest)) {
// relative path
srcRequest = path.resolve(request.path, request.request);
}
else {
return callback();
}
if (helper_1.REG_NODE_MODULES.test(srcRequest) && !this.includes(srcRequest)) {
return callback();
}
const extensions = (_c = (_b = (_a = this.options.chain) === null || _a === void 0 ? void 0 : _a.resolve) === null || _b === void 0 ? void 0 : _b.extensions) === null || _c === void 0 ? void 0 : _c.values();
const newRequestStr = helper_1.default.resolveMainFilePath(srcRequest, extensions);
if (newRequestStr === innerRequest)
return callback();
const obj = Object.assign({}, request, {
request: newRequestStr
});
return resolver.doResolve(target, obj, 'resolve multi platform file path', resolveContext, (err, result) => {
if (err)
return callback(err);
if (result === undefined)
return callback(null, null);
return callback(null, result);
});
}
callback();
});
}
includes(filePath) {
if (!this.options.include || !this.options.include.length)
return false;
filePath = filePath.replace(/[\\/]/g, '/');
const res = this.options.include.find(item => filePath.includes(item));
return Boolean(res);
}
}
exports.MultiPlatformPlugin = MultiPlatformPlugin;