tutuca 0.9.69 → 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.
@@ -8763,9 +8763,10 @@ function checkParseIssues(lx, view) {
8763
8763
  if (!issues)
8764
8764
  return;
8765
8765
  for (const { kind, info } of issues) {
8766
- const id = PARSE_ISSUE_KIND_TO_LINT_ID[kind];
8767
- if (!id)
8766
+ const rule = PARSE_ISSUES[kind];
8767
+ if (!rule)
8768
8768
  continue;
8769
+ const id = rule.id;
8769
8770
  if (kind === "bad-value") {
8770
8771
  const detected = classifyBadValue(info.value);
8771
8772
  if (detected) {
@@ -8773,15 +8774,13 @@ function checkParseIssues(lx, view) {
8773
8774
  continue;
8774
8775
  }
8775
8776
  }
8776
- const atPrefixKnown = AT_PREFIX_HINT_KNOWN_BY_KIND[kind];
8777
+ const atPrefixKnown = rule.atPrefix;
8777
8778
  const isAtPrefixedTypo = atPrefixKnown && info.name?.startsWith("@") && atPrefixKnown.has(info.name.slice(1));
8778
8779
  let suggestion = null;
8779
8780
  if (isAtPrefixedTypo) {
8780
8781
  suggestion = { kind: "drop-prefix", from: info.name, to: info.name.slice(1) };
8781
- } else {
8782
- const candidates = PARSE_ISSUE_KIND_TO_KNOWN_NAMES[kind];
8783
- if (candidates)
8784
- suggestion = replaceNameSuggestion(info.name, candidates);
8782
+ } else if (rule.candidates) {
8783
+ suggestion = replaceNameSuggestion(info.name, rule.candidates);
8785
8784
  }
8786
8785
  lx.error(id, info, suggestion);
8787
8786
  if (isAtPrefixedTypo) {
@@ -8930,70 +8929,15 @@ function checkEventHandlersHaveImpls(lx, Comp, referencedInputs) {
8930
8929
  });
8931
8930
  }
8932
8931
  }
8932
+ function reportUnknownName(lx, code, name, candidates, info) {
8933
+ lx.error(code, { ...info, name }, replaceNameSuggestion(name, candidates));
8934
+ }
8933
8935
  function checkConsistentAttrVal(lx, val, env, skipNameVal = false, errCtx = null) {
8934
- const { fields, proto, scope, alter } = env;
8935
- const valName = val?.constructor.name;
8936
- if (valName === "FieldVal") {
8937
- const { name } = val;
8938
- if (fields[name] === undefined) {
8939
- if (proto[name] !== undefined) {
8940
- lx.error(FIELD_VAL_IS_METHOD, { ...errCtx, val, name }, { kind: "rewrite", from: `.${name}`, to: `$${name}` });
8941
- } else {
8942
- lx.error(FIELD_VAL_NOT_DEFINED, { ...errCtx, val, name }, replaceNameSuggestion(name, Object.keys(fields)));
8943
- }
8944
- }
8945
- } else if (valName === "MethodVal") {
8946
- const { name } = val;
8947
- if (proto[name] === undefined) {
8948
- if (fields[name] !== undefined) {
8949
- lx.error(METHOD_VAL_IS_FIELD, { ...errCtx, val, name }, { kind: "rewrite", from: `$${name}`, to: `.${name}` });
8950
- } else {
8951
- lx.error(METHOD_VAL_NOT_DEFINED, { ...errCtx, val, name }, replaceNameSuggestion(name, collectProtoMethodNames(proto)));
8952
- }
8953
- }
8954
- } else if (valName === "SeqAccessVal") {
8955
- checkConsistentAttrVal(lx, val.seqVal, env, skipNameVal, errCtx);
8956
- checkConsistentAttrVal(lx, val.keyVal, env, skipNameVal, errCtx);
8957
- } else if (valName === "RequestVal") {
8958
- if (scope.lookupRequest(val.name) === null) {
8959
- lx.error(UNKNOWN_REQUEST_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, scopeKeysAlong(scope, "reqsByName")));
8960
- }
8961
- } else if (valName === "TypeVal") {
8962
- if (scope.lookupComponent(val.name) === null) {
8963
- lx.error(UNKNOWN_COMPONENT_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, scopeKeysAlong(scope, "byName")));
8964
- }
8965
- } else if (valName === "NameVal") {
8966
- if (!skipNameVal && !isKnownHandlerName(val.name)) {
8967
- lx.error(UNKNOWN_HANDLER_ARG_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, KNOWN_HANDLER_NAMES));
8968
- }
8969
- } else if (valName === "StrTplVal") {
8970
- const vs = val.vals;
8971
- const literal = val.toLiteralSource();
8972
- if (literal !== null) {
8973
- lx.hint(PLACEHOLDERLESS_TEMPLATE_STRING, { ...errCtx, literal }, { kind: "rewrite", from: `$${literal}`, to: literal });
8974
- } else if (vs.length === 1) {
8975
- const simpler = String(vs[0]);
8976
- lx.warn(REDUNDANT_TEMPLATE_STRING, { ...errCtx, simpler }, { kind: "rewrite", from: `$'{${simpler}}'`, to: simpler });
8977
- }
8978
- for (const subVal of vs) {
8979
- checkConsistentAttrVal(lx, subVal, env, skipNameVal, errCtx);
8980
- }
8981
- } else if (valName === "HandlerNameVal") {
8982
- env.referencedAlters?.add(val.name);
8983
- if (alter[val.name] === undefined) {
8984
- lx.error(ALT_HANDLER_NOT_DEFINED, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, Object.keys(alter)));
8985
- }
8986
- } else if (valName === "PredicateVal") {
8987
- for (const arg of val.args)
8988
- checkConsistentAttrVal(lx, arg, env, skipNameVal, errCtx);
8989
- } else if (valName === "DynVal") {
8990
- env.referencedDynamics?.add(val.name);
8991
- if (env.dynamicMap[val.name] === undefined) {
8992
- lx.error(DYN_VAL_NOT_DEFINED, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, Object.keys(env.dynamicMap)));
8993
- }
8994
- } else if (valName !== "ConstVal" && valName !== "BindVal") {
8995
- console.log(val);
8996
- }
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 });
8997
8941
  }
8998
8942
  function nodeCtxForNode(nodeKind) {
8999
8943
  return NODE_KIND_TO_CTX[nodeKind] ?? null;
@@ -9200,7 +9144,7 @@ class LintContext {
9200
9144
  this.reports.push({ id, info, level, context: { ...this.frame }, suggestion });
9201
9145
  }
9202
9146
  }
9203
- 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;
9204
9148
  var init_lint_check = __esm(() => {
9205
9149
  init_anode();
9206
9150
  init_htmllinter();
@@ -9220,12 +9164,6 @@ var init_lint_check = __esm(() => {
9220
9164
  "then",
9221
9165
  "else"
9222
9166
  ]);
9223
- PARSE_ISSUE_KIND_TO_LINT_ID = {
9224
- "unknown-directive": UNKNOWN_DIRECTIVE,
9225
- "unknown-x-op": UNKNOWN_X_OP,
9226
- "unknown-x-attr": UNKNOWN_X_ATTR,
9227
- "bad-value": BAD_VALUE
9228
- };
9229
9167
  X_KNOWN_OP_NAMES = new Set([
9230
9168
  "slot",
9231
9169
  "text",
@@ -9236,14 +9174,15 @@ var init_lint_check = __esm(() => {
9236
9174
  "hide"
9237
9175
  ]);
9238
9176
  X_KNOWN_ATTR_NAMES = new Set(["as", "when", "loop-with", "show", "hide"]);
9239
- AT_PREFIX_HINT_KNOWN_BY_KIND = {
9240
- "unknown-x-op": X_KNOWN_OP_NAMES,
9241
- "unknown-x-attr": X_KNOWN_ATTR_NAMES
9242
- };
9243
- PARSE_ISSUE_KIND_TO_KNOWN_NAMES = {
9244
- "unknown-directive": KNOWN_DIRECTIVE_NAMES,
9245
- "unknown-x-op": X_KNOWN_OP_NAMES,
9246
- "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 }
9247
9186
  };
9248
9187
  UNSUPPORTED_EXPR_GUIDANCE = {
9249
9188
  "legacy-template": "Unquoted {...} string templates are no longer supported. Wrap the value in $'...', e.g. $'flex {.color}'.",
@@ -9277,6 +9216,73 @@ var init_lint_check = __esm(() => {
9277
9216
  "ctx",
9278
9217
  "dragInfo"
9279
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
+ };
9280
9286
  NODE_KIND_TO_CTX = {
9281
9287
  RenderTextNode: { originAttr: "<x text>" },
9282
9288
  RenderNode: { originAttr: "<x render>" },
@@ -8180,12 +8180,6 @@ var REDUNDANT_TEMPLATE_STRING = "REDUNDANT_TEMPLATE_STRING";
8180
8180
  var PLACEHOLDERLESS_TEMPLATE_STRING = "PLACEHOLDERLESS_TEMPLATE_STRING";
8181
8181
  var UNKNOWN_COMPONENT_SPEC_KEY = "UNKNOWN_COMPONENT_SPEC_KEY";
8182
8182
  var COMP_FIELD_BAD_SHAPE = "COMP_FIELD_BAD_SHAPE";
8183
- var PARSE_ISSUE_KIND_TO_LINT_ID = {
8184
- "unknown-directive": UNKNOWN_DIRECTIVE,
8185
- "unknown-x-op": UNKNOWN_X_OP,
8186
- "unknown-x-attr": UNKNOWN_X_ATTR,
8187
- "bad-value": BAD_VALUE
8188
- };
8189
8183
  var X_KNOWN_OP_NAMES = new Set([
8190
8184
  "slot",
8191
8185
  "text",
@@ -8196,17 +8190,18 @@ var X_KNOWN_OP_NAMES = new Set([
8196
8190
  "hide"
8197
8191
  ]);
8198
8192
  var X_KNOWN_ATTR_NAMES = new Set(["as", "when", "loop-with", "show", "hide"]);
8199
- var AT_PREFIX_HINT_KNOWN_BY_KIND = {
8200
- "unknown-x-op": X_KNOWN_OP_NAMES,
8201
- "unknown-x-attr": X_KNOWN_ATTR_NAMES
8202
- };
8203
8193
  var LEVEL_WARN2 = "warn";
8204
8194
  var LEVEL_ERROR2 = "error";
8205
8195
  var LEVEL_HINT = "hint";
8206
- var PARSE_ISSUE_KIND_TO_KNOWN_NAMES = {
8207
- "unknown-directive": KNOWN_DIRECTIVE_NAMES,
8208
- "unknown-x-op": X_KNOWN_OP_NAMES,
8209
- "unknown-x-attr": X_KNOWN_ATTR_NAMES
8196
+ var PARSE_ISSUES = {
8197
+ "unknown-directive": { id: UNKNOWN_DIRECTIVE, candidates: KNOWN_DIRECTIVE_NAMES },
8198
+ "unknown-x-op": { id: UNKNOWN_X_OP, candidates: X_KNOWN_OP_NAMES, atPrefix: X_KNOWN_OP_NAMES },
8199
+ "unknown-x-attr": {
8200
+ id: UNKNOWN_X_ATTR,
8201
+ candidates: X_KNOWN_ATTR_NAMES,
8202
+ atPrefix: X_KNOWN_ATTR_NAMES
8203
+ },
8204
+ "bad-value": { id: BAD_VALUE }
8210
8205
  };
8211
8206
  function collectProtoMethodNames(proto) {
8212
8207
  const out = [];
@@ -8301,9 +8296,10 @@ function checkParseIssues(lx, view) {
8301
8296
  if (!issues)
8302
8297
  return;
8303
8298
  for (const { kind, info } of issues) {
8304
- const id = PARSE_ISSUE_KIND_TO_LINT_ID[kind];
8305
- if (!id)
8299
+ const rule = PARSE_ISSUES[kind];
8300
+ if (!rule)
8306
8301
  continue;
8302
+ const id = rule.id;
8307
8303
  if (kind === "bad-value") {
8308
8304
  const detected = classifyBadValue(info.value);
8309
8305
  if (detected) {
@@ -8311,15 +8307,13 @@ function checkParseIssues(lx, view) {
8311
8307
  continue;
8312
8308
  }
8313
8309
  }
8314
- const atPrefixKnown = AT_PREFIX_HINT_KNOWN_BY_KIND[kind];
8310
+ const atPrefixKnown = rule.atPrefix;
8315
8311
  const isAtPrefixedTypo = atPrefixKnown && info.name?.startsWith("@") && atPrefixKnown.has(info.name.slice(1));
8316
8312
  let suggestion = null;
8317
8313
  if (isAtPrefixedTypo) {
8318
8314
  suggestion = { kind: "drop-prefix", from: info.name, to: info.name.slice(1) };
8319
- } else {
8320
- const candidates = PARSE_ISSUE_KIND_TO_KNOWN_NAMES[kind];
8321
- if (candidates)
8322
- suggestion = replaceNameSuggestion(info.name, candidates);
8315
+ } else if (rule.candidates) {
8316
+ suggestion = replaceNameSuggestion(info.name, rule.candidates);
8323
8317
  }
8324
8318
  lx.error(id, info, suggestion);
8325
8319
  if (isAtPrefixedTypo) {
@@ -8489,70 +8483,83 @@ function checkEventHandlersHaveImpls(lx, Comp, referencedInputs) {
8489
8483
  });
8490
8484
  }
8491
8485
  }
8492
- function checkConsistentAttrVal(lx, val, env, skipNameVal = false, errCtx = null) {
8493
- const { fields, proto, scope, alter } = env;
8494
- const valName = val?.constructor.name;
8495
- if (valName === "FieldVal") {
8486
+ var fixTo = (from, to) => ({ kind: "rewrite", from, to });
8487
+ function reportUnknownName(lx, code, name, candidates, info) {
8488
+ lx.error(code, { ...info, name }, replaceNameSuggestion(name, candidates));
8489
+ }
8490
+ var ATTR_VAL_CHECKERS = {
8491
+ FieldVal({ lx, val, env, errCtx }) {
8492
+ const { fields, proto } = env;
8496
8493
  const { name } = val;
8497
- if (fields[name] === undefined) {
8498
- if (proto[name] !== undefined) {
8499
- lx.error(FIELD_VAL_IS_METHOD, { ...errCtx, val, name }, { kind: "rewrite", from: `.${name}`, to: `$${name}` });
8500
- } else {
8501
- lx.error(FIELD_VAL_NOT_DEFINED, { ...errCtx, val, name }, replaceNameSuggestion(name, Object.keys(fields)));
8502
- }
8503
- }
8504
- } else if (valName === "MethodVal") {
8494
+ if (fields[name] !== undefined)
8495
+ return;
8496
+ if (proto[name] !== undefined)
8497
+ lx.error(FIELD_VAL_IS_METHOD, { ...errCtx, val, name }, fixTo(`.${name}`, `$${name}`));
8498
+ else
8499
+ reportUnknownName(lx, FIELD_VAL_NOT_DEFINED, name, Object.keys(fields), { ...errCtx, val });
8500
+ },
8501
+ MethodVal({ lx, val, env, errCtx }) {
8502
+ const { fields, proto } = env;
8505
8503
  const { name } = val;
8506
- if (proto[name] === undefined) {
8507
- if (fields[name] !== undefined) {
8508
- lx.error(METHOD_VAL_IS_FIELD, { ...errCtx, val, name }, { kind: "rewrite", from: `$${name}`, to: `.${name}` });
8509
- } else {
8510
- lx.error(METHOD_VAL_NOT_DEFINED, { ...errCtx, val, name }, replaceNameSuggestion(name, collectProtoMethodNames(proto)));
8511
- }
8512
- }
8513
- } else if (valName === "SeqAccessVal") {
8514
- checkConsistentAttrVal(lx, val.seqVal, env, skipNameVal, errCtx);
8515
- checkConsistentAttrVal(lx, val.keyVal, env, skipNameVal, errCtx);
8516
- } else if (valName === "RequestVal") {
8517
- if (scope.lookupRequest(val.name) === null) {
8518
- lx.error(UNKNOWN_REQUEST_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, scopeKeysAlong(scope, "reqsByName")));
8519
- }
8520
- } else if (valName === "TypeVal") {
8521
- if (scope.lookupComponent(val.name) === null) {
8522
- lx.error(UNKNOWN_COMPONENT_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, scopeKeysAlong(scope, "byName")));
8523
- }
8524
- } else if (valName === "NameVal") {
8525
- if (!skipNameVal && !isKnownHandlerName(val.name)) {
8526
- lx.error(UNKNOWN_HANDLER_ARG_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, KNOWN_HANDLER_NAMES));
8527
- }
8528
- } else if (valName === "StrTplVal") {
8504
+ if (proto[name] !== undefined)
8505
+ return;
8506
+ if (fields[name] !== undefined)
8507
+ lx.error(METHOD_VAL_IS_FIELD, { ...errCtx, val, name }, fixTo(`$${name}`, `.${name}`));
8508
+ else
8509
+ reportUnknownName(lx, METHOD_VAL_NOT_DEFINED, name, collectProtoMethodNames(proto), {
8510
+ ...errCtx,
8511
+ val
8512
+ });
8513
+ },
8514
+ SeqAccessVal({ val, recurse }) {
8515
+ recurse(val.seqVal);
8516
+ recurse(val.keyVal);
8517
+ },
8518
+ RequestVal({ lx, val, env, errCtx }) {
8519
+ if (env.scope.lookupRequest(val.name) === null)
8520
+ reportUnknownName(lx, UNKNOWN_REQUEST_NAME, val.name, scopeKeysAlong(env.scope, "reqsByName"), errCtx);
8521
+ },
8522
+ TypeVal({ lx, val, env, errCtx }) {
8523
+ if (env.scope.lookupComponent(val.name) === null)
8524
+ reportUnknownName(lx, UNKNOWN_COMPONENT_NAME, val.name, scopeKeysAlong(env.scope, "byName"), errCtx);
8525
+ },
8526
+ NameVal({ lx, val, errCtx, skipNameVal }) {
8527
+ if (!skipNameVal && !isKnownHandlerName(val.name))
8528
+ reportUnknownName(lx, UNKNOWN_HANDLER_ARG_NAME, val.name, KNOWN_HANDLER_NAMES, errCtx);
8529
+ },
8530
+ StrTplVal({ lx, val, errCtx, recurse }) {
8529
8531
  const vs = val.vals;
8530
8532
  const literal = val.toLiteralSource();
8531
8533
  if (literal !== null) {
8532
- lx.hint(PLACEHOLDERLESS_TEMPLATE_STRING, { ...errCtx, literal }, { kind: "rewrite", from: `$${literal}`, to: literal });
8534
+ lx.hint(PLACEHOLDERLESS_TEMPLATE_STRING, { ...errCtx, literal }, fixTo(`$${literal}`, literal));
8533
8535
  } else if (vs.length === 1) {
8534
8536
  const simpler = String(vs[0]);
8535
- lx.warn(REDUNDANT_TEMPLATE_STRING, { ...errCtx, simpler }, { kind: "rewrite", from: `$'{${simpler}}'`, to: simpler });
8536
- }
8537
- for (const subVal of vs) {
8538
- checkConsistentAttrVal(lx, subVal, env, skipNameVal, errCtx);
8537
+ lx.warn(REDUNDANT_TEMPLATE_STRING, { ...errCtx, simpler }, fixTo(`$'{${simpler}}'`, simpler));
8539
8538
  }
8540
- } else if (valName === "HandlerNameVal") {
8539
+ for (const subVal of vs)
8540
+ recurse(subVal);
8541
+ },
8542
+ HandlerNameVal({ lx, val, env, errCtx }) {
8541
8543
  env.referencedAlters?.add(val.name);
8542
- if (alter[val.name] === undefined) {
8543
- lx.error(ALT_HANDLER_NOT_DEFINED, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, Object.keys(alter)));
8544
- }
8545
- } else if (valName === "PredicateVal") {
8544
+ if (env.alter[val.name] === undefined)
8545
+ reportUnknownName(lx, ALT_HANDLER_NOT_DEFINED, val.name, Object.keys(env.alter), errCtx);
8546
+ },
8547
+ PredicateVal({ val, recurse }) {
8546
8548
  for (const arg of val.args)
8547
- checkConsistentAttrVal(lx, arg, env, skipNameVal, errCtx);
8548
- } else if (valName === "DynVal") {
8549
+ recurse(arg);
8550
+ },
8551
+ DynVal({ lx, val, env, errCtx }) {
8549
8552
  env.referencedDynamics?.add(val.name);
8550
- if (env.dynamicMap[val.name] === undefined) {
8551
- lx.error(DYN_VAL_NOT_DEFINED, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, Object.keys(env.dynamicMap)));
8552
- }
8553
- } else if (valName !== "ConstVal" && valName !== "BindVal") {
8554
- console.log(val);
8553
+ if (env.dynamicMap[val.name] === undefined)
8554
+ reportUnknownName(lx, DYN_VAL_NOT_DEFINED, val.name, Object.keys(env.dynamicMap), errCtx);
8555
8555
  }
8556
+ };
8557
+ function checkConsistentAttrVal(lx, val, env, skipNameVal = false, errCtx = null) {
8558
+ const check = ATTR_VAL_CHECKERS[val?.constructor.name];
8559
+ if (check === undefined)
8560
+ return;
8561
+ const recurse = (sub) => checkConsistentAttrVal(lx, sub, env, skipNameVal, errCtx);
8562
+ check({ lx, val, env, errCtx, skipNameVal, recurse });
8556
8563
  }
8557
8564
  var NODE_KIND_TO_CTX = {
8558
8565
  RenderTextNode: { originAttr: "<x text>" },
@@ -12330,12 +12330,6 @@ var REDUNDANT_TEMPLATE_STRING = "REDUNDANT_TEMPLATE_STRING";
12330
12330
  var PLACEHOLDERLESS_TEMPLATE_STRING = "PLACEHOLDERLESS_TEMPLATE_STRING";
12331
12331
  var UNKNOWN_COMPONENT_SPEC_KEY = "UNKNOWN_COMPONENT_SPEC_KEY";
12332
12332
  var COMP_FIELD_BAD_SHAPE = "COMP_FIELD_BAD_SHAPE";
12333
- var PARSE_ISSUE_KIND_TO_LINT_ID = {
12334
- "unknown-directive": UNKNOWN_DIRECTIVE,
12335
- "unknown-x-op": UNKNOWN_X_OP,
12336
- "unknown-x-attr": UNKNOWN_X_ATTR,
12337
- "bad-value": BAD_VALUE
12338
- };
12339
12333
  var X_KNOWN_OP_NAMES = new Set([
12340
12334
  "slot",
12341
12335
  "text",
@@ -12346,17 +12340,18 @@ var X_KNOWN_OP_NAMES = new Set([
12346
12340
  "hide"
12347
12341
  ]);
12348
12342
  var X_KNOWN_ATTR_NAMES = new Set(["as", "when", "loop-with", "show", "hide"]);
12349
- var AT_PREFIX_HINT_KNOWN_BY_KIND = {
12350
- "unknown-x-op": X_KNOWN_OP_NAMES,
12351
- "unknown-x-attr": X_KNOWN_ATTR_NAMES
12352
- };
12353
12343
  var LEVEL_WARN2 = "warn";
12354
12344
  var LEVEL_ERROR2 = "error";
12355
12345
  var LEVEL_HINT = "hint";
12356
- var PARSE_ISSUE_KIND_TO_KNOWN_NAMES = {
12357
- "unknown-directive": KNOWN_DIRECTIVE_NAMES,
12358
- "unknown-x-op": X_KNOWN_OP_NAMES,
12359
- "unknown-x-attr": X_KNOWN_ATTR_NAMES
12346
+ var PARSE_ISSUES = {
12347
+ "unknown-directive": { id: UNKNOWN_DIRECTIVE, candidates: KNOWN_DIRECTIVE_NAMES },
12348
+ "unknown-x-op": { id: UNKNOWN_X_OP, candidates: X_KNOWN_OP_NAMES, atPrefix: X_KNOWN_OP_NAMES },
12349
+ "unknown-x-attr": {
12350
+ id: UNKNOWN_X_ATTR,
12351
+ candidates: X_KNOWN_ATTR_NAMES,
12352
+ atPrefix: X_KNOWN_ATTR_NAMES
12353
+ },
12354
+ "bad-value": { id: BAD_VALUE }
12360
12355
  };
12361
12356
  function collectProtoMethodNames(proto) {
12362
12357
  const out = [];
@@ -12451,9 +12446,10 @@ function checkParseIssues(lx, view) {
12451
12446
  if (!issues)
12452
12447
  return;
12453
12448
  for (const { kind, info } of issues) {
12454
- const id = PARSE_ISSUE_KIND_TO_LINT_ID[kind];
12455
- if (!id)
12449
+ const rule = PARSE_ISSUES[kind];
12450
+ if (!rule)
12456
12451
  continue;
12452
+ const id = rule.id;
12457
12453
  if (kind === "bad-value") {
12458
12454
  const detected = classifyBadValue(info.value);
12459
12455
  if (detected) {
@@ -12461,15 +12457,13 @@ function checkParseIssues(lx, view) {
12461
12457
  continue;
12462
12458
  }
12463
12459
  }
12464
- const atPrefixKnown = AT_PREFIX_HINT_KNOWN_BY_KIND[kind];
12460
+ const atPrefixKnown = rule.atPrefix;
12465
12461
  const isAtPrefixedTypo = atPrefixKnown && info.name?.startsWith("@") && atPrefixKnown.has(info.name.slice(1));
12466
12462
  let suggestion = null;
12467
12463
  if (isAtPrefixedTypo) {
12468
12464
  suggestion = { kind: "drop-prefix", from: info.name, to: info.name.slice(1) };
12469
- } else {
12470
- const candidates = PARSE_ISSUE_KIND_TO_KNOWN_NAMES[kind];
12471
- if (candidates)
12472
- suggestion = replaceNameSuggestion(info.name, candidates);
12465
+ } else if (rule.candidates) {
12466
+ suggestion = replaceNameSuggestion(info.name, rule.candidates);
12473
12467
  }
12474
12468
  lx.error(id, info, suggestion);
12475
12469
  if (isAtPrefixedTypo) {
@@ -12639,70 +12633,83 @@ function checkEventHandlersHaveImpls(lx, Comp, referencedInputs) {
12639
12633
  });
12640
12634
  }
12641
12635
  }
12642
- function checkConsistentAttrVal(lx, val, env, skipNameVal = false, errCtx = null) {
12643
- const { fields, proto, scope, alter } = env;
12644
- const valName = val?.constructor.name;
12645
- if (valName === "FieldVal") {
12636
+ var fixTo = (from, to) => ({ kind: "rewrite", from, to });
12637
+ function reportUnknownName(lx, code, name, candidates, info) {
12638
+ lx.error(code, { ...info, name }, replaceNameSuggestion(name, candidates));
12639
+ }
12640
+ var ATTR_VAL_CHECKERS = {
12641
+ FieldVal({ lx, val, env, errCtx }) {
12642
+ const { fields, proto } = env;
12646
12643
  const { name } = val;
12647
- if (fields[name] === undefined) {
12648
- if (proto[name] !== undefined) {
12649
- lx.error(FIELD_VAL_IS_METHOD, { ...errCtx, val, name }, { kind: "rewrite", from: `.${name}`, to: `$${name}` });
12650
- } else {
12651
- lx.error(FIELD_VAL_NOT_DEFINED, { ...errCtx, val, name }, replaceNameSuggestion(name, Object.keys(fields)));
12652
- }
12653
- }
12654
- } else if (valName === "MethodVal") {
12644
+ if (fields[name] !== undefined)
12645
+ return;
12646
+ if (proto[name] !== undefined)
12647
+ lx.error(FIELD_VAL_IS_METHOD, { ...errCtx, val, name }, fixTo(`.${name}`, `$${name}`));
12648
+ else
12649
+ reportUnknownName(lx, FIELD_VAL_NOT_DEFINED, name, Object.keys(fields), { ...errCtx, val });
12650
+ },
12651
+ MethodVal({ lx, val, env, errCtx }) {
12652
+ const { fields, proto } = env;
12655
12653
  const { name } = val;
12656
- if (proto[name] === undefined) {
12657
- if (fields[name] !== undefined) {
12658
- lx.error(METHOD_VAL_IS_FIELD, { ...errCtx, val, name }, { kind: "rewrite", from: `$${name}`, to: `.${name}` });
12659
- } else {
12660
- lx.error(METHOD_VAL_NOT_DEFINED, { ...errCtx, val, name }, replaceNameSuggestion(name, collectProtoMethodNames(proto)));
12661
- }
12662
- }
12663
- } else if (valName === "SeqAccessVal") {
12664
- checkConsistentAttrVal(lx, val.seqVal, env, skipNameVal, errCtx);
12665
- checkConsistentAttrVal(lx, val.keyVal, env, skipNameVal, errCtx);
12666
- } else if (valName === "RequestVal") {
12667
- if (scope.lookupRequest(val.name) === null) {
12668
- lx.error(UNKNOWN_REQUEST_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, scopeKeysAlong(scope, "reqsByName")));
12669
- }
12670
- } else if (valName === "TypeVal") {
12671
- if (scope.lookupComponent(val.name) === null) {
12672
- lx.error(UNKNOWN_COMPONENT_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, scopeKeysAlong(scope, "byName")));
12673
- }
12674
- } else if (valName === "NameVal") {
12675
- if (!skipNameVal && !isKnownHandlerName(val.name)) {
12676
- lx.error(UNKNOWN_HANDLER_ARG_NAME, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, KNOWN_HANDLER_NAMES));
12677
- }
12678
- } else if (valName === "StrTplVal") {
12654
+ if (proto[name] !== undefined)
12655
+ return;
12656
+ if (fields[name] !== undefined)
12657
+ lx.error(METHOD_VAL_IS_FIELD, { ...errCtx, val, name }, fixTo(`$${name}`, `.${name}`));
12658
+ else
12659
+ reportUnknownName(lx, METHOD_VAL_NOT_DEFINED, name, collectProtoMethodNames(proto), {
12660
+ ...errCtx,
12661
+ val
12662
+ });
12663
+ },
12664
+ SeqAccessVal({ val, recurse }) {
12665
+ recurse(val.seqVal);
12666
+ recurse(val.keyVal);
12667
+ },
12668
+ RequestVal({ lx, val, env, errCtx }) {
12669
+ if (env.scope.lookupRequest(val.name) === null)
12670
+ reportUnknownName(lx, UNKNOWN_REQUEST_NAME, val.name, scopeKeysAlong(env.scope, "reqsByName"), errCtx);
12671
+ },
12672
+ TypeVal({ lx, val, env, errCtx }) {
12673
+ if (env.scope.lookupComponent(val.name) === null)
12674
+ reportUnknownName(lx, UNKNOWN_COMPONENT_NAME, val.name, scopeKeysAlong(env.scope, "byName"), errCtx);
12675
+ },
12676
+ NameVal({ lx, val, errCtx, skipNameVal }) {
12677
+ if (!skipNameVal && !isKnownHandlerName(val.name))
12678
+ reportUnknownName(lx, UNKNOWN_HANDLER_ARG_NAME, val.name, KNOWN_HANDLER_NAMES, errCtx);
12679
+ },
12680
+ StrTplVal({ lx, val, errCtx, recurse }) {
12679
12681
  const vs = val.vals;
12680
12682
  const literal = val.toLiteralSource();
12681
12683
  if (literal !== null) {
12682
- lx.hint(PLACEHOLDERLESS_TEMPLATE_STRING, { ...errCtx, literal }, { kind: "rewrite", from: `$${literal}`, to: literal });
12684
+ lx.hint(PLACEHOLDERLESS_TEMPLATE_STRING, { ...errCtx, literal }, fixTo(`$${literal}`, literal));
12683
12685
  } else if (vs.length === 1) {
12684
12686
  const simpler = String(vs[0]);
12685
- lx.warn(REDUNDANT_TEMPLATE_STRING, { ...errCtx, simpler }, { kind: "rewrite", from: `$'{${simpler}}'`, to: simpler });
12686
- }
12687
- for (const subVal of vs) {
12688
- checkConsistentAttrVal(lx, subVal, env, skipNameVal, errCtx);
12687
+ lx.warn(REDUNDANT_TEMPLATE_STRING, { ...errCtx, simpler }, fixTo(`$'{${simpler}}'`, simpler));
12689
12688
  }
12690
- } else if (valName === "HandlerNameVal") {
12689
+ for (const subVal of vs)
12690
+ recurse(subVal);
12691
+ },
12692
+ HandlerNameVal({ lx, val, env, errCtx }) {
12691
12693
  env.referencedAlters?.add(val.name);
12692
- if (alter[val.name] === undefined) {
12693
- lx.error(ALT_HANDLER_NOT_DEFINED, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, Object.keys(alter)));
12694
- }
12695
- } else if (valName === "PredicateVal") {
12694
+ if (env.alter[val.name] === undefined)
12695
+ reportUnknownName(lx, ALT_HANDLER_NOT_DEFINED, val.name, Object.keys(env.alter), errCtx);
12696
+ },
12697
+ PredicateVal({ val, recurse }) {
12696
12698
  for (const arg of val.args)
12697
- checkConsistentAttrVal(lx, arg, env, skipNameVal, errCtx);
12698
- } else if (valName === "DynVal") {
12699
+ recurse(arg);
12700
+ },
12701
+ DynVal({ lx, val, env, errCtx }) {
12699
12702
  env.referencedDynamics?.add(val.name);
12700
- if (env.dynamicMap[val.name] === undefined) {
12701
- lx.error(DYN_VAL_NOT_DEFINED, { ...errCtx, name: val.name }, replaceNameSuggestion(val.name, Object.keys(env.dynamicMap)));
12702
- }
12703
- } else if (valName !== "ConstVal" && valName !== "BindVal") {
12704
- console.log(val);
12703
+ if (env.dynamicMap[val.name] === undefined)
12704
+ reportUnknownName(lx, DYN_VAL_NOT_DEFINED, val.name, Object.keys(env.dynamicMap), errCtx);
12705
12705
  }
12706
+ };
12707
+ function checkConsistentAttrVal(lx, val, env, skipNameVal = false, errCtx = null) {
12708
+ const check = ATTR_VAL_CHECKERS[val?.constructor.name];
12709
+ if (check === undefined)
12710
+ return;
12711
+ const recurse = (sub) => checkConsistentAttrVal(lx, sub, env, skipNameVal, errCtx);
12712
+ check({ lx, val, env, errCtx, skipNameVal, recurse });
12706
12713
  }
12707
12714
  var NODE_KIND_TO_CTX = {
12708
12715
  RenderTextNode: { originAttr: "<x text>" },