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.
- package/dist/tutuca-cli.js +91 -85
- package/dist/tutuca-dev.ext.js +80 -73
- package/dist/tutuca-dev.js +80 -73
- package/dist/tutuca-dev.min.js +1 -1
- package/package.json +1 -1
package/dist/tutuca-cli.js
CHANGED
|
@@ -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
|
|
8767
|
-
if (!
|
|
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 =
|
|
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
|
-
|
|
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
|
|
8935
|
-
|
|
8936
|
-
|
|
8937
|
-
|
|
8938
|
-
|
|
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",
|
|
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
|
-
|
|
9240
|
-
"unknown-
|
|
9241
|
-
"unknown-x-
|
|
9242
|
-
|
|
9243
|
-
|
|
9244
|
-
|
|
9245
|
-
|
|
9246
|
-
|
|
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>" },
|
package/dist/tutuca-dev.ext.js
CHANGED
|
@@ -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
|
|
8207
|
-
"unknown-directive": KNOWN_DIRECTIVE_NAMES,
|
|
8208
|
-
"unknown-x-op": X_KNOWN_OP_NAMES,
|
|
8209
|
-
"unknown-x-attr":
|
|
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
|
|
8305
|
-
if (!
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
8493
|
-
|
|
8494
|
-
|
|
8495
|
-
|
|
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]
|
|
8498
|
-
|
|
8499
|
-
|
|
8500
|
-
}
|
|
8501
|
-
|
|
8502
|
-
}
|
|
8503
|
-
|
|
8504
|
-
|
|
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]
|
|
8507
|
-
|
|
8508
|
-
|
|
8509
|
-
}
|
|
8510
|
-
|
|
8511
|
-
|
|
8512
|
-
|
|
8513
|
-
|
|
8514
|
-
|
|
8515
|
-
|
|
8516
|
-
|
|
8517
|
-
|
|
8518
|
-
|
|
8519
|
-
|
|
8520
|
-
|
|
8521
|
-
if (scope.
|
|
8522
|
-
lx
|
|
8523
|
-
|
|
8524
|
-
|
|
8525
|
-
if (
|
|
8526
|
-
lx
|
|
8527
|
-
|
|
8528
|
-
|
|
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 },
|
|
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 },
|
|
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
|
-
|
|
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
|
|
8544
|
-
|
|
8545
|
-
|
|
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
|
-
|
|
8548
|
-
}
|
|
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
|
|
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>" },
|
package/dist/tutuca-dev.js
CHANGED
|
@@ -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
|
|
12357
|
-
"unknown-directive": KNOWN_DIRECTIVE_NAMES,
|
|
12358
|
-
"unknown-x-op": X_KNOWN_OP_NAMES,
|
|
12359
|
-
"unknown-x-attr":
|
|
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
|
|
12455
|
-
if (!
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
12643
|
-
|
|
12644
|
-
|
|
12645
|
-
|
|
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]
|
|
12648
|
-
|
|
12649
|
-
|
|
12650
|
-
}
|
|
12651
|
-
|
|
12652
|
-
}
|
|
12653
|
-
|
|
12654
|
-
|
|
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]
|
|
12657
|
-
|
|
12658
|
-
|
|
12659
|
-
}
|
|
12660
|
-
|
|
12661
|
-
|
|
12662
|
-
|
|
12663
|
-
|
|
12664
|
-
|
|
12665
|
-
|
|
12666
|
-
|
|
12667
|
-
|
|
12668
|
-
|
|
12669
|
-
|
|
12670
|
-
|
|
12671
|
-
if (scope.
|
|
12672
|
-
lx
|
|
12673
|
-
|
|
12674
|
-
|
|
12675
|
-
if (
|
|
12676
|
-
lx
|
|
12677
|
-
|
|
12678
|
-
|
|
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 },
|
|
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 },
|
|
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
|
-
|
|
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
|
|
12694
|
-
|
|
12695
|
-
|
|
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
|
-
|
|
12698
|
-
}
|
|
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
|
|
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>" },
|