jgb-cli
Version:
```shell npm i -g jgb-cli #全局安装 ```
490 lines • 38.3 kB
JavaScript
"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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