tutuca 0.9.31 → 0.9.33
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/dist/tutuca-cli.js +184 -48
- package/dist/tutuca-dev.js +231 -49
- package/dist/tutuca-dev.min.js +2 -2
- package/dist/tutuca-extra.js +140 -46
- package/dist/tutuca-extra.min.js +1 -1
- package/dist/tutuca.js +140 -46
- package/dist/tutuca.min.js +1 -1
- package/package.json +1 -1
- package/skill/cli.md +3 -0
- package/skill/core.md +10 -0
package/dist/tutuca-cli.js
CHANGED
|
@@ -734,9 +734,11 @@ class ValParser {
|
|
|
734
734
|
const charCode = s.charCodeAt(0);
|
|
735
735
|
switch (charCode) {
|
|
736
736
|
case 94: {
|
|
737
|
-
const
|
|
737
|
+
const name = s.slice(1);
|
|
738
|
+
const newS = px.frame.macroVars?.[name];
|
|
738
739
|
if (newS !== undefined)
|
|
739
740
|
return this.parse(newS, px);
|
|
741
|
+
px.onParseIssue("bad-value", { role: "macro-var", name, value: s });
|
|
740
742
|
return null;
|
|
741
743
|
}
|
|
742
744
|
case 39:
|
|
@@ -1057,6 +1059,8 @@ class AttrParser {
|
|
|
1057
1059
|
this.attrs ??= [];
|
|
1058
1060
|
this.attrs.push(new Attr(name, val));
|
|
1059
1061
|
this.hasDynamic ||= !(val instanceof ConstVal);
|
|
1062
|
+
} else {
|
|
1063
|
+
this.px.onParseIssue("bad-value", { role: "attr", attr: name, value });
|
|
1060
1064
|
}
|
|
1061
1065
|
}
|
|
1062
1066
|
pushWrapper(name, raw, val) {
|
|
@@ -1072,6 +1076,9 @@ class AttrParser {
|
|
|
1072
1076
|
this.attrs ??= [];
|
|
1073
1077
|
this.attrs.push(this.ifAttr);
|
|
1074
1078
|
this.hasDynamic = true;
|
|
1079
|
+
} else {
|
|
1080
|
+
const info = { role: "if", attr: directiveName.slice(3), value };
|
|
1081
|
+
this.px.onParseIssue("bad-value", info);
|
|
1075
1082
|
}
|
|
1076
1083
|
}
|
|
1077
1084
|
parseThen(s) {
|
|
@@ -1094,36 +1101,44 @@ class AttrParser {
|
|
|
1094
1101
|
this.events.add(eventName, handler, modifiers);
|
|
1095
1102
|
}
|
|
1096
1103
|
}
|
|
1104
|
+
_parseDirectiveValue(directiveName, s, parserFn) {
|
|
1105
|
+
const val = parserFn.call(vp, s, this.px);
|
|
1106
|
+
if (val === null) {
|
|
1107
|
+
const info = { role: "directive", directive: directiveName, value: s };
|
|
1108
|
+
this.px.onParseIssue("bad-value", info);
|
|
1109
|
+
}
|
|
1110
|
+
return val;
|
|
1111
|
+
}
|
|
1097
1112
|
parseDirective(s, directiveName) {
|
|
1098
1113
|
switch (directiveName) {
|
|
1099
1114
|
case "dangerouslysetinnerhtml":
|
|
1100
1115
|
this.attrs ??= [];
|
|
1101
|
-
this.attrs.push(new RawHtmlAttr(
|
|
1116
|
+
this.attrs.push(new RawHtmlAttr(this._parseDirectiveValue(directiveName, s, vp.parseText)));
|
|
1102
1117
|
this.hasDynamic = true;
|
|
1103
1118
|
return;
|
|
1104
1119
|
case "slot":
|
|
1105
1120
|
this.pushWrapper("slot", s, vp.const(s));
|
|
1106
1121
|
return;
|
|
1107
1122
|
case "push-view":
|
|
1108
|
-
this.pushWrapper("push-view", s,
|
|
1123
|
+
this.pushWrapper("push-view", s, this._parseDirectiveValue(directiveName, s, vp.parseText));
|
|
1109
1124
|
return;
|
|
1110
1125
|
case "text":
|
|
1111
|
-
this.textChild =
|
|
1126
|
+
this.textChild = this._parseDirectiveValue(directiveName, s, vp.parseText);
|
|
1112
1127
|
return;
|
|
1113
1128
|
case "show":
|
|
1114
|
-
this.pushWrapper("show", s,
|
|
1129
|
+
this.pushWrapper("show", s, this._parseDirectiveValue(directiveName, s, vp.parseCondValue));
|
|
1115
1130
|
return;
|
|
1116
1131
|
case "hide":
|
|
1117
|
-
this.pushWrapper("hide", s,
|
|
1132
|
+
this.pushWrapper("hide", s, this._parseDirectiveValue(directiveName, s, vp.parseCondValue));
|
|
1118
1133
|
return;
|
|
1119
1134
|
case "each":
|
|
1120
|
-
this.eachAttr = this.pushWrapper("each", s,
|
|
1135
|
+
this.eachAttr = this.pushWrapper("each", s, this._parseDirectiveValue(directiveName, s, vp.parseEach));
|
|
1121
1136
|
return;
|
|
1122
1137
|
case "enrich-with":
|
|
1123
1138
|
if (this.eachAttr !== null) {
|
|
1124
|
-
this.eachAttr.enrichWithVal =
|
|
1139
|
+
this.eachAttr.enrichWithVal = this._parseDirectiveValue(directiveName, s, vp.parseAlter);
|
|
1125
1140
|
} else {
|
|
1126
|
-
this.pushWrapper("scope", s,
|
|
1141
|
+
this.pushWrapper("scope", s, this._parseDirectiveValue(directiveName, s, vp.parseAlter));
|
|
1127
1142
|
}
|
|
1128
1143
|
return;
|
|
1129
1144
|
case "when":
|
|
@@ -1147,14 +1162,18 @@ class AttrParser {
|
|
|
1147
1162
|
this.parseThen(s);
|
|
1148
1163
|
else if (directiveName.startsWith("else."))
|
|
1149
1164
|
this.parseElse(s);
|
|
1165
|
+
else {
|
|
1166
|
+
const info = { name: directiveName, value: s };
|
|
1167
|
+
this.px.onParseIssue("unknown-directive", info);
|
|
1168
|
+
}
|
|
1150
1169
|
}
|
|
1151
1170
|
_parseWhen(s) {
|
|
1152
1171
|
if (this.eachAttr !== null)
|
|
1153
|
-
this.eachAttr.whenVal =
|
|
1172
|
+
this.eachAttr.whenVal = this._parseDirectiveValue("when", s, vp.parseAlter);
|
|
1154
1173
|
}
|
|
1155
1174
|
_parseLoopWith(s) {
|
|
1156
1175
|
if (this.eachAttr !== null)
|
|
1157
|
-
this.eachAttr.loopWithVal =
|
|
1176
|
+
this.eachAttr.loopWithVal = this._parseDirectiveValue("loop-with", s, vp.parseAlter);
|
|
1158
1177
|
}
|
|
1159
1178
|
parse(attributes, parseAll = false) {
|
|
1160
1179
|
for (const { name, value } of attributes) {
|
|
@@ -1200,13 +1219,22 @@ class EventHandler {
|
|
|
1200
1219
|
static parse(s, px) {
|
|
1201
1220
|
const [handlerName, ...rawArgs] = s.trim().split(/\s+/);
|
|
1202
1221
|
const handlerVal = vp.parseHandlerName(handlerName, px);
|
|
1203
|
-
if (handlerVal === null)
|
|
1222
|
+
if (handlerVal === null) {
|
|
1223
|
+
const info = { role: "handler-name", value: handlerName };
|
|
1224
|
+
px.onParseIssue("bad-value", info);
|
|
1204
1225
|
return null;
|
|
1226
|
+
}
|
|
1205
1227
|
const args = new Array(rawArgs.length);
|
|
1206
1228
|
vp.allowHandlerArg();
|
|
1207
1229
|
for (let i = 0;i < rawArgs.length; i++) {
|
|
1208
1230
|
const val = vp.parse(rawArgs[i], px);
|
|
1209
|
-
|
|
1231
|
+
if (val !== null) {
|
|
1232
|
+
args[i] = val;
|
|
1233
|
+
} else {
|
|
1234
|
+
const info = { role: "handler-arg", value: rawArgs[i] };
|
|
1235
|
+
px.onParseIssue("bad-value", info);
|
|
1236
|
+
args[i] = vp.nullConstVal;
|
|
1237
|
+
}
|
|
1210
1238
|
}
|
|
1211
1239
|
return new EventHandler(handlerVal, args);
|
|
1212
1240
|
}
|
|
@@ -1332,6 +1360,74 @@ function optimizeNode(node) {
|
|
|
1332
1360
|
node.optimize();
|
|
1333
1361
|
return node;
|
|
1334
1362
|
}
|
|
1363
|
+
function parseXOp(attrs, childs, opIdx, px) {
|
|
1364
|
+
if (attrs.length === 0)
|
|
1365
|
+
return maybeFragment(childs);
|
|
1366
|
+
const { name, value } = attrs[opIdx];
|
|
1367
|
+
const as = attrs.getNamedItem("as")?.value ?? null;
|
|
1368
|
+
let node;
|
|
1369
|
+
switch (name) {
|
|
1370
|
+
case "slot":
|
|
1371
|
+
node = new SlotNode(null, vp.const(value), maybeFragment(childs));
|
|
1372
|
+
break;
|
|
1373
|
+
case "text":
|
|
1374
|
+
node = px.addNodeIf(RenderTextNode, parseXOpVal(name, value, px, vp.parseText));
|
|
1375
|
+
break;
|
|
1376
|
+
case "render":
|
|
1377
|
+
node = px.addNodeIf(RenderNode, parseXOpVal(name, value, px, vp.parseRender), as);
|
|
1378
|
+
break;
|
|
1379
|
+
case "render-it":
|
|
1380
|
+
node = px.addNodeIf(RenderItNode, vp.bindValIt, as);
|
|
1381
|
+
break;
|
|
1382
|
+
case "render-each":
|
|
1383
|
+
node = RenderEachNode.parse(px, vp, value, as, attrs);
|
|
1384
|
+
break;
|
|
1385
|
+
case "show": {
|
|
1386
|
+
const val = parseXOpVal(name, value, px, vp.parseCondValue);
|
|
1387
|
+
node = px.addNodeIf(ShowNode, val, maybeFragment(childs));
|
|
1388
|
+
break;
|
|
1389
|
+
}
|
|
1390
|
+
case "hide": {
|
|
1391
|
+
const val = parseXOpVal(name, value, px, vp.parseCondValue);
|
|
1392
|
+
node = px.addNodeIf(HideNode, val, maybeFragment(childs));
|
|
1393
|
+
break;
|
|
1394
|
+
}
|
|
1395
|
+
default:
|
|
1396
|
+
px.onParseIssue("unknown-x-op", { name, value });
|
|
1397
|
+
return new CommentNode(`Error: InvalidSpecialTagOp ${name}=${value}`);
|
|
1398
|
+
}
|
|
1399
|
+
return processXExtras(node, attrs, name, opIdx + 1, px);
|
|
1400
|
+
}
|
|
1401
|
+
function parseXOpVal(opName, value, px, parserFn) {
|
|
1402
|
+
const val = parserFn.call(vp, value, px);
|
|
1403
|
+
if (val === null)
|
|
1404
|
+
px.onParseIssue("bad-value", { role: "x-op", op: opName, value });
|
|
1405
|
+
return val;
|
|
1406
|
+
}
|
|
1407
|
+
function processXExtras(node, attrs, opName, startIdx, px) {
|
|
1408
|
+
const consumed = X_OP_CONSUMED[opName];
|
|
1409
|
+
const wrappable = X_OP_WRAPPABLE.has(opName);
|
|
1410
|
+
const wrappers = [];
|
|
1411
|
+
for (let i = startIdx;i < attrs.length; i++) {
|
|
1412
|
+
const a = attrs[i];
|
|
1413
|
+
const aName = a.name;
|
|
1414
|
+
if (consumed.has(aName))
|
|
1415
|
+
continue;
|
|
1416
|
+
if (wrappable && X_ATTR_WRAPPERS[aName]) {
|
|
1417
|
+
wrappers.push([X_ATTR_WRAPPERS[aName], vp.parseCondValue(a.value, px)]);
|
|
1418
|
+
continue;
|
|
1419
|
+
}
|
|
1420
|
+
const issueInfo = { op: opName, name: aName, value: a.value };
|
|
1421
|
+
px.onParseIssue("unknown-x-attr", issueInfo);
|
|
1422
|
+
}
|
|
1423
|
+
for (let i = wrappers.length - 1;i >= 0; i--) {
|
|
1424
|
+
const [Cls, val] = wrappers[i];
|
|
1425
|
+
const wrapper = px.addNodeIf(Cls, val, node);
|
|
1426
|
+
if (wrapper !== null)
|
|
1427
|
+
node = wrapper;
|
|
1428
|
+
}
|
|
1429
|
+
return node;
|
|
1430
|
+
}
|
|
1335
1431
|
function wrap(node, px, wrappers) {
|
|
1336
1432
|
if (wrappers) {
|
|
1337
1433
|
for (let i = wrappers.length - 1;i >= 0; i--) {
|
|
@@ -1438,6 +1534,9 @@ class ParseContext {
|
|
|
1438
1534
|
return this.nodes[id] ?? null;
|
|
1439
1535
|
}
|
|
1440
1536
|
onAttributes(_attrs, _wrapperAttrs, _textChild, _isMacroCall) {}
|
|
1537
|
+
onParseIssue(kind, info) {
|
|
1538
|
+
console.warn(`tutuca parse issue [${kind}]`, info);
|
|
1539
|
+
}
|
|
1441
1540
|
}
|
|
1442
1541
|
function condenseChildsWhites(childs) {
|
|
1443
1542
|
if (childs.length === 0)
|
|
@@ -1517,7 +1616,7 @@ function compileModifiers(eventName, names) {
|
|
|
1517
1616
|
return w(this, f, args, ctx);
|
|
1518
1617
|
};
|
|
1519
1618
|
}
|
|
1520
|
-
var TextNode, CommentNode, ChildsNode, DomNode, FragmentNode, maybeFragment = (xs) => xs.length === 1 ? xs[0] : new FragmentNode(xs), VALID_NODE_RE, ANode, MacroNode, RenderViewId, RenderNode, RenderItNode, RenderEachNode, RenderTextNode, RenderOnceNode, WrapperNode, ShowNode, HideNode, PushViewNameNode, SlotNode, ScopeNode, EachNode, filterAlwaysTrue = (_v, _k, _seq) => true, nullLoopWith = (seq) => ({ seq }), WRAPPER_NODES, _htmlBlockTags = "ADDRESS,ARTICLE,ASIDE,BLOCKQUOTE,CAPTION,COL,COLGROUP,DETAILS,DIALOG,DIV,DD,DL,DT,FIELDSET,FIGCAPTION,FIGURE,FOOTER,FORM,H1,H2,H3,H4,H5,H6,HEADER,HGROUP,HR,LEGEND,LI,MAIN,MENU,NAV,OL,P,PRE,SECTION,SUMMARY,TABLE,TBODY,TD,TFOOT,TH,THEAD,TR,UL", HTML_BLOCK_TAGS, isBlockDomNode = (n) => {
|
|
1619
|
+
var TextNode, CommentNode, ChildsNode, DomNode, FragmentNode, maybeFragment = (xs) => xs.length === 1 ? xs[0] : new FragmentNode(xs), VALID_NODE_RE, ANode, MacroNode, RenderViewId, RenderNode, RenderItNode, RenderEachNode, RenderTextNode, RenderOnceNode, WrapperNode, ShowNode, HideNode, PushViewNameNode, SlotNode, ScopeNode, EachNode, filterAlwaysTrue = (_v, _k, _seq) => true, nullLoopWith = (seq) => ({ seq }), X_OP_CONSUMED, X_OP_WRAPPABLE, X_ATTR_WRAPPERS, WRAPPER_NODES, _htmlBlockTags = "ADDRESS,ARTICLE,ASIDE,BLOCKQUOTE,CAPTION,COL,COLGROUP,DETAILS,DIALOG,DIV,DD,DL,DT,FIELDSET,FIGCAPTION,FIGURE,FOOTER,FORM,H1,H2,H3,H4,H5,H6,HEADER,HGROUP,HR,LEGEND,LI,MAIN,MENU,NAV,OL,P,PRE,SECTION,SUMMARY,TABLE,TBODY,TD,TFOOT,TH,THEAD,TR,UL", HTML_BLOCK_TAGS, isBlockDomNode = (n) => {
|
|
1521
1620
|
const node = n instanceof FragmentNode ? n.childs[0] : n;
|
|
1522
1621
|
return node instanceof DomNode && HTML_BLOCK_TAGS.has(node.tagName);
|
|
1523
1622
|
}, isMac, fwdIfCtxPred = (pred) => (w) => (that, f, args, ctx) => pred(ctx) ? w(that, f, args, ctx) : that, fwdIfKey = (keyName) => fwdIfCtxPred((ctx) => ctx.e.key === keyName), fwdCtrl, fwdMeta, fwdAlt, metaWraps, MOD_WRAPPERS_BY_EVENT, identityModifierWrapper = (f, _ctx) => f;
|
|
@@ -1616,18 +1715,19 @@ var init_anode = __esm(() => {
|
|
|
1616
1715
|
static parse(html, px) {
|
|
1617
1716
|
const nodes = px.parseHTML(html);
|
|
1618
1717
|
if (nodes.length === 0)
|
|
1619
|
-
return new
|
|
1718
|
+
return new CommentNode("Empty View in ANode.parse");
|
|
1620
1719
|
if (nodes.length === 1)
|
|
1621
1720
|
return ANode.fromDOM(nodes[0], px);
|
|
1622
|
-
const childs =
|
|
1623
|
-
for (let i = 0;i < nodes.length; i++)
|
|
1624
|
-
|
|
1721
|
+
const childs = [];
|
|
1722
|
+
for (let i = 0;i < nodes.length; i++) {
|
|
1723
|
+
const child = ANode.fromDOM(nodes[i], px);
|
|
1724
|
+
if (child !== null)
|
|
1725
|
+
childs.push(child);
|
|
1726
|
+
}
|
|
1625
1727
|
const trimmed = condenseChildsWhites(childs);
|
|
1626
1728
|
if (trimmed.length === 0)
|
|
1627
|
-
return new
|
|
1628
|
-
|
|
1629
|
-
return trimmed[0];
|
|
1630
|
-
return new FragmentNode(trimmed);
|
|
1729
|
+
return new CommentNode("Empty View in ANode.parse");
|
|
1730
|
+
return maybeFragment(trimmed);
|
|
1631
1731
|
}
|
|
1632
1732
|
static fromDOM(node, px) {
|
|
1633
1733
|
if (node instanceof px.Text)
|
|
@@ -1635,32 +1735,15 @@ var init_anode = __esm(() => {
|
|
|
1635
1735
|
else if (node instanceof px.Comment)
|
|
1636
1736
|
return new CommentNode(node.textContent);
|
|
1637
1737
|
const { childNodes, attributes: attrs, tagName: tag } = node;
|
|
1638
|
-
const childs =
|
|
1639
|
-
for (let i = 0;i < childNodes.length; i++)
|
|
1640
|
-
|
|
1738
|
+
const childs = [];
|
|
1739
|
+
for (let i = 0;i < childNodes.length; i++) {
|
|
1740
|
+
const child = ANode.fromDOM(childNodes[i], px);
|
|
1741
|
+
if (child !== null)
|
|
1742
|
+
childs.push(child);
|
|
1743
|
+
}
|
|
1641
1744
|
const isPseudoX = attrs[0]?.name === "@x";
|
|
1642
1745
|
if (tag === "X" || isPseudoX) {
|
|
1643
|
-
|
|
1644
|
-
return maybeFragment(childs);
|
|
1645
|
-
const { name, value } = attrs[isPseudoX ? 1 : 0];
|
|
1646
|
-
const as = attrs.getNamedItem("as")?.value ?? null;
|
|
1647
|
-
switch (name) {
|
|
1648
|
-
case "slot":
|
|
1649
|
-
return new SlotNode(null, vp.const(value), maybeFragment(childs));
|
|
1650
|
-
case "text":
|
|
1651
|
-
return px.addNodeIf(RenderTextNode, vp.parseText(value, px));
|
|
1652
|
-
case "render":
|
|
1653
|
-
return px.addNodeIf(RenderNode, vp.parseRender(value, px), as);
|
|
1654
|
-
case "render-it":
|
|
1655
|
-
return px.addNodeIf(RenderItNode, vp.bindValIt, as);
|
|
1656
|
-
case "render-each":
|
|
1657
|
-
return RenderEachNode.parse(px, vp, value, as, attrs);
|
|
1658
|
-
case "show":
|
|
1659
|
-
return px.addNodeIf(ShowNode, vp.parseCondValue(value, px), maybeFragment(childs));
|
|
1660
|
-
case "hide":
|
|
1661
|
-
return px.addNodeIf(HideNode, vp.parseCondValue(value, px), maybeFragment(childs));
|
|
1662
|
-
}
|
|
1663
|
-
return new CommentNode(`Error: InvalidSpecialTagOp ${name}=${value}`);
|
|
1746
|
+
return parseXOp(attrs, childs, isPseudoX ? 1 : 0, px);
|
|
1664
1747
|
} else if (tag.charCodeAt(1) === 58 && tag.charCodeAt(0) === 88) {
|
|
1665
1748
|
const macroName = tag.slice(2).toLowerCase();
|
|
1666
1749
|
if (macroName === "slot") {
|
|
@@ -1746,7 +1829,7 @@ var init_anode = __esm(() => {
|
|
|
1746
1829
|
return rx.renderEach(stack, this.iterInfo, this.nodeId, this.viewId);
|
|
1747
1830
|
}
|
|
1748
1831
|
static parse(px, vp2, s, as, attrs) {
|
|
1749
|
-
const node = px.addNodeIf(RenderEachNode,
|
|
1832
|
+
const node = px.addNodeIf(RenderEachNode, parseXOpVal("render-each", s, px, vp2.parseEach), as);
|
|
1750
1833
|
if (node !== null) {
|
|
1751
1834
|
const attrParser = getAttrParser(px);
|
|
1752
1835
|
attrParser.eachAttr = attrParser.pushWrapper("each", s, node.val);
|
|
@@ -1844,6 +1927,17 @@ var init_anode = __esm(() => {
|
|
|
1844
1927
|
}
|
|
1845
1928
|
static register = true;
|
|
1846
1929
|
};
|
|
1930
|
+
X_OP_CONSUMED = {
|
|
1931
|
+
slot: new Set,
|
|
1932
|
+
text: new Set,
|
|
1933
|
+
render: new Set(["as"]),
|
|
1934
|
+
"render-it": new Set(["as"]),
|
|
1935
|
+
"render-each": new Set(["as", "when", "loop-with"]),
|
|
1936
|
+
show: new Set,
|
|
1937
|
+
hide: new Set
|
|
1938
|
+
};
|
|
1939
|
+
X_OP_WRAPPABLE = new Set(["text", "render", "render-it", "render-each"]);
|
|
1940
|
+
X_ATTR_WRAPPERS = { show: ShowNode, hide: HideNode };
|
|
1847
1941
|
WRAPPER_NODES = {
|
|
1848
1942
|
slot: SlotNode,
|
|
1849
1943
|
show: ShowNode,
|
|
@@ -2084,11 +2178,29 @@ function checkComponent(Comp, lx = new LintContext) {
|
|
|
2084
2178
|
});
|
|
2085
2179
|
}
|
|
2086
2180
|
function checkView(lx, view, Comp, referencedAlters, referencedComputed) {
|
|
2181
|
+
checkParseIssues(lx, view);
|
|
2087
2182
|
checkRenderItInLoop(lx, view);
|
|
2088
2183
|
checkEventModifiers(lx, view);
|
|
2089
2184
|
checkKnownHandlerNames(lx, view, Comp, referencedAlters, referencedComputed);
|
|
2090
2185
|
checkMacroCallArgs(lx, view, Comp);
|
|
2091
2186
|
}
|
|
2187
|
+
function checkParseIssues(lx, view) {
|
|
2188
|
+
const issues = view.ctx.parseIssues;
|
|
2189
|
+
if (!issues)
|
|
2190
|
+
return;
|
|
2191
|
+
for (const { kind, info } of issues) {
|
|
2192
|
+
const id = PARSE_ISSUE_KIND_TO_LINT_ID[kind];
|
|
2193
|
+
if (!id)
|
|
2194
|
+
continue;
|
|
2195
|
+
lx.error(id, info);
|
|
2196
|
+
const known = AT_PREFIX_HINT_KNOWN_BY_KIND[kind];
|
|
2197
|
+
if (known && info.name?.startsWith("@")) {
|
|
2198
|
+
const suggestion = info.name.slice(1);
|
|
2199
|
+
if (known.has(suggestion))
|
|
2200
|
+
lx.hint(MAYBE_DROP_AT_PREFIX, { ...info, suggestion });
|
|
2201
|
+
}
|
|
2202
|
+
}
|
|
2203
|
+
}
|
|
2092
2204
|
function checkMacroCallArgs(lx, view, Comp) {
|
|
2093
2205
|
const { scope } = Comp;
|
|
2094
2206
|
for (const macroNode of view.ctx.macroNodes) {
|
|
@@ -2377,9 +2489,29 @@ class LintContext {
|
|
|
2377
2489
|
this.reports.push({ id, info, level, context: { ...this.frame } });
|
|
2378
2490
|
}
|
|
2379
2491
|
}
|
|
2380
|
-
var ALT_HANDLER_NOT_DEFINED = "ALT_HANDLER_NOT_DEFINED", ALT_HANDLER_NOT_REFERENCED = "ALT_HANDLER_NOT_REFERENCED", RENDER_IT_OUTSIDE_OF_LOOP = "RENDER_IT_OUTSIDE_OF_LOOP", UNKNOWN_EVENT_MODIFIER = "UNKNOWN_EVENT_MODIFIER", UNKNOWN_HANDLER_ARG_NAME = "UNKNOWN_HANDLER_ARG_NAME", INPUT_HANDLER_NOT_IMPLEMENTED = "INPUT_HANDLER_NOT_IMPLEMENTED", INPUT_HANDLER_NOT_REFERENCED = "INPUT_HANDLER_NOT_REFERENCED", INPUT_HANDLER_METHOD_NOT_IMPLEMENTED = "INPUT_HANDLER_METHOD_NOT_IMPLEMENTED", INPUT_HANDLER_FOR_INPUT_HANDLER_METHOD = "INPUT_HANDLER_FOR_INPUT_HANDLER_METHOD", INPUT_HANDLER_METHOD_FOR_INPUT_HANDLER = "INPUT_HANDLER_METHOD_FOR_INPUT_HANDLER", FIELD_VAL_NOT_DEFINED = "FIELD_VAL_NOT_DEFINED", COMPUTED_VAL_NOT_DEFINED = "COMPUTED_VAL_NOT_DEFINED", COMPUTED_NOT_REFERENCED = "COMPUTED_NOT_REFERENCED", DUPLICATE_ATTR_DEFINITION = "DUPLICATE_ATTR_DEFINITION", UNKNOWN_REQUEST_NAME = "UNKNOWN_REQUEST_NAME", UNKNOWN_COMPONENT_NAME = "UNKNOWN_COMPONENT_NAME", UNKNOWN_MACRO_ARG = "UNKNOWN_MACRO_ARG", LEVEL_WARN = "warn", LEVEL_ERROR = "error", LEVEL_HINT = "hint", NO_WRAPPERS, KNOWN_HANDLER_NAMES, LintParseContext;
|
|
2492
|
+
var ALT_HANDLER_NOT_DEFINED = "ALT_HANDLER_NOT_DEFINED", ALT_HANDLER_NOT_REFERENCED = "ALT_HANDLER_NOT_REFERENCED", RENDER_IT_OUTSIDE_OF_LOOP = "RENDER_IT_OUTSIDE_OF_LOOP", UNKNOWN_EVENT_MODIFIER = "UNKNOWN_EVENT_MODIFIER", UNKNOWN_HANDLER_ARG_NAME = "UNKNOWN_HANDLER_ARG_NAME", INPUT_HANDLER_NOT_IMPLEMENTED = "INPUT_HANDLER_NOT_IMPLEMENTED", INPUT_HANDLER_NOT_REFERENCED = "INPUT_HANDLER_NOT_REFERENCED", INPUT_HANDLER_METHOD_NOT_IMPLEMENTED = "INPUT_HANDLER_METHOD_NOT_IMPLEMENTED", INPUT_HANDLER_FOR_INPUT_HANDLER_METHOD = "INPUT_HANDLER_FOR_INPUT_HANDLER_METHOD", INPUT_HANDLER_METHOD_FOR_INPUT_HANDLER = "INPUT_HANDLER_METHOD_FOR_INPUT_HANDLER", FIELD_VAL_NOT_DEFINED = "FIELD_VAL_NOT_DEFINED", COMPUTED_VAL_NOT_DEFINED = "COMPUTED_VAL_NOT_DEFINED", COMPUTED_NOT_REFERENCED = "COMPUTED_NOT_REFERENCED", DUPLICATE_ATTR_DEFINITION = "DUPLICATE_ATTR_DEFINITION", UNKNOWN_REQUEST_NAME = "UNKNOWN_REQUEST_NAME", UNKNOWN_COMPONENT_NAME = "UNKNOWN_COMPONENT_NAME", UNKNOWN_MACRO_ARG = "UNKNOWN_MACRO_ARG", UNKNOWN_DIRECTIVE = "UNKNOWN_DIRECTIVE", UNKNOWN_X_OP = "UNKNOWN_X_OP", UNKNOWN_X_ATTR = "UNKNOWN_X_ATTR", MAYBE_DROP_AT_PREFIX = "MAYBE_DROP_AT_PREFIX", BAD_VALUE = "BAD_VALUE", PARSE_ISSUE_KIND_TO_LINT_ID, X_KNOWN_OP_NAMES, X_KNOWN_ATTR_NAMES, AT_PREFIX_HINT_KNOWN_BY_KIND, LEVEL_WARN = "warn", LEVEL_ERROR = "error", LEVEL_HINT = "hint", NO_WRAPPERS, KNOWN_HANDLER_NAMES, LintParseContext;
|
|
2381
2493
|
var init_lint_check = __esm(() => {
|
|
2382
2494
|
init_anode();
|
|
2495
|
+
PARSE_ISSUE_KIND_TO_LINT_ID = {
|
|
2496
|
+
"unknown-directive": UNKNOWN_DIRECTIVE,
|
|
2497
|
+
"unknown-x-op": UNKNOWN_X_OP,
|
|
2498
|
+
"unknown-x-attr": UNKNOWN_X_ATTR,
|
|
2499
|
+
"bad-value": BAD_VALUE
|
|
2500
|
+
};
|
|
2501
|
+
X_KNOWN_OP_NAMES = new Set([
|
|
2502
|
+
"slot",
|
|
2503
|
+
"text",
|
|
2504
|
+
"render",
|
|
2505
|
+
"render-it",
|
|
2506
|
+
"render-each",
|
|
2507
|
+
"show",
|
|
2508
|
+
"hide"
|
|
2509
|
+
]);
|
|
2510
|
+
X_KNOWN_ATTR_NAMES = new Set(["as", "when", "loop-with", "show", "hide"]);
|
|
2511
|
+
AT_PREFIX_HINT_KNOWN_BY_KIND = {
|
|
2512
|
+
"unknown-x-op": X_KNOWN_OP_NAMES,
|
|
2513
|
+
"unknown-x-attr": X_KNOWN_ATTR_NAMES
|
|
2514
|
+
};
|
|
2383
2515
|
NO_WRAPPERS = {};
|
|
2384
2516
|
KNOWN_HANDLER_NAMES = new Set([
|
|
2385
2517
|
"value",
|
|
@@ -2405,10 +2537,14 @@ var init_lint_check = __esm(() => {
|
|
|
2405
2537
|
constructor(document2, Text, Comment) {
|
|
2406
2538
|
super(document2, Text, Comment);
|
|
2407
2539
|
this.attrs = [];
|
|
2540
|
+
this.parseIssues = [];
|
|
2408
2541
|
}
|
|
2409
2542
|
onAttributes(attrs, wrapperAttrs, textChild, isMacroCall = false) {
|
|
2410
2543
|
this.attrs.push({ attrs, wrapperAttrs, textChild, isMacroCall });
|
|
2411
2544
|
}
|
|
2545
|
+
onParseIssue(kind, info) {
|
|
2546
|
+
this.parseIssues.push({ kind, info });
|
|
2547
|
+
}
|
|
2412
2548
|
};
|
|
2413
2549
|
});
|
|
2414
2550
|
|