@velarscript/web 0.27.3 → 0.27.4

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.
@@ -393,6 +393,19 @@ export declare class VelarWebAnalyzer extends Analyzer {
393
393
  private analyzeLookValue;
394
394
  /** Whether this value is written as a call to the module's `token` builder, alias included. */
395
395
  private isLookTokenCall;
396
+ /**
397
+ * A complete CSS filter function whose arguments fit the checked Look
398
+ * builders has one equivalent source spelling. The parser deliberately
399
+ * stops at the first function or argument grammar it cannot prove, leaving
400
+ * arbitrary CSS and externally defined filter functions as ordinary text.
401
+ */
402
+ private adviseLookFilterSpelling;
403
+ /** Uses an existing alias when present and lists only builders the fix must import. */
404
+ private localizeLookBuilderCall;
405
+ /** Rewrites either a Look entry expression or the synthetic value of a JSX Look directive. */
406
+ private lookBuilderRewrite;
407
+ /** Adds missing builders to the module's one velar/look import in stable order. */
408
+ private lookBuilderImportEdit;
396
409
  /** How this module spells a call to the token builder, honouring an aliased import. */
397
410
  private lookTokenCallText;
398
411
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
package/dist/analyzer.js CHANGED
@@ -72,6 +72,7 @@ const lookColor = { kind: "named", name: "Color" };
72
72
  const lookImage = { kind: "named", name: "Image" };
73
73
  const lookBorder = { kind: "named", name: "Border" };
74
74
  const lookShadow = { kind: "named", name: "Shadow" };
75
+ const lookFilter = { kind: "named", name: "Filter" };
75
76
  const lookDuration = { kind: "named", name: "Duration" };
76
77
  const lookAngle = { kind: "named", name: "Angle" };
77
78
  const lookTrackList = { kind: "named", name: "TrackList" };
@@ -101,7 +102,7 @@ const lookPropertyType = (kind) => {
101
102
  case "shadow": return { kind: "union", members: [lookShadow, stringType] };
102
103
  case "track": return { kind: "union", members: [lookTrackList, stringType] };
103
104
  case "transition": return { kind: "union", members: [lookTransition, stringType] };
104
- case "filter":
105
+ case "filter": return { kind: "union", members: [lookFilter, stringType] };
105
106
  case "keyword":
106
107
  case "text":
107
108
  case "transform":
@@ -428,6 +429,147 @@ function lookShorthandStringGuidance(name, value) {
428
429
  }
429
430
  return null;
430
431
  }
432
+ const lookSimpleFilterBuilders = new Map([
433
+ ["blur", { builder: "blur", argument: "length" }],
434
+ ["brightness", { builder: "brightness", argument: "number" }],
435
+ ["contrast", { builder: "contrast", argument: "number" }],
436
+ ["grayscale", { builder: "grayscale", argument: "number" }],
437
+ ["hue-rotate", { builder: "hueRotate", argument: "angle" }],
438
+ ["invert", { builder: "invert", argument: "number" }],
439
+ ["opacity", { builder: "filterOpacity", argument: "number" }],
440
+ ["saturate", { builder: "saturate", argument: "number" }],
441
+ ["sepia", { builder: "sepia", argument: "number" }],
442
+ ]);
443
+ function cssFunctionValues(text) {
444
+ const values = [];
445
+ let cursor = 0;
446
+ while (cursor < text.length) {
447
+ while (cursor < text.length && /\s/u.test(text[cursor]))
448
+ cursor += 1;
449
+ if (cursor === text.length)
450
+ break;
451
+ const matched = /^([a-z-]+)\(/iu.exec(text.slice(cursor));
452
+ if (!matched)
453
+ return null;
454
+ const name = matched[1].toLowerCase();
455
+ const start = cursor + matched[0].length;
456
+ let depth = 1;
457
+ let quote = null;
458
+ let escaped = false;
459
+ cursor = start;
460
+ while (cursor < text.length && depth > 0) {
461
+ const character = text[cursor];
462
+ if (escaped)
463
+ escaped = false;
464
+ else if (quote && character === "\\")
465
+ escaped = true;
466
+ else if (quote && character === quote)
467
+ quote = null;
468
+ else if (!quote && (character === "\"" || character === "'"))
469
+ quote = character;
470
+ else if (!quote && character === "(")
471
+ depth += 1;
472
+ else if (!quote && character === ")")
473
+ depth -= 1;
474
+ cursor += 1;
475
+ }
476
+ if (depth !== 0 || quote)
477
+ return null;
478
+ values.push({ name, arguments: text.slice(start, cursor - 1).trim() });
479
+ if (cursor < text.length && !/\s/u.test(text[cursor]))
480
+ return null;
481
+ }
482
+ return values.length > 0 ? values : null;
483
+ }
484
+ function topLevelWords(text) {
485
+ const words = [];
486
+ let start = 0;
487
+ let depth = 0;
488
+ for (let cursor = 0; cursor <= text.length; cursor += 1) {
489
+ const character = text[cursor];
490
+ if (character === "(")
491
+ depth += 1;
492
+ else if (character === ")") {
493
+ depth -= 1;
494
+ if (depth < 0)
495
+ return null;
496
+ }
497
+ if ((character === undefined || /\s/u.test(character)) && depth === 0) {
498
+ const word = text.slice(start, cursor).trim();
499
+ if (word)
500
+ words.push(word);
501
+ start = cursor + 1;
502
+ }
503
+ }
504
+ return depth === 0 ? words : null;
505
+ }
506
+ function filterLength(text) {
507
+ return /^(?:0|\+?(?:\d+(?:\.\d+)?|\.\d+)(?:px|rem|em|vw|vh|vmin|vmax))$/u.test(text)
508
+ ? lookBuilderToken(text)
509
+ : null;
510
+ }
511
+ function filterNumericArgumentsHold(builder, values) {
512
+ const ranges = LOOK_BUILDER_NUMERIC_RANGES.get(builder);
513
+ return values.every((value, index) => {
514
+ const range = ranges?.[index];
515
+ const numeric = Number(value);
516
+ return Number.isFinite(numeric) && (!range || (numeric >= range[1] && numeric <= range[2]));
517
+ });
518
+ }
519
+ function filterColor(text) {
520
+ if (/^#[0-9a-f]{3,8}$/iu.test(text) || /^[a-z]+$/iu.test(text)) {
521
+ return { call: `color(${JSON.stringify(text)})`, builders: ["color"] };
522
+ }
523
+ const functional = /^(rgb|rgba)\((.*)\)$/iu.exec(text);
524
+ if (!functional)
525
+ return null;
526
+ const channels = functional[2].split(",").map((channel) => channel.trim());
527
+ const expected = functional[1].toLowerCase() === "rgb" ? 3 : 4;
528
+ if (channels.length !== expected || channels.some((channel) => !/^\+?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(channel)))
529
+ return null;
530
+ const builder = functional[1].toLowerCase();
531
+ if (!filterNumericArgumentsHold(builder, channels))
532
+ return null;
533
+ return { call: `${builder}(${channels.join(", ")})`, builders: [builder] };
534
+ }
535
+ function filterFunctionRewrite(value) {
536
+ const simple = lookSimpleFilterBuilders.get(value.name);
537
+ if (simple) {
538
+ const argument = simple.argument === "length"
539
+ ? filterLength(value.arguments)
540
+ : simple.argument === "angle"
541
+ ? (/^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:deg|turn)$/u.test(value.arguments) ? value.arguments : null)
542
+ : (/^\+?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(value.arguments)
543
+ && filterNumericArgumentsHold(simple.builder, [value.arguments]) ? value.arguments : null);
544
+ return argument === null ? null : { call: `${simple.builder}(${argument})`, builders: [simple.builder] };
545
+ }
546
+ if (value.name !== "drop-shadow")
547
+ return null;
548
+ const words = topLevelWords(value.arguments);
549
+ if (!words || words.length !== 4)
550
+ return null;
551
+ const lengths = words.slice(0, 3).map(filterLength);
552
+ const color = filterColor(words[3]);
553
+ if (lengths.some((length) => length === null) || !color)
554
+ return null;
555
+ return {
556
+ call: `dropShadow(${lengths.join(", ")}, ${color.call})`,
557
+ builders: ["dropShadow", ...color.builders],
558
+ };
559
+ }
560
+ function lookFilterRewrite(text) {
561
+ const functions = cssFunctionValues(text.trim());
562
+ if (!functions)
563
+ return null;
564
+ const rewritten = functions.map(filterFunctionRewrite);
565
+ if (rewritten.some((item) => item === null))
566
+ return null;
567
+ const calls = rewritten;
568
+ const builders = [...new Set(calls.flatMap((item) => item.builders))];
569
+ if (calls.length === 1)
570
+ return { call: calls[0].call, builders };
571
+ return { call: `filters(${calls.map((item) => item.call).join(", ")})`, builders: ["filters", ...builders] };
572
+ }
431
573
  /**
432
574
  * D104 rule 2 — what a refusal says when two entries in one scope write the
433
575
  * same CSS declaration. Written once because two positions raise it: a Look
@@ -3090,10 +3232,15 @@ export class VelarWebAnalyzer extends Analyzer {
3090
3232
  if (range && literal !== null && (literal < range[1] || literal > range[2])) {
3091
3233
  this.diagnostics.push(diagnostic("VEL5042", `${range[0]} must be from ${range[1]} through ${range[2]}; ${builder} received ${literal}`, argument.span));
3092
3234
  }
3235
+ const nonNegativeBlur = (builder === "blur" && position === 0) || (builder === "dropShadow" && position === 2);
3236
+ if (nonNegativeBlur && folded?.kind === "unit" && folded.value < 0) {
3237
+ this.diagnostics.push(diagnostic("VEL5042", `${builder} blur cannot be negative`, argument.span));
3238
+ }
3093
3239
  // LOK-D3, builder half: a unitless number in a length position is dead
3094
3240
  // CSS exactly as it is on a property. Zero is the one unitless length.
3095
3241
  if (LOOK_LENGTH_BUILDERS.has(builder) && literal !== null && literal !== 0
3096
- && !(builder === "border" && position !== 0) && !(builder === "shadow" && position === 5)) {
3242
+ && !(builder === "border" && position !== 0) && !(builder === "shadow" && position === 5)
3243
+ && !(builder === "dropShadow" && position === 3)) {
3097
3244
  this.diagnostics.push(diagnostic("VEL5042", `${builder} composes CSS lengths, so ${literal} requires a unit; write a unit value such as ${literal}px or ${literal}rem (only 0 is unitless)`, argument.span));
3098
3245
  }
3099
3246
  if (builder === "border" && position === 2 && argument.kind === "LiteralExpression" && typeof argument.value === "string"
@@ -3118,6 +3265,9 @@ export class VelarWebAnalyzer extends Analyzer {
3118
3265
  if (builder === "tracks" && expression.arguments.length > 1024) {
3119
3266
  this.diagnostics.push(diagnostic("VEL5042", "tracks cannot contain more than 1024 values", expression.span));
3120
3267
  }
3268
+ if (builder === "filters" && expression.arguments.length > 64) {
3269
+ this.diagnostics.push(diagnostic("VEL5042", "filters cannot compose more than 64 values", expression.span));
3270
+ }
3121
3271
  }
3122
3272
  /**
3123
3273
  * D103 rules 1 and 5 — what a checked token reference has to be at the site
@@ -3196,15 +3346,7 @@ export class VelarWebAnalyzer extends Analyzer {
3196
3346
  }
3197
3347
  /** The one edit that gives this module a `token` import, in the shape D103's migration needs. */
3198
3348
  lookTokenImportEdit() {
3199
- const site = this.lookImport ?? { declaration: null, insertAt: 0, leadingBlankLine: true };
3200
- const specifiers = [...(site.declaration?.specifiers ?? []), { imported: "token", local: "token" }];
3201
- const line = `import {${[...specifiers]
3202
- .sort((left, right) => byCodeUnit(left.imported, right.imported))
3203
- .map((specifier) => specifier.imported === specifier.local ? specifier.imported : `${specifier.imported} as ${specifier.local}`)
3204
- .join(", ")}} from "velar/look"`;
3205
- if (site.declaration)
3206
- return { span: site.declaration.span, text: line };
3207
- return { span: { start: site.insertAt, end: site.insertAt }, text: site.leadingBlankLine ? `${line}\n\n` : `\n${line}` };
3349
+ return this.lookBuilderImportEdit(["token"]);
3208
3350
  }
3209
3351
  checkAnimateBuilderCall(expression) {
3210
3352
  const argument = (name, position) => {
@@ -3401,6 +3543,7 @@ export class VelarWebAnalyzer extends Analyzer {
3401
3543
  return false;
3402
3544
  }
3403
3545
  const site = { property: name, entrySpan, directive };
3546
+ this.adviseLookFilterSpelling(name, value, site);
3404
3547
  this.adviseLookTokenSpelling(name, value, site);
3405
3548
  if (!this.validateLookStringVocabulary(name, value, undefined, site))
3406
3549
  return false;
@@ -3411,6 +3554,63 @@ export class VelarWebAnalyzer extends Analyzer {
3411
3554
  return value.kind === "CallExpression" && value.callee.kind === "IdentifierExpression"
3412
3555
  && this.lookBuilderNames.get(value.callee.name) === "token";
3413
3556
  }
3557
+ /**
3558
+ * A complete CSS filter function whose arguments fit the checked Look
3559
+ * builders has one equivalent source spelling. The parser deliberately
3560
+ * stops at the first function or argument grammar it cannot prove, leaving
3561
+ * arbitrary CSS and externally defined filter functions as ordinary text.
3562
+ */
3563
+ adviseLookFilterSpelling(name, value, site) {
3564
+ if (LOOK_PROPERTY_VALUE_KINDS.get(name) !== "filter")
3565
+ return;
3566
+ if (value.kind !== "LiteralExpression" || typeof value.value !== "string")
3567
+ return;
3568
+ const rewrite = lookFilterRewrite(value.value);
3569
+ if (!rewrite)
3570
+ return;
3571
+ const localized = this.localizeLookBuilderCall(rewrite);
3572
+ this.advise("A16", `Look property '${name}' accepts CSS filter text, but this complete filter list has the checked equivalent ${localized.call}`, value.span, mechanicalEdits(this.lookBuilderRewrite(value, localized.call, site, localized.missingImports), `Use ${localized.call}`));
3573
+ }
3574
+ /** Uses an existing alias when present and lists only builders the fix must import. */
3575
+ localizeLookBuilderCall(rewrite) {
3576
+ let call = rewrite.call;
3577
+ const missingImports = [];
3578
+ for (const builder of rewrite.builders) {
3579
+ const imported = [...this.lookBuilderNames].find(([, candidate]) => candidate === builder);
3580
+ const local = imported?.[0] ?? builder;
3581
+ if (!imported)
3582
+ missingImports.push(builder);
3583
+ call = call.replace(new RegExp(`\\b${builder}(?=\\()`, "gu"), local);
3584
+ }
3585
+ return { call, missingImports };
3586
+ }
3587
+ /** Rewrites either a Look entry expression or the synthetic value of a JSX Look directive. */
3588
+ lookBuilderRewrite(value, call, site, missingImports) {
3589
+ const wholeAttribute = site.directive !== null
3590
+ && value.span.start === site.entrySpan.start && value.span.end === site.entrySpan.end;
3591
+ const edit = {
3592
+ span: value.span,
3593
+ text: wholeAttribute ? `${site.directive}:${site.property}={${call}}` : call,
3594
+ };
3595
+ return missingImports.length === 0 ? [edit] : [this.lookBuilderImportEdit(missingImports), edit];
3596
+ }
3597
+ /** Adds missing builders to the module's one velar/look import in stable order. */
3598
+ lookBuilderImportEdit(builders) {
3599
+ const site = this.lookImport ?? { declaration: null, insertAt: 0, leadingBlankLine: true };
3600
+ const existing = site.declaration?.specifiers ?? [];
3601
+ const imported = new Set(existing.map((specifier) => specifier.imported));
3602
+ const specifiers = [
3603
+ ...existing,
3604
+ ...builders.filter((builder) => !imported.has(builder)).map((builder) => ({ imported: builder, local: builder })),
3605
+ ];
3606
+ const line = `import {${specifiers
3607
+ .sort((left, right) => byCodeUnit(left.imported, right.imported))
3608
+ .map((specifier) => specifier.imported === specifier.local ? specifier.imported : `${specifier.imported} as ${specifier.local}`)
3609
+ .join(", ")}} from "velar/look"`;
3610
+ if (site.declaration)
3611
+ return { span: site.declaration.span, text: line };
3612
+ return { span: { start: site.insertAt, end: site.insertAt }, text: site.leadingBlankLine ? `${line}\n\n` : `\n${line}` };
3613
+ }
3414
3614
  /** How this module spells a call to the token builder, honouring an aliased import. */
3415
3615
  lookTokenCallText(referenced) {
3416
3616
  const local = [...this.lookBuilderNames].find(([, builder]) => builder === "token")?.[0] ?? null;