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.
@@ -734,9 +734,11 @@ class ValParser {
734
734
  const charCode = s.charCodeAt(0);
735
735
  switch (charCode) {
736
736
  case 94: {
737
- const newS = px.frame.macroVars?.[s.slice(1)];
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(vp.parseText(s, this.px)));
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, vp.parseText(s, this.px));
1123
+ this.pushWrapper("push-view", s, this._parseDirectiveValue(directiveName, s, vp.parseText));
1109
1124
  return;
1110
1125
  case "text":
1111
- this.textChild = vp.parseText(s, this.px);
1126
+ this.textChild = this._parseDirectiveValue(directiveName, s, vp.parseText);
1112
1127
  return;
1113
1128
  case "show":
1114
- this.pushWrapper("show", s, vp.parseCondValue(s, this.px));
1129
+ this.pushWrapper("show", s, this._parseDirectiveValue(directiveName, s, vp.parseCondValue));
1115
1130
  return;
1116
1131
  case "hide":
1117
- this.pushWrapper("hide", s, vp.parseCondValue(s, this.px));
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, vp.parseEach(s, this.px));
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 = vp.parseAlter(s, this.px);
1139
+ this.eachAttr.enrichWithVal = this._parseDirectiveValue(directiveName, s, vp.parseAlter);
1125
1140
  } else {
1126
- this.pushWrapper("scope", s, vp.parseAlter(s, this.px));
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 = vp.parseAlter(s, this.px);
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 = vp.parseAlter(s, this.px);
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
- args[i] = val !== null ? val : vp.nullConstVal;
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 TextNode("");
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 = new Array(nodes.length);
1623
- for (let i = 0;i < nodes.length; i++)
1624
- childs[i] = ANode.fromDOM(nodes[i], px);
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 TextNode("");
1628
- if (trimmed.length === 1)
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 = new Array(childNodes.length);
1639
- for (let i = 0;i < childNodes.length; i++)
1640
- childs[i] = ANode.fromDOM(childNodes[i], px);
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
- if (attrs.length === 0)
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, vp2.parseEach(s, px), as);
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