babel-plugin-wallace 0.0.2 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/ast-helpers.d.ts +10 -0
  3. package/dist/ast-helpers.js +52 -0
  4. package/dist/ast-helpers.js.map +1 -0
  5. package/dist/babel-types.d.ts +4 -0
  6. package/dist/babel-types.js +3 -0
  7. package/dist/babel-types.js.map +1 -0
  8. package/dist/builders/consolidation.d.ts +30 -0
  9. package/dist/builders/consolidation.js +321 -0
  10. package/dist/builders/consolidation.js.map +1 -0
  11. package/dist/builders/define-component.d.ts +7 -0
  12. package/dist/builders/define-component.js +101 -0
  13. package/dist/builders/define-component.js.map +1 -0
  14. package/dist/builders/index.d.ts +2 -0
  15. package/dist/builders/index.js +7 -0
  16. package/dist/builders/index.js.map +1 -0
  17. package/dist/builders/types.d.ts +15 -0
  18. package/dist/builders/types.js +3 -0
  19. package/dist/builders/types.js.map +1 -0
  20. package/dist/builders/visibility.d.ts +5 -0
  21. package/dist/builders/visibility.js +43 -0
  22. package/dist/builders/visibility.js.map +1 -0
  23. package/dist/config.d.ts +14 -0
  24. package/dist/config.js +47 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/constants.d.ts +31 -0
  27. package/dist/constants.js +40 -0
  28. package/dist/constants.js.map +1 -0
  29. package/dist/contexts/handlers.d.ts +18 -0
  30. package/dist/contexts/handlers.js +152 -0
  31. package/dist/contexts/handlers.js.map +1 -0
  32. package/dist/contexts/index.d.ts +2 -0
  33. package/dist/contexts/index.js +6 -0
  34. package/dist/contexts/index.js.map +1 -0
  35. package/dist/contexts/parameters.d.ts +8 -0
  36. package/dist/contexts/parameters.js +114 -0
  37. package/dist/contexts/parameters.js.map +1 -0
  38. package/dist/directives.d.ts +8 -0
  39. package/dist/directives.js +94 -0
  40. package/dist/directives.js.map +1 -0
  41. package/dist/errors.d.ts +32 -0
  42. package/dist/errors.js +45 -0
  43. package/dist/errors.js.map +1 -0
  44. package/dist/helpers.d.ts +4 -0
  45. package/dist/helpers.js +35 -0
  46. package/dist/helpers.js.map +1 -0
  47. package/dist/index.d.ts +10 -0
  48. package/dist/index.js +34 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/models/component.d.ts +25 -0
  51. package/dist/models/component.js +114 -0
  52. package/dist/models/component.js.map +1 -0
  53. package/dist/models/directive.d.ts +13 -0
  54. package/dist/models/directive.js +8 -0
  55. package/dist/models/directive.js.map +1 -0
  56. package/dist/models/index.d.ts +5 -0
  57. package/dist/models/index.js +15 -0
  58. package/dist/models/index.js.map +1 -0
  59. package/dist/models/module.d.ts +12 -0
  60. package/dist/models/module.js +40 -0
  61. package/dist/models/module.js.map +1 -0
  62. package/dist/models/node.d.ts +82 -0
  63. package/dist/models/node.js +306 -0
  64. package/dist/models/node.js.map +1 -0
  65. package/dist/utils.d.ts +12 -0
  66. package/dist/utils.js +59 -0
  67. package/dist/utils.js.map +1 -0
  68. package/dist/visitors/attribute.d.ts +10 -0
  69. package/dist/visitors/attribute.js +82 -0
  70. package/dist/visitors/attribute.js.map +1 -0
  71. package/dist/visitors/jsx.d.ts +13 -0
  72. package/dist/visitors/jsx.js +61 -0
  73. package/dist/visitors/jsx.js.map +1 -0
  74. package/dist/visitors/program.d.ts +12 -0
  75. package/dist/visitors/program.js +26 -0
  76. package/dist/visitors/program.js.map +1 -0
  77. package/package.json +19 -10
  78. package/README.md +0 -3
  79. package/lib/_config/directives.js +0 -356
  80. package/lib/_config/index.js +0 -2
  81. package/lib/_config/loader.js +0 -43
  82. package/lib/_config/parse_directives.js +0 -63
  83. package/lib/config.js +0 -263
  84. package/lib/convert.js +0 -27
  85. package/lib/definitions/constants.js +0 -73
  86. package/lib/definitions/node_data.js +0 -183
  87. package/lib/definitions/watcher.js +0 -26
  88. package/lib/generate/code_generator.js +0 -333
  89. package/lib/generate/statement_builders.js +0 -130
  90. package/lib/help-system/browser-code.js +0 -50
  91. package/lib/help-system/entry.js +0 -92
  92. package/lib/help-system/error-display.js +0 -20
  93. package/lib/help-system/styles.css +0 -25
  94. package/lib/import-checker.js +0 -35
  95. package/lib/index.js +0 -47
  96. package/lib/jsx/component_dom.js +0 -40
  97. package/lib/jsx/contexts.js +0 -121
  98. package/lib/jsx/extract.js +0 -214
  99. package/lib/jsx/parse.js +0 -98
  100. package/lib/parse/component_templates.js +0 -44
  101. package/lib/parse/inline_directives.js +0 -318
  102. package/lib/parse/parse_node.js +0 -73
  103. package/lib/polyfills.js +0 -10
  104. package/lib/utils/babel.js +0 -100
  105. package/lib/utils/dom.js +0 -174
  106. package/lib/utils/misc.js +0 -152
  107. package/lib_old/handlers.js +0 -52
  108. package/lib_old/index.js +0 -145
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var _ExtractedNode_stubName, _ExtractedNode_conditionalDisplay, _ExtractedNode_ref, _ExtractedNode_props, _ExtractedNode_forExpression, _ExtractedNode_forVariable;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PlainTextNode = exports.DynamicTextNode = exports.StubNode = exports.TagNode = exports.ExtractedNode = void 0;
16
+ const utils_1 = require("../utils");
17
+ const errors_1 = require("../errors");
18
+ const constants_1 = require("../constants");
19
+ class ExtractedNode {
20
+ constructor(address, path, parent) {
21
+ this.isRepeatedNode = false;
22
+ this.watches = [];
23
+ this.eventListeners = [];
24
+ this.isNestedClass = false;
25
+ _ExtractedNode_stubName.set(this, void 0);
26
+ _ExtractedNode_conditionalDisplay.set(this, void 0);
27
+ _ExtractedNode_ref.set(this, void 0);
28
+ _ExtractedNode_props.set(this, void 0);
29
+ _ExtractedNode_forExpression.set(this, void 0);
30
+ _ExtractedNode_forVariable.set(this, void 0);
31
+ this.path = path;
32
+ this.address = address;
33
+ this.parent = parent;
34
+ }
35
+ getElement() {
36
+ throw new Error("Not implemented");
37
+ }
38
+ addEventListener(eventName, callback) {
39
+ if (this.isNestedClass) {
40
+ (0, errors_1.error)(this.path, errors_1.ERROR_MESSAGES.NO_ATTRIBUTES_ON_NESTED_CLASS);
41
+ }
42
+ this.eventListeners.push({ eventName, callback });
43
+ }
44
+ watchAttribute(attName, expression) {
45
+ if (this.isNestedClass) {
46
+ (0, errors_1.error)(this.path, errors_1.ERROR_MESSAGES.NO_ATTRIBUTES_ON_NESTED_CLASS);
47
+ }
48
+ this.watches.push({
49
+ expression,
50
+ callback: `${constants_1.WATCH_CALLBACK_PARAMS.element}.setAttribute("${attName}", n)`,
51
+ });
52
+ }
53
+ watchText(expression) {
54
+ this.watches.push({
55
+ expression,
56
+ callback: `${constants_1.WATCH_CALLBACK_PARAMS.element}.textContent = n`,
57
+ });
58
+ }
59
+ setProps(expression) {
60
+ if (this.isRepeatedNode) {
61
+ this.setRepeatExpression(expression);
62
+ }
63
+ else {
64
+ if (__classPrivateFieldGet(this, _ExtractedNode_props, "f")) {
65
+ (0, errors_1.error)(this.path, errors_1.ERROR_MESSAGES.PROPS_ALREADY_DEFINED);
66
+ }
67
+ __classPrivateFieldSet(this, _ExtractedNode_props, expression, "f");
68
+ }
69
+ }
70
+ getProps() {
71
+ return __classPrivateFieldGet(this, _ExtractedNode_props, "f");
72
+ }
73
+ setConditionalDisplay(expression, reverse) {
74
+ if (__classPrivateFieldGet(this, _ExtractedNode_conditionalDisplay, "f")) {
75
+ (0, errors_1.error)(this.path, errors_1.ERROR_MESSAGES.CONDITIONAL_DISPLAY_ALREADY_DEFINED);
76
+ }
77
+ __classPrivateFieldSet(this, _ExtractedNode_conditionalDisplay, { expression, reverse }, "f");
78
+ }
79
+ getShieldInfo() {
80
+ return __classPrivateFieldGet(this, _ExtractedNode_conditionalDisplay, "f");
81
+ }
82
+ setRef(name) {
83
+ if (__classPrivateFieldGet(this, _ExtractedNode_ref, "f")) {
84
+ (0, errors_1.error)(this.path, errors_1.ERROR_MESSAGES.REF_ALREADY_DEFINED);
85
+ }
86
+ __classPrivateFieldSet(this, _ExtractedNode_ref, name, "f");
87
+ }
88
+ getRef() {
89
+ return __classPrivateFieldGet(this, _ExtractedNode_ref, "f");
90
+ }
91
+ // TODO: fix not to use directive.
92
+ setRepeatExpression(expression) {
93
+ if (!this.parent) {
94
+ (0, errors_1.error)(this.path, errors_1.ERROR_MESSAGES.REPEAT_WITHOUT_PARENT);
95
+ }
96
+ // if (this.isRepeatedNode) {
97
+ // error(this.path, ERROR_MESSAGES.REPEAT_ALREADY_DEFINED);
98
+ // }
99
+ // if (!this.isNestedClass) {
100
+ // error(this.path, ERROR_MESSAGES.REPEAT_ONLY_ON_NESTED_CLASS);
101
+ // }
102
+ this.isRepeatedNode = true;
103
+ // While this could potentially be set multiple times, we later check that repeat
104
+ // cannot be used if there siblings.
105
+ this.repeatExpression = expression;
106
+ this.parent.repeatNode = this;
107
+ }
108
+ /**
109
+ * Called on the parent of a repeat.
110
+ */
111
+ getRepeatInstruction() {
112
+ return this.repeatNode
113
+ ? {
114
+ expression: this.repeatNode.repeatExpression,
115
+ componentCls: this.repeatNode.tagName,
116
+ poolExpression: this.repeatNode.poolExpression,
117
+ }
118
+ : undefined;
119
+ }
120
+ setStub(name) {
121
+ if (__classPrivateFieldGet(this, _ExtractedNode_stubName, "f")) {
122
+ (0, errors_1.error)(this.path, errors_1.ERROR_MESSAGES.STUB_ALREADY_DEFINED);
123
+ }
124
+ __classPrivateFieldSet(this, _ExtractedNode_stubName, name, "f");
125
+ }
126
+ getStub() {
127
+ return __classPrivateFieldGet(this, _ExtractedNode_stubName, "f");
128
+ }
129
+ // setForLoop(expression: Expression, variable: string | undefined) {
130
+ // if (this.#forExpression) {
131
+ // error(this.path, ERROR_MESSAGES.REF_ALREADY_DEFINED);
132
+ // }
133
+ // this.#forVariable = variable;
134
+ // this.#forExpression = expression;
135
+ // }
136
+ // getForLoop():
137
+ // | { expression: Expression; variable: string | undefined }
138
+ // | undefined {
139
+ // if (this.#forExpression) {
140
+ // return { expression: this.#forExpression, variable: this.#forVariable };
141
+ // }
142
+ // }
143
+ setBaseComponent(expression) {
144
+ if (this.component.baseComponent) {
145
+ (0, errors_1.error)(this.path, errors_1.ERROR_MESSAGES.BASE_COMPONENT_ALREADY_DEFINED);
146
+ }
147
+ this.component.baseComponent = expression;
148
+ }
149
+ }
150
+ exports.ExtractedNode = ExtractedNode;
151
+ _ExtractedNode_stubName = new WeakMap(), _ExtractedNode_conditionalDisplay = new WeakMap(), _ExtractedNode_ref = new WeakMap(), _ExtractedNode_props = new WeakMap(), _ExtractedNode_forExpression = new WeakMap(), _ExtractedNode_forVariable = new WeakMap();
152
+ class TagNode extends ExtractedNode {
153
+ // directives: ExtractedDirective[] = [];
154
+ constructor(path, address, parent, component, // TODO: fix type circular import.
155
+ tagName, isNestedClass) {
156
+ super(address, path, parent);
157
+ this.attributes = [];
158
+ this.path = path;
159
+ this.address = address;
160
+ this.component = component;
161
+ this.tagName = tagName;
162
+ this.parent = parent;
163
+ this.isNestedClass = isNestedClass;
164
+ }
165
+ addFixedAttribute(name, value) {
166
+ this.attributes.push({ name, value });
167
+ }
168
+ getElement() {
169
+ if (this.isRepeatedNode) {
170
+ return undefined;
171
+ }
172
+ const element = (0, utils_1.createElement)(this.tagName);
173
+ this.attributes.forEach(({ name, value }) => {
174
+ element.setAttribute(name, value || "");
175
+ });
176
+ this.element = element;
177
+ return this.element;
178
+ }
179
+ }
180
+ exports.TagNode = TagNode;
181
+ class StubNode extends ExtractedNode {
182
+ constructor(path, address, parent, name) {
183
+ super(address, path, parent);
184
+ this.setStub(name);
185
+ }
186
+ getElement() {
187
+ this.element = (0, utils_1.createElement)("div");
188
+ return this.element;
189
+ }
190
+ }
191
+ exports.StubNode = StubNode;
192
+ class DynamicTextNode extends ExtractedNode {
193
+ constructor(path, address, parent, expression) {
194
+ super(address, path, parent);
195
+ this.watchText(expression);
196
+ }
197
+ getElement() {
198
+ this.element = (0, utils_1.createElement)("span");
199
+ return this.element;
200
+ }
201
+ }
202
+ exports.DynamicTextNode = DynamicTextNode;
203
+ class PlainTextNode extends ExtractedNode {
204
+ constructor(path, address, parent) {
205
+ super(address, path, parent);
206
+ }
207
+ getElement() {
208
+ // @ts-ignore
209
+ this.element = (0, utils_1.createTextNode)(this.path.node.value);
210
+ return this.element;
211
+ }
212
+ }
213
+ exports.PlainTextNode = PlainTextNode;
214
+ // class NodeData {
215
+ // constructor(path, module, component, parentNodeData, nodeTreeAddress) {
216
+ // this.path = path;
217
+ // this.module = module;
218
+ // this.component = component;
219
+ // this.parentNodeData = parentNodeData;
220
+ // this.nodeTreeAddress = nodeTreeAddress;
221
+ // this.nestedClass = undefined;
222
+ // this.isRepeat = false;
223
+ // this.props = undefined;
224
+ // this.shieldQuery = undefined;
225
+ // this.reverseShield = 0;
226
+ // this.buildCalls = [];
227
+ // this.watches = [];
228
+ // this.seq = 0;
229
+ // }
230
+ // isDynamic() {
231
+ // return (
232
+ // this.watches.length > 0 ||
233
+ // this.buildCalls.length > 0 ||
234
+ // this.props ||
235
+ // this.nestedClass ||
236
+ // this.shieldQuery
237
+ // );
238
+ // }
239
+ // /**
240
+ // * Creates a watch on this node.
241
+ // *
242
+ // * @param {string} watch - the field or function to watch.
243
+ // * @param {string} converter - the value to pass to method, or free function call if
244
+ // * property is not supplied.
245
+ // * @param {string} property - the method on the wrapper (Can even be dotted
246
+ // * `style.color`).
247
+ // */
248
+ // addWatch(watch, converter, property) {
249
+ // this.watches.push({ watch, converter, property });
250
+ // }
251
+ // /**
252
+ // * Creates an event listener on this node.
253
+ // * Slot will be expanded.
254
+ // *
255
+ // * @param {string} event
256
+ // * @param {string} slot
257
+ // */
258
+ // addEventListener(event, code) {
259
+ // this.module.requireImport(builderCalls.onEvent);
260
+ // const callback = `function(${eventCallbackArgs}) {${code}}`;
261
+ // this.addBuildCall(builderCalls.onEvent, [
262
+ // componentRefInBuild,
263
+ // `'${event.toLowerCase()}'`,
264
+ // callback,
265
+ // ]);
266
+ // }
267
+ // addBuildCall(functionName, args) {
268
+ // this.buildCalls.push([functionName, ...args]);
269
+ // }
270
+ // saveAs(name) {
271
+ // this.module.requireImport(builderCalls.saveAs);
272
+ // this.addBuildCall(builderCalls.saveAs, [
273
+ // componentRefInBuild,
274
+ // literal(name),
275
+ // ]);
276
+ // }
277
+ // requireImport(name, source, alias) {
278
+ // // TODO: make it use alias
279
+ // this.module.requireImport(name, source, alias);
280
+ // }
281
+ // repeat(data, key) {
282
+ // // There is no transform here. Should we allow it?
283
+ // const parent = this.parentNodeData;
284
+ // if (parent === undefined) {
285
+ // // TODO: throw better error, and assert parent has no other children.
286
+ // throw Error("For must be used under a parent.");
287
+ // }
288
+ // let getPoolCall;
289
+ // if (key) {
290
+ // const keyFn = `function(props) {return props.${key}}`;
291
+ // this.requireImport(builderCalls.getKeyedPool);
292
+ // getPoolCall = `${builderCalls.getKeyedPool}(${this.nestedClass}, ${keyFn})`;
293
+ // } else {
294
+ // this.requireImport(builderCalls.getSequentialPool);
295
+ // getPoolCall = `${builderCalls.getSequentialPool}(${this.nestedClass})`;
296
+ // }
297
+ // this.requireImport(builderCalls.initRepeater);
298
+ // parent.addBuildCall(builderCalls.initRepeater, [
299
+ // componentRefInBuild,
300
+ // getPoolCall,
301
+ // ]);
302
+ // parent.addWatch(alwaysUpdate, `w.gkItems(${data})`);
303
+ // this.isRepeat = true;
304
+ // }
305
+ // }
306
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/models/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Statement } from "@babel/types";
2
+ export declare function createElement(tagName: string): HTMLElement;
3
+ export declare function createTextNode(text: string): Text;
4
+ export declare function isCapitalized(s: string): boolean;
5
+ export declare function escapeSingleQuotes(text: string): string;
6
+ export declare function escapeDoubleQuotes(text: string): string;
7
+ /**
8
+ * Strips extraneous whitespace from HTML
9
+ */
10
+ export declare function stripHtml(htmlString: string): string;
11
+ export declare function arrayStartsWith(origin: Array<any>, test: Array<any>): boolean;
12
+ export declare function codeToNode(code: string): Statement[];
package/dist/utils.js ADDED
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createElement = createElement;
4
+ exports.createTextNode = createTextNode;
5
+ exports.isCapitalized = isCapitalized;
6
+ exports.escapeSingleQuotes = escapeSingleQuotes;
7
+ exports.escapeDoubleQuotes = escapeDoubleQuotes;
8
+ exports.stripHtml = stripHtml;
9
+ exports.arrayStartsWith = arrayStartsWith;
10
+ exports.codeToNode = codeToNode;
11
+ const jsdom_1 = require("jsdom");
12
+ const babel = require("@babel/core");
13
+ const document = new jsdom_1.JSDOM("<!DOCTYPE html>").window.document;
14
+ function createElement(tagName) {
15
+ return document.createElement(tagName);
16
+ }
17
+ function createTextNode(text) {
18
+ return document.createTextNode(text);
19
+ }
20
+ const REGEX_CAPITALIZED = new RegExp(/^[A-Z].*/);
21
+ function isCapitalized(s) {
22
+ return REGEX_CAPITALIZED.test(s);
23
+ }
24
+ function escapeSingleQuotes(text) {
25
+ return text.replace(/'/g, "\\'");
26
+ }
27
+ function escapeDoubleQuotes(text) {
28
+ return text.replace(/"/g, '\\"');
29
+ }
30
+ /**
31
+ * Strips extraneous whitespace from HTML
32
+ */
33
+ function stripHtml(htmlString) {
34
+ return htmlString
35
+ .replace(/\n/g, "")
36
+ .replace(/[\t ]+\</g, " <")
37
+ .replace(/\>[\t ]+$/g, "> ")
38
+ .replace(/\>[\t ]+\</g, "><")
39
+ .trim();
40
+ }
41
+ function arrayStartsWith(origin, test) {
42
+ if (test.length <= origin.length) {
43
+ return false;
44
+ }
45
+ for (const [i, v] of origin.entries()) {
46
+ if (test[i] !== v) {
47
+ return false;
48
+ }
49
+ }
50
+ return true;
51
+ }
52
+ function codeToNode(code) {
53
+ const statement = babel.template.ast(code);
54
+ if (statement instanceof Array) {
55
+ return statement;
56
+ }
57
+ return [statement];
58
+ }
59
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AAOA,sCAEC;AAED,wCAEC;AAID,sCAEC;AAED,gDAEC;AAED,gDAEC;AAKD,8BAOC;AAED,0CAUC;AAED,gCAMC;AA3DD,iCAA8B;AAE9B,qCAAqC;AAGrC,MAAM,QAAQ,GAAG,IAAI,aAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;AAE9D,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;AAEjD,SAAgB,aAAa,CAAC,CAAS;IACrC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,UAAkB;IAC1C,OAAO,UAAU;SACd,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1B,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;SAC5B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,eAAe,CAAC,MAAkB,EAAE,IAAgB;IAClE,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,UAAU,CAAC,IAAY;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,SAAS,YAAY,KAAK,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,SAAS,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { NodePath } from "@babel/core";
2
+ import type { JSXAttribute } from "@babel/types";
3
+ import { TagNode } from "../models";
4
+ interface State {
5
+ extractedNode: TagNode;
6
+ }
7
+ export declare const attributeVisitors: {
8
+ JSXAttribute(path: NodePath<JSXAttribute>, { extractedNode }: State): void;
9
+ };
10
+ export {};
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.attributeVisitors = void 0;
4
+ const t = require("@babel/types");
5
+ const config_1 = require("../config");
6
+ const errors_1 = require("../errors");
7
+ const ast_helpers_1 = require("../ast-helpers");
8
+ /**
9
+ * Name could be:
10
+ * foo
11
+ * foo:bar
12
+ *
13
+ */
14
+ function extractName(path) {
15
+ const { name } = path.node;
16
+ let base, qualifier;
17
+ if (t.isJSXNamespacedName(name)) {
18
+ base = name.namespace.name;
19
+ qualifier = name.name.name;
20
+ }
21
+ else {
22
+ base = name.name;
23
+ }
24
+ return { base, qualifier };
25
+ }
26
+ /**
27
+ * Value could be:
28
+ *
29
+ * foo
30
+ * foo="bar"
31
+ * foo={bar}
32
+ */
33
+ function extractValue(path) {
34
+ const { value } = path.node;
35
+ if (t.isStringLiteral(value)) {
36
+ return { type: "string", value: value.value };
37
+ }
38
+ else if (t.isJSXExpressionContainer(value)) {
39
+ const expression = (0, ast_helpers_1.getPlaceholderExpression)(path, value.expression);
40
+ return { type: "expression", expression: expression };
41
+ }
42
+ else if (value === null) {
43
+ return { type: "null" };
44
+ }
45
+ else {
46
+ (0, errors_1.error)(path, errors_1.ERROR_MESSAGES.JSX_ELEMENTS_NOT_ALLOWED_IN_EXPRESSIONS);
47
+ }
48
+ }
49
+ exports.attributeVisitors = {
50
+ JSXAttribute(path, { extractedNode }) {
51
+ if (extractedNode.path.node !== path.parentPath.parentPath.node) {
52
+ // We exit here as otherwise we'd traverse attributes of nested JSXElements too.
53
+ return;
54
+ }
55
+ const { base, qualifier } = extractName(path);
56
+ const extractedValue = extractValue(path);
57
+ const isEventHandler = extractedValue.type === "expression" && base.startsWith("on");
58
+ const directiveClass = isEventHandler
59
+ ? config_1.gleekitConfig.directives["on*"]
60
+ : config_1.gleekitConfig.directives[base];
61
+ if (directiveClass) {
62
+ const handler = new directiveClass();
63
+ handler.apply(extractedNode, extractedValue, qualifier, base);
64
+ }
65
+ else {
66
+ const attName = qualifier ? `${base}:${qualifier}` : base;
67
+ switch (extractedValue.type) {
68
+ case "expression":
69
+ extractedNode.watchAttribute(attName, extractedValue.expression);
70
+ break;
71
+ case "string":
72
+ extractedNode.addFixedAttribute(attName, extractedValue.value);
73
+ break;
74
+ case "null":
75
+ extractedNode.addFixedAttribute(attName);
76
+ break;
77
+ }
78
+ }
79
+ path.remove();
80
+ },
81
+ };
82
+ //# sourceMappingURL=attribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute.js","sourceRoot":"","sources":["../../src/visitors/attribute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { NodePath } from "@babel/core";
2
+ import type { JSXElement, JSXExpressionContainer, JSXText } from "@babel/types";
3
+ import { Component, WalkTracker } from "../models";
4
+ interface State {
5
+ component: Component;
6
+ tracker?: WalkTracker;
7
+ }
8
+ export declare const jsxVisitors: {
9
+ JSXElement(path: NodePath<JSXElement>, { component, tracker }: State): void;
10
+ JSXText(path: NodePath<JSXText>, { component, tracker }: State): void;
11
+ JSXExpressionContainer(path: NodePath<JSXExpressionContainer>, { component, tracker }: State): void;
12
+ };
13
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jsxVisitors = void 0;
4
+ const ast_helpers_1 = require("../ast-helpers");
5
+ const errors_1 = require("../errors");
6
+ const utils_1 = require("../utils");
7
+ // Calls itself recursively, using trackers to identify where we are.
8
+ // Must delete visited nodes to avoid reprocessing them with recursion.
9
+ exports.jsxVisitors = {
10
+ JSXElement(path, { component, tracker = { childIndex: 0, parent: undefined } }) {
11
+ const tagName = (0, ast_helpers_1.getJSXElementName)(path);
12
+ if (typeof tagName === "string") {
13
+ if ((0, utils_1.isCapitalized)(tagName)) {
14
+ (0, errors_1.error)(path, errors_1.ERROR_MESSAGES.INCORRECTLY_NESTED_COMPONENT);
15
+ }
16
+ component.processJSXElement(path, tracker, tagName, exports.jsxVisitors);
17
+ }
18
+ else {
19
+ const { namespace, name } = tagName;
20
+ if (name === "nest" || name === "repeat") {
21
+ const componentCls = namespace;
22
+ if (!(0, utils_1.isCapitalized)(componentCls)) {
23
+ (0, errors_1.error)(path, errors_1.ERROR_MESSAGES.NESTED_COMPONENT_MUST_BE_CAPTIALIZED);
24
+ }
25
+ component.processNestedElement(path, tracker, componentCls, name === "repeat");
26
+ path.traverse(errorIfJSXelementsFoundUnderNested);
27
+ }
28
+ else if (namespace === "stub") {
29
+ // TODO: ensure there is nothing inside and no other attributes.
30
+ component.processStub(path, name, tracker);
31
+ }
32
+ else {
33
+ (0, errors_1.error)(path, errors_1.ERROR_MESSAGES.UNSUPPORTED_NAMESPACE);
34
+ }
35
+ }
36
+ path.remove();
37
+ },
38
+ JSXText(path, { component, tracker }) {
39
+ if (path.node.value.trim() !== "") {
40
+ component.processJSXText(path, tracker);
41
+ }
42
+ path.remove();
43
+ },
44
+ JSXExpressionContainer(path, { component, tracker }) {
45
+ path.traverse(errorIfJSXelementsFoundInExpression);
46
+ // We remove attributes while processing JSXElements, so the only expressions left
47
+ // must be text nodes.
48
+ component.processJSXExpressionInText(path, tracker);
49
+ path.remove();
50
+ },
51
+ };
52
+ function getVisitorThatErrorsIfJSXElementFound(errorMessage) {
53
+ return {
54
+ JSXElement(path) {
55
+ (0, errors_1.error)(path, errorMessage);
56
+ },
57
+ };
58
+ }
59
+ const errorIfJSXelementsFoundInExpression = getVisitorThatErrorsIfJSXElementFound(errors_1.ERROR_MESSAGES.JSX_ELEMENTS_NOT_ALLOWED_IN_EXPRESSIONS);
60
+ const errorIfJSXelementsFoundUnderNested = getVisitorThatErrorsIfJSXElementFound(errors_1.ERROR_MESSAGES.NESTED_COMPONENT_WITH_CHILDREN);
61
+ //# sourceMappingURL=jsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.js","sourceRoot":"","sources":["../../src/visitors/jsx.ts"],"names":[],"mappings":";;;AAGA,gDAAmD;AAEnD,sCAAkD;AAClD,oCAAyC;AAOzC,qEAAqE;AACrE,uEAAuE;AAC1D,QAAA,WAAW,GAAG;IACzB,UAAU,CACR,IAA0B,EAC1B,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAS;QAEpE,MAAM,OAAO,GAAG,IAAA,+BAAiB,EAAC,IAAI,CAAC,CAAC;QACxC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,IAAA,qBAAa,EAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,IAAA,cAAK,EAAC,IAAI,EAAE,uBAAc,CAAC,4BAA4B,CAAC,CAAC;YAC3D,CAAC;YACD,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAW,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YACpC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzC,MAAM,YAAY,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,IAAA,qBAAa,EAAC,YAAY,CAAC,EAAE,CAAC;oBACjC,IAAA,cAAK,EAAC,IAAI,EAAE,uBAAc,CAAC,oCAAoC,CAAC,CAAC;gBACnE,CAAC;gBACD,SAAS,CAAC,oBAAoB,CAC5B,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,IAAI,KAAK,QAAQ,CAClB,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBAChC,gEAAgE;gBAChE,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,IAAA,cAAK,EAAC,IAAI,EAAE,uBAAc,CAAC,qBAAqB,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,IAAuB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAS;QAC5D,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClC,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IACD,sBAAsB,CACpB,IAAsC,EACtC,EAAE,SAAS,EAAE,OAAO,EAAS;QAE7B,IAAI,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC;QACnD,kFAAkF;QAClF,sBAAsB;QACtB,SAAS,CAAC,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;CACF,CAAC;AAEF,SAAS,qCAAqC,CAAC,YAAoB;IACjE,OAAO;QACL,UAAU,CAAC,IAA0B;YACnC,IAAA,cAAK,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,mCAAmC,GACvC,qCAAqC,CACnC,uBAAc,CAAC,uCAAuC,CACvD,CAAC;AAEJ,MAAM,kCAAkC,GACtC,qCAAqC,CACnC,uBAAc,CAAC,8BAA8B,CAC9C,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { NodePath } from "@babel/core";
2
+ import type { Function, JSXElement, ImportSpecifier } from "@babel/types";
3
+ import { Module } from "../models";
4
+ interface State {
5
+ module: Module;
6
+ }
7
+ export declare const programVisitors: {
8
+ ImportSpecifier(path: NodePath<ImportSpecifier>, { module }: State): void;
9
+ Function(path: NodePath<Function>, { module }: State): void;
10
+ JSXElement(path: NodePath<JSXElement>): void;
11
+ };
12
+ export {};
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.programVisitors = void 0;
4
+ const errors_1 = require("../errors");
5
+ const handlers_1 = require("../contexts/handlers");
6
+ // Although we're mainly interested in JSXElements, we visit nodes above where
7
+ // we expect to find those, so that we can get in before other plugins apply
8
+ // their transformations (like ES6 ArrowFunction conversion).
9
+ // Note that those plugins may not be loaded, so we can't depend on their
10
+ // transformations happening.
11
+ exports.programVisitors = {
12
+ ImportSpecifier(path, { module }) {
13
+ module.foundImport(path);
14
+ },
15
+ Function(path, { module }) {
16
+ const contextHandler = (0, handlers_1.identifyContextToBeHandled)(path, module);
17
+ if (contextHandler) {
18
+ contextHandler.applyTransformations();
19
+ }
20
+ },
21
+ // This captures JSX not caught by valid contexts, and therefore not allowed.
22
+ JSXElement(path) {
23
+ (0, errors_1.error)(path, errors_1.ERROR_MESSAGES.FOUND_JSX_IN_INVALID_LOCATION);
24
+ },
25
+ };
26
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/visitors/program.ts"],"names":[],"mappings":";;;AAEA,sCAAkD;AAElD,mDAAkE;AAMlE,8EAA8E;AAC9E,4EAA4E;AAC5E,6DAA6D;AAC7D,yEAAyE;AACzE,6BAA6B;AAEhB,QAAA,eAAe,GAAG;IAC7B,eAAe,CAAC,IAA+B,EAAE,EAAE,MAAM,EAAS;QAChE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,QAAQ,CAAC,IAAwB,EAAE,EAAE,MAAM,EAAS;QAClD,MAAM,cAAc,GAAG,IAAA,qCAA0B,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,oBAAoB,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IACD,6EAA6E;IAC7E,UAAU,CAAC,IAA0B;QACnC,IAAA,cAAK,EAAC,IAAI,EAAE,uBAAc,CAAC,6BAA6B,CAAC,CAAC;IAC5D,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,17 +1,26 @@
1
1
  {
2
2
  "name": "babel-plugin-wallace",
3
- "version": "0.0.2",
4
- "description": "Babel plugin for wallace",
5
- "main": "lib/index.js",
3
+ "version": "0.0.5",
4
+ "author": "Andrew Buchan",
5
+ "description": "The babel plugin for wallace",
6
+ "license": "ISC",
7
+ "main": "dist/index.js",
8
+ "files": [
9
+ "/dist"
10
+ ],
6
11
  "scripts": {
7
- "test": "echo \"No test here, they are all in 'wallace' package.\""
12
+ "test": "echo \"All tests are in packages/wallace.\"",
13
+ "prepack": "shx rm -rf dist/* && tsc"
8
14
  },
9
15
  "dependencies": {
10
- "@babel/plugin-proposal-class-properties": "^7.18.6",
11
- "@babel/preset-env": "^7.22.9",
12
- "jsdom": "^22.1.0"
16
+ "@babel/plugin-syntax-jsx": "^7.22.5",
17
+ "jsdom": "^26.0.0"
13
18
  },
14
- "author": "Andrew Buchan",
15
- "license": "MIT",
16
- "gitHead": "922a989fa10d19dbcd2aaffe725d075a85214a73"
19
+ "devDependencies": {
20
+ "@types/node": "^22.8.1",
21
+ "babylon": "^6.18.0",
22
+ "source-map-support": "^0.5.21",
23
+ "typescript": "^5.6.3"
24
+ },
25
+ "gitHead": "3acf6a601862c29c011f5745322d0c3853561d75"
17
26
  }