@velarscript/web 0.27.0 → 0.27.2
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/analyzer.d.ts +21 -5
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +59 -6
- package/dist/analyzer.js.map +1 -1
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +38 -2
- package/dist/compiler.js.map +1 -1
- package/dist/elements.d.ts +9 -0
- package/dist/elements.d.ts.map +1 -1
- package/dist/elements.js +16 -0
- package/dist/elements.js.map +1 -1
- package/dist/emitter.js +2 -14
- package/dist/emitter.js.map +1 -1
- package/package.json +2 -2
package/dist/analyzer.d.ts
CHANGED
|
@@ -58,6 +58,8 @@ export declare class VelarWebAnalyzer extends Analyzer {
|
|
|
58
58
|
private readonly plainCallSpans;
|
|
59
59
|
/** D57 rule 138: `velar/web-test` is legal only where the browser runner looks. */
|
|
60
60
|
private readonly webModulePath;
|
|
61
|
+
/** The source coordinates used by mechanical JSX attribute rewrites. */
|
|
62
|
+
private readonly webSourceText;
|
|
61
63
|
/** D74: only props whose authors wrote a readonly contract receive prop-specific guidance. */
|
|
62
64
|
private explicitReadonlyPropBindings;
|
|
63
65
|
constructor(context?: AnalysisContext, extensions?: readonly CompilerAnalysisExtension[]);
|
|
@@ -483,6 +485,19 @@ export declare class VelarWebAnalyzer extends Analyzer {
|
|
|
483
485
|
private reportIndependentLookCollisions;
|
|
484
486
|
private analyzeComponentRef;
|
|
485
487
|
private analyzeNativeJsxAttribute;
|
|
488
|
+
/**
|
|
489
|
+
* A14: `condition ? "true" : "false"` is the expanded spelling of the Core
|
|
490
|
+
* text conversion `str(condition)`. Keep that conversion explicit at a DOM
|
|
491
|
+
* text boundary instead of teaching every attribute its own coercion rule.
|
|
492
|
+
*
|
|
493
|
+
* The rule does not reach component props or HTML bool-presence attributes.
|
|
494
|
+
* A string "false" keeps such an attribute present; accepting that spelling
|
|
495
|
+
* as canonical would hide a likely presence bug whose direct expression is
|
|
496
|
+
* the bool itself.
|
|
497
|
+
*/
|
|
498
|
+
private adviseNativeBooleanTextConversion;
|
|
499
|
+
/** Directives and compiler-owned control attributes do not use DOM text conversion. */
|
|
500
|
+
private plainNativeTextAttribute;
|
|
486
501
|
/**
|
|
487
502
|
* D90 coherence-3: DOM attribute names and ARIA are documented as checked
|
|
488
503
|
* surfaces, and nothing checked them — `className="panel"` compiled clean and
|
|
@@ -498,11 +513,12 @@ export declare class VelarWebAnalyzer extends Analyzer {
|
|
|
498
513
|
* the React / JavaScript-property spellings, the ARIA attribute names (ARIA,
|
|
499
514
|
* unlike HTML, admits no custom names), and the ARIA and role vocabularies.
|
|
500
515
|
*
|
|
501
|
-
* D61 bounds the value half.
|
|
502
|
-
*
|
|
503
|
-
*
|
|
504
|
-
*
|
|
505
|
-
*
|
|
516
|
+
* D61 bounds the value half. Every native attribute uses the same presence
|
|
517
|
+
* rule: false/null remove it, true writes an empty value, and strings carry
|
|
518
|
+
* literal text. A token vocabulary is therefore read only against a string
|
|
519
|
+
* literal; expression values are runtime questions. A14 separately shortens
|
|
520
|
+
* an explicit bool-to-text conditional to `str(bool)` when that rewrite is
|
|
521
|
+
* provably equivalent.
|
|
506
522
|
*
|
|
507
523
|
* Returns true when it reported, so the caller does not stack a value-shape
|
|
508
524
|
* message on an attribute whose name is already answered.
|
package/dist/analyzer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwD,KAAK,UAAU,EAA2C,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClK,OAAO,EACL,QAAQ,EAgBR,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,gCAAgC,EACrC,KAAK,UAAU,EAEf,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
|
package/dist/analyzer.js
CHANGED
|
@@ -7,7 +7,7 @@ import { collectLookStaticValues, evaluateLookStaticExpression, isLookStaticValu
|
|
|
7
7
|
import { keyframeCssValue } from "./keyframes.js";
|
|
8
8
|
import { byCodeUnit } from "./stable-order.js";
|
|
9
9
|
import { dynamicChildLeaves, JSX_SCALAR_TEXT_HINT } from "./emitter.js";
|
|
10
|
-
import { isWebCustomElementName, WEB_ARIA_ATTRIBUTES, WEB_ARIA_ENUMERATED_VALUES, WEB_ARIA_ROLES, WEB_ARIA_ROLE_SYNONYMS, WEB_MISSPELLED_ATTRIBUTES, WEB_NATIVE_ELEMENTS, } from "./elements.js";
|
|
10
|
+
import { isWebCustomElementName, WEB_ARIA_ATTRIBUTES, WEB_ARIA_ENUMERATED_VALUES, WEB_ARIA_ROLES, WEB_ARIA_ROLE_SYNONYMS, WEB_BOOL_PRESENCE_HTML_ATTRIBUTES, WEB_HTML_ELEMENTS, WEB_MISSPELLED_ATTRIBUTES, WEB_NATIVE_ELEMENTS, } from "./elements.js";
|
|
11
11
|
import { isWebExpression, isWebJsx, isWebKeyframes, isWebLook, isWebStatement, isWebUnit, } from "./ast.js";
|
|
12
12
|
import { isWebComponentConstructor, isWebComponentType, isWebComputedExport, isWebNodeType, normalizeWebComponentType, webComponentConstructor, webComponentHandle, webComponentIntrinsic, webComponentName, webNodeType, WEB_EVENT_TYPE_NAMES, WEB_OWNED_TYPE_NAMES, } from "./types.js";
|
|
13
13
|
// The canonical nominal identity of the Web RouteContext record. Route checks
|
|
@@ -1653,11 +1653,14 @@ export class VelarWebAnalyzer extends Analyzer {
|
|
|
1653
1653
|
plainCallSpans = new Map();
|
|
1654
1654
|
/** D57 rule 138: `velar/web-test` is legal only where the browser runner looks. */
|
|
1655
1655
|
webModulePath;
|
|
1656
|
+
/** The source coordinates used by mechanical JSX attribute rewrites. */
|
|
1657
|
+
webSourceText;
|
|
1656
1658
|
/** D74: only props whose authors wrote a readonly contract receive prop-specific guidance. */
|
|
1657
1659
|
explicitReadonlyPropBindings = new Map();
|
|
1658
1660
|
constructor(context = {}, extensions = []) {
|
|
1659
1661
|
super(context, extensions);
|
|
1660
1662
|
this.webModulePath = context.path ?? null;
|
|
1663
|
+
this.webSourceText = context.sourceText ?? "";
|
|
1661
1664
|
this.resources = context.resources ?? new Map();
|
|
1662
1665
|
const webImports = [...(context.extensionImports?.get("@velarscript/web") ?? [])];
|
|
1663
1666
|
this.importedLookStaticValues = new Map(webImports.filter((entry) => isLookStaticValue(entry[1])));
|
|
@@ -4167,10 +4170,59 @@ export class VelarWebAnalyzer extends Analyzer {
|
|
|
4167
4170
|
&& !isInvalidType(inferred) && !this.isJsxAttributeValue(inferred)) {
|
|
4168
4171
|
this.diagnostics.push(diagnostic("VEL5047", `Native JSX attributes require text, finite numbers, bool, enums, or null; received ${describeType(inferred)}`, attribute.span));
|
|
4169
4172
|
}
|
|
4173
|
+
if (!isInvalidType(inferred))
|
|
4174
|
+
this.adviseNativeBooleanTextConversion(expression.tag, attribute);
|
|
4170
4175
|
if (attribute.name.startsWith("on:click") && !["button", "a", "input", "select", "textarea", "summary"].includes(expression.tag)
|
|
4171
4176
|
&& !expression.attributes.some((item) => item.name === "role"))
|
|
4172
4177
|
this.diagnostics.push(diagnostic("VEL5023", `Clickable <${expression.tag}> requires an explicit role`, expression.span));
|
|
4173
4178
|
}
|
|
4179
|
+
/**
|
|
4180
|
+
* A14: `condition ? "true" : "false"` is the expanded spelling of the Core
|
|
4181
|
+
* text conversion `str(condition)`. Keep that conversion explicit at a DOM
|
|
4182
|
+
* text boundary instead of teaching every attribute its own coercion rule.
|
|
4183
|
+
*
|
|
4184
|
+
* The rule does not reach component props or HTML bool-presence attributes.
|
|
4185
|
+
* A string "false" keeps such an attribute present; accepting that spelling
|
|
4186
|
+
* as canonical would hide a likely presence bug whose direct expression is
|
|
4187
|
+
* the bool itself.
|
|
4188
|
+
*/
|
|
4189
|
+
adviseNativeBooleanTextConversion(tag, attribute) {
|
|
4190
|
+
if (!WEB_NATIVE_ELEMENTS.has(tag))
|
|
4191
|
+
return;
|
|
4192
|
+
const value = attribute.value;
|
|
4193
|
+
if (!value || typeof value === "string" || !this.plainNativeTextAttribute(tag, attribute.name))
|
|
4194
|
+
return;
|
|
4195
|
+
const written = this.webSourceText.slice(value.span.start, value.span.end);
|
|
4196
|
+
if (written.length === 0)
|
|
4197
|
+
return;
|
|
4198
|
+
if (value.kind === "ConditionalExpression"
|
|
4199
|
+
&& value.thenValue.kind === "LiteralExpression" && value.thenValue.value === "true"
|
|
4200
|
+
&& value.elseValue.kind === "LiteralExpression" && value.elseValue.value === "false") {
|
|
4201
|
+
if (this.expandAliases(this.inferredExpressionType(value.condition)).kind !== "bool")
|
|
4202
|
+
return;
|
|
4203
|
+
const replacement = this.webSourceText.slice(value.condition.span.start, value.condition.span.end);
|
|
4204
|
+
if (!replacement)
|
|
4205
|
+
return;
|
|
4206
|
+
// The condition is copied verbatim into str(...), so comments inside it
|
|
4207
|
+
// survive. Only comments in discarded punctuation/branches make the
|
|
4208
|
+
// mechanical rewrite unsafe.
|
|
4209
|
+
const omitted = `${this.webSourceText.slice(value.span.start, value.condition.span.start)}${this.webSourceText.slice(value.condition.span.end, value.span.end)}`;
|
|
4210
|
+
this.advise("A14", `Native attribute '${attribute.name}' spells this bool as text; write the equivalent str(condition) conversion directly`, value.span, omitted.includes("//") || omitted.includes("/*")
|
|
4211
|
+
? undefined
|
|
4212
|
+
: mechanicalFix(value.span, `str(${replacement})`, `Convert the bool with str() for '${attribute.name}'`));
|
|
4213
|
+
}
|
|
4214
|
+
}
|
|
4215
|
+
/** Directives and compiler-owned control attributes do not use DOM text conversion. */
|
|
4216
|
+
plainNativeTextAttribute(tag, name) {
|
|
4217
|
+
if (WEB_MISSPELLED_ATTRIBUTES.has(name) || /^aria[A-Z]/u.test(name))
|
|
4218
|
+
return false;
|
|
4219
|
+
if (name.startsWith("aria-") && !WEB_ARIA_ATTRIBUTES.has(name))
|
|
4220
|
+
return false;
|
|
4221
|
+
if (WEB_HTML_ELEMENTS.has(tag) && WEB_BOOL_PRESENCE_HTML_ATTRIBUTES.has(name.toLowerCase()))
|
|
4222
|
+
return false;
|
|
4223
|
+
return name !== "class" && name !== "host" && name !== "key" && name !== "look" && name !== "ref"
|
|
4224
|
+
&& name !== "style" && !/^(?:bind|class|look|on|style|unsafe):/u.test(name) && !/^on/iu.test(name);
|
|
4225
|
+
}
|
|
4174
4226
|
/**
|
|
4175
4227
|
* D90 coherence-3: DOM attribute names and ARIA are documented as checked
|
|
4176
4228
|
* surfaces, and nothing checked them — `className="panel"` compiled clean and
|
|
@@ -4186,11 +4238,12 @@ export class VelarWebAnalyzer extends Analyzer {
|
|
|
4186
4238
|
* the React / JavaScript-property spellings, the ARIA attribute names (ARIA,
|
|
4187
4239
|
* unlike HTML, admits no custom names), and the ARIA and role vocabularies.
|
|
4188
4240
|
*
|
|
4189
|
-
* D61 bounds the value half.
|
|
4190
|
-
*
|
|
4191
|
-
*
|
|
4192
|
-
*
|
|
4193
|
-
*
|
|
4241
|
+
* D61 bounds the value half. Every native attribute uses the same presence
|
|
4242
|
+
* rule: false/null remove it, true writes an empty value, and strings carry
|
|
4243
|
+
* literal text. A token vocabulary is therefore read only against a string
|
|
4244
|
+
* literal; expression values are runtime questions. A14 separately shortens
|
|
4245
|
+
* an explicit bool-to-text conditional to `str(bool)` when that rewrite is
|
|
4246
|
+
* provably equivalent.
|
|
4194
4247
|
*
|
|
4195
4248
|
* Returns true when it reported, so the caller does not stack a value-shape
|
|
4196
4249
|
* message on an attribute whose name is already answered.
|