1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var tslib_1 = require("tslib");
|
4 | var DEFAULT_PACKAGES_TO_PROCESS = {
|
5 | '@shopify/async': ['createResolver'],
|
6 | '@shopify/react-async': ['createAsyncContext', 'createAsyncComponent'],
|
7 | '@shopify/react-graphql': ['createAsyncQueryComponent'],
|
8 | };
|
9 | function asyncBabelPlugin(_a) {
|
10 | var t = _a.types;
|
11 | return {
|
12 | visitor: {
|
13 | Program: function (_path, state) {
|
14 | state.processPackages = new Map(Object.entries((state.opts && state.opts.packages) || DEFAULT_PACKAGES_TO_PROCESS));
|
15 | },
|
16 | ImportDeclaration: function (path, state) {
|
17 | var e_1, _a;
|
18 | var processPackages = state.processPackages;
|
19 | if (!(processPackages instanceof Map)) {
|
20 | return;
|
21 | }
|
22 | var source = path.node.source.value;
|
23 | var processImports = processPackages.get(source) || [];
|
24 | if (processImports.length === 0) {
|
25 | return;
|
26 | }
|
27 | var importSpecifiersToProcess = path
|
28 | .get('specifiers')
|
29 | .filter(function (specifier) {
|
30 | return (specifier.isImportSpecifier() &&
|
31 | processImports.some(function (name) {
|
32 | return specifier.get('imported').isIdentifier({ name: name });
|
33 | }));
|
34 | });
|
35 | if (importSpecifiersToProcess.length === 0) {
|
36 | return;
|
37 | }
|
38 | try {
|
39 | for (var importSpecifiersToProcess_1 = tslib_1.__values(importSpecifiersToProcess), importSpecifiersToProcess_1_1 = importSpecifiersToProcess_1.next(); !importSpecifiersToProcess_1_1.done; importSpecifiersToProcess_1_1 = importSpecifiersToProcess_1.next()) {
|
40 | var importSpecifier = importSpecifiersToProcess_1_1.value;
|
41 | var bindingName = importSpecifier.node.local.name;
|
42 | var binding = path.scope.getBinding(bindingName);
|
43 | if (binding != null) {
|
44 | addIdOption(binding, t, state.opts);
|
45 | }
|
46 | }
|
47 | }
|
48 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
49 | finally {
|
50 | try {
|
51 | if (importSpecifiersToProcess_1_1 && !importSpecifiersToProcess_1_1.done && (_a = importSpecifiersToProcess_1.return)) _a.call(importSpecifiersToProcess_1);
|
52 | }
|
53 | finally { if (e_1) throw e_1.error; }
|
54 | }
|
55 | },
|
56 | },
|
57 | };
|
58 | }
|
59 | exports.default = asyncBabelPlugin;
|
60 | function addIdOption(binding, t, _a) {
|
61 | var _b = (_a === void 0 ? {} : _a).webpack, webpack = _b === void 0 ? true : _b;
|
62 | binding.referencePaths.forEach(function (refPath) {
|
63 | var callExpression = refPath.parentPath;
|
64 | if (!callExpression.isCallExpression()) {
|
65 | return;
|
66 | }
|
67 | var args = callExpression.get('arguments');
|
68 | if (args.length === 0) {
|
69 | return;
|
70 | }
|
71 | var options = args[0];
|
72 | if (!options.isObjectExpression()) {
|
73 | return;
|
74 | }
|
75 | var properties = options.get('properties');
|
76 | var propertiesMap = {};
|
77 | properties.forEach(function (property) {
|
78 | if (!property.isObjectMember() || property.node.computed) {
|
79 | return;
|
80 | }
|
81 | var key = property.get('key');
|
82 | if (!key.isIdentifier()) {
|
83 | return;
|
84 | }
|
85 | propertiesMap[key.node.name] = property;
|
86 | });
|
87 | var id = propertiesMap.id, loadProperty = propertiesMap.load;
|
88 | if (id != null || loadProperty == null) {
|
89 | return;
|
90 | }
|
91 | var loaderMethod = loadProperty.isObjectProperty()
|
92 | ? loadProperty.get('value')
|
93 | : loadProperty.get('body');
|
94 | var dynamicImports = [];
|
95 | if (!Array.isArray(loaderMethod)) {
|
96 | loaderMethod.traverse({
|
97 | Import: function (_a) {
|
98 | var parentPath = _a.parentPath;
|
99 | if (parentPath.isCallExpression()) {
|
100 | dynamicImports.push(parentPath);
|
101 | }
|
102 | },
|
103 | });
|
104 | }
|
105 | if (!dynamicImports.length) {
|
106 | return;
|
107 | }
|
108 | if (webpack) {
|
109 | loadProperty.insertAfter(t.objectProperty(t.identifier('id'), t.arrowFunctionExpression([], t.callExpression(t.memberExpression(t.identifier('require'), t.identifier('resolveWeak')), [dynamicImports[0].get('arguments')[0].node]))));
|
110 | }
|
111 | else {
|
112 | propertiesMap.load.insertAfter(t.objectProperty(t.identifier('id'), t.arrowFunctionExpression([], t.callExpression(t.memberExpression(t.identifier('require'), t.identifier('resolve')), [dynamicImports[0].get('arguments')[0].node]))));
|
113 | }
|
114 | });
|
115 | }
|