tutuca 0.9.68 → 0.9.70

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.
@@ -5833,16 +5833,16 @@ function parseXOpVal(opName, value, px, parserFn) {
5833
5833
  return val;
5834
5834
  }
5835
5835
  function processXExtras(node, attrs, opName, startIdx, px) {
5836
- const consumed = X_OP_CONSUMED[opName];
5837
- const wrappable = X_OP_WRAPPABLE.has(opName);
5836
+ const { consumed, wrappable } = X_OPS[opName];
5838
5837
  const wrappers = [];
5839
5838
  for (let i = startIdx;i < attrs.length; i++) {
5840
5839
  const a = attrs[i];
5841
5840
  const aName = a.name;
5842
5841
  if (consumed.has(aName))
5843
5842
  continue;
5844
- if (wrappable && X_ATTR_WRAPPERS[aName]) {
5845
- wrappers.push([X_ATTR_WRAPPERS[aName], vp.parseBool(a.value, px)]);
5843
+ const wrapper = wrappable ? X_OPS[aName]?.wrapper : null;
5844
+ if (wrapper) {
5845
+ wrappers.push([wrapper, vp.parseBool(a.value, px)]);
5846
5846
  continue;
5847
5847
  }
5848
5848
  const issueInfo = { op: opName, name: aName, value: a.value };
@@ -5878,6 +5878,12 @@ function makeWrapperNode(data, px) {
5878
5878
  }
5879
5879
  return node;
5880
5880
  }
5881
+ function dynRenderStep(comp, name, key) {
5882
+ const p = resolveDynProducer(comp, name);
5883
+ if (!p)
5884
+ return null;
5885
+ return key === undefined ? new DynStep(p.producerCompId, p.producerSteps) : new DynEachStep(p.producerCompId, p.producerSteps, key);
5886
+ }
5881
5887
 
5882
5888
  class IterInfo {
5883
5889
  constructor(val, whenVal, loopWithVal, enrichWithVal) {
@@ -5894,6 +5900,9 @@ class IterInfo {
5894
5900
  return { seq, filter, loopWith, enricher };
5895
5901
  }
5896
5902
  }
5903
+ function xOp(consumed = [], { wrappable = false, wrapper = null } = {}) {
5904
+ return { consumed: new Set(consumed), wrappable, wrapper };
5905
+ }
5897
5906
 
5898
5907
  class ParseContext {
5899
5908
  constructor(document2, Text, Comment, nodes, events, macroNodes, frame, parent) {
@@ -5967,29 +5976,29 @@ class ParseContext {
5967
5976
  console.warn(`tutuca parse issue [${kind}]`, info);
5968
5977
  }
5969
5978
  }
5979
+ function trimEdgeWhite(node) {
5980
+ if (!node.isWhiteSpace?.())
5981
+ return false;
5982
+ node.condenseWhiteSpace();
5983
+ return true;
5984
+ }
5970
5985
  function condenseChildsWhites(childs) {
5971
5986
  if (childs.length === 0)
5972
5987
  return childs;
5973
- let changed = false;
5974
- if (childs[0].isWhiteSpace?.()) {
5975
- childs[0].condenseWhiteSpace();
5976
- changed = true;
5977
- }
5978
5988
  const last = childs.length - 1;
5979
- if (last > 0 && childs[last].isWhiteSpace?.()) {
5980
- childs[last].condenseWhiteSpace();
5981
- changed = true;
5982
- }
5989
+ let emptied = trimEdgeWhite(childs[0]);
5990
+ if (last > 0 && trimEdgeWhite(childs[last]))
5991
+ emptied = true;
5983
5992
  for (let i = 1;i < last; i++) {
5984
5993
  const cur = childs[i];
5985
- if (cur.isWhiteSpace?.() && cur.hasNewLine()) {
5986
- const bothBlock = isBlockDomNode(childs[i - 1]) && isBlockDomNode(childs[i + 1]);
5987
- cur.condenseWhiteSpace(bothBlock ? "" : " ");
5988
- if (bothBlock)
5989
- changed = true;
5990
- }
5994
+ if (!(cur.isWhiteSpace?.() && cur.hasNewLine()))
5995
+ continue;
5996
+ const bothBlock = isBlockDomNode(childs[i - 1]) && isBlockDomNode(childs[i + 1]);
5997
+ cur.condenseWhiteSpace(bothBlock ? "" : " ");
5998
+ if (bothBlock)
5999
+ emptied = true;
5991
6000
  }
5992
- return changed ? childs.filter((c) => !(c instanceof TextNode && c.val === "")) : childs;
6001
+ return emptied ? childs.filter((c) => !isEmptyText(c)) : childs;
5993
6002
  }
5994
6003
 
5995
6004
  class NodeEvents {
@@ -6045,10 +6054,10 @@ function compileModifiers(eventName, names) {
6045
6054
  return w(this, f, args, ctx);
6046
6055
  };
6047
6056
  }
6048
- 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) => ({ iterData: { 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) => {
6057
+ 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) => ({ iterData: { seq } }), X_OPS, 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) => {
6049
6058
  const node = n instanceof FragmentNode ? n.childs[0] : n;
6050
6059
  return node instanceof DomNode && HTML_BLOCK_TAGS.has(node.tagName);
6051
- }, 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;
6060
+ }, isEmptyText = (c) => c instanceof TextNode && c.val === "", 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;
6052
6061
  var init_anode = __esm(() => {
6053
6062
  init_attribute();
6054
6063
  init_path();
@@ -6252,10 +6261,8 @@ var init_anode = __esm(() => {
6252
6261
  return rx.renderIt(newStack, this, "", this.viewId);
6253
6262
  }
6254
6263
  toPathStep(ctx) {
6255
- if (this.val instanceof DynVal) {
6256
- const p = resolveDynProducer(ctx.comp, this.val.name);
6257
- return p ? new DynStep(p.producerCompId, p.producerSteps) : null;
6258
- }
6264
+ if (this.val instanceof DynVal)
6265
+ return dynRenderStep(ctx.comp, this.val.name);
6259
6266
  return super.toPathStep(ctx);
6260
6267
  }
6261
6268
  };
@@ -6270,10 +6277,8 @@ var init_anode = __esm(() => {
6270
6277
  return null;
6271
6278
  const nextNode = next.resolveNode();
6272
6279
  if (nextNode instanceof EachNode && next.hasKey) {
6273
- if (nextNode.val instanceof DynVal) {
6274
- const p = resolveDynProducer(ctx.comp, nextNode.val.name);
6275
- return p ? new DynEachStep(p.producerCompId, p.producerSteps, next.key) : null;
6276
- }
6280
+ if (nextNode.val instanceof DynVal)
6281
+ return dynRenderStep(ctx.comp, nextNode.val.name, next.key);
6277
6282
  return new EachRenderItStep(nextNode.val.name, next.key);
6278
6283
  }
6279
6284
  return null;
@@ -6288,12 +6293,8 @@ var init_anode = __esm(() => {
6288
6293
  return rx.renderEach(stack, this.iterInfo, this, this.viewId);
6289
6294
  }
6290
6295
  toPathStep(ctx) {
6291
- if (this.val instanceof DynVal) {
6292
- if (!ctx.hasKey)
6293
- return null;
6294
- const p = resolveDynProducer(ctx.comp, this.val.name);
6295
- return p ? new DynEachStep(p.producerCompId, p.producerSteps, ctx.key) : null;
6296
- }
6296
+ if (this.val instanceof DynVal)
6297
+ return ctx.hasKey ? dynRenderStep(ctx.comp, this.val.name, ctx.key) : null;
6297
6298
  return super.toPathStep(ctx);
6298
6299
  }
6299
6300
  static parse(px, vp2, s, as, attrs) {
@@ -6396,17 +6397,15 @@ var init_anode = __esm(() => {
6396
6397
  }
6397
6398
  static register = true;
6398
6399
  };
6399
- X_OP_CONSUMED = {
6400
- slot: new Set,
6401
- text: new Set,
6402
- render: new Set(["as"]),
6403
- "render-it": new Set(["as"]),
6404
- "render-each": new Set(["as", "when", "loop-with"]),
6405
- show: new Set,
6406
- hide: new Set
6407
- };
6408
- X_OP_WRAPPABLE = new Set(["text", "render", "render-it", "render-each"]);
6409
- X_ATTR_WRAPPERS = { show: ShowNode, hide: HideNode };
6400
+ X_OPS = {
6401
+ slot: xOp(),
6402
+ text: xOp([], { wrappable: true }),
6403
+ render: xOp(["as"], { wrappable: true }),
6404
+ "render-it": xOp(["as"], { wrappable: true }),
6405
+ "render-each": xOp(["as", "when", "loop-with"], { wrappable: true }),
6406
+ show: xOp([], { wrapper: ShowNode }),
6407
+ hide: xOp([], { wrapper: HideNode })
6408
+ };
6410
6409
  WRAPPER_NODES = {
6411
6410
  slot: SlotNode,
6412
6411
  show: ShowNode,
@@ -8764,9 +8763,10 @@ function checkParseIssues(lx, view) {
8764
8763
  if (!issues)
8765
8764
  return;
8766
8765
  for (const { kind, info } of issues) {
8767
- const id = PARSE_ISSUE_KIND_TO_LINT_ID[kind];
8768
- if (!id)
8766
+ const rule = PARSE_ISSUES[kind];
8767
+ if (!rule)
8769
8768
  continue;
8769
+ const id = rule.id;
8770
8770
  if (kind === "bad-value") {
8771
8771
  const detected = classifyBadValue(info.value);
8772
8772
  if (detected) {
@@ -8774,15 +8774,13 @@ function checkParseIssues(lx, view) {
8774
8774
  continue;
8775
8775
  }
8776
8776
  }
8777
- const atPrefixKnown = AT_PREFIX_HINT_KNOWN_BY_KIND[kind];
8777
+ const atPrefixKnown = rule.atPrefix;
8778
8778
  const isAtPrefixedTypo = atPrefixKnown && info.name?.startsWith("@") && atPrefixKnown.has(info.name.slice(1));
8779
8779
  let suggestion = null;
8780
8780
  if (isAtPrefixedTypo) {
8781
8781
  suggestion = { kind: "drop-prefix", from: info.name, to: info.name.slice(1) };
8782
- } else {
8783
- const candidates = PARSE_ISSUE_KIND_TO_KNOWN_NAMES[kind];
8784
- if (candidates)
8785
- suggestion = replaceNameSuggestion(info.name, candidates);
8782
+ } else if (rule.candidates) {
8783
+ suggestion = replaceNameSuggestion(info.name, rule.candidates);
8786
8784
  }
8787
8785
  lx.error(id, info, suggestion);
8788
8786
  if (isAtPrefixedTypo) {
@@ -8931,70 +8929,15 @@ function checkEventHandlersHaveImpls(lx, Comp, referencedInputs) {
8931
8929
  });
8932
8930
  }
8933
8931
  }
8932
+ function reportUnknownName(lx, code, name, candidates, info) {
8933
+ lx.error(code, { ...info, name }, replaceNameSuggestion(name, candidates));
8934
+ }
8934
8935
  function checkConsistentAttrVal(lx, val, env, skipNameVal = false, errCtx = null) {
8935
- const { fields, proto, scope, alter } = env;
8936
- const valName = val?.constructor.name;
8937
- if (valName === "FieldVal") {
8938
- const { name } = val;
8939
- if (fields[name] === undefined) {
8940
- if (proto[name] !== undefined) {
8941
- lx.error(FIELD_VAL_IS_METHOD, { ...errCtx, val, name }, { kind: "rewrite", from: `.${name}`, to: `$${name}` });
8942
- } else {
8943
- lx.error(FIELD_VAL_NOT_DEFINED, { ...errCtx, val, name }, replaceNameSuggestion(name, Object.keys(fields)));
8944
- }
8945
- }
8946
- } else if (valName === "MethodVal") {
8947
- const { name } = val;
8948
- if (proto[name] === undefined) {
8949
- if (fields[name] !== undefined) {
8950
- lx.error(METHOD_VAL_IS_FIELD, { ...errCtx, val, name }, { kind: "rewrite", from: `$${name}`, to: `.${name}` });
8951
- } else {
8952
- lx.error(METHOD_VAL_NOT_DEFINED, { ...errCtx, val, name }, replaceNameSuggestion(name, collectProtoMethodNames(proto)));
8953
- }
8954
- }
8955
- } else if (valName === "SeqAccessVal") {
8956
- checkConsistentAttrVal(lx, val.seqVal, env, skipNameVal, errCtx);
8957
- checkConsistentAttrVal(lx, val.keyVal, env, skipNameVal, errCtx);
8958
- } else if (valName === "RequestVal") {
8959
- if (scope.lookupRequest(val.name) === null) {
8960
- lx.error(UNKNOWN_REQUEST_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, scopeKeysAlong(scope, "reqsByName")));
8961
- }
8962
- } else if (valName === "TypeVal") {
8963
- if (scope.lookupComponent(val.name) === null) {
8964
- lx.error(UNKNOWN_COMPONENT_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, scopeKeysAlong(scope, "byName")));
8965
- }
8966
- } else if (valName === "NameVal") {
8967
- if (!skipNameVal && !isKnownHandlerName(val.name)) {
8968
- lx.error(UNKNOWN_HANDLER_ARG_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, KNOWN_HANDLER_NAMES));
8969
- }
8970
- } else if (valName === "StrTplVal") {
8971
- const vs = val.vals;
8972
- const literal = val.toLiteralSource();
8973
- if (literal !== null) {
8974
- lx.hint(PLACEHOLDERLESS_TEMPLATE_STRING, { ...errCtx, literal }, { kind: "rewrite", from: `$${literal}`, to: literal });
8975
- } else if (vs.length === 1) {
8976
- const simpler = String(vs[0]);
8977
- lx.warn(REDUNDANT_TEMPLATE_STRING, { ...errCtx, simpler }, { kind: "rewrite", from: `$'{${simpler}}'`, to: simpler });
8978
- }
8979
- for (const subVal of vs) {
8980
- checkConsistentAttrVal(lx, subVal, env, skipNameVal, errCtx);
8981
- }
8982
- } else if (valName === "HandlerNameVal") {
8983
- env.referencedAlters?.add(val.name);
8984
- if (alter[val.name] === undefined) {
8985
- lx.error(ALT_HANDLER_NOT_DEFINED, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, Object.keys(alter)));
8986
- }
8987
- } else if (valName === "PredicateVal") {
8988
- for (const arg of val.args)
8989
- checkConsistentAttrVal(lx, arg, env, skipNameVal, errCtx);
8990
- } else if (valName === "DynVal") {
8991
- env.referencedDynamics?.add(val.name);
8992
- if (env.dynamicMap[val.name] === undefined) {
8993
- lx.error(DYN_VAL_NOT_DEFINED, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, Object.keys(env.dynamicMap)));
8994
- }
8995
- } else if (valName !== "ConstVal" && valName !== "BindVal") {
8996
- console.log(val);
8997
- }
8936
+ const check = ATTR_VAL_CHECKERS[val?.constructor.name];
8937
+ if (check === undefined)
8938
+ return;
8939
+ const recurse = (sub) => checkConsistentAttrVal(lx, sub, env, skipNameVal, errCtx);
8940
+ check({ lx, val, env, errCtx, skipNameVal, recurse });
8998
8941
  }
8999
8942
  function nodeCtxForNode(nodeKind) {
9000
8943
  return NODE_KIND_TO_CTX[nodeKind] ?? null;
@@ -9201,7 +9144,7 @@ class LintContext {
9201
9144
  this.reports.push({ id, info, level, context: { ...this.frame }, suggestion });
9202
9145
  }
9203
9146
  }
9204
- var KNOWN_COMPONENT_SPEC_KEYS, EMPTY_SET2, KNOWN_DIRECTIVE_NAMES, ALT_HANDLER_NOT_DEFINED = "ALT_HANDLER_NOT_DEFINED", ALT_HANDLER_NOT_REFERENCED = "ALT_HANDLER_NOT_REFERENCED", DYN_VAL_NOT_DEFINED = "DYN_VAL_NOT_DEFINED", DYN_ALIAS_NOT_REFERENCED = "DYN_ALIAS_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", FIELD_VAL_IS_METHOD = "FIELD_VAL_IS_METHOD", METHOD_VAL_NOT_DEFINED = "METHOD_VAL_NOT_DEFINED", METHOD_VAL_IS_FIELD = "METHOD_VAL_IS_FIELD", DUPLICATE_ATTR_DEFINITION = "DUPLICATE_ATTR_DEFINITION", IF_NO_BRANCH_SET = "IF_NO_BRANCH_SET", 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", UNSUPPORTED_EXPR_SYNTAX = "UNSUPPORTED_EXPR_SYNTAX", REDUNDANT_TEMPLATE_STRING = "REDUNDANT_TEMPLATE_STRING", PLACEHOLDERLESS_TEMPLATE_STRING = "PLACEHOLDERLESS_TEMPLATE_STRING", UNKNOWN_COMPONENT_SPEC_KEY = "UNKNOWN_COMPONENT_SPEC_KEY", COMP_FIELD_BAD_SHAPE = "COMP_FIELD_BAD_SHAPE", PARSE_ISSUE_KIND_TO_LINT_ID, X_KNOWN_OP_NAMES, X_KNOWN_ATTR_NAMES, AT_PREFIX_HINT_KNOWN_BY_KIND, LEVEL_WARN2 = "warn", LEVEL_ERROR2 = "error", LEVEL_HINT = "hint", PARSE_ISSUE_KIND_TO_KNOWN_NAMES, UNSUPPORTED_EXPR_GUIDANCE, HTML_LINT_OPTS, NO_WRAPPERS, KNOWN_HANDLER_NAMES, NODE_KIND_TO_CTX, LintParseContext;
9147
+ var KNOWN_COMPONENT_SPEC_KEYS, EMPTY_SET2, KNOWN_DIRECTIVE_NAMES, ALT_HANDLER_NOT_DEFINED = "ALT_HANDLER_NOT_DEFINED", ALT_HANDLER_NOT_REFERENCED = "ALT_HANDLER_NOT_REFERENCED", DYN_VAL_NOT_DEFINED = "DYN_VAL_NOT_DEFINED", DYN_ALIAS_NOT_REFERENCED = "DYN_ALIAS_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", FIELD_VAL_IS_METHOD = "FIELD_VAL_IS_METHOD", METHOD_VAL_NOT_DEFINED = "METHOD_VAL_NOT_DEFINED", METHOD_VAL_IS_FIELD = "METHOD_VAL_IS_FIELD", DUPLICATE_ATTR_DEFINITION = "DUPLICATE_ATTR_DEFINITION", IF_NO_BRANCH_SET = "IF_NO_BRANCH_SET", 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", UNSUPPORTED_EXPR_SYNTAX = "UNSUPPORTED_EXPR_SYNTAX", REDUNDANT_TEMPLATE_STRING = "REDUNDANT_TEMPLATE_STRING", PLACEHOLDERLESS_TEMPLATE_STRING = "PLACEHOLDERLESS_TEMPLATE_STRING", UNKNOWN_COMPONENT_SPEC_KEY = "UNKNOWN_COMPONENT_SPEC_KEY", COMP_FIELD_BAD_SHAPE = "COMP_FIELD_BAD_SHAPE", X_KNOWN_OP_NAMES, X_KNOWN_ATTR_NAMES, LEVEL_WARN2 = "warn", LEVEL_ERROR2 = "error", LEVEL_HINT = "hint", PARSE_ISSUES, UNSUPPORTED_EXPR_GUIDANCE, HTML_LINT_OPTS, NO_WRAPPERS, KNOWN_HANDLER_NAMES, fixTo = (from, to) => ({ kind: "rewrite", from, to }), ATTR_VAL_CHECKERS, NODE_KIND_TO_CTX, LintParseContext;
9205
9148
  var init_lint_check = __esm(() => {
9206
9149
  init_anode();
9207
9150
  init_htmllinter();
@@ -9221,12 +9164,6 @@ var init_lint_check = __esm(() => {
9221
9164
  "then",
9222
9165
  "else"
9223
9166
  ]);
9224
- PARSE_ISSUE_KIND_TO_LINT_ID = {
9225
- "unknown-directive": UNKNOWN_DIRECTIVE,
9226
- "unknown-x-op": UNKNOWN_X_OP,
9227
- "unknown-x-attr": UNKNOWN_X_ATTR,
9228
- "bad-value": BAD_VALUE
9229
- };
9230
9167
  X_KNOWN_OP_NAMES = new Set([
9231
9168
  "slot",
9232
9169
  "text",
@@ -9237,14 +9174,15 @@ var init_lint_check = __esm(() => {
9237
9174
  "hide"
9238
9175
  ]);
9239
9176
  X_KNOWN_ATTR_NAMES = new Set(["as", "when", "loop-with", "show", "hide"]);
9240
- AT_PREFIX_HINT_KNOWN_BY_KIND = {
9241
- "unknown-x-op": X_KNOWN_OP_NAMES,
9242
- "unknown-x-attr": X_KNOWN_ATTR_NAMES
9243
- };
9244
- PARSE_ISSUE_KIND_TO_KNOWN_NAMES = {
9245
- "unknown-directive": KNOWN_DIRECTIVE_NAMES,
9246
- "unknown-x-op": X_KNOWN_OP_NAMES,
9247
- "unknown-x-attr": X_KNOWN_ATTR_NAMES
9177
+ PARSE_ISSUES = {
9178
+ "unknown-directive": { id: UNKNOWN_DIRECTIVE, candidates: KNOWN_DIRECTIVE_NAMES },
9179
+ "unknown-x-op": { id: UNKNOWN_X_OP, candidates: X_KNOWN_OP_NAMES, atPrefix: X_KNOWN_OP_NAMES },
9180
+ "unknown-x-attr": {
9181
+ id: UNKNOWN_X_ATTR,
9182
+ candidates: X_KNOWN_ATTR_NAMES,
9183
+ atPrefix: X_KNOWN_ATTR_NAMES
9184
+ },
9185
+ "bad-value": { id: BAD_VALUE }
9248
9186
  };
9249
9187
  UNSUPPORTED_EXPR_GUIDANCE = {
9250
9188
  "legacy-template": "Unquoted {...} string templates are no longer supported. Wrap the value in $'...', e.g. $'flex {.color}'.",
@@ -9278,6 +9216,73 @@ var init_lint_check = __esm(() => {
9278
9216
  "ctx",
9279
9217
  "dragInfo"
9280
9218
  ]);
9219
+ ATTR_VAL_CHECKERS = {
9220
+ FieldVal({ lx, val, env, errCtx }) {
9221
+ const { fields, proto } = env;
9222
+ const { name } = val;
9223
+ if (fields[name] !== undefined)
9224
+ return;
9225
+ if (proto[name] !== undefined)
9226
+ lx.error(FIELD_VAL_IS_METHOD, { ...errCtx, val, name }, fixTo(`.${name}`, `$${name}`));
9227
+ else
9228
+ reportUnknownName(lx, FIELD_VAL_NOT_DEFINED, name, Object.keys(fields), { ...errCtx, val });
9229
+ },
9230
+ MethodVal({ lx, val, env, errCtx }) {
9231
+ const { fields, proto } = env;
9232
+ const { name } = val;
9233
+ if (proto[name] !== undefined)
9234
+ return;
9235
+ if (fields[name] !== undefined)
9236
+ lx.error(METHOD_VAL_IS_FIELD, { ...errCtx, val, name }, fixTo(`$${name}`, `.${name}`));
9237
+ else
9238
+ reportUnknownName(lx, METHOD_VAL_NOT_DEFINED, name, collectProtoMethodNames(proto), {
9239
+ ...errCtx,
9240
+ val
9241
+ });
9242
+ },
9243
+ SeqAccessVal({ val, recurse }) {
9244
+ recurse(val.seqVal);
9245
+ recurse(val.keyVal);
9246
+ },
9247
+ RequestVal({ lx, val, env, errCtx }) {
9248
+ if (env.scope.lookupRequest(val.name) === null)
9249
+ reportUnknownName(lx, UNKNOWN_REQUEST_NAME, val.name, scopeKeysAlong(env.scope, "reqsByName"), errCtx);
9250
+ },
9251
+ TypeVal({ lx, val, env, errCtx }) {
9252
+ if (env.scope.lookupComponent(val.name) === null)
9253
+ reportUnknownName(lx, UNKNOWN_COMPONENT_NAME, val.name, scopeKeysAlong(env.scope, "byName"), errCtx);
9254
+ },
9255
+ NameVal({ lx, val, errCtx, skipNameVal }) {
9256
+ if (!skipNameVal && !isKnownHandlerName(val.name))
9257
+ reportUnknownName(lx, UNKNOWN_HANDLER_ARG_NAME, val.name, KNOWN_HANDLER_NAMES, errCtx);
9258
+ },
9259
+ StrTplVal({ lx, val, errCtx, recurse }) {
9260
+ const vs = val.vals;
9261
+ const literal = val.toLiteralSource();
9262
+ if (literal !== null) {
9263
+ lx.hint(PLACEHOLDERLESS_TEMPLATE_STRING, { ...errCtx, literal }, fixTo(`$${literal}`, literal));
9264
+ } else if (vs.length === 1) {
9265
+ const simpler = String(vs[0]);
9266
+ lx.warn(REDUNDANT_TEMPLATE_STRING, { ...errCtx, simpler }, fixTo(`$'{${simpler}}'`, simpler));
9267
+ }
9268
+ for (const subVal of vs)
9269
+ recurse(subVal);
9270
+ },
9271
+ HandlerNameVal({ lx, val, env, errCtx }) {
9272
+ env.referencedAlters?.add(val.name);
9273
+ if (env.alter[val.name] === undefined)
9274
+ reportUnknownName(lx, ALT_HANDLER_NOT_DEFINED, val.name, Object.keys(env.alter), errCtx);
9275
+ },
9276
+ PredicateVal({ val, recurse }) {
9277
+ for (const arg of val.args)
9278
+ recurse(arg);
9279
+ },
9280
+ DynVal({ lx, val, env, errCtx }) {
9281
+ env.referencedDynamics?.add(val.name);
9282
+ if (env.dynamicMap[val.name] === undefined)
9283
+ reportUnknownName(lx, DYN_VAL_NOT_DEFINED, val.name, Object.keys(env.dynamicMap), errCtx);
9284
+ }
9285
+ };
9281
9286
  NODE_KIND_TO_CTX = {
9282
9287
  RenderTextNode: { originAttr: "<x text>" },
9283
9288
  RenderNode: { originAttr: "<x render>" },