"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UNI_EASYCOM_EXCLUDE = exports.genResolveEasycomCode = exports.addImportDeclaration = exports.matchEasycom = exports.initEasycomsOnce = exports.initEasycoms = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const debug_1 = __importDefault(require("debug")); const shared_1 = require("@vue/shared"); const pluginutils_1 = require("@rollup/pluginutils"); const uni_shared_1 = require("@dcloudio/uni-shared"); const utils_1 = require("./utils"); const pages_1 = require("./json/pages"); const messages_1 = require("./messages"); const uts_1 = require("./uts"); const debugEasycom = (0, debug_1.default)('uni:easycom'); const easycoms = []; const easycomsCache = new Map(); const easycomsInvalidCache = new Set(); let hasEasycom = false; function clearEasycom() { easycoms.length = 0; easycomsCache.clear(); easycomsInvalidCache.clear(); } function initEasycoms(inputDir, { dirs, platform, isX, }) { const componentsDir = path_1.default.resolve(inputDir, 'components'); const uniModulesDir = path_1.default.resolve(inputDir, 'uni_modules'); const initEasycomOptions = (pagesJson) => { // 初始化时,从once中读取缓存,refresh时,实时读取 const { easycom } = pagesJson || (0, pages_1.parsePagesJson)(inputDir, platform, false); const easycomOptions = { dirs: easycom && easycom.autoscan === false ? [...dirs] // 禁止自动扫描 : [ ...dirs, componentsDir, ...initUniModulesEasycomDirs(uniModulesDir), ], rootDir: inputDir, autoscan: !!(easycom && easycom.autoscan), custom: (easycom && easycom.custom) || {}, extensions: [...(isX ? ['.uvue'] : []), ...['.vue', '.jsx', '.tsx']], }; debugEasycom(easycomOptions); return easycomOptions; }; const options = initEasycomOptions((0, pages_1.parsePagesJsonOnce)(inputDir, platform)); const initUTSEasycom = () => { (0, uts_1.initUTSComponents)(inputDir, platform).forEach((item) => { const index = easycoms.findIndex((easycom) => item.name === easycom.name); if (index > -1) { easycoms.splice(index, 1, item); } else { easycoms.push(item); } }); }; initEasycom(options); initUTSEasycom(); const componentExtNames = isX ? 'uvue|vue' : 'vue'; const res = { options, filter: (0, pluginutils_1.createFilter)([ 'components/*/*.(' + componentExtNames + '|jsx|tsx)', 'uni_modules/*/components/*/*.(' + componentExtNames + '|jsx|tsx)', 'utssdk/*/**/*.(' + componentExtNames + ')', 'uni_modules/*/utssdk/*/*.(' + componentExtNames + ')', ], [], { resolve: inputDir, }), refresh() { res.options = initEasycomOptions(); initEasycom(res.options); initUTSEasycom(); }, easycoms, }; return res; } exports.initEasycoms = initEasycoms; exports.initEasycomsOnce = (0, uni_shared_1.once)(initEasycoms); function initUniModulesEasycomDirs(uniModulesDir) { if (!fs_1.default.existsSync(uniModulesDir)) { return []; } return fs_1.default .readdirSync(uniModulesDir) .map((uniModuleDir) => { const uniModuleComponentsDir = path_1.default.resolve(uniModulesDir, uniModuleDir, 'components'); if (fs_1.default.existsSync(uniModuleComponentsDir)) { return uniModuleComponentsDir; } }) .filter(Boolean); } function initEasycom({ dirs, rootDir, custom, extensions }) { clearEasycom(); const easycomsObj = Object.create(null); if (dirs && dirs.length && rootDir) { (0, shared_1.extend)(easycomsObj, initAutoScanEasycoms(dirs, rootDir, extensions)); } if (custom) { Object.keys(custom).forEach((name) => { const componentPath = custom[name]; easycomsObj[name] = componentPath.startsWith('@/') ? (0, utils_1.normalizePath)(path_1.default.join(rootDir, componentPath.slice(2))) : componentPath; }); } Object.keys(easycomsObj).forEach((name) => { easycoms.push({ name: name.startsWith('^') && name.endsWith('$') ? name.slice(1, -1) : name, pattern: new RegExp(name), replacement: easycomsObj[name], }); }); debugEasycom(easycoms); hasEasycom = !!easycoms.length; return easycoms; } function matchEasycom(tag) { if (!hasEasycom) { return; } let source = easycomsCache.get(tag); if (source) { return source; } if (easycomsInvalidCache.has(tag)) { return false; } const matcher = easycoms.find((matcher) => matcher.pattern.test(tag)); if (!matcher) { easycomsInvalidCache.add(tag); return false; } source = tag.replace(matcher.pattern, matcher.replacement); easycomsCache.set(tag, source); debugEasycom('matchEasycom', tag, source); return source; } exports.matchEasycom = matchEasycom; const isDir = (path) => fs_1.default.lstatSync(path).isDirectory(); function initAutoScanEasycom(dir, rootDir, extensions) { if (!path_1.default.isAbsolute(dir)) { dir = path_1.default.resolve(rootDir, dir); } const easycoms = Object.create(null); if (!fs_1.default.existsSync(dir)) { return easycoms; } fs_1.default.readdirSync(dir).forEach((name) => { const folder = path_1.default.resolve(dir, name); if (!isDir(folder)) { return; } const importDir = (0, utils_1.normalizePath)(folder); const files = fs_1.default.readdirSync(folder); // 读取文件夹文件列表,比对文件名(fs.existsSync在大小写不敏感的系统会匹配不准确) for (let i = 0; i < extensions.length; i++) { const ext = extensions[i]; if (files.includes(name + ext)) { easycoms[`^${name}$`] = `${importDir}/${name}${ext}`; break; } } }); return easycoms; } function initAutoScanEasycoms(dirs, rootDir, extensions) { const conflict = {}; const res = dirs.reduce((easycoms, dir) => { const curEasycoms = initAutoScanEasycom(dir, rootDir, extensions); Object.keys(curEasycoms).forEach((name) => { // Use the first component when name conflict const componentPath = easycoms[name]; if (!componentPath) { easycoms[name] = curEasycoms[name]; } else { ; (conflict[componentPath] || (conflict[componentPath] = [])).push(normalizeComponentPath(curEasycoms[name], rootDir)); } }); return easycoms; }, Object.create(null)); const conflictComponents = Object.keys(conflict); if (conflictComponents.length) { console.warn(messages_1.M['easycom.conflict']); conflictComponents.forEach((com) => { console.warn([normalizeComponentPath(com, rootDir), conflict[com]].join(',')); }); } return res; } function normalizeComponentPath(componentPath, rootDir) { return (0, utils_1.normalizePath)(path_1.default.relative(rootDir, componentPath)); } function addImportDeclaration(importDeclarations, local, source, imported) { importDeclarations.push(createImportDeclaration(local, source, imported)); return local; } exports.addImportDeclaration = addImportDeclaration; function createImportDeclaration(local, source, imported) { if (imported) { return `import { ${imported} as ${local} } from '${source}';`; } return `import ${local} from '${source}';`; } const RESOLVE_EASYCOM_IMPORT_CODE = `import { resolveDynamicComponent as __resolveDynamicComponent } from 'vue';import { resolveEasycom } from '@dcloudio/uni-app';`; function genResolveEasycomCode(importDeclarations, code, name) { if (!importDeclarations.includes(RESOLVE_EASYCOM_IMPORT_CODE)) { importDeclarations.push(RESOLVE_EASYCOM_IMPORT_CODE); } return `resolveEasycom(${code.replace('_resolveComponent', '__resolveDynamicComponent')}, ${name})`; } exports.genResolveEasycomCode = genResolveEasycomCode; exports.UNI_EASYCOM_EXCLUDE = [/App.vue$/, /@dcloudio\/uni-h5/];