@quenk/wml 2.11.4 → 2.12.0
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/lib/cli.js +24 -29
- package/lib/cli.js.map +1 -1
- package/lib/cli.ts +20 -13
- package/lib/compile/codegen.d.ts +1 -9
- package/lib/compile/codegen.js +547 -646
- package/lib/compile/codegen.js.map +1 -1
- package/lib/compile/codegen.ts +26 -22
- package/lib/compile/index.js +6 -11
- package/lib/compile/index.js.map +1 -1
- package/lib/compile/transform.js +14 -23
- package/lib/compile/transform.js.map +1 -1
- package/lib/dom.js +118 -167
- package/lib/dom.js.map +1 -1
- package/lib/index.js +7 -10
- package/lib/index.js.map +1 -1
- package/lib/main.js +31 -56
- package/lib/main.js.map +1 -1
- package/lib/parse/ast.d.ts +3 -3
- package/lib/parse/ast.js +166 -220
- package/lib/parse/ast.js.map +1 -1
- package/lib/parse/ast.ts +2 -2
- package/lib/parse/generated.js +1649 -1685
- package/lib/parse/index.js +7 -10
- package/lib/parse/index.js.map +1 -1
- package/lib/parse/test.js +277 -54
- package/lib/parse/test.js.map +1 -1
- package/lib/parse/test.ts +10 -1
- package/lib/parse/wml.y +30 -39
- package/lib/tsconfig.json +1 -1
- package/package.json +1 -2
package/lib/parse/index.js
CHANGED
|
@@ -2,18 +2,15 @@
|
|
|
2
2
|
/// <reference path='generated.d.ts' />
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.parse = void 0;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
const parser = require("./generated");
|
|
6
|
+
const nodes = require("./ast");
|
|
7
|
+
const error_1 = require("@quenk/noni/lib/control/error");
|
|
8
8
|
/**
|
|
9
9
|
* parse a string containing WML returning the resulting AST.
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return
|
|
14
|
-
|
|
15
|
-
return parser.parser.parse(str);
|
|
16
|
-
});
|
|
17
|
-
};
|
|
11
|
+
const parse = (str, ast = nodes) => (0, error_1.attempt)(() => {
|
|
12
|
+
parser.parser.yy = { ast };
|
|
13
|
+
return parser.parser.parse(str);
|
|
14
|
+
});
|
|
18
15
|
exports.parse = parse;
|
|
19
16
|
//# sourceMappingURL=index.js.map
|
package/lib/parse/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA,uCAAuC;;;AAEvC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA,uCAAuC;;;AAEvC,sCAAsC;AACtC,+BAA+B;AAE/B,yDAAgE;AAEhE;;GAEG;AACI,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,MAAW,KAAK,EAAwB,EAAE,CACzE,IAAA,eAAO,EAAC,GAAG,EAAE;IAET,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAE3B,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEpC,CAAC,CAAC,CAAC;AAPM,QAAA,KAAK,SAOX"}
|
package/lib/parse/test.js
CHANGED
|
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.tests = void 0;
|
|
4
4
|
exports.tests = {
|
|
5
5
|
'should parse qualified import': {
|
|
6
|
-
input:
|
|
6
|
+
input: `{% import * as lib from "path/to/libs" %}`
|
|
7
7
|
},
|
|
8
8
|
'should parse named import': {
|
|
9
|
-
input:
|
|
9
|
+
input: `{% import (B) from "path/to/a/b" %}`
|
|
10
10
|
},
|
|
11
11
|
'should detect exact duplicate imports': {
|
|
12
|
-
input:
|
|
12
|
+
input: `{% import (A) from "b" %} {% import (A) from "b" %}`
|
|
13
13
|
},
|
|
14
14
|
'should parse a self closing tag': {
|
|
15
15
|
input: '<simple/>'
|
|
@@ -71,7 +71,13 @@ exports.tests = {
|
|
|
71
71
|
'</root>'
|
|
72
72
|
},
|
|
73
73
|
'should parse for from statements': {
|
|
74
|
-
input:
|
|
74
|
+
input: `
|
|
75
|
+
<root>
|
|
76
|
+
{% for value=1 to 30 %}
|
|
77
|
+
<b>{{value}}</b>
|
|
78
|
+
{% endfor %}
|
|
79
|
+
</root>
|
|
80
|
+
`
|
|
75
81
|
},
|
|
76
82
|
'should parse if then expressions': {
|
|
77
83
|
input: '<Html id={{@id}}>{{ if @check() then a else b }}</Html>'
|
|
@@ -95,7 +101,16 @@ exports.tests = {
|
|
|
95
101
|
input: '<Tag>{% if value %}<text>Text</text>{% else %}<text>else</text>{% endif %}</Tag>'
|
|
96
102
|
},
|
|
97
103
|
'should parse if else if statements': {
|
|
98
|
-
input:
|
|
104
|
+
input: `
|
|
105
|
+
<Tag>
|
|
106
|
+
{% if value %}
|
|
107
|
+
<text>Text</text>
|
|
108
|
+
{% else if value %}
|
|
109
|
+
<text>else</text>
|
|
110
|
+
{% else %}
|
|
111
|
+
no
|
|
112
|
+
{% endif %}
|
|
113
|
+
</Tag>`
|
|
99
114
|
},
|
|
100
115
|
'should parse short fun statements': {
|
|
101
116
|
input: '{% fun vue () = <View/> %}'
|
|
@@ -146,7 +161,11 @@ exports.tests = {
|
|
|
146
161
|
'[view] should parse typed views with type parameters': {
|
|
147
162
|
input: '{% view Main [A,B] (Context[A,B]) %} <p>{{@values}}</p>'
|
|
148
163
|
},
|
|
149
|
-
'[view] should allow the where syntax':
|
|
164
|
+
'[view] should allow the where syntax': `
|
|
165
|
+
|
|
166
|
+
{% view HeadView where title: String %}
|
|
167
|
+
<title>{{@title}}</title>
|
|
168
|
+
`,
|
|
150
169
|
'should parse context variables': {
|
|
151
170
|
input: '<Input name={{@level.name}}/>'
|
|
152
171
|
},
|
|
@@ -154,7 +173,10 @@ exports.tests = {
|
|
|
154
173
|
input: '{% view MyView (Context from "./") %} <div>{{@text}}</div>'
|
|
155
174
|
},
|
|
156
175
|
'[view] should allow multiple inline context imports': {
|
|
157
|
-
input:
|
|
176
|
+
input: `
|
|
177
|
+
{% view MyView (Context from "./") %} <div>{{@text}}</div>
|
|
178
|
+
{% view YourView (Context from "./") %} <div/>
|
|
179
|
+
`
|
|
158
180
|
},
|
|
159
181
|
'should allow construct expression': {
|
|
160
182
|
input: '<TextView android:thing={value=1}>{{Person(@value)}}</TextView>'
|
|
@@ -175,10 +197,78 @@ exports.tests = {
|
|
|
175
197
|
input: '<div>{{ <@action()> }}</div>'
|
|
176
198
|
},
|
|
177
199
|
'should allow view statements after short fun': {
|
|
178
|
-
input:
|
|
200
|
+
input: `
|
|
201
|
+
|
|
202
|
+
{% fun template [A] (d: Date[A], o:A, _:String, __:A[]) = {{String(o)}} %}
|
|
203
|
+
|
|
204
|
+
{% view Results [A](Date[A]) %}
|
|
205
|
+
|
|
206
|
+
<ul>
|
|
207
|
+
|
|
208
|
+
{% for option,index in [1,3,4] %}
|
|
209
|
+
|
|
210
|
+
<li>{{option}}and{{index}}</li>
|
|
211
|
+
|
|
212
|
+
{% else %}
|
|
213
|
+
|
|
214
|
+
<p>De nada!</p>
|
|
215
|
+
|
|
216
|
+
{% endfor %}
|
|
217
|
+
|
|
218
|
+
</ul>`
|
|
179
219
|
},
|
|
180
220
|
'should allow actual code': {
|
|
181
|
-
input:
|
|
221
|
+
input: `
|
|
222
|
+
{% import (Table) from "@quenk/wml-widgets/lib/data/table" %}
|
|
223
|
+
{% import (TextField) from "@quenk/wml-widgets/lib/control/text-field" %}
|
|
224
|
+
{% import (Panel) from "@quenk/wml-widgets/lib/layout/panel" %}
|
|
225
|
+
{% import (PanelHeader) from "@quenk/wml-widgets/lib/layout/panel" %}
|
|
226
|
+
{% import (Tab) from "@quenk/wml-widgets/lib/control/tab-bar" %}
|
|
227
|
+
{% import (TabBar) from "@quenk/wml-widgets/lib/control/tab-bar" %}
|
|
228
|
+
{% import (TabSpec) from ".." %}
|
|
229
|
+
{% import (TabbedPanel) from ".." %}
|
|
230
|
+
|
|
231
|
+
{% view Main (TabbedPanel) %}
|
|
232
|
+
|
|
233
|
+
<Panel ww:class={{@values.root.class}}>
|
|
234
|
+
|
|
235
|
+
{% if (@values.header.tabs.length > 0) || (@values.header.additionalTabs) %}
|
|
236
|
+
|
|
237
|
+
<PanelHeader>
|
|
238
|
+
|
|
239
|
+
<TabBar>
|
|
240
|
+
|
|
241
|
+
{% for tab in @values.header.tabs %}
|
|
242
|
+
|
|
243
|
+
<Tab
|
|
244
|
+
ww:name={{tab.name}}
|
|
245
|
+
ww:onClick={{tab.onClick}} />
|
|
246
|
+
|
|
247
|
+
{% endfor %}
|
|
248
|
+
|
|
249
|
+
{% if @values.header.additionalTabs %}
|
|
250
|
+
|
|
251
|
+
{{<(@values.header.additionalTabs)(@)>}}
|
|
252
|
+
|
|
253
|
+
{% else %}
|
|
254
|
+
|
|
255
|
+
{{''}}
|
|
256
|
+
|
|
257
|
+
{% endif %}
|
|
258
|
+
|
|
259
|
+
</TabBar>
|
|
260
|
+
|
|
261
|
+
</PanelHeader>
|
|
262
|
+
|
|
263
|
+
{% else %}
|
|
264
|
+
|
|
265
|
+
{{''}}
|
|
266
|
+
|
|
267
|
+
{% endif %}
|
|
268
|
+
|
|
269
|
+
{{@children}}
|
|
270
|
+
|
|
271
|
+
</Panel>`
|
|
182
272
|
},
|
|
183
273
|
'should recognize type parameters': {
|
|
184
274
|
input: '{% fun test[A:String] (a:A) %} {{a}} {% endfun %}'
|
|
@@ -194,57 +284,190 @@ exports.tests = {
|
|
|
194
284
|
},
|
|
195
285
|
'[context] should parse constructors': '{% context Test where name: String %}',
|
|
196
286
|
'[context] should parse generic constructors': '{% context Test where table.name: Text[A] %}',
|
|
197
|
-
'[context] should parse record types':
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
'[context] should parse
|
|
207
|
-
'[context] should parse
|
|
208
|
-
'[context] should parse
|
|
209
|
-
'[context] should parse func with
|
|
210
|
-
'[context] should parse func with
|
|
211
|
-
'[context] should parse func with
|
|
212
|
-
'[context] should parse func with
|
|
213
|
-
'[context] should parse func with record arg':
|
|
214
|
-
'[context] should parse func with
|
|
215
|
-
'[context] should parse func with
|
|
216
|
-
'[context] should parse func with
|
|
217
|
-
'[context] should parse func with
|
|
218
|
-
'[context] should parse func with
|
|
219
|
-
'[context] should parse func with
|
|
220
|
-
'[context] should parse func with
|
|
221
|
-
'[context] should parse func with
|
|
222
|
-
'[context] should parse func
|
|
223
|
-
'[context] should parse
|
|
287
|
+
'[context] should parse record types': `{% context Test[A] where
|
|
288
|
+
|
|
289
|
+
table.data.record: {
|
|
290
|
+
|
|
291
|
+
name: String,
|
|
292
|
+
table.name: Text[A],
|
|
293
|
+
table.data.list: A[]
|
|
294
|
+
}
|
|
295
|
+
%}`,
|
|
296
|
+
'[context] should parse list types': `{% context Test[A] where table.data.list: A[] %}`,
|
|
297
|
+
'[context] should parse 2d list types': `{% context Test[A,B] where table.data.list2: A[][] %}`,
|
|
298
|
+
'[context] should parse 3d list types': `{% context Test[A, B, C] where table.data.list3: A[][][] %}`,
|
|
299
|
+
'[context] should parse func with no args or parens': `{% context Test where value: Test -> Number %}`,
|
|
300
|
+
'[context] should parse func with no args': `{% context Test where value: () -> Number %}`,
|
|
301
|
+
'[context] should parse no-parens func with constructor': `{% context Test where value: String -> String %}`,
|
|
302
|
+
'[context] should parse no-parens func with generic constructor': `{% context Test where value: Text[A] -> Text[A] %}`,
|
|
303
|
+
'[context] should parse no-parens func with record arg': `{% context Test where value: {} -> { } %}`,
|
|
304
|
+
'[context] should parse no-parens func with list arg': `{% context Test where value: String[] -> String[] %}`,
|
|
305
|
+
'[context] should parse func with cons arg': `{% context Test where value: (String) -> String %}`,
|
|
306
|
+
'[context] should parse func with 2 cons args': `{% context Test where value: (String, String) -> String %}`,
|
|
307
|
+
'[context] should parse func with 3 cons args': `{% context Test where value: (String, String, String) -> String %}`,
|
|
308
|
+
'[context] should parse func with generic cons arg': `{% context Test[A] where value: (Text[A]) -> Text[A] %}`,
|
|
309
|
+
'[context] should parse func with 2 generic cons args': `{% context Test[A] where value: (Text[A], Text[A]) -> Text[A] %}`,
|
|
310
|
+
'[context] should parse func with 3 generic cons args': `{% context Test[A] where value: (Text[A], Text[A], Text[A]) -> Text[A] %}`,
|
|
311
|
+
'[context] should parse func with record arg': `{% context Test where value: ({ }) -> { } %}`,
|
|
312
|
+
'[context] should parse func with 2 record args': `{% context Test where value: ({ }, { name: String }) -> { } %}`,
|
|
313
|
+
'[context] should parse func with 3 record args': `{% context Test where value: ({ }, { name: String }, { value: A[]}) -> { } %}`,
|
|
314
|
+
'[context] should parse func with list arg': `{% context Test where value: (String[]) -> String[] %}`,
|
|
315
|
+
'[context] should parse func with 2 list args': `{% context Test where value: (String[], String[]) -> String[] %}`,
|
|
316
|
+
'[context] should parse func with 3 list args': `{% context Test where value: (String[], String[], String[]) -> String[] %}`,
|
|
317
|
+
'[context] should parse func with func arg': `{% context Test where value: (String -> String) -> String %}`,
|
|
318
|
+
'[context] should parse func with 2 func args': `{% context Test where value: ((String -> String), (String -> String)) -> String %}`,
|
|
319
|
+
'[context] should parse func with 3 func args': `{% context Test where
|
|
320
|
+
value: ((String -> String), (String -> String), (String -> String)) -> String
|
|
321
|
+
%}`,
|
|
322
|
+
'[context] should parse func that return array of generic type': `{% context Test[A] where value: Number -> Text[A][] %}`,
|
|
323
|
+
'[context] should parse funct that return array of array': `{% context Test where value: String -> Number[][] %}`,
|
|
224
324
|
'[context] should parse context definitions': {
|
|
225
|
-
input:
|
|
325
|
+
input: `{% context Manager[A] where
|
|
326
|
+
|
|
327
|
+
name: String,
|
|
328
|
+
|
|
329
|
+
table.name: Text[A],
|
|
330
|
+
|
|
331
|
+
table.data.record: { name: String, table.name: Text[A], table.data.list: A[] },
|
|
332
|
+
|
|
333
|
+
table.data.list: A[],
|
|
334
|
+
|
|
335
|
+
table.data.list2: A[][],
|
|
336
|
+
|
|
337
|
+
table.data.list3: A[][][],
|
|
338
|
+
|
|
339
|
+
noArgsFunc1: -> Number,
|
|
340
|
+
|
|
341
|
+
noArgsFunc0: () -> Number,
|
|
342
|
+
|
|
343
|
+
noParensConsArgFunc: String -> String,
|
|
344
|
+
|
|
345
|
+
noParensConsGenericArgFunc: Text[A] -> Text[A],
|
|
346
|
+
|
|
347
|
+
noParensRecordArgFunc: { } -> { },
|
|
348
|
+
|
|
349
|
+
noParensListArgFunc: String[] -> String[],
|
|
350
|
+
|
|
351
|
+
parensConsArgFunc: (String) -> String,
|
|
352
|
+
|
|
353
|
+
parensConsArg2Func: (String, String) -> String,
|
|
354
|
+
|
|
355
|
+
parensConsArg3Func: (String, String, String) -> String,
|
|
356
|
+
|
|
357
|
+
parensConsGenericArgFunc: (Text[A]) -> Text[A],
|
|
358
|
+
|
|
359
|
+
parensConsGenericArg2Func: (Text[A], Text[A]) -> Text[A],
|
|
360
|
+
|
|
361
|
+
parensConsGenericArg3Func: (Text[A], Text[A], Text[A]) -> Text[A],
|
|
362
|
+
|
|
363
|
+
parensRecordArgFunc: ({ }) -> { },
|
|
364
|
+
|
|
365
|
+
parensRecordArg2Func: ({ }, { name: String }) -> { },
|
|
366
|
+
|
|
367
|
+
parensRecordArgFunc: ({ }, { name: String }, { value: A[]}) -> { },
|
|
368
|
+
|
|
369
|
+
parensListArgFunc: (String[]) -> String[],
|
|
370
|
+
|
|
371
|
+
parensListArg2Func: (String[], String[]) -> String[],
|
|
372
|
+
|
|
373
|
+
parensListArg3Func: (String[], String[], String[]) -> String[],
|
|
374
|
+
|
|
375
|
+
funcArgFunc1: (String -> String) -> String,
|
|
376
|
+
|
|
377
|
+
funcArgFunc2: (String -> String -> String) -> String,
|
|
378
|
+
|
|
379
|
+
funcArg2Func: ((String -> String), (String -> String)) -> String,
|
|
380
|
+
|
|
381
|
+
funcArg3Func: ((String -> String), (String -> String), (String -> String)) -> String,
|
|
382
|
+
|
|
383
|
+
funcRetGenArray: Number -> Text[A][],
|
|
384
|
+
|
|
385
|
+
funcRetMultiArray: String -> Number[][]
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
%} `
|
|
226
389
|
},
|
|
227
390
|
'[context] should allow optional properties': {
|
|
228
|
-
input:
|
|
391
|
+
input: `{% context AContract where
|
|
392
|
+
|
|
393
|
+
id?: Number,
|
|
394
|
+
|
|
395
|
+
name.first: String,
|
|
396
|
+
|
|
397
|
+
name.middle?: String,
|
|
398
|
+
|
|
399
|
+
name.last?: String
|
|
400
|
+
|
|
401
|
+
%}`
|
|
229
402
|
},
|
|
230
403
|
'[context] should allow extending': {
|
|
231
|
-
input:
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
404
|
+
input: `{% context AContract where :BContract %}
|
|
405
|
+
{% context CContract where :AContract, :BContract %}
|
|
406
|
+
{% context DContract[Type] where :CContract, member: Type %}
|
|
407
|
+
{% context EContract[A,B,C,D] where
|
|
408
|
+
:BContract,
|
|
409
|
+
:CContract,
|
|
410
|
+
:DContract[D],
|
|
411
|
+
member0: A,
|
|
412
|
+
member1: B,
|
|
413
|
+
member2: C
|
|
414
|
+
%}
|
|
415
|
+
{% context DContract where :AContract, member: DType %}`
|
|
416
|
+
},
|
|
417
|
+
'[context] should mark nested properties as optional if all are': `{% context Paper where object."type"?: String %}`,
|
|
418
|
+
'should parse type statements': `{% type Type = String | Number | Boolean | Type[] | Type -> Type %}`,
|
|
419
|
+
'should parse tupe types': `{% type Tuple = [Number, String, Number] %}`,
|
|
236
420
|
'should parse type assertion': '<Panel onClick={{ \e -> [*User]foo(e) }} />',
|
|
237
421
|
'should parse partial application in expression': '<Link ww:text={{truncate(50)(@text)}} />',
|
|
238
|
-
'should transform special primitives':
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
422
|
+
'should transform special primitives': `<div>
|
|
423
|
+
{% for kind in [
|
|
424
|
+
String,
|
|
425
|
+
Boolean,
|
|
426
|
+
Number,
|
|
427
|
+
Object,
|
|
428
|
+
Undefined,
|
|
429
|
+
Null,
|
|
430
|
+
Void,
|
|
431
|
+
Never,
|
|
432
|
+
Any] %}
|
|
433
|
+
{{ kind | text }}
|
|
434
|
+
{% endfor %}
|
|
435
|
+
</div>`,
|
|
436
|
+
'should allow casting': `
|
|
437
|
+
{% view Test (Object) %}
|
|
438
|
+
<Widget
|
|
439
|
+
val1={{String(@value)}}
|
|
440
|
+
val2={{Number(@value)}}
|
|
441
|
+
val3={{Boolean(@value)}} />
|
|
442
|
+
`,
|
|
443
|
+
'should parse null query operator': `<div>{% if value ?? %}<b>True</b>{% else %}<b>False</b>{% endif %}</div>`,
|
|
444
|
+
'[let] should parse let statements': `{% let head:HeadCtx = {title = "Foo"} %}
|
|
445
|
+
{% let head2:HeadCtx = {title = "My Title"} %}
|
|
446
|
+
`,
|
|
447
|
+
'[let] should be usable in a view': `
|
|
448
|
+
{% view MyView(Object) %}
|
|
449
|
+
{% let head:HeadViewContext = {title = "My Title"} %}
|
|
450
|
+
<h1>{{<HeadView(head)>}}</h1>
|
|
451
|
+
`,
|
|
452
|
+
'[comment] should parse html comments': `<!-- This is an html comment. -->`,
|
|
453
|
+
'[comment] should parse wml comments': `{# This is a wml comment #}`,
|
|
454
|
+
'[comment] should parse wml comments in statements': `{% view Name {# This is a comment! #} (Object) %} <div/> %}`,
|
|
455
|
+
'[fun] should parse multi dimensional array parameters': `
|
|
456
|
+
{% fun test (value:List[][]) %}<p/>{% endfun %}`,
|
|
457
|
+
'should allow index access on context properties': `{% view Test (Object) %}
|
|
458
|
+
<div>
|
|
459
|
+
{% if @["type"]?? %}
|
|
460
|
+
<div/>
|
|
461
|
+
{% endif %}
|
|
462
|
+
</div>`,
|
|
463
|
+
'should allow paths to use brackets': `
|
|
464
|
+
{% view Test (Object) %}
|
|
465
|
+
<div>
|
|
466
|
+
{% if @values.controls["@type"] %} value {% endif %}
|
|
467
|
+
{% if @values.controls["@type"].value %} value {% endif %}
|
|
468
|
+
</div>`,
|
|
469
|
+
'should allow 2nd level bracket access': `<div>{% for item in our."items" %} <div/>{% endfor %}</div> `,
|
|
470
|
+
'should allow type to be used in if statement expression': `<div>{% if item."type" == 1 %}<p/>{% endif %}</div>`,
|
|
471
|
+
'should support the special wml:attrs attribute': `<Panel wml:attrs={{@panelAttrs}}><div wml:attrs={{divAttrs}}/></Panel>`
|
|
249
472
|
};
|
|
250
473
|
//# sourceMappingURL=test.js.map
|
package/lib/parse/test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":";;;AAAa,QAAA,KAAK,GAA2B;IAEzC,+BAA+B,EAAE;QAC7B,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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"}
|
package/lib/parse/test.ts
CHANGED
|
@@ -648,6 +648,15 @@ export const tests: { [key: string]: any } = {
|
|
|
648
648
|
<div>
|
|
649
649
|
{% if @values.controls["@type"] %} value {% endif %}
|
|
650
650
|
{% if @values.controls["@type"].value %} value {% endif %}
|
|
651
|
-
</div
|
|
651
|
+
</div>`,
|
|
652
|
+
|
|
653
|
+
'should allow 2nd level bracket access':
|
|
654
|
+
`<div>{% for item in our."items" %} <div/>{% endfor %}</div> `,
|
|
655
|
+
|
|
656
|
+
'should allow type to be used in if statement expression':
|
|
657
|
+
`<div>{% if item."type" == 1 %}<p/>{% endif %}</div>`,
|
|
658
|
+
|
|
659
|
+
'should support the special wml:attrs attribute':
|
|
660
|
+
`<Panel wml:attrs={{@panelAttrs}}><div wml:attrs={{divAttrs}}/></Panel>`
|
|
652
661
|
|
|
653
662
|
}
|
package/lib/parse/wml.y
CHANGED
|
@@ -468,10 +468,10 @@ non_function_type
|
|
|
468
468
|
;
|
|
469
469
|
|
|
470
470
|
constructor_type
|
|
471
|
-
:
|
|
471
|
+
: unqualified_constructor
|
|
472
472
|
{ $$ = new yy.ast.ConstructorType($1, [], @$); }
|
|
473
473
|
|
|
474
|
-
|
|
|
474
|
+
| unqualified_constructor type_parameters
|
|
475
475
|
{ $$ = new yy.ast.ConstructorType($1, $2, @$); }
|
|
476
476
|
;
|
|
477
477
|
|
|
@@ -485,11 +485,11 @@ record_type
|
|
|
485
485
|
;
|
|
486
486
|
|
|
487
487
|
list_type
|
|
488
|
-
:
|
|
488
|
+
: unqualified_constructor '[' ']'
|
|
489
489
|
{ $$ = new yy.ast.ListType(
|
|
490
490
|
new yy.ast.ConstructorType($1, []), @$); }
|
|
491
491
|
|
|
492
|
-
|
|
|
492
|
+
| unqualified_constructor type_parameters '[' ']'
|
|
493
493
|
{ $$ = new yy.ast.ListType(
|
|
494
494
|
new yy.ast.ConstructorType($1, $2), @$); }
|
|
495
495
|
|
|
@@ -837,8 +837,8 @@ simple_expression
|
|
|
837
837
|
|member_expression
|
|
838
838
|
|literal
|
|
839
839
|
|context_property
|
|
840
|
-
|
|
|
841
|
-
|
|
|
840
|
+
|unqualified_constructor
|
|
841
|
+
|unqualified_identifier
|
|
842
842
|
|context_variable)
|
|
843
843
|
{ $$ = $1; }
|
|
844
844
|
;
|
|
@@ -865,24 +865,24 @@ type_arg_list
|
|
|
865
865
|
;
|
|
866
866
|
|
|
867
867
|
construct_expression
|
|
868
|
-
:
|
|
868
|
+
: unqualified_constructor '(' arguments ')'
|
|
869
869
|
{ $$ = new yy.ast.ConstructExpression($1, $3, @$); }
|
|
870
870
|
|
|
871
|
-
|
|
|
871
|
+
| unqualified_constructor '(' ')'
|
|
872
872
|
{ $$ = new yy.ast.ConstructExpression($1, [], @$); }
|
|
873
873
|
;
|
|
874
874
|
|
|
875
875
|
call_expression
|
|
876
|
-
:
|
|
876
|
+
: unqualified_identifier type_arguments '(' arguments ')'
|
|
877
877
|
{$$ = new yy.ast.CallExpression($1, $2, $4, @$); }
|
|
878
878
|
|
|
879
|
-
|
|
|
879
|
+
| unqualified_identifier type_arguments '(' ')'
|
|
880
880
|
{$$ = new yy.ast.CallExpression($1, $2, [], @$); }
|
|
881
881
|
|
|
882
|
-
|
|
|
882
|
+
| unqualified_identifier '(' arguments ')'
|
|
883
883
|
{$$ = new yy.ast.CallExpression($1, [], $3, @$); }
|
|
884
884
|
|
|
885
|
-
|
|
|
885
|
+
| unqualified_identifier '(' ')'
|
|
886
886
|
{$$ = new yy.ast.CallExpression($1, [], [], @$); }
|
|
887
887
|
|
|
888
888
|
| context_property type_arguments '(' arguments ')'
|
|
@@ -929,43 +929,34 @@ call_expression
|
|
|
929
929
|
;
|
|
930
930
|
|
|
931
931
|
member_expression
|
|
932
|
-
|
|
933
|
-
: qualified_identifier '.' unqualified_identifier
|
|
934
|
-
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
935
|
-
|
|
936
|
-
| qualified_constructor '.' unqualified_identifier
|
|
937
|
-
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
938
|
-
|
|
939
|
-
| context_variable '.' unqualified_identifier
|
|
940
|
-
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
941
|
-
|
|
942
|
-
| context_property '.' unqualified_identifier
|
|
943
|
-
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
944
|
-
|
|
945
|
-
| list '.' unqualified_identifier
|
|
932
|
+
: member_expression_head '.' member_expression_tail
|
|
946
933
|
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
947
934
|
|
|
948
|
-
|
|
|
935
|
+
| member_expression '.' member_expression_tail
|
|
949
936
|
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
950
937
|
|
|
951
|
-
| string_literal '
|
|
952
|
-
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
953
|
-
|
|
954
|
-
| call_expression '.' unqualified_identifier
|
|
938
|
+
| member_expression '[' string_literal ']'
|
|
955
939
|
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
940
|
+
;
|
|
956
941
|
|
|
957
|
-
|
|
958
|
-
|
|
942
|
+
member_expression_head:
|
|
943
|
+
( unqualified_identifier
|
|
944
|
+
| unqualified_constructor
|
|
945
|
+
| context_variable
|
|
946
|
+
| context_property
|
|
947
|
+
| list
|
|
948
|
+
| record
|
|
949
|
+
| string_literal
|
|
950
|
+
| call_expression
|
|
951
|
+
|'(' expression ')'
|
|
952
|
+
)
|
|
953
|
+
;
|
|
959
954
|
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
| member_expression '[' string_literal ']'
|
|
964
|
-
{$$ = new yy.ast.MemberExpression($1, $3, @$); }
|
|
955
|
+
member_expression_tail
|
|
956
|
+
: (unqualified_identifier| unqualified_constructor|string_literal)
|
|
965
957
|
;
|
|
966
958
|
|
|
967
959
|
function_expression
|
|
968
|
-
|
|
969
960
|
: parameters '->' expression
|
|
970
961
|
{$$ = new yy.ast.FunctionExpression($1, $3, @$); }
|
|
971
962
|
|
package/lib/tsconfig.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenk/wml",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.12.0",
|
|
4
4
|
"description": "(WML) is a DSL for describing user interfaces in web applications.",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
"jison-gho": "^0.6.1-216",
|
|
24
24
|
"mocha": "^9.0.0",
|
|
25
25
|
"ts-node": "^10.5.0",
|
|
26
|
-
"typedoc": "^0.20.36",
|
|
27
26
|
"typescript": "^4.3.2"
|
|
28
27
|
},
|
|
29
28
|
"dependencies": {
|