1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var tslib_1 = require("tslib");
|
4 | var glob = require("fast-glob");
|
5 | var fs = require("fs");
|
6 | var jgb_plugin_babel_1 = require("jgb-plugin-babel");
|
7 | var jgb_plugin_css_1 = require("jgb-plugin-css");
|
8 | var jgb_plugin_html_1 = require("jgb-plugin-html");
|
9 | var jgb_plugin_json_1 = require("jgb-plugin-json");
|
10 | var lib_1 = require("jgb-shared/lib");
|
11 | var utils_1 = require("jgb-shared/lib/utils");
|
12 | var Path = require("path");
|
13 | var EXT_REGEX = /\.(\w)+$/;
|
14 | exports.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 | });
|
28 | function attachCompilerEvent(compiler) {
|
29 | compiler.on('collect-app-json', collectAppJson);
|
30 | compiler.on('collect-page-json', collectPageJson);
|
31 | }
|
32 | function 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 | */
|
130 | function 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 | }
|
183 | exports.findComponent = findComponent;
|
184 | function 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 | }
|
230 | exports.usingNpmComponents = usingNpmComponents;
|
231 | function 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 | }
|
253 | function 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 | }
|
315 | var windowNameMapping = {
|
316 | navigationBarTitleText: 'defaultTitle',
|
317 | enablePullDownRefresh: 'pullRefresh',
|
318 | navigationBarBackgroundColor: 'titleBarColor',
|
319 | component: 'component',
|
320 | usingComponents: 'usingComponents'
|
321 | };
|
322 | /** aliapp中page.json生效的关键字 */
|
323 | var PageEnableKey = [
|
324 | 'defaultTitle',
|
325 | 'pullRefresh',
|
326 | 'allowsBounceVertical',
|
327 | 'titleBarColor',
|
328 | 'component',
|
329 | 'usingComponents'
|
330 | ];
|
331 | /** aliapp中 app.json中 tabBar生效的关键字 */
|
332 | var TabBarEnableKey = [
|
333 | 'textColor',
|
334 | 'selectedColor',
|
335 | 'backgroundColor',
|
336 | 'items'
|
337 | ];
|
338 | var TabBarItemEnableKey = ['pagePath', 'name', 'icon', 'activeIcon'];
|
339 | var tabBarNameMapping = {
|
340 | color: 'textColor',
|
341 | selectedColor: 'selectedColor',
|
342 | backgroundColor: 'backgroundColor',
|
343 | list: 'items'
|
344 | };
|
345 | var tabBarItemNameMapping = {
|
346 | pagePath: 'pagePath',
|
347 | text: 'name',
|
348 | iconPath: 'icon',
|
349 | selectedIconPath: 'activeIcon'
|
350 | };
|
351 | /** 是否需要转换json */
|
352 | function needTransformJson(ctx) {
|
353 | return ctx.options.target !== ctx.options.source;
|
354 | }
|
355 | /**
|
356 | * 微信page|component.json转支付宝微信page|component.json
|
357 | * @param json
|
358 | */
|
359 | function 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 | }
|
374 | exports.formatAsAliappPageJson = formatAsAliappPageJson;
|
375 | /**
|
376 | * 微信app.json转支付宝app.json
|
377 | * @param json
|
378 | */
|
379 | function 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 | }
|
405 | exports.formatAsAliappJson = formatAsAliappJson;
|
406 | function 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 | }
|
424 | exports.formatAsAliappTabBarJson = formatAsAliappTabBarJson;
|
425 | function 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 | }
|
441 | exports.formatAsAliappTabBarItemsJson = formatAsAliappTabBarItemsJson;
|
442 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0NBQWtDO0FBQ2xDLHVCQUF5QjtBQUN6QixxREFBMkM7QUFDM0MsaURBQXVDO0FBQ3ZDLG1EQUF5QztBQUN6QyxtREFBeUM7QUFFekMsc0NBQXVEO0FBRXZELDhDQUFzRDtBQUN0RCwyQkFBNkI7QUFtRjdCLElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUU3QixrQkFBZSxhQUFPLENBQUMsVUFBQyxRQUFRLEVBQUUsWUFBZ0M7SUFBaEMsNkJBQUEsRUFBQSxpQkFBZ0M7SUFDaEUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFOUIsMEJBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUIseUJBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekIseUJBQVUsQ0FBQyxRQUFRLEVBQUU7UUFDbkIsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxPQUFPO0tBQ2hCLENBQUMsQ0FBQztJQUVILHdCQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2xCLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUNyQixNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsbUJBQW1CLENBQUMsUUFBbUI7SUFDOUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNoRCxRQUFRLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFlLGVBQWUsQ0FBQyxFQVE5QjtRQVBDLDRCQUFXLEVBQ1gsc0JBQVEsRUFDUixZQUFHOzs7Ozs7O29CQU1ILElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzFCLFFB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 |
\ | No newline at end of file |