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.
- package/dist/tutuca-cli.js +137 -132
- package/dist/tutuca-dev.ext.js +125 -118
- package/dist/tutuca-dev.js +125 -118
- package/dist/tutuca-dev.min.js +1 -1
- package/dist/tutuca-extra.ext.js +44 -44
- package/dist/tutuca-extra.js +44 -44
- package/dist/tutuca-extra.min.js +1 -1
- package/dist/tutuca.ext.js +44 -44
- package/dist/tutuca.js +44 -44
- package/dist/tutuca.min.js +1 -1
- package/package.json +1 -1
- package/skill/tutuca/core.md +47 -105
- package/skill/tutuca/testing.md +8 -1
- package/skill/tutuca-source/tutuca.ext.js +44 -44
package/dist/tutuca-cli.js
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
5845
|
-
|
|
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
|
-
|
|
5980
|
-
|
|
5981
|
-
|
|
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
|
-
|
|
5987
|
-
|
|
5988
|
-
|
|
5989
|
-
|
|
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
|
|
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 } }),
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6400
|
-
slot:
|
|
6401
|
-
text:
|
|
6402
|
-
render:
|
|
6403
|
-
"render-it":
|
|
6404
|
-
"render-each":
|
|
6405
|
-
show:
|
|
6406
|
-
hide:
|
|
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
|
|
8768
|
-
if (!
|
|
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 =
|
|
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
|
-
|
|
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
|
|
8936
|
-
|
|
8937
|
-
|
|
8938
|
-
|
|
8939
|
-
|
|
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",
|
|
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
|
-
|
|
9241
|
-
"unknown-
|
|
9242
|
-
"unknown-x-
|
|
9243
|
-
|
|
9244
|
-
|
|
9245
|
-
|
|
9246
|
-
|
|
9247
|
-
|
|
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>" },
|