@contentful/experience-design-system-cli 2.37.1-dev-build-2ec208d2.0 → 2.37.1-dev-build-daf63213.0
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/app.js +204 -695
- package/dist/index.js +317 -1747
- package/dist/package.json +1 -1
- package/package.json +3 -3
package/dist/app.js
CHANGED
|
@@ -9663,8 +9663,8 @@ function extractAccessorProperties(classDecl, applyRuntimeFieldDenylist = false)
|
|
|
9663
9663
|
accessors.set(name, entry);
|
|
9664
9664
|
}
|
|
9665
9665
|
for (const [name, { getter, setter }] of accessors) {
|
|
9666
|
-
const
|
|
9667
|
-
if (!
|
|
9666
|
+
const hasPropertyDecorator = getter?.getDecorators().some((decorator) => decorator.getName() === "property") || setter?.getDecorators().some((decorator) => decorator.getName() === "property");
|
|
9667
|
+
if (!hasPropertyDecorator && !(getter && setter))
|
|
9668
9668
|
continue;
|
|
9669
9669
|
const type = getter?.getReturnTypeNode()?.getText() ?? setter?.getParameters()[0]?.getTypeNode()?.getText() ?? "any";
|
|
9670
9670
|
const accessorNode = getter ?? setter;
|
|
@@ -12934,9 +12934,9 @@ function generateUlid(now = Date.now()) {
|
|
|
12934
12934
|
tsBytes[i] = n & 255;
|
|
12935
12935
|
n = Math.floor(n / 256);
|
|
12936
12936
|
}
|
|
12937
|
-
const
|
|
12937
|
+
const ts3 = encodeBase32(tsBytes, 10);
|
|
12938
12938
|
const rand = encodeBase32(randomBytes2(10), 16);
|
|
12939
|
-
return (
|
|
12939
|
+
return (ts3 + rand).toUpperCase();
|
|
12940
12940
|
}
|
|
12941
12941
|
|
|
12942
12942
|
// packages/experience-design-system-backend-pipeline/dist/src/persistence/src/runs/repositories/read-runs-file.js
|
|
@@ -15350,610 +15350,7 @@ async function runMapTokens(request) {
|
|
|
15350
15350
|
import { mkdir as mkdir4 } from "node:fs/promises";
|
|
15351
15351
|
import { relative as relative2 } from "node:path";
|
|
15352
15352
|
|
|
15353
|
-
// packages/experience-design-system-
|
|
15354
|
-
import { Node as Node10, Project as Project7 } from "ts-morph";
|
|
15355
|
-
|
|
15356
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/shared/helpers/tsx-shared.js
|
|
15357
|
-
import { Project as Project8 } from "ts-morph";
|
|
15358
|
-
|
|
15359
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/shared/helpers/tsx-node-utils.js
|
|
15360
|
-
import { Node as Node12, SyntaxKind as SyntaxKind7 } from "ts-morph";
|
|
15361
|
-
|
|
15362
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-workspace-imports.js
|
|
15363
|
-
import { Node as Node11 } from "ts-morph";
|
|
15364
|
-
|
|
15365
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-tsconfig-path.js
|
|
15366
|
-
import ts3 from "typescript";
|
|
15367
|
-
|
|
15368
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/shared/helpers/tsx-renderable-exports.js
|
|
15369
|
-
import { Node as Node13 } from "ts-morph";
|
|
15370
|
-
|
|
15371
|
-
// packages/experience-design-system-extraction/dist/src/extract/helpers/evidence/collect-jsx-component-references.js
|
|
15372
|
-
import { Node as Node15, SyntaxKind as SyntaxKind9 } from "ts-morph";
|
|
15373
|
-
|
|
15374
|
-
// packages/experience-design-system-extraction/dist/src/extract/helpers/evidence/ast/get-jsx-ast-data.js
|
|
15375
|
-
import { Node as Node14 } from "ts-morph";
|
|
15376
|
-
|
|
15377
|
-
// packages/experience-design-system-extraction/dist/src/extract/helpers/evidence/ast/collect-structural-jsx-evidence.js
|
|
15378
|
-
import { SyntaxKind as SyntaxKind8 } from "ts-morph";
|
|
15379
|
-
|
|
15380
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/extract-from-react-source-file.js
|
|
15381
|
-
import { SyntaxKind as SyntaxKind14 } from "ts-morph";
|
|
15382
|
-
|
|
15383
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/extract-react-component-from-export.js
|
|
15384
|
-
import { Node as Node32 } from "ts-morph";
|
|
15385
|
-
|
|
15386
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/collect-prop-dataflow.js
|
|
15387
|
-
import { Node as Node17, SyntaxKind as SyntaxKind10 } from "ts-morph";
|
|
15388
|
-
|
|
15389
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/resolve-component-function.js
|
|
15390
|
-
import { Node as Node16 } from "ts-morph";
|
|
15391
|
-
|
|
15392
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/extract-react-props-from-type.js
|
|
15393
|
-
import { Node as Node24 } from "ts-morph";
|
|
15394
|
-
|
|
15395
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/dom-attribute-surfaces.js
|
|
15396
|
-
import { Node as Node18 } from "ts-morph";
|
|
15397
|
-
function createTextControlSurface2(onChangeType, specificProps) {
|
|
15398
|
-
return [
|
|
15399
|
-
{ name: "autoComplete", type: "string", required: false },
|
|
15400
|
-
...specificProps,
|
|
15401
|
-
{ name: "disabled", type: "boolean", required: false },
|
|
15402
|
-
{ name: "name", type: "string", required: false },
|
|
15403
|
-
{ name: "onChange", type: onChangeType, required: false },
|
|
15404
|
-
{ name: "placeholder", type: "string", required: false },
|
|
15405
|
-
{ name: "readOnly", type: "boolean", required: false },
|
|
15406
|
-
{ name: "required", type: "boolean", required: false },
|
|
15407
|
-
{
|
|
15408
|
-
name: "value",
|
|
15409
|
-
type: "string | number | readonly string[]",
|
|
15410
|
-
required: false
|
|
15411
|
-
}
|
|
15412
|
-
];
|
|
15413
|
-
}
|
|
15414
|
-
var DOM_ATTRIBUTE_PROP_SURFACES2 = {
|
|
15415
|
-
HTMLProps: [],
|
|
15416
|
-
HTMLAttributes: [
|
|
15417
|
-
{ name: "className", type: "string", required: false },
|
|
15418
|
-
{ name: "hidden", type: "boolean", required: false },
|
|
15419
|
-
{ name: "id", type: "string", required: false },
|
|
15420
|
-
{
|
|
15421
|
-
name: "onClick",
|
|
15422
|
-
type: "MouseEventHandler<HTMLElement>",
|
|
15423
|
-
required: false
|
|
15424
|
-
},
|
|
15425
|
-
{ name: "style", type: "CSSProperties", required: false },
|
|
15426
|
-
{ name: "tabIndex", type: "number", required: false },
|
|
15427
|
-
{ name: "title", type: "string", required: false }
|
|
15428
|
-
],
|
|
15429
|
-
ImgHTMLAttributes: [
|
|
15430
|
-
{ name: "alt", type: "string", required: false },
|
|
15431
|
-
{ name: "crossOrigin", type: "string", required: false },
|
|
15432
|
-
{ name: "height", type: "number | string", required: false },
|
|
15433
|
-
{
|
|
15434
|
-
name: "loading",
|
|
15435
|
-
type: "string",
|
|
15436
|
-
required: false,
|
|
15437
|
-
allowedValues: ["eager", "lazy"]
|
|
15438
|
-
},
|
|
15439
|
-
{ name: "sizes", type: "string", required: false },
|
|
15440
|
-
{ name: "src", type: "string", required: false },
|
|
15441
|
-
{ name: "srcSet", type: "string", required: false },
|
|
15442
|
-
{ name: "width", type: "number | string", required: false }
|
|
15443
|
-
],
|
|
15444
|
-
LiHTMLAttributes: [],
|
|
15445
|
-
AnchorHTMLAttributes: [
|
|
15446
|
-
{ name: "download", type: "boolean | string", required: false },
|
|
15447
|
-
{ name: "href", type: "string", required: false },
|
|
15448
|
-
{ name: "hrefLang", type: "string", required: false },
|
|
15449
|
-
{ name: "referrerPolicy", type: "string", required: false },
|
|
15450
|
-
{ name: "rel", type: "string", required: false },
|
|
15451
|
-
{
|
|
15452
|
-
name: "target",
|
|
15453
|
-
type: "string",
|
|
15454
|
-
required: false,
|
|
15455
|
-
allowedValues: ["_blank", "_parent", "_self", "_top"]
|
|
15456
|
-
}
|
|
15457
|
-
],
|
|
15458
|
-
ButtonHTMLAttributes: [
|
|
15459
|
-
{ name: "autoFocus", type: "boolean", required: false },
|
|
15460
|
-
{ name: "disabled", type: "boolean", required: false },
|
|
15461
|
-
{ name: "form", type: "string", required: false },
|
|
15462
|
-
{ name: "formAction", type: "string", required: false },
|
|
15463
|
-
{ name: "formMethod", type: "string", required: false },
|
|
15464
|
-
{ name: "formNoValidate", type: "boolean", required: false },
|
|
15465
|
-
{ name: "formTarget", type: "string", required: false },
|
|
15466
|
-
{ name: "name", type: "string", required: false },
|
|
15467
|
-
{
|
|
15468
|
-
name: "type",
|
|
15469
|
-
type: "string",
|
|
15470
|
-
required: false,
|
|
15471
|
-
allowedValues: ["button", "reset", "submit"]
|
|
15472
|
-
},
|
|
15473
|
-
{
|
|
15474
|
-
name: "value",
|
|
15475
|
-
type: "string | number | readonly string[]",
|
|
15476
|
-
required: false
|
|
15477
|
-
}
|
|
15478
|
-
],
|
|
15479
|
-
InputHTMLAttributes: createTextControlSurface2("ChangeEventHandler<HTMLInputElement>", [
|
|
15480
|
-
{ name: "checked", type: "boolean", required: false },
|
|
15481
|
-
{ name: "max", type: "number | string", required: false },
|
|
15482
|
-
{ name: "maxLength", type: "number", required: false },
|
|
15483
|
-
{ name: "min", type: "number | string", required: false },
|
|
15484
|
-
{ name: "minLength", type: "number", required: false },
|
|
15485
|
-
{ name: "type", type: "string", required: false }
|
|
15486
|
-
]),
|
|
15487
|
-
FieldsetHTMLAttributes: [
|
|
15488
|
-
{ name: "disabled", type: "boolean", required: false },
|
|
15489
|
-
{ name: "form", type: "string", required: false },
|
|
15490
|
-
{ name: "name", type: "string", required: false }
|
|
15491
|
-
],
|
|
15492
|
-
LabelHTMLAttributes: [
|
|
15493
|
-
{ name: "form", type: "string", required: false },
|
|
15494
|
-
{ name: "htmlFor", type: "string", required: false }
|
|
15495
|
-
],
|
|
15496
|
-
SelectHTMLAttributes: [
|
|
15497
|
-
{ name: "autoComplete", type: "string", required: false },
|
|
15498
|
-
{ name: "disabled", type: "boolean", required: false },
|
|
15499
|
-
{ name: "form", type: "string", required: false },
|
|
15500
|
-
{ name: "multiple", type: "boolean", required: false },
|
|
15501
|
-
{ name: "name", type: "string", required: false },
|
|
15502
|
-
{
|
|
15503
|
-
name: "onChange",
|
|
15504
|
-
type: "ChangeEventHandler<HTMLSelectElement>",
|
|
15505
|
-
required: false
|
|
15506
|
-
},
|
|
15507
|
-
{ name: "required", type: "boolean", required: false },
|
|
15508
|
-
{ name: "size", type: "number", required: false },
|
|
15509
|
-
{
|
|
15510
|
-
name: "value",
|
|
15511
|
-
type: "string | number | readonly string[]",
|
|
15512
|
-
required: false
|
|
15513
|
-
}
|
|
15514
|
-
],
|
|
15515
|
-
SVGAttributes: [
|
|
15516
|
-
{
|
|
15517
|
-
name: "focusable",
|
|
15518
|
-
type: 'boolean | "auto"',
|
|
15519
|
-
required: false,
|
|
15520
|
-
allowedValues: ["auto"]
|
|
15521
|
-
},
|
|
15522
|
-
{ name: "height", type: "number | string", required: false },
|
|
15523
|
-
{ name: "viewBox", type: "string", required: false },
|
|
15524
|
-
{ name: "width", type: "number | string", required: false }
|
|
15525
|
-
],
|
|
15526
|
-
SVGProps: [],
|
|
15527
|
-
TextareaHTMLAttributes: createTextControlSurface2("ChangeEventHandler<HTMLTextAreaElement>", [
|
|
15528
|
-
{ name: "cols", type: "number", required: false },
|
|
15529
|
-
{ name: "rows", type: "number", required: false },
|
|
15530
|
-
{ name: "wrap", type: "string", required: false }
|
|
15531
|
-
]),
|
|
15532
|
-
TdHTMLAttributes: [
|
|
15533
|
-
{
|
|
15534
|
-
name: "align",
|
|
15535
|
-
type: "string",
|
|
15536
|
-
required: false,
|
|
15537
|
-
allowedValues: ["center", "char", "justify", "left", "right"]
|
|
15538
|
-
},
|
|
15539
|
-
{ name: "colSpan", type: "number", required: false },
|
|
15540
|
-
{ name: "headers", type: "string", required: false },
|
|
15541
|
-
{ name: "rowSpan", type: "number", required: false },
|
|
15542
|
-
{ name: "scope", type: "string", required: false }
|
|
15543
|
-
]
|
|
15544
|
-
};
|
|
15545
|
-
|
|
15546
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/collect-dom-wrapper-contexts.js
|
|
15547
|
-
import { Node as Node19 } from "ts-morph";
|
|
15548
|
-
|
|
15549
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/detect-dom-is-pure-wrapper.js
|
|
15550
|
-
import { Node as Node20 } from "ts-morph";
|
|
15551
|
-
|
|
15552
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/detect-omit-wrapped-custom-props.js
|
|
15553
|
-
import { Node as Node21 } from "ts-morph";
|
|
15554
|
-
|
|
15555
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/detect-pick-type-patterns.js
|
|
15556
|
-
import { Node as Node22 } from "ts-morph";
|
|
15557
|
-
|
|
15558
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/detect-react-polymorphic.js
|
|
15559
|
-
import { Node as Node23 } from "ts-morph";
|
|
15560
|
-
|
|
15561
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/resolve-react-props-type.js
|
|
15562
|
-
import { Node as Node25 } from "ts-morph";
|
|
15563
|
-
|
|
15564
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/extract-react-binding-defaults.js
|
|
15565
|
-
import { Node as Node28 } from "ts-morph";
|
|
15566
|
-
|
|
15567
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/filter-impl-alias-props.js
|
|
15568
|
-
import { Node as Node26 } from "ts-morph";
|
|
15569
|
-
|
|
15570
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/extract-binding-fallback-props.js
|
|
15571
|
-
import { Node as Node27, SyntaxKind as SyntaxKind11 } from "ts-morph";
|
|
15572
|
-
|
|
15573
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/collect-react-impl-hints.js
|
|
15574
|
-
import { Node as Node30, SyntaxKind as SyntaxKind13 } from "ts-morph";
|
|
15575
|
-
|
|
15576
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/infer-primitive-dom-props.js
|
|
15577
|
-
import { Node as Node29, SyntaxKind as SyntaxKind12 } from "ts-morph";
|
|
15578
|
-
|
|
15579
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/react/helpers/extract-react-prop-types.js
|
|
15580
|
-
import { Node as Node31 } from "ts-morph";
|
|
15581
|
-
|
|
15582
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/stencil/extractor.js
|
|
15583
|
-
import { Project as Project9, Node as Node37 } from "ts-morph";
|
|
15584
|
-
|
|
15585
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/stencil/helpers/detect-stencil-class.js
|
|
15586
|
-
import { Node as Node33 } from "ts-morph";
|
|
15587
|
-
|
|
15588
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-props.js
|
|
15589
|
-
import { Node as Node35 } from "ts-morph";
|
|
15590
|
-
|
|
15591
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/stencil/helpers/stencil-prop-helpers.js
|
|
15592
|
-
import { Node as Node34, SyntaxKind as SyntaxKind15 } from "ts-morph";
|
|
15593
|
-
|
|
15594
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-slots.js
|
|
15595
|
-
import { Node as Node36 } from "ts-morph";
|
|
15596
|
-
|
|
15597
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-unresolved-retry.js
|
|
15598
|
-
import { Project as Project12, ScriptTarget as ScriptTarget4, ModuleKind as ModuleKind4, ts as ts5 } from "ts-morph";
|
|
15599
|
-
|
|
15600
|
-
// packages/experience-design-system-extraction/dist/src/extract/services/quality/helpers/scoring/collect-scoring-inputs.js
|
|
15601
|
-
var OPAQUE_TYPES2 = /* @__PURE__ */ new Set(["any", "unknown", "object", "Record<string, unknown>", "Record<string, any>"]);
|
|
15602
|
-
var OBVIOUS_PROP_NAMES2 = /* @__PURE__ */ new Set([
|
|
15603
|
-
"className",
|
|
15604
|
-
"style",
|
|
15605
|
-
"id",
|
|
15606
|
-
"children",
|
|
15607
|
-
"disabled",
|
|
15608
|
-
"hidden",
|
|
15609
|
-
"onClick",
|
|
15610
|
-
"onChange",
|
|
15611
|
-
"onSubmit",
|
|
15612
|
-
"onBlur",
|
|
15613
|
-
"onFocus",
|
|
15614
|
-
"href",
|
|
15615
|
-
"src",
|
|
15616
|
-
"alt",
|
|
15617
|
-
"type",
|
|
15618
|
-
"value",
|
|
15619
|
-
"checked",
|
|
15620
|
-
"placeholder",
|
|
15621
|
-
"label",
|
|
15622
|
-
"title",
|
|
15623
|
-
"name",
|
|
15624
|
-
"required",
|
|
15625
|
-
"readOnly",
|
|
15626
|
-
"autoFocus",
|
|
15627
|
-
"tabIndex",
|
|
15628
|
-
"role",
|
|
15629
|
-
"aria-label",
|
|
15630
|
-
"aria-describedby"
|
|
15631
|
-
]);
|
|
15632
|
-
function isWidePrimitiveUnion2(type) {
|
|
15633
|
-
const parts = type.split("|").map((p) => p.trim());
|
|
15634
|
-
if (parts.length < 3)
|
|
15635
|
-
return false;
|
|
15636
|
-
const basePrimitives = /* @__PURE__ */ new Set(["string", "number", "boolean"]);
|
|
15637
|
-
const nullability = /* @__PURE__ */ new Set(["null", "undefined"]);
|
|
15638
|
-
const baseCount = parts.filter((p) => basePrimitives.has(p)).length;
|
|
15639
|
-
const nullabilityCount = parts.filter((p) => nullability.has(p)).length;
|
|
15640
|
-
return baseCount >= 3 || baseCount >= 2 && nullabilityCount > 0 && baseCount + nullabilityCount >= 3;
|
|
15641
|
-
}
|
|
15642
|
-
function countExtractionIssues(component, options = {}) {
|
|
15643
|
-
let count = 0;
|
|
15644
|
-
const reasons = [];
|
|
15645
|
-
if (component.props.length === 0 && component.slots.length === 0) {
|
|
15646
|
-
count++;
|
|
15647
|
-
reasons.push("no-props-or-slots");
|
|
15648
|
-
}
|
|
15649
|
-
if (component.props.length > 50) {
|
|
15650
|
-
count++;
|
|
15651
|
-
reasons.push(`high-prop-count:${component.props.length}`);
|
|
15652
|
-
}
|
|
15653
|
-
for (const prop of component.props) {
|
|
15654
|
-
if (OPAQUE_TYPES2.has(prop.type.trim())) {
|
|
15655
|
-
count++;
|
|
15656
|
-
reasons.push(`opaque-type:${prop.name}`);
|
|
15657
|
-
break;
|
|
15658
|
-
}
|
|
15659
|
-
if (isWidePrimitiveUnion2(prop.type)) {
|
|
15660
|
-
count++;
|
|
15661
|
-
reasons.push(`wide-union:${prop.name}`);
|
|
15662
|
-
break;
|
|
15663
|
-
}
|
|
15664
|
-
if (!prop.description && !OBVIOUS_PROP_NAMES2.has(prop.name)) {
|
|
15665
|
-
count++;
|
|
15666
|
-
reasons.push("props-missing-description");
|
|
15667
|
-
break;
|
|
15668
|
-
}
|
|
15669
|
-
}
|
|
15670
|
-
count += options.additionalIssueCount ?? 0;
|
|
15671
|
-
if (options.additionalReasons && options.additionalReasons.length > 0) {
|
|
15672
|
-
reasons.push(...options.additionalReasons);
|
|
15673
|
-
}
|
|
15674
|
-
return { count, reasons: [...new Set(reasons)] };
|
|
15675
|
-
}
|
|
15676
|
-
function mapIssueCountToConfidence(count) {
|
|
15677
|
-
if (count === 0)
|
|
15678
|
-
return 5;
|
|
15679
|
-
if (count === 1)
|
|
15680
|
-
return 4;
|
|
15681
|
-
if (count === 2)
|
|
15682
|
-
return 3;
|
|
15683
|
-
if (count === 3)
|
|
15684
|
-
return 2;
|
|
15685
|
-
return 1;
|
|
15686
|
-
}
|
|
15687
|
-
|
|
15688
|
-
// packages/experience-design-system-extraction/dist/src/extract/services/quality/helpers/scoring/compute-extraction-score.js
|
|
15689
|
-
function computeExtractionScore2(component, options = {}) {
|
|
15690
|
-
const { count, reasons } = countExtractionIssues(component, options);
|
|
15691
|
-
return {
|
|
15692
|
-
confidence: mapIssueCountToConfidence(count),
|
|
15693
|
-
reasons
|
|
15694
|
-
};
|
|
15695
|
-
}
|
|
15696
|
-
function deriveNeedsReview2(confidence) {
|
|
15697
|
-
return confidence <= 2;
|
|
15698
|
-
}
|
|
15699
|
-
|
|
15700
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-checker.js
|
|
15701
|
-
import { Project as Project10, ScriptTarget as ScriptTarget2, ModuleKind as ModuleKind2, ts as ts4 } from "ts-morph";
|
|
15702
|
-
|
|
15703
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-declaration-data.js
|
|
15704
|
-
import { Node as Node38 } from "ts-morph";
|
|
15705
|
-
|
|
15706
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-external-type-readers.js
|
|
15707
|
-
import { Node as Node40, Project as Project11, ScriptTarget as ScriptTarget3, ModuleKind as ModuleKind3 } from "ts-morph";
|
|
15708
|
-
|
|
15709
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-external-type-members.js
|
|
15710
|
-
import { Node as Node39 } from "ts-morph";
|
|
15711
|
-
|
|
15712
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/svelte/helpers/extract-from-svelte-file.js
|
|
15713
|
-
import { parse as parseSvelte2 } from "svelte/compiler";
|
|
15714
|
-
|
|
15715
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue-tsx/extractor.js
|
|
15716
|
-
import { Node as Node44 } from "ts-morph";
|
|
15717
|
-
|
|
15718
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-props.js
|
|
15719
|
-
import { Node as Node42 } from "ts-morph";
|
|
15720
|
-
|
|
15721
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue-tsx/helpers/resolve-ast-object.js
|
|
15722
|
-
import { Node as Node41, SyntaxKind as SyntaxKind16 } from "ts-morph";
|
|
15723
|
-
|
|
15724
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-slots.js
|
|
15725
|
-
import { Node as Node43, SyntaxKind as SyntaxKind17 } from "ts-morph";
|
|
15726
|
-
|
|
15727
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue/extractor.js
|
|
15728
|
-
import { parse as parseSFC3 } from "@vue/compiler-sfc";
|
|
15729
|
-
|
|
15730
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-props.js
|
|
15731
|
-
import { Project as Project14, Node as Node47 } from "ts-morph";
|
|
15732
|
-
|
|
15733
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-object-props.js
|
|
15734
|
-
import { Project as Project13, Node as Node46 } from "ts-morph";
|
|
15735
|
-
|
|
15736
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue/helpers/extract-vue-object-props.js
|
|
15737
|
-
import { Node as Node45 } from "ts-morph";
|
|
15738
|
-
|
|
15739
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/vue/helpers/extract-vue-options-props.js
|
|
15740
|
-
import { parse as parseSFC2 } from "@vue/compiler-sfc";
|
|
15741
|
-
import { Node as Node48, Project as Project15 } from "ts-morph";
|
|
15742
|
-
|
|
15743
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/extractor.js
|
|
15744
|
-
import { Project as Project16 } from "ts-morph";
|
|
15745
|
-
|
|
15746
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-observed-attrs.js
|
|
15747
|
-
import { Node as Node49 } from "ts-morph";
|
|
15748
|
-
|
|
15749
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-class-properties.js
|
|
15750
|
-
import { Node as Node50 } from "ts-morph";
|
|
15751
|
-
|
|
15752
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-decorator-tag.js
|
|
15753
|
-
import { Node as Node51 } from "ts-morph";
|
|
15754
|
-
|
|
15755
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-sibling-definition.js
|
|
15756
|
-
import { Node as Node54, SyntaxKind as SyntaxKind19 } from "ts-morph";
|
|
15757
|
-
|
|
15758
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import.js
|
|
15759
|
-
import { Node as Node53, SyntaxKind as SyntaxKind18 } from "ts-morph";
|
|
15760
|
-
|
|
15761
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import-source.js
|
|
15762
|
-
import { Node as Node52 } from "ts-morph";
|
|
15763
|
-
|
|
15764
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-template-content.js
|
|
15765
|
-
import { Node as Node56 } from "ts-morph";
|
|
15766
|
-
|
|
15767
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/collect-wc-html-templates.js
|
|
15768
|
-
import { Node as Node55 } from "ts-morph";
|
|
15769
|
-
|
|
15770
|
-
// packages/experience-design-system-extraction/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-base-class.js
|
|
15771
|
-
import { Node as Node57, SyntaxKind as SyntaxKind20 } from "ts-morph";
|
|
15772
|
-
|
|
15773
|
-
// packages/experience-design-system-extraction/dist/src/extract/services/classification/helpers/check-prop-types.js
|
|
15774
|
-
function isStringLiteralUnion(type) {
|
|
15775
|
-
return type.includes("|") && type.includes("'");
|
|
15776
|
-
}
|
|
15777
|
-
function isSimpleType(type) {
|
|
15778
|
-
const t = type.trim();
|
|
15779
|
-
if (t === "string" || t === "boolean" || t === "number")
|
|
15780
|
-
return true;
|
|
15781
|
-
return isStringLiteralUnion(t);
|
|
15782
|
-
}
|
|
15783
|
-
function isBooleanType(type) {
|
|
15784
|
-
return type.trim() === "boolean";
|
|
15785
|
-
}
|
|
15786
|
-
function isStringType(type) {
|
|
15787
|
-
return type.trim() === "string";
|
|
15788
|
-
}
|
|
15789
|
-
function isNumberType(type) {
|
|
15790
|
-
return type.trim() === "number";
|
|
15791
|
-
}
|
|
15792
|
-
function isComplexType(type) {
|
|
15793
|
-
return !isSimpleType(type);
|
|
15794
|
-
}
|
|
15795
|
-
|
|
15796
|
-
// packages/experience-design-system-extraction/dist/src/extract/services/classification/helpers/detect-dom-props.js
|
|
15797
|
-
var DOM_PASS_THROUGH_PROPS = /* @__PURE__ */ new Set([
|
|
15798
|
-
// Bare HTML / framework styling pass-through
|
|
15799
|
-
"className",
|
|
15800
|
-
"class",
|
|
15801
|
-
"classes",
|
|
15802
|
-
"classNames",
|
|
15803
|
-
"rootClassName",
|
|
15804
|
-
"prefixCls",
|
|
15805
|
-
"style",
|
|
15806
|
-
"styles",
|
|
15807
|
-
// Bare HTML attributes
|
|
15808
|
-
"id",
|
|
15809
|
-
"role",
|
|
15810
|
-
"tabIndex",
|
|
15811
|
-
"tabindex",
|
|
15812
|
-
"htmlFor",
|
|
15813
|
-
"for",
|
|
15814
|
-
"slot",
|
|
15815
|
-
"is",
|
|
15816
|
-
"lang",
|
|
15817
|
-
"dir",
|
|
15818
|
-
"hidden",
|
|
15819
|
-
"draggable",
|
|
15820
|
-
"spellCheck",
|
|
15821
|
-
"spellcheck",
|
|
15822
|
-
"contentEditable",
|
|
15823
|
-
"contenteditable",
|
|
15824
|
-
"inputMode",
|
|
15825
|
-
"inputmode",
|
|
15826
|
-
"autoComplete",
|
|
15827
|
-
"autocomplete",
|
|
15828
|
-
"autoFocus",
|
|
15829
|
-
"autofocus",
|
|
15830
|
-
"translate",
|
|
15831
|
-
"part",
|
|
15832
|
-
"exportparts",
|
|
15833
|
-
"aria",
|
|
15834
|
-
// Framework theming / pass-through escape hatches — dev-facing, never marketer-configurable
|
|
15835
|
-
"dt",
|
|
15836
|
-
"pt",
|
|
15837
|
-
"ptOptions",
|
|
15838
|
-
"unstyled",
|
|
15839
|
-
"sx",
|
|
15840
|
-
// Polymorphic component props — change rendered HTML/component, not marketer-visible behavior
|
|
15841
|
-
"as",
|
|
15842
|
-
"element",
|
|
15843
|
-
"component",
|
|
15844
|
-
// QA / vendor test attributes
|
|
15845
|
-
"dataQa",
|
|
15846
|
-
"data-qa",
|
|
15847
|
-
// Vue v-model internals — framework wiring, never marketer-configurable
|
|
15848
|
-
"modelValue",
|
|
15849
|
-
"modelModifiers"
|
|
15850
|
-
]);
|
|
15851
|
-
function isDomPassThroughProp(name) {
|
|
15852
|
-
if (DOM_PASS_THROUGH_PROPS.has(name))
|
|
15853
|
-
return true;
|
|
15854
|
-
if (/^aria[-A-Z]/.test(name))
|
|
15855
|
-
return true;
|
|
15856
|
-
return name.startsWith("data-");
|
|
15857
|
-
}
|
|
15858
|
-
|
|
15859
|
-
// packages/experience-design-system-extraction/dist/src/extract/services/classification/classify-component-props.js
|
|
15860
|
-
function preClassifyProp(prop) {
|
|
15861
|
-
const { name, type } = prop;
|
|
15862
|
-
if (/^on[A-Z]/.test(name) || type.includes("=> void") || type.includes("EventHandler")) {
|
|
15863
|
-
return { category: "exclude" };
|
|
15864
|
-
}
|
|
15865
|
-
if (name === "ref" || name === "innerRef" || type.includes("Ref<") || type.includes("RefObject<")) {
|
|
15866
|
-
return { category: "exclude" };
|
|
15867
|
-
}
|
|
15868
|
-
if (name === "testId" || name === "data-testid" || name === "dataTestId") {
|
|
15869
|
-
return { category: "exclude" };
|
|
15870
|
-
}
|
|
15871
|
-
if (name === "key") {
|
|
15872
|
-
return { category: "exclude" };
|
|
15873
|
-
}
|
|
15874
|
-
if (type.includes("Dispatch<") || type.includes("SetStateAction")) {
|
|
15875
|
-
return { category: "exclude" };
|
|
15876
|
-
}
|
|
15877
|
-
if (isDomPassThroughProp(name)) {
|
|
15878
|
-
return { category: "exclude" };
|
|
15879
|
-
}
|
|
15880
|
-
if (name === "name" && prop.domAttribute) {
|
|
15881
|
-
return { category: "exclude" };
|
|
15882
|
-
}
|
|
15883
|
-
if (isStringLiteralUnion(type)) {
|
|
15884
|
-
return { category: "design", cdfTypeHint: "enum" };
|
|
15885
|
-
}
|
|
15886
|
-
if (!isComplexType(type)) {
|
|
15887
|
-
const designNameStart = /^(variant|size|spacing|gap|color|bg|theme|align|layout|orientation|position)/i;
|
|
15888
|
-
const designNameEnd = /(Color|Size|Variant|Style)$/;
|
|
15889
|
-
if (designNameStart.test(name) || designNameEnd.test(name)) {
|
|
15890
|
-
return { category: "design", cdfTypeHint: "string" };
|
|
15891
|
-
}
|
|
15892
|
-
}
|
|
15893
|
-
if (isBooleanType(type)) {
|
|
15894
|
-
const stateNames = ["disabled", "loading", "expanded", "isOpen", "selected", "checked", "active", "preview"];
|
|
15895
|
-
if (stateNames.includes(name)) {
|
|
15896
|
-
return { category: "state", cdfTypeHint: "boolean" };
|
|
15897
|
-
}
|
|
15898
|
-
}
|
|
15899
|
-
if (isBooleanType(type)) {
|
|
15900
|
-
const visualToggle = /^(hide|show|enable|disable|vertical|horizontal|reverse|bold|italic|imageOn|with)/i;
|
|
15901
|
-
if (visualToggle.test(name)) {
|
|
15902
|
-
return { category: "design", cdfTypeHint: "boolean" };
|
|
15903
|
-
}
|
|
15904
|
-
}
|
|
15905
|
-
if (name === "componentId" || name === "sectionKey" || name === "locale" || name === "variantIndex") {
|
|
15906
|
-
return { category: "state", cdfTypeHint: "string" };
|
|
15907
|
-
}
|
|
15908
|
-
if (isStringType(type)) {
|
|
15909
|
-
const urlNameStart = /^(href|url|link|src)/i;
|
|
15910
|
-
const urlNameEnd = /(Url|Href|Link|Src)$/;
|
|
15911
|
-
if (urlNameStart.test(name) || urlNameEnd.test(name)) {
|
|
15912
|
-
return { category: "content", cdfTypeHint: "string" };
|
|
15913
|
-
}
|
|
15914
|
-
}
|
|
15915
|
-
if (isStringType(type)) {
|
|
15916
|
-
const textNameStart = /^(label|title|text|description|caption|heading|subheading|body|alt|name|placeholder|summary)/i;
|
|
15917
|
-
const textNameEnd = /(Text|Label|Title|Name)$/;
|
|
15918
|
-
if (textNameStart.test(name) || textNameEnd.test(name)) {
|
|
15919
|
-
return { category: "content", cdfTypeHint: "string" };
|
|
15920
|
-
}
|
|
15921
|
-
}
|
|
15922
|
-
if (isStringType(type)) {
|
|
15923
|
-
return { category: "content", cdfTypeHint: "string" };
|
|
15924
|
-
}
|
|
15925
|
-
if (isBooleanType(type)) {
|
|
15926
|
-
return { category: "design", cdfTypeHint: "boolean" };
|
|
15927
|
-
}
|
|
15928
|
-
if (isNumberType(type)) {
|
|
15929
|
-
return { category: "design", cdfTypeHint: "string" };
|
|
15930
|
-
}
|
|
15931
|
-
return void 0;
|
|
15932
|
-
}
|
|
15933
|
-
function preClassifyComponent(component) {
|
|
15934
|
-
const props = component.props.flatMap((prop) => {
|
|
15935
|
-
const result = preClassifyProp(prop);
|
|
15936
|
-
if (result?.category === "exclude") {
|
|
15937
|
-
return [];
|
|
15938
|
-
}
|
|
15939
|
-
const { domAttribute: _domAttribute, ...authorableProp } = prop;
|
|
15940
|
-
if (prop.category) {
|
|
15941
|
-
return [authorableProp];
|
|
15942
|
-
}
|
|
15943
|
-
if (!result) {
|
|
15944
|
-
return [authorableProp];
|
|
15945
|
-
}
|
|
15946
|
-
return [
|
|
15947
|
-
{
|
|
15948
|
-
...authorableProp,
|
|
15949
|
-
category: result.category
|
|
15950
|
-
}
|
|
15951
|
-
];
|
|
15952
|
-
});
|
|
15953
|
-
return { ...component, props };
|
|
15954
|
-
}
|
|
15955
|
-
|
|
15956
|
-
// packages/experience-design-system-extraction/dist/src/extract/services/quality/helpers/authorability/evaluate-authorability.js
|
|
15353
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/extraction/src/helpers/quality/non-authorable-filter.js
|
|
15957
15354
|
var HANDLER_TYPE_PATTERN = /=>|EventHandler|Dispatch<|SetStateAction/;
|
|
15958
15355
|
var REF_TYPE_PATTERN = /Ref<|RefObject<|MutableRefObject/;
|
|
15959
15356
|
function isHandlerOrRefProp(prop) {
|
|
@@ -16006,10 +15403,15 @@ function hasNoAuthoringSurface(component) {
|
|
|
16006
15403
|
return { skip: false };
|
|
16007
15404
|
}
|
|
16008
15405
|
|
|
16009
|
-
// packages/experience-design-system-
|
|
15406
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/extraction/src/helpers/evidence/source-inspection.js
|
|
16010
15407
|
import { readFile as readFile15 } from "node:fs/promises";
|
|
16011
15408
|
|
|
16012
|
-
// packages/experience-design-system-
|
|
15409
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/extraction/src/constants/review-reasons.js
|
|
15410
|
+
var HIGH_CONFIDENCE_DATA_FETCH_WRAPPER_REASON = "data-fetch-wrapper";
|
|
15411
|
+
var POSSIBLE_DATA_FETCH_WRAPPER_REASON = "possible-data-fetch-wrapper";
|
|
15412
|
+
var ZERO_SURFACE_RENDERED_UI_REASON = "zero-surface:rendered-ui";
|
|
15413
|
+
|
|
15414
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/extraction/src/framework-adapters/shared/parse-imported-names.js
|
|
16013
15415
|
function parseImportedNames(importClause) {
|
|
16014
15416
|
const trimmed = importClause.trim();
|
|
16015
15417
|
if (!trimmed)
|
|
@@ -16034,7 +15436,7 @@ function parseImportedNames(importClause) {
|
|
|
16034
15436
|
return names;
|
|
16035
15437
|
}
|
|
16036
15438
|
|
|
16037
|
-
// packages/experience-design-system-
|
|
15439
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/extraction/src/helpers/evidence/source-inspection.js
|
|
16038
15440
|
var INFRA_PROP_NAMES = /* @__PURE__ */ new Set(["id", "locale", "preview", "slug", "topic", "previousComponent", "__typename"]);
|
|
16039
15441
|
var VISIBLE_UI_TAG_PATTERN = /<(?:[A-Z][A-Za-z0-9_.]*|div|span|section|main|article|header|footer|nav|aside|img|video|p|h[1-6]|ul|ol|li|button|input|textarea|select|form|label|table|tbody|thead|tr|td|th)\b/;
|
|
16040
15442
|
var GENERATED_IMPORT_PATTERN = /from\s+['"][^'"]*__generated[^'"]*['"]/;
|
|
@@ -16076,11 +15478,11 @@ function hasSiblingForwardRender(sourceText, siblingImports) {
|
|
|
16076
15478
|
function hasVisibleUiRender(sourceText) {
|
|
16077
15479
|
return /return\s*(?:\(|<)/.test(sourceText) && VISIBLE_UI_TAG_PATTERN.test(sourceText);
|
|
16078
15480
|
}
|
|
16079
|
-
function
|
|
15481
|
+
function infraPropNames(component) {
|
|
16080
15482
|
const props = component.props.map((prop) => prop.name);
|
|
16081
15483
|
return props.length > 0 && props.every((prop) => INFRA_PROP_NAMES.has(prop)) ? props : [];
|
|
16082
15484
|
}
|
|
16083
|
-
function
|
|
15485
|
+
function scoreToConfidence(score) {
|
|
16084
15486
|
if (score <= 0)
|
|
16085
15487
|
return 0;
|
|
16086
15488
|
if (score <= 2)
|
|
@@ -16091,14 +15493,9 @@ function mapScoreToWrapperConfidence(score) {
|
|
|
16091
15493
|
return 4;
|
|
16092
15494
|
return 5;
|
|
16093
15495
|
}
|
|
16094
|
-
function
|
|
16095
|
-
return [...new Set(
|
|
15496
|
+
function dedupeReasons(reasons) {
|
|
15497
|
+
return [...new Set(reasons)];
|
|
16096
15498
|
}
|
|
16097
|
-
|
|
16098
|
-
// packages/experience-design-system-extraction/dist/src/extract/services/quality/helpers/inspection/inspect-component-source.js
|
|
16099
|
-
var HIGH_CONFIDENCE_DATA_FETCH_WRAPPER_REASON = "data-fetch-wrapper";
|
|
16100
|
-
var POSSIBLE_DATA_FETCH_WRAPPER_REASON = "possible-data-fetch-wrapper";
|
|
16101
|
-
var ZERO_SURFACE_RENDERED_UI_REASON = "zero-surface:rendered-ui";
|
|
16102
15499
|
async function inspectComponentSource(component) {
|
|
16103
15500
|
let sourceText = "";
|
|
16104
15501
|
try {
|
|
@@ -16113,7 +15510,7 @@ async function inspectComponentSource(component) {
|
|
|
16113
15510
|
const reviewReasons = [];
|
|
16114
15511
|
let wrapperScore = 0;
|
|
16115
15512
|
const hasGeneratedQueryHook = GENERATED_IMPORT_PATTERN.test(sourceText) && GENERATED_QUERY_HOOK_PATTERN.test(sourceText);
|
|
16116
|
-
const infraProps =
|
|
15513
|
+
const infraProps = infraPropNames(component);
|
|
16117
15514
|
const siblingImports = collectSiblingRendererImports(sourceText);
|
|
16118
15515
|
if (GQL_FILENAME_PATTERN.test(component.source)) {
|
|
16119
15516
|
reviewReasons.push("data-wrapper:gql-filename");
|
|
@@ -16143,7 +15540,7 @@ async function inspectComponentSource(component) {
|
|
|
16143
15540
|
reviewReasons.push("data-wrapper:loading-null-guard");
|
|
16144
15541
|
wrapperScore += 1;
|
|
16145
15542
|
}
|
|
16146
|
-
const wrapperConfidence =
|
|
15543
|
+
const wrapperConfidence = scoreToConfidence(wrapperScore);
|
|
16147
15544
|
if (wrapperConfidence >= 4) {
|
|
16148
15545
|
reviewReasons.unshift(HIGH_CONFIDENCE_DATA_FETCH_WRAPPER_REASON);
|
|
16149
15546
|
} else if (wrapperConfidence === 3) {
|
|
@@ -16155,7 +15552,7 @@ async function inspectComponentSource(component) {
|
|
|
16155
15552
|
}
|
|
16156
15553
|
return {
|
|
16157
15554
|
wrapperConfidence,
|
|
16158
|
-
reviewReasons:
|
|
15555
|
+
reviewReasons: dedupeReasons(reviewReasons),
|
|
16159
15556
|
keepDespiteZeroSurface
|
|
16160
15557
|
};
|
|
16161
15558
|
}
|
|
@@ -16186,77 +15583,10 @@ function describeReviewReason(reason) {
|
|
|
16186
15583
|
}
|
|
16187
15584
|
}
|
|
16188
15585
|
function describeReviewReasons(reasons) {
|
|
16189
|
-
return
|
|
16190
|
-
}
|
|
16191
|
-
|
|
16192
|
-
// packages/experience-design-system-extraction/dist/src/extract/services/quality/helpers/inspection/validate-extracted-components.js
|
|
16193
|
-
function validateExtractedComponents2(components) {
|
|
16194
|
-
const nameCounts = /* @__PURE__ */ new Map();
|
|
16195
|
-
for (const component of components) {
|
|
16196
|
-
const key = component.name.trim();
|
|
16197
|
-
nameCounts.set(key, (nameCounts.get(key) ?? 0) + 1);
|
|
16198
|
-
}
|
|
16199
|
-
return components.map((component) => {
|
|
16200
|
-
const issues = [];
|
|
16201
|
-
if (!component.name.trim()) {
|
|
16202
|
-
issues.push({
|
|
16203
|
-
severity: "error",
|
|
16204
|
-
code: "EMPTY_COMPONENT_NAME",
|
|
16205
|
-
message: "Component name must not be empty"
|
|
16206
|
-
});
|
|
16207
|
-
}
|
|
16208
|
-
for (let i = 0; i < component.props.length; i++) {
|
|
16209
|
-
if (!component.props[i].name.trim()) {
|
|
16210
|
-
issues.push({
|
|
16211
|
-
severity: "error",
|
|
16212
|
-
code: "EMPTY_PROP_NAME",
|
|
16213
|
-
message: `Prop at index ${i} has an empty name`,
|
|
16214
|
-
field: `props[${i}].name`
|
|
16215
|
-
});
|
|
16216
|
-
}
|
|
16217
|
-
}
|
|
16218
|
-
for (let i = 0; i < component.slots.length; i++) {
|
|
16219
|
-
if (!component.slots[i].name.trim()) {
|
|
16220
|
-
issues.push({
|
|
16221
|
-
severity: "warning",
|
|
16222
|
-
code: "EMPTY_SLOT_NAME",
|
|
16223
|
-
message: `Slot at index ${i} has an empty name`,
|
|
16224
|
-
field: `slots[${i}].name`
|
|
16225
|
-
});
|
|
16226
|
-
}
|
|
16227
|
-
}
|
|
16228
|
-
const propNames = new Set(component.props.map((p) => p.name.trim()).filter(Boolean));
|
|
16229
|
-
for (let i = 0; i < component.slots.length; i++) {
|
|
16230
|
-
const slotName = component.slots[i].name.trim();
|
|
16231
|
-
if (slotName && propNames.has(slotName)) {
|
|
16232
|
-
issues.push({
|
|
16233
|
-
severity: "error",
|
|
16234
|
-
code: "PROP_SLOT_NAME_COLLISION",
|
|
16235
|
-
message: `"${slotName}" is used as both a prop name and a slot name`,
|
|
16236
|
-
field: `slots[${i}].name`
|
|
16237
|
-
});
|
|
16238
|
-
}
|
|
16239
|
-
}
|
|
16240
|
-
const nameKey = component.name.trim();
|
|
16241
|
-
if (nameKey && (nameCounts.get(nameKey) ?? 0) > 1) {
|
|
16242
|
-
issues.push({
|
|
16243
|
-
severity: "error",
|
|
16244
|
-
code: "DUPLICATE_COMPONENT_NAME",
|
|
16245
|
-
message: `Component name "${component.name}" appears more than once in the extracted set`
|
|
16246
|
-
});
|
|
16247
|
-
}
|
|
16248
|
-
if (component.props.length === 0 && component.slots.length === 0) {
|
|
16249
|
-
issues.push({
|
|
16250
|
-
severity: "warning",
|
|
16251
|
-
code: "EMPTY_COMPONENT",
|
|
16252
|
-
message: "Component has no props or slots and will be filtered out during generation"
|
|
16253
|
-
});
|
|
16254
|
-
}
|
|
16255
|
-
return { ...component, validationIssues: issues };
|
|
16256
|
-
});
|
|
15586
|
+
return dedupeReasons(reasons.map(describeReviewReason));
|
|
16257
15587
|
}
|
|
16258
15588
|
|
|
16259
|
-
// packages/experience-design-system-
|
|
15589
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/extraction/src/helpers/quality/evaluate-extraction-quality.js
|
|
16260
15590
|
function wrapperConfidenceToIssueCount(confidence) {
|
|
16261
15591
|
if (confidence >= 4)
|
|
16262
15592
|
return 2;
|
|
@@ -16288,7 +15618,7 @@ async function evaluateExtractionQuality(components, initialWarnings = []) {
|
|
|
16288
15618
|
}
|
|
16289
15619
|
const extractorReasons = component.reviewReasons ?? [];
|
|
16290
15620
|
const nonAuthorableReason = retainedForReview ? [`non-authorable:${verdict.reason}`] : [];
|
|
16291
|
-
const { confidence, reasons } =
|
|
15621
|
+
const { confidence, reasons } = computeExtractionScore(component, {
|
|
16292
15622
|
additionalIssueCount: wrapperConfidenceToIssueCount(inspection.wrapperConfidence) + extractorReasons.length + nonAuthorableReason.length,
|
|
16293
15623
|
additionalReasons: [...extractorReasons, ...inspection.reviewReasons, ...nonAuthorableReason]
|
|
16294
15624
|
});
|
|
@@ -16296,15 +15626,194 @@ async function evaluateExtractionQuality(components, initialWarnings = []) {
|
|
|
16296
15626
|
...component,
|
|
16297
15627
|
extractionConfidence: confidence,
|
|
16298
15628
|
reviewReasons: reasons,
|
|
16299
|
-
needsReview:
|
|
15629
|
+
needsReview: deriveNeedsReview(confidence) || inspection.wrapperConfidence >= 4 || inspection.keepDespiteZeroSurface || retainedForReview || extractorReasons.includes("props-type-unresolved") || (component.needsReview ?? false)
|
|
16300
15630
|
});
|
|
16301
15631
|
}
|
|
16302
15632
|
return {
|
|
16303
|
-
components:
|
|
15633
|
+
components: validateExtractedComponents(scoredComponents),
|
|
16304
15634
|
warnings
|
|
16305
15635
|
};
|
|
16306
15636
|
}
|
|
16307
15637
|
|
|
15638
|
+
// packages/experience-design-system-backend-pipeline/dist/src/steps/extraction/src/helpers/pre-classify.js
|
|
15639
|
+
function isStringLiteralUnion(type) {
|
|
15640
|
+
return type.includes("|") && type.includes("'");
|
|
15641
|
+
}
|
|
15642
|
+
function isSimpleType(type) {
|
|
15643
|
+
const t = type.trim();
|
|
15644
|
+
if (t === "string" || t === "boolean" || t === "number")
|
|
15645
|
+
return true;
|
|
15646
|
+
return isStringLiteralUnion(t);
|
|
15647
|
+
}
|
|
15648
|
+
function isBooleanType(type) {
|
|
15649
|
+
return type.trim() === "boolean";
|
|
15650
|
+
}
|
|
15651
|
+
function isStringType(type) {
|
|
15652
|
+
return type.trim() === "string";
|
|
15653
|
+
}
|
|
15654
|
+
function isNumberType(type) {
|
|
15655
|
+
return type.trim() === "number";
|
|
15656
|
+
}
|
|
15657
|
+
function isComplexType(type) {
|
|
15658
|
+
return !isSimpleType(type);
|
|
15659
|
+
}
|
|
15660
|
+
var DOM_PASS_THROUGH_PROPS = /* @__PURE__ */ new Set([
|
|
15661
|
+
// Bare HTML / framework styling pass-through
|
|
15662
|
+
"className",
|
|
15663
|
+
"class",
|
|
15664
|
+
"classes",
|
|
15665
|
+
"classNames",
|
|
15666
|
+
"rootClassName",
|
|
15667
|
+
"prefixCls",
|
|
15668
|
+
"style",
|
|
15669
|
+
"styles",
|
|
15670
|
+
// Bare HTML attributes
|
|
15671
|
+
"id",
|
|
15672
|
+
"role",
|
|
15673
|
+
"tabIndex",
|
|
15674
|
+
"tabindex",
|
|
15675
|
+
"htmlFor",
|
|
15676
|
+
"for",
|
|
15677
|
+
"slot",
|
|
15678
|
+
"is",
|
|
15679
|
+
"lang",
|
|
15680
|
+
"dir",
|
|
15681
|
+
"hidden",
|
|
15682
|
+
"draggable",
|
|
15683
|
+
"spellCheck",
|
|
15684
|
+
"spellcheck",
|
|
15685
|
+
"contentEditable",
|
|
15686
|
+
"contenteditable",
|
|
15687
|
+
"inputMode",
|
|
15688
|
+
"inputmode",
|
|
15689
|
+
"autoComplete",
|
|
15690
|
+
"autocomplete",
|
|
15691
|
+
"autoFocus",
|
|
15692
|
+
"autofocus",
|
|
15693
|
+
"translate",
|
|
15694
|
+
"part",
|
|
15695
|
+
"exportparts",
|
|
15696
|
+
"aria",
|
|
15697
|
+
// Framework theming / pass-through escape hatches — dev-facing, never marketer-configurable
|
|
15698
|
+
"dt",
|
|
15699
|
+
"pt",
|
|
15700
|
+
"ptOptions",
|
|
15701
|
+
"unstyled",
|
|
15702
|
+
"sx",
|
|
15703
|
+
// Polymorphic component props — change rendered HTML/component, not marketer-visible behavior
|
|
15704
|
+
"as",
|
|
15705
|
+
"element",
|
|
15706
|
+
"component",
|
|
15707
|
+
// QA / vendor test attributes
|
|
15708
|
+
"dataQa",
|
|
15709
|
+
"data-qa",
|
|
15710
|
+
// Vue v-model internals — framework wiring, never marketer-configurable
|
|
15711
|
+
"modelValue",
|
|
15712
|
+
"modelModifiers"
|
|
15713
|
+
]);
|
|
15714
|
+
function isDomPassThroughProp(name) {
|
|
15715
|
+
if (DOM_PASS_THROUGH_PROPS.has(name))
|
|
15716
|
+
return true;
|
|
15717
|
+
if (/^aria[-A-Z]/.test(name))
|
|
15718
|
+
return true;
|
|
15719
|
+
return name.startsWith("data-");
|
|
15720
|
+
}
|
|
15721
|
+
function preClassifyProp(prop) {
|
|
15722
|
+
const { name, type } = prop;
|
|
15723
|
+
if (/^on[A-Z]/.test(name) || type.includes("=> void") || type.includes("EventHandler")) {
|
|
15724
|
+
return { category: "exclude" };
|
|
15725
|
+
}
|
|
15726
|
+
if (name === "ref" || name === "innerRef" || type.includes("Ref<") || type.includes("RefObject<")) {
|
|
15727
|
+
return { category: "exclude" };
|
|
15728
|
+
}
|
|
15729
|
+
if (name === "testId" || name === "data-testid" || name === "dataTestId") {
|
|
15730
|
+
return { category: "exclude" };
|
|
15731
|
+
}
|
|
15732
|
+
if (name === "key") {
|
|
15733
|
+
return { category: "exclude" };
|
|
15734
|
+
}
|
|
15735
|
+
if (type.includes("Dispatch<") || type.includes("SetStateAction")) {
|
|
15736
|
+
return { category: "exclude" };
|
|
15737
|
+
}
|
|
15738
|
+
if (isDomPassThroughProp(name)) {
|
|
15739
|
+
return { category: "exclude" };
|
|
15740
|
+
}
|
|
15741
|
+
if (name === "name" && prop.domAttribute) {
|
|
15742
|
+
return { category: "exclude" };
|
|
15743
|
+
}
|
|
15744
|
+
if (isStringLiteralUnion(type)) {
|
|
15745
|
+
return { category: "design", cdfTypeHint: "enum" };
|
|
15746
|
+
}
|
|
15747
|
+
if (!isComplexType(type)) {
|
|
15748
|
+
const designNameStart = /^(variant|size|spacing|gap|color|bg|theme|align|layout|orientation|position)/i;
|
|
15749
|
+
const designNameEnd = /(Color|Size|Variant|Style)$/;
|
|
15750
|
+
if (designNameStart.test(name) || designNameEnd.test(name)) {
|
|
15751
|
+
return { category: "design", cdfTypeHint: "string" };
|
|
15752
|
+
}
|
|
15753
|
+
}
|
|
15754
|
+
if (isBooleanType(type)) {
|
|
15755
|
+
const stateNames = ["disabled", "loading", "expanded", "isOpen", "selected", "checked", "active", "preview"];
|
|
15756
|
+
if (stateNames.includes(name)) {
|
|
15757
|
+
return { category: "state", cdfTypeHint: "boolean" };
|
|
15758
|
+
}
|
|
15759
|
+
}
|
|
15760
|
+
if (isBooleanType(type)) {
|
|
15761
|
+
const visualToggle = /^(hide|show|enable|disable|vertical|horizontal|reverse|bold|italic|imageOn|with)/i;
|
|
15762
|
+
if (visualToggle.test(name)) {
|
|
15763
|
+
return { category: "design", cdfTypeHint: "boolean" };
|
|
15764
|
+
}
|
|
15765
|
+
}
|
|
15766
|
+
if (name === "componentId" || name === "sectionKey" || name === "locale" || name === "variantIndex") {
|
|
15767
|
+
return { category: "state", cdfTypeHint: "string" };
|
|
15768
|
+
}
|
|
15769
|
+
if (isStringType(type)) {
|
|
15770
|
+
const urlNameStart = /^(href|url|link|src)/i;
|
|
15771
|
+
const urlNameEnd = /(Url|Href|Link|Src)$/;
|
|
15772
|
+
if (urlNameStart.test(name) || urlNameEnd.test(name)) {
|
|
15773
|
+
return { category: "content", cdfTypeHint: "string" };
|
|
15774
|
+
}
|
|
15775
|
+
}
|
|
15776
|
+
if (isStringType(type)) {
|
|
15777
|
+
const textNameStart = /^(label|title|text|description|caption|heading|subheading|body|alt|name|placeholder|summary)/i;
|
|
15778
|
+
const textNameEnd = /(Text|Label|Title|Name)$/;
|
|
15779
|
+
if (textNameStart.test(name) || textNameEnd.test(name)) {
|
|
15780
|
+
return { category: "content", cdfTypeHint: "string" };
|
|
15781
|
+
}
|
|
15782
|
+
}
|
|
15783
|
+
if (isStringType(type)) {
|
|
15784
|
+
return { category: "content", cdfTypeHint: "string" };
|
|
15785
|
+
}
|
|
15786
|
+
if (isBooleanType(type)) {
|
|
15787
|
+
return { category: "design", cdfTypeHint: "boolean" };
|
|
15788
|
+
}
|
|
15789
|
+
if (isNumberType(type)) {
|
|
15790
|
+
return { category: "design", cdfTypeHint: "string" };
|
|
15791
|
+
}
|
|
15792
|
+
return void 0;
|
|
15793
|
+
}
|
|
15794
|
+
function preClassifyComponent(component) {
|
|
15795
|
+
const props = component.props.flatMap((prop) => {
|
|
15796
|
+
const result = preClassifyProp(prop);
|
|
15797
|
+
if (result?.category === "exclude") {
|
|
15798
|
+
return [];
|
|
15799
|
+
}
|
|
15800
|
+
const { domAttribute: _domAttribute, ...authorableProp } = prop;
|
|
15801
|
+
if (prop.category) {
|
|
15802
|
+
return [authorableProp];
|
|
15803
|
+
}
|
|
15804
|
+
if (!result) {
|
|
15805
|
+
return [authorableProp];
|
|
15806
|
+
}
|
|
15807
|
+
return [
|
|
15808
|
+
{
|
|
15809
|
+
...authorableProp,
|
|
15810
|
+
category: result.category
|
|
15811
|
+
}
|
|
15812
|
+
];
|
|
15813
|
+
});
|
|
15814
|
+
return { ...component, props };
|
|
15815
|
+
}
|
|
15816
|
+
|
|
16308
15817
|
// packages/experience-design-system-backend-pipeline/dist/src/orchestrators/run-extract-and-compose-session/helpers/emit-pre-classification-exclusions.js
|
|
16309
15818
|
function emitPreClassificationExclusions(extraction, onExclusion) {
|
|
16310
15819
|
if (!onExclusion)
|