UNPKG

uni-plugin-light

Version:

uni-app相关插件、loader及webpack基础配置

424 lines (405 loc) 17 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var path = require('path'); var tComm = require('t-comm'); var fs = require('fs'); var globToRegExp = require('glob-to-regexp'); var vueTemplateCompiler = require('vue-template-compiler'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n["default"] = e; return Object.freeze(n); } var path__namespace = /*#__PURE__*/_interopNamespace(path); var fs__namespace = /*#__PURE__*/_interopNamespace(fs); var globToRegExp__default = /*#__PURE__*/_interopDefaultLegacy(globToRegExp); function _arrayLikeToArray$2(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray$2(arr); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$2(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$2(o, minLen); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray$2(arr) || _nonIterableSpread(); } /* eslint-disable @typescript-eslint/no-require-imports */ function getParent(path, level) { if (!level) { return path.parent; } return getParent(path.parentPath, level - 1); } function findDependencies(content) { var parser = require('@babel/parser'); var traverse = require('@babel/traverse')["default"]; // const generate = require('@babel/generator').default; // const t = require('@babel/types'); var sourceList = []; var ast = parser.parse(content, { // 不加这个配置,报错:SyntaxError: 'import' and 'export' may appear only with 'sourceType: "module"' sourceType: 'module', plugins: ['typescript'] }); traverse(ast, { CallExpression: function CallExpression(path) { if (path.node.callee.name === 'require') { var _getParent, _getParent2, _getParent3, _getParent4; if (path.node.arguments[0].type === 'StringLiteral') { sourceList.push(path.node.arguments[0].value); } if (getParent(path, 0).type === 'ExpressionStatement' && getParent(path, 1).type === 'BlockStatement' && getParent(path, 2).type === 'ObjectMethod' && getParent(path, 3).type === 'ObjectExpression' && ((_getParent = getParent(path, 4)) === null || _getParent === void 0 ? void 0 : _getParent.type) === 'ObjectProperty' && ((_getParent2 = getParent(path, 4)) === null || _getParent2 === void 0 || (_getParent2 = _getParent2.key) === null || _getParent2 === void 0 ? void 0 : _getParent2.name) === 'components' && ((_getParent3 = getParent(path, 5)) === null || _getParent3 === void 0 ? void 0 : _getParent3.type) === 'ObjectExpression' && ((_getParent4 = getParent(path, 6)) === null || _getParent4 === void 0 ? void 0 : _getParent4.type) === 'ExportDefaultDeclaration' && path.node.arguments[0].type === 'ArrayExpression') { sourceList.push(path.node.arguments[0].elements[0].value); } } }, ImportDeclaration: function ImportDeclaration(path) { sourceList.push(path.node.source.value); } }); return sourceList; } function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function isInIgnoreGlob(file, ignoreGlob, projectRoot) { var _iterator = _createForOfIteratorHelper$1(ignoreGlob), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var item = _step.value; var re = globToRegExp__default["default"](item); var relativeFile = path__namespace.relative(projectRoot, file); if (re.test(relativeFile)) { return true; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return false; } function resolveFilePath(file, _ref) { var _findFile2; var projectRoot = _ref.projectRoot, fromFile = _ref.fromFile, fileExts = _ref.fileExts; if (file.startsWith('src')) { var _findFile; return (_findFile = findFile(path__namespace.resolve(projectRoot, file), fileExts)) === null || _findFile === void 0 ? void 0 : _findFile.file; } if (!file.startsWith('.')) { // node_modules return; } var dir = path__namespace.dirname(fromFile); return (_findFile2 = findFile(path__namespace.resolve(dir, file), fileExts)) === null || _findFile2 === void 0 ? void 0 : _findFile2.file; } function parseRoot(root) { var list = []; if (fs__namespace.existsSync(root)) { if (fs__namespace.statSync(root).isDirectory()) { tComm.traverseFolder(function (path) { list.push(path); }, root); } else { return [root]; } } return list; } // 传入绝对路径 function findFile(filePath, fileExts) { if (fs__namespace.existsSync(filePath)) { if (!fs__namespace.statSync(filePath).isDirectory()) { return { file: filePath }; } filePath = path__namespace.resolve(filePath, 'index'); } var _iterator2 = _createForOfIteratorHelper$1(fileExts), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var postfix = _step2.value; var newFilePath = "".concat(filePath, ".").concat(postfix); if (fs__namespace.existsSync(newFilePath)) { return { file: newFilePath }; } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return null; } function readFile(file) { var content = fs__namespace.readFileSync(file, { encoding: 'utf-8' }); return content; } function writeFile(file, data) { fs__namespace.writeFileSync(file, data, { encoding: 'utf-8' }); } function isVue(file) { return file.endsWith('.vue'); } function findDependenciesFromFile(file) { var content = readFile(file); if (isVue(file)) { var _res$script; var res = vueTemplateCompiler.parseComponent(content); var styleDependencies = res.styles.map(function (item) { return item.src; }).filter(function (item) { return item; }); return [].concat(_toConsumableArray(findDependencies((res === null || res === void 0 || (_res$script = res.script) === null || _res$script === void 0 ? void 0 : _res$script.content) || '')), _toConsumableArray(styleDependencies)); } if (/\.(scss|css|less)$/.test(file)) { return []; } return findDependencies(content); } function copyFile(from, to) { if (!fs__namespace.existsSync(to)) { tComm.mkDirsSync(path__namespace.dirname(to)); tComm.execCommand("cp -r ".concat(from, " ").concat(to)); } else { var content = readFile(from); writeFile(to, content); } } function removeJSFile(file) { if (!fs__namespace.existsSync(file)) return; var extension = path__namespace.extname(file); if (extension === '.ts') { var jsFile = file.replace(/\.ts$/, '.js'); if (fs__namespace.existsSync(jsFile)) { fs__namespace.unlinkSync(jsFile); console.log('[light cli] 删除JS文件', jsFile); } } } var DEFAULT_EXTENSIONS = ['js', 'ts', 'vue', // 'scss', // 'css', 'json']; var CONFIG_KEY_MAP = { FILE: 'light-cli.config.js', LIGHT_CLI: 'light-cli', SYNC_REPO: 'sync-repo' }; function getRoot() { var root = process.cwd(); return root; } function getConfig() { var _pkg; var root = getRoot(); var pkg = {}; var configFile = path__namespace.resolve(root, CONFIG_KEY_MAP.FILE); if (fs__namespace.existsSync(configFile)) { var _require; // eslint-disable-next-line @typescript-eslint/no-require-imports return ((_require = require(configFile)) === null || _require === void 0 ? void 0 : _require[CONFIG_KEY_MAP.SYNC_REPO]) || {}; } try { var content = fs__namespace.readFileSync(path__namespace.resolve(root, 'package.json'), { encoding: 'utf-8' }); pkg = JSON.parse(content); } catch (err) {} return ((_pkg = pkg) === null || _pkg === void 0 || (_pkg = _pkg[CONFIG_KEY_MAP.LIGHT_CLI]) === null || _pkg === void 0 ? void 0 : _pkg[CONFIG_KEY_MAP.SYNC_REPO]) || {}; } /* eslint-disable @typescript-eslint/no-require-imports */ function saveJsonToLog(content, file) { var needLog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (!needLog) return; createLogDir(); try { fs__namespace.writeFile("./log/".concat(file), JSON.stringify(content, null, 2), { encoding: 'utf-8' }, function () {}); } catch (err) {} } function createLogDir() { if (!fs__namespace.existsSync('./log')) { fs__namespace.mkdirSync('./log'); } } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } var visitedFiles = []; var fileDependencyMap = {}; function parseParams(files, _ref) { var ignore = _ref.ignore, projectRoot = _ref.projectRoot; return tComm.flat(files.map(function (file) { var from; var level = Infinity; if (typeof file === 'string') { from = file; } else { from = file.from; level = file.level || level; } var parsedFiles; if (Array.isArray(from)) { parsedFiles = tComm.flat(from.map(function (item) { return parseRoot(item); })); } else { parsedFiles = parseRoot(from); } return parsedFiles.filter(function (item) { return !isInIgnoreGlob(item, ignore, projectRoot); }).map(function (item) { return { from: item, level: level }; }); })); } function syncRepo() { var _getConfig = getConfig(), _getConfig$files = _getConfig.files, files = _getConfig$files === void 0 ? [] : _getConfig$files, target = _getConfig.target, _getConfig$ignore = _getConfig.ignore, ignore = _getConfig$ignore === void 0 ? [] : _getConfig$ignore, _getConfig$extensions = _getConfig.extensions, extensions = _getConfig$extensions === void 0 ? DEFAULT_EXTENSIONS : _getConfig$extensions, _getConfig$shouldRepl = _getConfig.shouldReplaceJS, shouldReplaceJS = _getConfig$shouldRepl === void 0 ? true : _getConfig$shouldRepl; if (!files.length) { console.error('files 长度不能为0'); return; } if (!target) { console.log('target 不能为空'); return; } var projectRoot = getRoot(); // visitedFiles.push(...files); var parsedFiles = parseParams(files, { ignore: ignore, projectRoot: projectRoot }); var allDependencies = new Set(parsedFiles.map(function (item) { return item.from; })); findAllDependencies({ files: parsedFiles, projectRoot: projectRoot, dependencies: allDependencies, extensions: extensions, ignore: ignore }); var allDependencyList = Array.from(allDependencies); for (var _i = 0, _allDependencyList = allDependencyList; _i < _allDependencyList.length; _i++) { var file = _allDependencyList[_i]; var relativeFile = path__namespace.relative(projectRoot, file); var to = path__namespace.resolve(projectRoot, target, relativeFile); copyFile(file, to); if (shouldReplaceJS) { removeJSFile(to); } } saveJsonToLog(fileDependencyMap, 'sync-repo.json'); } function findAllDependencies(_ref2) { var files = _ref2.files, projectRoot = _ref2.projectRoot, dependencies = _ref2.dependencies, extensions = _ref2.extensions, ignore = _ref2.ignore; var _iterator = _createForOfIteratorHelper(files), _step; try { var _loop = function _loop() { var file = _step.value; var from = file.from, level = file.level; if (!level) return 1; // continue var foundFile = findFile(from, extensions); if (foundFile && !visitedFiles.includes(foundFile.file) && !isInIgnoreGlob(foundFile.file, ignore, projectRoot)) { var sourceList = findDependenciesFromFile(foundFile.file).map(function (file) { return resolveFilePath(file, { projectRoot: projectRoot, fromFile: foundFile.file, fileExts: extensions }); }).filter(function (item) { return item; }).filter(function (item) { return !isInIgnoreGlob(item, ignore, projectRoot); }); visitedFiles.push(foundFile.file); sourceList.forEach(function (item) { return dependencies.add(item); }); fileDependencyMap[foundFile.file] = sourceList; findAllDependencies({ files: sourceList.map(function (file) { return { from: file, level: level - 1 }; }), projectRoot: projectRoot, dependencies: dependencies, extensions: extensions, ignore: ignore }); } }; for (_iterator.s(); !(_step = _iterator.n()).done;) { if (_loop()) continue; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } exports.syncRepo = syncRepo;