UNPKG

jgb-cli

Version:

```shell npm i -g jgb-cli #全局安装 ```

490 lines 38.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var babel = require("babel-core"); var chalk_1 = require("chalk"); var fs = require("fs"); var index_1 = require("jgb-shared/lib/utils/index"); var json5 = require("json5"); var ora_1 = require("ora"); var Path = require("path"); var componentNum = 0; /** * 判断被babel劫持到的ObjectExpression向上查找是否是某个对象的一个属性中的属性 例如: obj = {a: {func: () => {}}}, * func是a对象的一个ObjectProperty属性,但a是obj的一个属性,则返回ObjectProperty。直到找到的是program * @param path type为ObjectExpression */ var recentTypeIsObjOrProgram = function (path) { var type = 'Program'; var node = path.parentPath; while (!babel.types.isProgram(node.node)) { if (babel.types.isObjectExpression(node)) { type = 'ObjectProperty'; break; } node = node.parentPath; } return type; }; var isParentPathProgramNode = function (path, step) { var node = path; for (var i = 0; i < step; i++) { node = node.parentPath; } return babel.types.isProgram(node.node); }; var getNodeName = function (node) { return node.name; }; var formatPath = function (path, replacedStr) { return index_1.pathToUnixType(Path.relative(replacedStr, path)); }; var Core = /** @class */ (function () { function Core(options) { this.errPath = []; this.entry = options.entry; } Core.prototype.scan = function (scanPageParams) { if (scanPageParams === void 0) { scanPageParams = false; } return tslib_1.__awaiter(this, void 0, void 0, function () { var spinner, data, mainPackages_1, subPackages_1, res, e_1; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (scanPageParams) { return [2 /*return*/, this.scanPageParams()]; } spinner = ora_1.default(); _a.label = 1; case 1: _a.trys.push([1, 4, , 5]); spinner.start(chalk_1.default.green('start scanning')); return [4 /*yield*/, this._getAppJson(this.entry)]; case 2: data = _a.sent(); if (!data) { return [2 /*return*/, console.log(chalk_1.default.red('文件内容为空'))]; } mainPackages_1 = data.pages; subPackages_1 = this._getSubPackagesPath(data.subPackages); this.pathes = this._mergePath(mainPackages_1, subPackages_1); return [4 /*yield*/, this._startScanPage()]; case 3: res = _a.sent(); spinner.stop(); this._printErrorInfo(); fs.writeFile(Path.resolve(this.entry, '../scan-res.json'), JSON.stringify(res, null, 2), function (err) { if (err) { return console.log(chalk_1.default.red('文件写入失败')); } console.log(chalk_1.default.greenBright("\u6587\u4EF6\u5199\u5165\u81F3: " + Path.resolve(_this.entry, '../scan-res.json'))); console.log(chalk_1.default.greenBright("\u5171" + chalk_1.default.blueBright("" + _this.pathes.length) + "\u4E2A\u9875\u9762, " + chalk_1.default.blueBright("" + componentNum) + "\u4E2A\u7EC4\u4EF6,\u53BB\u9664" + chalk_1.default.blueBright("" + (subPackages_1.length + mainPackages_1.length - _this.pathes.length)) + "\u4E2A\u591A\u4F59\u9875\u9762")); }); return [3 /*break*/, 5]; case 4: e_1 = _a.sent(); console.log('e', e_1); return [3 /*break*/, 5]; case 5: return [2 /*return*/]; } }); }); }; /** * 扫描收集 page.json 中的 $pageParams 页面参数 */ Core.prototype.scanPageParams = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var spinner, data, mainPackages_2, subPackages_2, paths_1, res, resFilename, absoluteResFile_1, e_2; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: spinner = ora_1.default(); _a.label = 1; case 1: _a.trys.push([1, 4, , 5]); spinner.start(chalk_1.default.green('start scanning')); return [4 /*yield*/, this._getAppJson(this.entry)]; case 2: data = _a.sent(); if (!data) { spinner.stop(); return [2 /*return*/, console.log(chalk_1.default.red('文件内容为空'))]; } mainPackages_2 = data.pages; subPackages_2 = this._getSubPackagesPath(data.subPackages); paths_1 = this._mergePath(mainPackages_2, subPackages_2); return [4 /*yield*/, this._collectPages(paths_1)]; case 3: res = _a.sent(); spinner.stop(); resFilename = 'scan-page-params.json'; absoluteResFile_1 = Path.resolve(this.entry, '..', resFilename); fs.writeFile(absoluteResFile_1, JSON.stringify(res, null, 2), function (err) { if (err) { return console.log(chalk_1.default.red('文件写入失败')); } console.log(chalk_1.default.greenBright("\u6587\u4EF6\u5199\u5165\u81F3: " + absoluteResFile_1)); console.log(chalk_1.default.greenBright("\u5171" + chalk_1.default.blueBright("" + paths_1.length) + "\u4E2A\u9875\u9762, ,\u53BB\u9664" + chalk_1.default.blueBright("" + (subPackages_2.length + mainPackages_2.length - paths_1.length)) + "\u4E2A\u591A\u4F59\u9875\u9762")); }); return [3 /*break*/, 5]; case 4: e_2 = _a.sent(); spinner.stop(); console.log(e_2); return [3 /*break*/, 5]; case 5: return [2 /*return*/]; } }); }); }; Core.prototype._printErrorInfo = function () { if (this.errPath.length) { console.log(chalk_1.default.redBright('以下路径未被find: ')); console.log(chalk_1.default.redBright(JSON.stringify(this.errPath, null, 2))); } }; Core.prototype._startScanPage = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var res, _a, _b, path, obj, _c, _d, e_3_1; var e_3, _e; return tslib_1.__generator(this, function (_f) { switch (_f.label) { case 0: res = []; _f.label = 1; case 1: _f.trys.push([1, 7, 8, 9]); _a = tslib_1.__values(this.pathes), _b = _a.next(); _f.label = 2; case 2: if (!!_b.done) return [3 /*break*/, 6]; path = _b.value; obj = {}; obj.path = path; _c = obj; return [4 /*yield*/, this._getMethods(path)]; case 3: _c.methods = (_f.sent()) || []; _d = obj; return [4 /*yield*/, this._getComponents(path)]; case 4: _d.components = (_f.sent()) || []; obj.type = 'page'; res.push(obj); _f.label = 5; case 5: _b = _a.next(); return [3 /*break*/, 2]; case 6: return [3 /*break*/, 9]; case 7: e_3_1 = _f.sent(); e_3 = { error: e_3_1 }; return [3 /*break*/, 9]; case 8: try { if (_b && !_b.done && (_e = _a.return)) _e.call(_a); } finally { if (e_3) throw e_3.error; } return [7 /*endfinally*/]; case 9: return [2 /*return*/, res]; } }); }); }; Core.prototype._getAppJson = function (entry) { return new Promise(function (resolve, reject) { fs.readdir(entry, function (err) { if (err) { console.log(chalk_1.default.red('\n未发现dist目录')); return reject(null); } fs.readFile(Path.resolve(entry, 'app.json'), 'utf8', function (error, data) { if (error) { console.log(chalk_1.default.red('未发现app.json文件')); return reject(null); } return resolve(json5.parse(data)); }); }); }); }; Core.prototype._getComponents = function (path) { var _this = this; return new Promise(function (resolve, reject) { var entry = Path.resolve(_this.entry, path + ".json"); var res = []; fs.readFile(entry, 'utf8', (function (err, data) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var usingComponents, _a, _b, _i, componentName, componentPath, obj, absCompPath, _c, _d; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: if (err) { console.log(chalk_1.default.red("\n\u672A\u627E\u5230json\u6587\u4EF6: " + entry)); return [2 /*return*/, resolve(null)]; } data = json5.parse(data); usingComponents = data.usingComponents || {}; _a = []; for (_b in usingComponents) _a.push(_b); _i = 0; _e.label = 1; case 1: if (!(_i < _a.length)) return [3 /*break*/, 5]; componentName = _a[_i]; componentNum++; componentPath = usingComponents[componentName]; // 去除组件路径为plugins的 if (componentPath.startsWith('plugin:')) { return [3 /*break*/, 4]; } obj = {}; absCompPath = Path.resolve(entry, '../', this._normalizePath(componentPath)); // console.log('this.entry', this.entry, _path) obj.path = formatPath(absCompPath, "" + this.entry); _c = obj; return [4 /*yield*/, this._getMethods(absCompPath, formatPath(path, this.entry + "/"))]; case 2: _c.methods = (_e.sent()) || []; obj.type = 'component'; _d = obj; return [4 /*yield*/, this._getComponents(absCompPath)]; case 3: _d.components = (_e.sent()) || []; res.push(obj); _e.label = 4; case 4: _i++; return [3 /*break*/, 1]; case 5: return [2 /*return*/, resolve(res)]; } }); }); })); }); }; // 获取分包的路径,返回绝对路径 Core.prototype._getSubPackagesPath = function (subPackages) { var _a; if (!((_a = subPackages) === null || _a === void 0 ? void 0 : _a.length)) { return []; } return subPackages.reduce(function (pre, subPackage) { var root = subPackage.root; return pre.concat(subPackage.pages.map(function (path) { return root + "/" + path; })); }, []); }; // 合并路径,去除重复的路径, 并去除plugin Core.prototype._mergePath = function (mainPackages, subPackages) { var e_4, _a; mainPackages = mainPackages || []; subPackages = subPackages || []; var res = []; try { for (var mainPackages_3 = tslib_1.__values(mainPackages), mainPackages_3_1 = mainPackages_3.next(); !mainPackages_3_1.done; mainPackages_3_1 = mainPackages_3.next()) { var path = mainPackages_3_1.value; // let isExist = false // for (const sub of subPackages) { // if (sub.includes(path)) { // isExist = true // break // } // } // if (!isExist) { // res.push(path) // } res.push(path); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (mainPackages_3_1 && !mainPackages_3_1.done && (_a = mainPackages_3.return)) _a.call(mainPackages_3); } finally { if (e_4) throw e_4.error; } } return res.concat(subPackages); }; Core.prototype._getMethods = function (filePath, parentPath) { var _this = this; return new Promise(function (resolve, reject) { var entry = Path.resolve(_this.entry, filePath + ".js"); fs.readFile(entry, 'utf8', function (err, code) { var _a; if (err) { _this.errPath.push((_a = {}, _a["" + parentPath] = filePath, _a)); return resolve(null); } var ast = babel.transform(code, { sourceType: 'module' }).ast; var funcNames = []; babel.traverse(ast, { ObjectProperty: function (path, state) { var node = path.node; var key = node.key, value = node.value; // 移除computed里面的方法 if (key.name === 'computed') { value.properties.forEach(function (property) { property.filter = true; }); } if (recentTypeIsObjOrProgram(path.parentPath) === 'Program' && !node.filter && // 不是computed属性 key.name !== 'observer' // 不是observer ) { // func: function func() {} if (babel.types.isFunctionExpression(value)) { funcNames.push(getNodeName(key)); } // func: function() { return function () {} }() if (babel.types.isCallExpression(value)) { if (babel.types.isFunctionExpression(value.callee)) { funcNames.push(getNodeName(key)); } } } if (key.name === 'methods') { var methods = value.properties && Array.isArray(value.properties) && value.properties.map(function (item) { return item.key.name; }) || []; funcNames.push.apply(funcNames, tslib_1.__spread(methods)); } }, AssignmentExpression: function (path, state) { var node = path.node; var left = node.left; if (babel.types.isMemberExpression(left)) { var object = left.object, property = left.property; if (object && object.property && babel.types.isIdentifier(object.property) && object.property.name === 'prototype') { if (left.property && babel.types.isIdentifier(left.property)) { funcNames.push(getNodeName(left.property)); } } } } }); return resolve(funcNames); }); }); }; // 针对 /component/index/index ==> /path/to/component/index/index Core.prototype._normalizePath = function (path) { path = path.replace(/\\/g, '/'); if (path.substr(0, 1) === '/') { path = this.entry + "/" + path.substr(1); } return path; }; /** * 收集全部页面参数 * @param {string[]} paths 所有要收集的页面路径 */ Core.prototype._collectPages = function (paths) { return tslib_1.__awaiter(this, void 0, void 0, function () { var res, paths_2, paths_2_1, path, collectedJson, e_5_1; var e_5, _a; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: res = []; _b.label = 1; case 1: _b.trys.push([1, 6, 7, 8]); paths_2 = tslib_1.__values(paths), paths_2_1 = paths_2.next(); _b.label = 2; case 2: if (!!paths_2_1.done) return [3 /*break*/, 5]; path = paths_2_1.value; return [4 /*yield*/, this._collectPageParams(path)]; case 3: collectedJson = _b.sent(); if (collectedJson) { res.push(collectedJson); } _b.label = 4; case 4: paths_2_1 = paths_2.next(); return [3 /*break*/, 2]; case 5: return [3 /*break*/, 8]; case 6: e_5_1 = _b.sent(); e_5 = { error: e_5_1 }; return [3 /*break*/, 8]; case 7: try { if (paths_2_1 && !paths_2_1.done && (_a = paths_2.return)) _a.call(paths_2); } finally { if (e_5) throw e_5.error; } return [7 /*endfinally*/]; case 8: return [2 /*return*/, res]; } }); }); }; /** * 收集页面参数 * @param {string} path 页面路径 */ Core.prototype._collectPageParams = function (path) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib_1.__generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { var pageJsonPath = Path.resolve(_this.entry, path + ".json"); fs.readFile(pageJsonPath, 'utf8', function (err, data) { if (err) { console.log(pageJsonPath, err); resolve(null); return; } var collect = { path: path, title: '', params: null, }; try { var json = json5.parse(data) || {}; collect.params = json.$pageParams || null; collect.title = json.$pageTitle || json.navigationBarTitleText || ''; } catch (e) { console.log(pageJsonPath, e); } resolve(collect); }); })]; }); }); }; return Core; }()); function scan(program) { return tslib_1.__awaiter(this, void 0, void 0, function () { var path, entry, pageParams, core; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: path = program.source || process.cwd(); entry = Path.resolve(path, 'dist'); pageParams = program.pageParams; // 有 pageParams 参数时,需要扫描原始文件 if (pageParams) { entry = Path.resolve(path, 'src'); } core = new Core({ entry: entry }); return [4 /*yield*/, core.scan(pageParams)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); } exports.default = scan; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kL3NjYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0NBQW9DO0FBQ3BDLCtCQUEwQjtBQUMxQix1QkFBeUI7QUFDekIsb0RBQTREO0FBQzVELDZCQUErQjtBQUMvQiwyQkFBc0I7QUFDdEIsMkJBQTZCO0FBRTdCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQTtBQWlCcEI7Ozs7R0FJRztBQUNILElBQU0sd0JBQXdCLEdBQUcsVUFBQyxJQUFTO0lBQ3pDLElBQUksSUFBSSxHQUFtQyxTQUFTLENBQUE7SUFDcEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3hDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QyxJQUFJLEdBQUcsZ0JBQWdCLENBQUE7WUFDdkIsTUFBTTtTQUNQO1FBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUE7S0FDdkI7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMsQ0FBQTtBQStDRCxJQUFNLHVCQUF1QixHQUFHLFVBQUMsSUFBUyxFQUFFLElBQVk7SUFDdEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFBO0lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQTtLQUN2QjtJQUNELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3pDLENBQUMsQ0FBQTtBQUVELElBQU0sV0FBVyxHQUFHLFVBQUMsSUFBUyxJ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