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.
- package/LICENSE.md +1 -1
- package/dist/ast-helpers.d.ts +10 -0
- package/dist/ast-helpers.js +52 -0
- package/dist/ast-helpers.js.map +1 -0
- package/dist/babel-types.d.ts +4 -0
- package/dist/babel-types.js +3 -0
- package/dist/babel-types.js.map +1 -0
- package/dist/builders/consolidation.d.ts +30 -0
- package/dist/builders/consolidation.js +321 -0
- package/dist/builders/consolidation.js.map +1 -0
- package/dist/builders/define-component.d.ts +7 -0
- package/dist/builders/define-component.js +101 -0
- package/dist/builders/define-component.js.map +1 -0
- package/dist/builders/index.d.ts +2 -0
- package/dist/builders/index.js +7 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/builders/types.d.ts +15 -0
- package/dist/builders/types.js +3 -0
- package/dist/builders/types.js.map +1 -0
- package/dist/builders/visibility.d.ts +5 -0
- package/dist/builders/visibility.js +43 -0
- package/dist/builders/visibility.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +31 -0
- package/dist/constants.js +40 -0
- package/dist/constants.js.map +1 -0
- package/dist/contexts/handlers.d.ts +18 -0
- package/dist/contexts/handlers.js +152 -0
- package/dist/contexts/handlers.js.map +1 -0
- package/dist/contexts/index.d.ts +2 -0
- package/dist/contexts/index.js +6 -0
- package/dist/contexts/index.js.map +1 -0
- package/dist/contexts/parameters.d.ts +8 -0
- package/dist/contexts/parameters.js +114 -0
- package/dist/contexts/parameters.js.map +1 -0
- package/dist/directives.d.ts +8 -0
- package/dist/directives.js +94 -0
- package/dist/directives.js.map +1 -0
- package/dist/errors.d.ts +32 -0
- package/dist/errors.js +45 -0
- package/dist/errors.js.map +1 -0
- package/dist/helpers.d.ts +4 -0
- package/dist/helpers.js +35 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/models/component.d.ts +25 -0
- package/dist/models/component.js +114 -0
- package/dist/models/component.js.map +1 -0
- package/dist/models/directive.d.ts +13 -0
- package/dist/models/directive.js +8 -0
- package/dist/models/directive.js.map +1 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.js +15 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/module.d.ts +12 -0
- package/dist/models/module.js +40 -0
- package/dist/models/module.js.map +1 -0
- package/dist/models/node.d.ts +82 -0
- package/dist/models/node.js +306 -0
- package/dist/models/node.js.map +1 -0
- package/dist/utils.d.ts +12 -0
- package/dist/utils.js +59 -0
- package/dist/utils.js.map +1 -0
- package/dist/visitors/attribute.d.ts +10 -0
- package/dist/visitors/attribute.js +82 -0
- package/dist/visitors/attribute.js.map +1 -0
- package/dist/visitors/jsx.d.ts +13 -0
- package/dist/visitors/jsx.js +61 -0
- package/dist/visitors/jsx.js.map +1 -0
- package/dist/visitors/program.d.ts +12 -0
- package/dist/visitors/program.js +26 -0
- package/dist/visitors/program.js.map +1 -0
- package/package.json +19 -10
- package/README.md +0 -3
- package/lib/_config/directives.js +0 -356
- package/lib/_config/index.js +0 -2
- package/lib/_config/loader.js +0 -43
- package/lib/_config/parse_directives.js +0 -63
- package/lib/config.js +0 -263
- package/lib/convert.js +0 -27
- package/lib/definitions/constants.js +0 -73
- package/lib/definitions/node_data.js +0 -183
- package/lib/definitions/watcher.js +0 -26
- package/lib/generate/code_generator.js +0 -333
- package/lib/generate/statement_builders.js +0 -130
- package/lib/help-system/browser-code.js +0 -50
- package/lib/help-system/entry.js +0 -92
- package/lib/help-system/error-display.js +0 -20
- package/lib/help-system/styles.css +0 -25
- package/lib/import-checker.js +0 -35
- package/lib/index.js +0 -47
- package/lib/jsx/component_dom.js +0 -40
- package/lib/jsx/contexts.js +0 -121
- package/lib/jsx/extract.js +0 -214
- package/lib/jsx/parse.js +0 -98
- package/lib/parse/component_templates.js +0 -44
- package/lib/parse/inline_directives.js +0 -318
- package/lib/parse/parse_node.js +0 -73
- package/lib/polyfills.js +0 -10
- package/lib/utils/babel.js +0 -100
- package/lib/utils/dom.js +0 -174
- package/lib/utils/misc.js +0 -152
- package/lib_old/handlers.js +0 -52
- 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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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -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.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
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 \"
|
|
12
|
+
"test": "echo \"All tests are in packages/wallace.\"",
|
|
13
|
+
"prepack": "shx rm -rf dist/* && tsc"
|
|
8
14
|
},
|
|
9
15
|
"dependencies": {
|
|
10
|
-
"@babel/plugin-
|
|
11
|
-
"
|
|
12
|
-
"jsdom": "^22.1.0"
|
|
16
|
+
"@babel/plugin-syntax-jsx": "^7.22.5",
|
|
17
|
+
"jsdom": "^26.0.0"
|
|
13
18
|
},
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
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
|
}
|