UNPKG

30.2 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var glob = require("fast-glob");
5var fs = require("fs");
6var jgb_plugin_babel_1 = require("jgb-plugin-babel");
7var jgb_plugin_css_1 = require("jgb-plugin-css");
8var jgb_plugin_html_1 = require("jgb-plugin-html");
9var jgb_plugin_json_1 = require("jgb-plugin-json");
10var lib_1 = require("jgb-shared/lib");
11var utils_1 = require("jgb-shared/lib/utils");
12var Path = require("path");
13var EXT_REGEX = /\.(\w)+$/;
14exports.default = lib_1.declare(function (compiler, pluginConfig) {
15 if (pluginConfig === void 0) { pluginConfig = {}; }
16 attachCompilerEvent(compiler);
17 jgb_plugin_babel_1.default(compiler, {});
18 jgb_plugin_json_1.default(compiler, {});
19 jgb_plugin_html_1.default(compiler, {
20 extensions: ['.axml'],
21 outExt: '.axml'
22 });
23 jgb_plugin_css_1.default(compiler, {
24 extensions: ['.acss'],
25 outExt: '.acss'
26 });
27});
28function attachCompilerEvent(compiler) {
29 compiler.on('collect-app-json', collectAppJson);
30 compiler.on('collect-page-json', collectPageJson);
31}
32function collectPageJson(_a) {
33 var dependences = _a.dependences, pageJson = _a.pageJson, ctx = _a.ctx;
34 return tslib_1.__awaiter(this, void 0, void 0, function () {
35 var extensions, supportExtensions, components, usingComponent, _b, _c, _d, key, value, componentPath, error_1, e_1_1, _e, _f, dep, e_2_1;
36 var e_1, _g, e_2, _h;
37 return tslib_1.__generator(this, function (_j) {
38 switch (_j.label) {
39 case 0:
40 if (needTransformJson(ctx)) {
41 pageJson = formatAsAliappPageJson(pageJson);
42 ctx.contents = JSON.stringify(pageJson);
43 ctx.ast = pageJson;
44 }
45 // 是否使用组件
46 if (!pageJson.usingComponents ||
47 typeof pageJson.usingComponents !== 'object') {
48 return [2 /*return*/];
49 }
50 extensions = ctx.options.parser.extensions;
51 supportExtensions = extensions.keys();
52 components = [];
53 usingComponent = usingNpmComponents.bind(ctx);
54 _j.label = 1;
55 case 1:
56 _j.trys.push([1, 9, 10, 11]);
57 _b = tslib_1.__values(Object.entries(pageJson.usingComponents)), _c = _b.next();
58 _j.label = 2;
59 case 2:
60 if (!!_c.done) return [3 /*break*/, 8];
61 _d = tslib_1.__read(_c.value, 2), key = _d[0], value = _d[1];
62 // 插件
63 if (value.startsWith('plugin://')) {
64 return [3 /*break*/, 7];
65 }
66 return [4 /*yield*/, findComponent(value, ctx)];
67 case 3:
68 componentPath = _j.sent();
69 _j.label = 4;
70 case 4:
71 _j.trys.push([4, 6, , 7]);
72 return [4 /*yield*/, usingComponent(key, componentPath, pageJson, dependences, components)];
73 case 5:
74 _j.sent();
75 return [3 /*break*/, 7];
76 case 6:
77 error_1 = _j.sent();
78 return [3 /*break*/, 7];
79 case 7:
80 _c = _b.next();
81 return [3 /*break*/, 2];
82 case 8: return [3 /*break*/, 11];
83 case 9:
84 e_1_1 = _j.sent();
85 e_1 = { error: e_1_1 };
86 return [3 /*break*/, 11];
87 case 10:
88 try {
89 if (_c && !_c.done && (_g = _b.return)) _g.call(_b);
90 }
91 finally { if (e_1) throw e_1.error; }
92 return [7 /*endfinally*/];
93 case 11:
94 if (!(components.length > 0)) return [3 /*break*/, 19];
95 _j.label = 12;
96 case 12:
97 _j.trys.push([12, 17, 18, 19]);
98 return [4 /*yield*/, ctx.expandFiles(new Set(components), supportExtensions)];
99 case 13:
100 _e = tslib_1.__values.apply(void 0, [_j.sent()]), _f = _e.next();
101 _j.label = 14;
102 case 14:
103 if (!!_f.done) return [3 /*break*/, 16];
104 dep = _f.value;
105 dependences.add(dep);
106 _j.label = 15;
107 case 15:
108 _f = _e.next();
109 return [3 /*break*/, 14];
110 case 16: return [3 /*break*/, 19];
111 case 17:
112 e_2_1 = _j.sent();
113 e_2 = { error: e_2_1 };
114 return [3 /*break*/, 19];
115 case 18:
116 try {
117 if (_f && !_f.done && (_h = _e.return)) _h.call(_e);
118 }
119 finally { if (e_2) throw e_2.error; }
120 return [7 /*endfinally*/];
121 case 19: return [2 /*return*/];
122 }
123 });
124 });
125}
126/**
127 * 找到组件路径,并返回相对编译后的路径
128 * @param componentPath
129 */
130function findComponent(componentPath, ctx) {
131 return tslib_1.__awaiter(this, void 0, void 0, function () {
132 var result, error_2, module, pkg, _a, realComponentPath;
133 return tslib_1.__generator(this, function (_b) {
134 switch (_b.label) {
135 case 0:
136 _b.trys.push([0, 2, , 3]);
137 return [4 /*yield*/, ctx.resolver.resolve(componentPath)];
138 case 1:
139 result = _b.sent();
140 if (result && result.path) {
141 componentPath = result.path.replace(/\.(\w+)$/, '');
142 }
143 return [3 /*break*/, 3];
144 case 2:
145 error_2 = _b.sent();
146 return [3 /*break*/, 3];
147 case 3:
148 if (componentPath.startsWith('.') || componentPath.startsWith('/')) {
149 return [2 /*return*/, componentPath];
150 }
151 return [4 /*yield*/, ctx.resolver.resolveModule(componentPath, null)];
152 case 4:
153 module = _b.sent();
154 if (!module) {
155 return [2 /*return*/, componentPath];
156 }
157 if (!('moduleDir' in module && module.moduleDir)) return [3 /*break*/, 6];
158 return [4 /*yield*/, ctx.resolver.findPackage(module.moduleDir)];
159 case 5:
160 _a = _b.sent();
161 return [3 /*break*/, 7];
162 case 6:
163 _a = {};
164 _b.label = 7;
165 case 7:
166 pkg = _a;
167 if (module.filePath &&
168 (fs.existsSync(module.filePath) || fs.existsSync(module.filePath + '.json'))) {
169 return [2 /*return*/, module.filePath];
170 }
171 // 根据pkg.miniprogram查找
172 if (pkg.miniprogram) {
173 realComponentPath = Path.join(module.moduleDir, pkg.miniprogram, module.subPath);
174 if (fs.existsSync(realComponentPath + '.json')) {
175 return [2 /*return*/, realComponentPath];
176 }
177 }
178 return [2 /*return*/];
179 }
180 });
181 });
182}
183exports.findComponent = findComponent;
184function usingNpmComponents(key, value, pageJson, dependences, components) {
185 return tslib_1.__awaiter(this, void 0, void 0, function () {
186 var _a, distPath, relativeRequirePath, realName, absolutePath, relativeRequire, componentPath, pkgJson, pkg, dir, npmProjectDir_1, allMatches;
187 return tslib_1.__generator(this, function (_b) {
188 switch (_b.label) {
189 case 0: return [4 /*yield*/, this.resolveAliasName(value)];
190 case 1:
191 _a = _b.sent(), distPath = _a.distPath, relativeRequirePath = _a.relativeRequirePath, realName = _a.realName, absolutePath = _a.absolutePath;
192 if (!(distPath && relativeRequirePath)) return [3 /*break*/, 5];
193 relativeRequire = relativeRequirePath.replace(EXT_REGEX, '');
194 pageJson.usingComponents[key] = relativeRequire;
195 if (realName) {
196 componentPath = utils_1.pathToUnixType(absolutePath.replace(EXT_REGEX, ''));
197 components.push(componentPath);
198 }
199 if (!absolutePath.includes('node_modules')) return [3 /*break*/, 5];
200 return [4 /*yield*/, findPackage(this, Path.dirname(absolutePath))];
201 case 2:
202 pkgJson = _b.sent();
203 if (!pkgJson) {
204 return [2 /*return*/];
205 }
206 pkg = pkgJson.pkg, dir = pkgJson.dir;
207 if (!pkg.miniprogram) return [3 /*break*/, 4];
208 npmProjectDir_1 = Path.join(dir, pkg.miniprogram);
209 return [4 /*yield*/, glob.async(['**/**'], {
210 cwd: npmProjectDir_1
211 })];
212 case 3:
213 allMatches = _b.sent();
214 if (allMatches) {
215 allMatches.forEach(function (file) {
216 dependences.add(Path.join(npmProjectDir_1, file));
217 });
218 return [2 /*return*/, true];
219 }
220 return [3 /*break*/, 5];
221 case 4:
222 // only resolve
223 components.push(absolutePath.replace(EXT_REGEX, ''));
224 return [2 /*return*/, true];
225 case 5: return [2 /*return*/];
226 }
227 });
228 });
229}
230exports.usingNpmComponents = usingNpmComponents;
231function findPackage(ctx, dir) {
232 return tslib_1.__awaiter(this, void 0, void 0, function () {
233 var pkg, err_1;
234 return tslib_1.__generator(this, function (_a) {
235 switch (_a.label) {
236 case 0:
237 _a.trys.push([0, 2, , 3]);
238 return [4 /*yield*/, ctx.resolver.findPackage(dir)];
239 case 1:
240 pkg = _a.sent();
241 return [2 /*return*/, {
242 pkg: pkg,
243 dir: pkg.pkgdir
244 }];
245 case 2:
246 err_1 = _a.sent();
247 return [3 /*break*/, 3];
248 case 3: return [2 /*return*/];
249 }
250 });
251 });
252}
253function collectAppJson(_a) {
254 var dependences = _a.dependences, appJson = _a.appJson, ctx = _a.ctx;
255 return tslib_1.__awaiter(this, void 0, void 0, function () {
256 var extensions, supportExtensions, assetPaths, _b, _c, dep, e_3_1;
257 var e_3, _d;
258 return tslib_1.__generator(this, function (_e) {
259 switch (_e.label) {
260 case 0:
261 if (needTransformJson(ctx)) {
262 appJson = formatAsAliappJson(appJson);
263 ctx.contents = JSON.stringify(appJson);
264 ctx.ast = appJson;
265 }
266 extensions = ctx.options.parser.extensions;
267 supportExtensions = extensions.keys();
268 assetPaths = [];
269 // pages asset
270 if (Array.isArray(appJson.pages)) {
271 assetPaths.push.apply(assetPaths, tslib_1.__spread(appJson.pages));
272 }
273 if (!Array.isArray(assetPaths)) return [3 /*break*/, 8];
274 _e.label = 1;
275 case 1:
276 _e.trys.push([1, 6, 7, 8]);
277 return [4 /*yield*/, ctx.expandFiles(new Set(assetPaths), supportExtensions)];
278 case 2:
279 _b = tslib_1.__values.apply(void 0, [_e.sent()]), _c = _b.next();
280 _e.label = 3;
281 case 3:
282 if (!!_c.done) return [3 /*break*/, 5];
283 dep = _c.value;
284 dependences.add(dep);
285 _e.label = 4;
286 case 4:
287 _c = _b.next();
288 return [3 /*break*/, 3];
289 case 5: return [3 /*break*/, 8];
290 case 6:
291 e_3_1 = _e.sent();
292 e_3 = { error: e_3_1 };
293 return [3 /*break*/, 8];
294 case 7:
295 try {
296 if (_c && !_c.done && (_d = _b.return)) _d.call(_b);
297 }
298 finally { if (e_3) throw e_3.error; }
299 return [7 /*endfinally*/];
300 case 8:
301 // tabBar asset
302 if (appJson.tabBar && Array.isArray(appJson.tabBar.items)) {
303 appJson.tabBar.items.forEach(function (config) {
304 // tslint:disable-next-line:no-unused-expression
305 config.icon && dependences.add(config.icon);
306 // tslint:disable-next-line:no-unused-expression
307 config.activeIcon && dependences.add(config.activeIcon);
308 });
309 }
310 return [2 /*return*/];
311 }
312 });
313 });
314}
315var windowNameMapping = {
316 navigationBarTitleText: 'defaultTitle',
317 enablePullDownRefresh: 'pullRefresh',
318 navigationBarBackgroundColor: 'titleBarColor',
319 component: 'component',
320 usingComponents: 'usingComponents'
321};
322/** aliapp中page.json生效的关键字 */
323var PageEnableKey = [
324 'defaultTitle',
325 'pullRefresh',
326 'allowsBounceVertical',
327 'titleBarColor',
328 'component',
329 'usingComponents'
330];
331/** aliapp中 app.json中 tabBar生效的关键字 */
332var TabBarEnableKey = [
333 'textColor',
334 'selectedColor',
335 'backgroundColor',
336 'items'
337];
338var TabBarItemEnableKey = ['pagePath', 'name', 'icon', 'activeIcon'];
339var tabBarNameMapping = {
340 color: 'textColor',
341 selectedColor: 'selectedColor',
342 backgroundColor: 'backgroundColor',
343 list: 'items'
344};
345var tabBarItemNameMapping = {
346 pagePath: 'pagePath',
347 text: 'name',
348 iconPath: 'icon',
349 selectedIconPath: 'activeIcon'
350};
351/** 是否需要转换json */
352function needTransformJson(ctx) {
353 return ctx.options.target !== ctx.options.source;
354}
355/**
356 * 微信page|component.json转支付宝微信page|component.json
357 * @param json
358 */
359function formatAsAliappPageJson(json) {
360 var windowJson = {};
361 Object.keys(json).forEach(function (key) {
362 // 当遇到支付宝小程序中page.json关键字时直接赋值
363 if (PageEnableKey.includes(key)) {
364 windowJson[key] = json[key];
365 return;
366 }
367 var value = windowNameMapping[key];
368 if (value) {
369 windowJson[value] = json[key];
370 }
371 });
372 return windowJson;
373}
374exports.formatAsAliappPageJson = formatAsAliappPageJson;
375/**
376 * 微信app.json转支付宝app.json
377 * @param json
378 */
379function formatAsAliappJson(json) {
380 var _a;
381 var aliappJson = {};
382 aliappJson.pages = json.pages;
383 aliappJson.window = {};
384 aliappJson.tabBar = {};
385 if (json.subPackages && json.subPackages.length) {
386 var allSubPages_1 = [];
387 json.subPackages.forEach(function (sub) {
388 var pages = sub.pages.map(function (page) {
389 return utils_1.pathToUnixType(Path.join(sub.root, page));
390 });
391 allSubPages_1.push.apply(allSubPages_1, tslib_1.__spread(pages));
392 });
393 (_a = aliappJson.pages).push.apply(_a, tslib_1.__spread(allSubPages_1));
394 }
395 if (json.window) {
396 var windowJSON = formatAsAliappPageJson(json.window);
397 aliappJson.window = windowJSON;
398 }
399 if (json.tabBar) {
400 var tabBar = formatAsAliappTabBarJson(json.tabBar);
401 aliappJson.tabBar = tabBar;
402 }
403 return aliappJson;
404}
405exports.formatAsAliappJson = formatAsAliappJson;
406function formatAsAliappTabBarJson(tabBar) {
407 var returnValue = {};
408 Object.keys(tabBar).forEach(function (key) {
409 if (TabBarEnableKey.includes(key)) {
410 returnValue[key] = tabBar[key];
411 return;
412 }
413 var value = tabBarNameMapping[key];
414 if (value) {
415 if (key === 'list') {
416 returnValue[value] = formatAsAliappTabBarItemsJson(tabBar[key]);
417 return;
418 }
419 returnValue[value] = tabBar[key];
420 }
421 });
422 return returnValue;
423}
424exports.formatAsAliappTabBarJson = formatAsAliappTabBarJson;
425function formatAsAliappTabBarItemsJson(json) {
426 return json.map(function (item) {
427 var innerItem = {};
428 Object.keys(item).forEach(function (itemKey) {
429 if (TabBarItemEnableKey.includes(itemKey)) {
430 innerItem[itemKey] = item[itemKey];
431 return;
432 }
433 var replacedItemKey = tabBarItemNameMapping[itemKey];
434 if (replacedItemKey) {
435 innerItem[replacedItemKey] = item[itemKey];
436 }
437 });
438 return innerItem;
439 });
440}
441exports.formatAsAliappTabBarItemsJson = formatAsAliappTabBarItemsJson;
442//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0NBQWtDO0FBQ2xDLHVCQUF5QjtBQUN6QixxREFBMkM7QUFDM0MsaURBQXVDO0FBQ3ZDLG1EQUF5QztBQUN6QyxtREFBeUM7QUFFekMsc0NBQXVEO0FBRXZELDhDQUFzRDtBQUN0RCwyQkFBNkI7QUFtRjdCLElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUU3QixrQkFBZSxhQUFPLENBQUMsVUFBQyxRQUFRLEVBQUUsWUFBZ0M7SUFBaEMsNkJBQUEsRUFBQSxpQkFBZ0M7SUFDaEUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFOUIsMEJBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUIseUJBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekIseUJBQVUsQ0FBQyxRQUFRLEVBQUU7UUFDbkIsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxPQUFPO0tBQ2hCLENBQUMsQ0FBQztJQUVILHdCQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2xCLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUNyQixNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsbUJBQW1CLENBQUMsUUFBbUI7SUFDOUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNoRCxRQUFRLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFlLGVBQWUsQ0FBQyxFQVE5QjtRQVBDLDRCQUFXLEVBQ1gsc0JBQVEsRUFDUixZQUFHOzs7Ozs7O29CQU1ILElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzFCLFFB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
\No newline at end of file