UNPKG

@tarojs/runner-utils

Version:

Taro runner utilities.

79 lines (78 loc) 3.35 kB
"use strict"; 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;