UNPKG

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