@lyse-labs/lyse 0.1.0-alpha.2 → 0.2.0-alpha.1
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/LICENSE +0 -5
- package/dist/cli.js +67 -11
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/add-ci-gate.test.d.ts +1 -0
- package/dist/commands/__tests__/add-ci-gate.test.js +149 -0
- package/dist/commands/__tests__/add-ci-gate.test.js.map +1 -0
- package/dist/commands/add-ci-gate.d.ts +26 -0
- package/dist/commands/add-ci-gate.js +429 -0
- package/dist/commands/add-ci-gate.js.map +1 -0
- package/dist/commands/audit-pipeline.js +1 -1
- package/dist/commands/audit-pipeline.js.map +1 -1
- package/dist/commands/fix.d.ts +8 -8
- package/dist/commands/init.d.ts +3 -3
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp-setup.js +1 -1
- package/dist/commands/mcp-setup.js.map +1 -1
- package/dist/config/schema.d.ts +14 -14
- package/dist/llm/__tests__/layer4-stage.test.d.ts +1 -0
- package/dist/llm/__tests__/layer4-stage.test.js +157 -0
- package/dist/llm/__tests__/layer4-stage.test.js.map +1 -0
- package/dist/llm/__tests__/validator.test.d.ts +1 -0
- package/dist/llm/__tests__/validator.test.js +156 -0
- package/dist/llm/__tests__/validator.test.js.map +1 -0
- package/dist/llm/connectors/__tests__/anthropic-adapter.test.d.ts +1 -0
- package/dist/llm/connectors/__tests__/anthropic-adapter.test.js +99 -0
- package/dist/llm/connectors/__tests__/anthropic-adapter.test.js.map +1 -0
- package/dist/llm/connectors/__tests__/cache.test.d.ts +1 -0
- package/dist/llm/connectors/__tests__/cache.test.js +50 -0
- package/dist/llm/connectors/__tests__/cache.test.js.map +1 -0
- package/dist/llm/connectors/__tests__/noop-adapter.test.d.ts +1 -0
- package/dist/llm/connectors/__tests__/noop-adapter.test.js +21 -0
- package/dist/llm/connectors/__tests__/noop-adapter.test.js.map +1 -0
- package/dist/llm/connectors/__tests__/openai-compatible-adapter.test.d.ts +1 -0
- package/dist/llm/connectors/__tests__/openai-compatible-adapter.test.js +82 -0
- package/dist/llm/connectors/__tests__/openai-compatible-adapter.test.js.map +1 -0
- package/dist/llm/connectors/__tests__/resolver.test.d.ts +1 -0
- package/dist/llm/connectors/__tests__/resolver.test.js +140 -0
- package/dist/llm/connectors/__tests__/resolver.test.js.map +1 -0
- package/dist/llm/connectors/anthropic-adapter.d.ts +12 -0
- package/dist/llm/connectors/anthropic-adapter.js +57 -0
- package/dist/llm/connectors/anthropic-adapter.js.map +1 -0
- package/dist/llm/connectors/cache.d.ts +15 -0
- package/dist/llm/connectors/cache.js +57 -0
- package/dist/llm/connectors/cache.js.map +1 -0
- package/dist/llm/connectors/noop-adapter.d.ts +4 -0
- package/dist/llm/connectors/noop-adapter.js +12 -0
- package/dist/llm/connectors/noop-adapter.js.map +1 -0
- package/dist/llm/connectors/openai-compatible-adapter.d.ts +13 -0
- package/dist/llm/connectors/openai-compatible-adapter.js +47 -0
- package/dist/llm/connectors/openai-compatible-adapter.js.map +1 -0
- package/dist/llm/connectors/resolver.d.ts +9 -0
- package/dist/llm/connectors/resolver.js +162 -0
- package/dist/llm/connectors/resolver.js.map +1 -0
- package/dist/llm/connectors/types.d.ts +25 -0
- package/dist/llm/connectors/types.js +13 -0
- package/dist/llm/connectors/types.js.map +1 -0
- package/dist/llm/layer4-stage.d.ts +8 -6
- package/dist/llm/layer4-stage.js +145 -9
- package/dist/llm/layer4-stage.js.map +1 -1
- package/dist/llm/rubric-stub.d.ts +8 -0
- package/dist/llm/rubric-stub.js +4 -0
- package/dist/llm/rubric-stub.js.map +1 -0
- package/dist/llm/validator.d.ts +18 -0
- package/dist/llm/validator.js +81 -0
- package/dist/llm/validator.js.map +1 -0
- package/dist/parsers/ai-tokens.d.ts +10 -0
- package/dist/parsers/ai-tokens.js +156 -0
- package/dist/parsers/ai-tokens.js.map +1 -0
- package/dist/reliability/catalogue/__tests__/sub-axes.test.js +13 -3
- package/dist/reliability/catalogue/__tests__/sub-axes.test.js.map +1 -1
- package/dist/reliability/catalogue/sub-axes.js +16 -0
- package/dist/reliability/catalogue/sub-axes.js.map +1 -1
- package/dist/reliability/types.d.ts +1 -1
- package/dist/rule-runner.js +1 -1
- package/dist/rule-runner.js.map +1 -1
- package/dist/rules/ai-governance-ai-content-live-region.d.ts +11 -0
- package/dist/rules/ai-governance-ai-content-live-region.js +304 -0
- package/dist/rules/ai-governance-ai-content-live-region.js.map +1 -0
- package/dist/rules/ai-governance-ai-loading-error-states.d.ts +9 -0
- package/dist/rules/ai-governance-ai-loading-error-states.js +214 -0
- package/dist/rules/ai-governance-ai-loading-error-states.js.map +1 -0
- package/dist/rules/ai-governance-ai-marker-anti-patterns.d.ts +15 -0
- package/dist/rules/ai-governance-ai-marker-anti-patterns.js +178 -0
- package/dist/rules/ai-governance-ai-marker-anti-patterns.js.map +1 -0
- package/dist/rules/ai-governance-ai-marker-component-present.d.ts +28 -0
- package/dist/rules/ai-governance-ai-marker-component-present.js +320 -0
- package/dist/rules/ai-governance-ai-marker-component-present.js.map +1 -0
- package/dist/rules/ai-governance-ai-token-requires-marker.d.ts +17 -0
- package/dist/rules/ai-governance-ai-token-requires-marker.js +206 -0
- package/dist/rules/ai-governance-ai-token-requires-marker.js.map +1 -0
- package/dist/rules/ai-governance-ai-tokens-reserved.d.ts +8 -0
- package/dist/rules/ai-governance-ai-tokens-reserved.js +85 -0
- package/dist/rules/ai-governance-ai-tokens-reserved.js.map +1 -0
- package/dist/rules/ai-governance-disclaimer-present.d.ts +18 -0
- package/dist/rules/ai-governance-disclaimer-present.js +210 -0
- package/dist/rules/ai-governance-disclaimer-present.js.map +1 -0
- package/dist/rules/ai-governance-explainability-affordance.d.ts +14 -0
- package/dist/rules/ai-governance-explainability-affordance.js +196 -0
- package/dist/rules/ai-governance-explainability-affordance.js.map +1 -0
- package/dist/rules/ai-governance-feedback-control-present.d.ts +19 -0
- package/dist/rules/ai-governance-feedback-control-present.js +223 -0
- package/dist/rules/ai-governance-feedback-control-present.js.map +1 -0
- package/dist/rules/ai-governance-human-control-affordances.d.ts +16 -0
- package/dist/rules/ai-governance-human-control-affordances.js +228 -0
- package/dist/rules/ai-governance-human-control-affordances.js.map +1 -0
- package/dist/rules/ai-governance-value-gate-doc-present.d.ts +18 -0
- package/dist/rules/ai-governance-value-gate-doc-present.js +206 -0
- package/dist/rules/ai-governance-value-gate-doc-present.js.map +1 -0
- package/dist/rules/ai-surface-agent-instruction-files.d.ts +33 -0
- package/dist/rules/ai-surface-agent-instruction-files.js +310 -0
- package/dist/rules/ai-surface-agent-instruction-files.js.map +1 -0
- package/dist/rules/ai-surface-llms-txt-structure.d.ts +18 -0
- package/dist/rules/ai-surface-llms-txt-structure.js +200 -0
- package/dist/rules/ai-surface-llms-txt-structure.js.map +1 -0
- package/dist/rules/ai-surface-mcp-config-present.d.ts +23 -0
- package/dist/rules/ai-surface-mcp-config-present.js +193 -0
- package/dist/rules/ai-surface-mcp-config-present.js.map +1 -0
- package/dist/rules/ai-surface-shadcn-registry-valid.d.ts +22 -0
- package/dist/rules/ai-surface-shadcn-registry-valid.js +247 -0
- package/dist/rules/ai-surface-shadcn-registry-valid.js.map +1 -0
- package/dist/rules/components-contracts-strictness.d.ts +48 -0
- package/dist/rules/components-contracts-strictness.js +372 -0
- package/dist/rules/components-contracts-strictness.js.map +1 -0
- package/dist/rules/registry.js +32 -0
- package/dist/rules/registry.js.map +1 -1
- package/dist/rules/tokens-dtcg-conformance.d.ts +55 -19
- package/dist/rules/tokens-dtcg-conformance.js +320 -82
- package/dist/rules/tokens-dtcg-conformance.js.map +1 -1
- package/dist/scorer.js +4 -3
- package/dist/scorer.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.js.map +1 -1
- package/package.json +41 -16
- package/rules-manifest.json +431 -6
- package/schemas/v1/lyse-rules.json +1 -1
- package/dist/commands/ci-setup.d.ts +0 -9
- package/dist/commands/ci-setup.js +0 -42
- package/dist/commands/ci-setup.js.map +0 -1
- package/dist/commands/templates/lyse-workflow.yml.template +0 -30
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join, relative, dirname } from "node:path";
|
|
3
|
+
import fg from "fast-glob";
|
|
4
|
+
import { parse as parseBabel } from "@babel/parser";
|
|
5
|
+
import _traverse from "@babel/traverse";
|
|
6
|
+
import { isPathExcluded } from "./_exclude.js";
|
|
7
|
+
import { createLyseRule } from "./_rule-module.js";
|
|
8
|
+
const traverse = (_traverse.default ??
|
|
9
|
+
_traverse);
|
|
10
|
+
const RULE_ID = "components/contracts-strictness";
|
|
11
|
+
const MAX_FILE_BYTES = 2_000_000;
|
|
12
|
+
const VARIANT_PROP_RE = /^(variant|size|intent|color|tone|appearance|kind)$/i;
|
|
13
|
+
const PASCAL_CASE_RE = /^[A-Z][a-zA-Z0-9]*$/;
|
|
14
|
+
const FRAMEWORK_ALLOWED_PROPS = new Set([
|
|
15
|
+
"children",
|
|
16
|
+
"ref",
|
|
17
|
+
"key",
|
|
18
|
+
"asChild",
|
|
19
|
+
"as",
|
|
20
|
+
]);
|
|
21
|
+
function isPascalCase(name) {
|
|
22
|
+
return PASCAL_CASE_RE.test(name);
|
|
23
|
+
}
|
|
24
|
+
function classifyPropType(typeAnnotation) {
|
|
25
|
+
if (typeAnnotation.type === "TSAnyKeyword")
|
|
26
|
+
return "any";
|
|
27
|
+
if (typeAnnotation.type === "TSUnknownKeyword")
|
|
28
|
+
return "unknown";
|
|
29
|
+
if (typeAnnotation.type === "TSStringKeyword")
|
|
30
|
+
return "string";
|
|
31
|
+
return "other";
|
|
32
|
+
}
|
|
33
|
+
function collectPropFindings(componentName, typeMembers, findings) {
|
|
34
|
+
for (const member of typeMembers) {
|
|
35
|
+
if (member.type !== "TSPropertySignature")
|
|
36
|
+
continue;
|
|
37
|
+
const propSig = member;
|
|
38
|
+
if (propSig.key.type !== "Identifier")
|
|
39
|
+
continue;
|
|
40
|
+
const propName = propSig.key.name;
|
|
41
|
+
if (FRAMEWORK_ALLOWED_PROPS.has(propName))
|
|
42
|
+
continue;
|
|
43
|
+
const ann = propSig.typeAnnotation?.typeAnnotation;
|
|
44
|
+
if (!ann)
|
|
45
|
+
continue;
|
|
46
|
+
const kind = classifyPropType(ann);
|
|
47
|
+
const loc = propSig.loc?.start ?? { line: 1, column: 1 };
|
|
48
|
+
if (kind === "any" || kind === "unknown") {
|
|
49
|
+
findings.push({
|
|
50
|
+
componentName,
|
|
51
|
+
propName,
|
|
52
|
+
kind,
|
|
53
|
+
line: loc.line,
|
|
54
|
+
column: loc.column,
|
|
55
|
+
});
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (kind === "string" && VARIANT_PROP_RE.test(propName)) {
|
|
59
|
+
findings.push({
|
|
60
|
+
componentName,
|
|
61
|
+
propName,
|
|
62
|
+
kind: "string-variant",
|
|
63
|
+
line: loc.line,
|
|
64
|
+
column: loc.column,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Walk a parsed .tsx/.jsx source for exported PascalCase component declarations
|
|
71
|
+
* and collect their typed prop violations.
|
|
72
|
+
*
|
|
73
|
+
* Resolves prop type references to same-file interface / type-alias declarations.
|
|
74
|
+
* Cross-file references are skipped (v0.1 limitation, mirrors loaders/components.ts).
|
|
75
|
+
*/
|
|
76
|
+
export function scanComponentContracts(source) {
|
|
77
|
+
const findings = [];
|
|
78
|
+
let ast;
|
|
79
|
+
try {
|
|
80
|
+
ast = parseBabel(source, {
|
|
81
|
+
sourceType: "module",
|
|
82
|
+
plugins: ["typescript", "jsx"],
|
|
83
|
+
errorRecovery: true,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return { findings, componentCount: 0 };
|
|
88
|
+
}
|
|
89
|
+
const typeDeclarations = new Map();
|
|
90
|
+
try {
|
|
91
|
+
traverse(ast, {
|
|
92
|
+
TSInterfaceDeclaration(path) {
|
|
93
|
+
typeDeclarations.set(path.node.id.name, path.node.body.body);
|
|
94
|
+
},
|
|
95
|
+
TSTypeAliasDeclaration(path) {
|
|
96
|
+
const ann = path.node.typeAnnotation;
|
|
97
|
+
if (ann.type === "TSTypeLiteral") {
|
|
98
|
+
typeDeclarations.set(path.node.id.name, ann.members);
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return { findings, componentCount: 0 };
|
|
105
|
+
}
|
|
106
|
+
let componentCount = 0;
|
|
107
|
+
const resolveAndCollect = (componentName, params) => {
|
|
108
|
+
if (params.length === 0)
|
|
109
|
+
return;
|
|
110
|
+
const first = params[0];
|
|
111
|
+
let typeAnnotation;
|
|
112
|
+
if (first.type === "Identifier" &&
|
|
113
|
+
first.typeAnnotation?.type === "TSTypeAnnotation") {
|
|
114
|
+
typeAnnotation = first.typeAnnotation.typeAnnotation;
|
|
115
|
+
}
|
|
116
|
+
else if (first.type === "ObjectPattern" &&
|
|
117
|
+
first.typeAnnotation?.type === "TSTypeAnnotation") {
|
|
118
|
+
typeAnnotation = first.typeAnnotation.typeAnnotation;
|
|
119
|
+
}
|
|
120
|
+
if (!typeAnnotation)
|
|
121
|
+
return;
|
|
122
|
+
componentCount++;
|
|
123
|
+
if (typeAnnotation.type === "TSTypeLiteral") {
|
|
124
|
+
collectPropFindings(componentName, typeAnnotation.members, findings);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (typeAnnotation.type === "TSTypeReference") {
|
|
128
|
+
const ref = typeAnnotation;
|
|
129
|
+
if (ref.typeName.type !== "Identifier")
|
|
130
|
+
return;
|
|
131
|
+
const refName = ref.typeName.name;
|
|
132
|
+
const members = typeDeclarations.get(refName);
|
|
133
|
+
if (members) {
|
|
134
|
+
collectPropFindings(componentName, members, findings);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
try {
|
|
139
|
+
traverse(ast, {
|
|
140
|
+
ExportNamedDeclaration(path) {
|
|
141
|
+
const decl = path.node.declaration;
|
|
142
|
+
if (!decl)
|
|
143
|
+
return;
|
|
144
|
+
if (decl.type === "FunctionDeclaration") {
|
|
145
|
+
const id = decl.id;
|
|
146
|
+
if (id && isPascalCase(id.name)) {
|
|
147
|
+
resolveAndCollect(id.name, decl.params);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (decl.type === "VariableDeclaration") {
|
|
151
|
+
for (const d of decl.declarations) {
|
|
152
|
+
if (d.id.type !== "Identifier")
|
|
153
|
+
continue;
|
|
154
|
+
const name = d.id.name;
|
|
155
|
+
if (!isPascalCase(name))
|
|
156
|
+
continue;
|
|
157
|
+
const init = d.init;
|
|
158
|
+
if (init && init.type === "ArrowFunctionExpression") {
|
|
159
|
+
resolveAndCollect(name, init.params);
|
|
160
|
+
}
|
|
161
|
+
else if (init && init.type === "FunctionExpression") {
|
|
162
|
+
resolveAndCollect(name, init.params);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
ExportDefaultDeclaration(path) {
|
|
168
|
+
const decl = path.node.declaration;
|
|
169
|
+
if (decl.type === "FunctionDeclaration") {
|
|
170
|
+
const id = decl.id;
|
|
171
|
+
const name = id?.name ?? "default";
|
|
172
|
+
if (isPascalCase(name)) {
|
|
173
|
+
resolveAndCollect(name, decl.params);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return { findings, componentCount };
|
|
181
|
+
}
|
|
182
|
+
return { findings, componentCount };
|
|
183
|
+
}
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
// package.json `types`/`typings` discovery
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
const PACKAGE_JSON_PATTERNS = [
|
|
188
|
+
"**/package.json",
|
|
189
|
+
];
|
|
190
|
+
function readJsonIfSmall(absPath) {
|
|
191
|
+
try {
|
|
192
|
+
const stat = statSync(absPath);
|
|
193
|
+
if (!stat.isFile())
|
|
194
|
+
return null;
|
|
195
|
+
if (stat.size > MAX_FILE_BYTES)
|
|
196
|
+
return null;
|
|
197
|
+
const raw = readFileSync(absPath, "utf8");
|
|
198
|
+
if (raw.trim().length === 0)
|
|
199
|
+
return null;
|
|
200
|
+
return JSON.parse(raw);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
export function checkPackageJsonTypes(pkg, packageDir) {
|
|
207
|
+
const typesValue = typeof pkg.types === "string" ? pkg.types : null;
|
|
208
|
+
const typingsValue = typeof pkg.typings === "string" ? pkg.typings : null;
|
|
209
|
+
const declared = typesValue ?? typingsValue;
|
|
210
|
+
if (!declared) {
|
|
211
|
+
return { kind: "missing-types" };
|
|
212
|
+
}
|
|
213
|
+
const abs = join(packageDir, declared);
|
|
214
|
+
if (!existsSync(abs)) {
|
|
215
|
+
return { kind: "types-points-to-missing-file", typesPath: declared };
|
|
216
|
+
}
|
|
217
|
+
return { kind: "ok", typesPath: declared };
|
|
218
|
+
}
|
|
219
|
+
function looksLikePublishablePackage(pkg) {
|
|
220
|
+
if (pkg.private === true)
|
|
221
|
+
return false;
|
|
222
|
+
if (typeof pkg.name !== "string" || pkg.name.length === 0)
|
|
223
|
+
return false;
|
|
224
|
+
return (typeof pkg.main === "string" ||
|
|
225
|
+
typeof pkg.module === "string" ||
|
|
226
|
+
pkg.exports !== undefined ||
|
|
227
|
+
typeof pkg.types === "string" ||
|
|
228
|
+
typeof pkg.typings === "string");
|
|
229
|
+
}
|
|
230
|
+
function discoverPackageJsonFiles(ctx) {
|
|
231
|
+
if (!ctx.repoRoot)
|
|
232
|
+
return [];
|
|
233
|
+
let entries = [];
|
|
234
|
+
try {
|
|
235
|
+
entries = fg.sync(PACKAGE_JSON_PATTERNS, {
|
|
236
|
+
cwd: ctx.repoRoot,
|
|
237
|
+
absolute: false,
|
|
238
|
+
dot: false,
|
|
239
|
+
ignore: ["**/node_modules/**", "**/dist/**", "**/build/**", "**/.git/**"],
|
|
240
|
+
followSymbolicLinks: false,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return [];
|
|
245
|
+
}
|
|
246
|
+
const out = new Set();
|
|
247
|
+
for (const rel of entries) {
|
|
248
|
+
if (isPathExcluded(rel, ctx.excludePaths))
|
|
249
|
+
continue;
|
|
250
|
+
out.add(rel);
|
|
251
|
+
}
|
|
252
|
+
return Array.from(out).sort();
|
|
253
|
+
}
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
// Rule evaluator
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
const evaluate = async (ctx, files) => {
|
|
258
|
+
const findings = [];
|
|
259
|
+
let opportunities = 0;
|
|
260
|
+
for (const f of files.ts) {
|
|
261
|
+
if (isPathExcluded(f.path, ctx.excludePaths))
|
|
262
|
+
continue;
|
|
263
|
+
if (!/\.(tsx|jsx)$/.test(f.path))
|
|
264
|
+
continue;
|
|
265
|
+
if (/\.(test|spec)\.(tsx?|jsx?)$/.test(f.path))
|
|
266
|
+
continue;
|
|
267
|
+
if (!/\bexport\b/.test(f.source))
|
|
268
|
+
continue;
|
|
269
|
+
const { findings: propFindings, componentCount } = scanComponentContracts(f.source);
|
|
270
|
+
opportunities += componentCount;
|
|
271
|
+
for (const pf of propFindings) {
|
|
272
|
+
if (pf.kind === "any" || pf.kind === "unknown") {
|
|
273
|
+
findings.push({
|
|
274
|
+
ruleId: RULE_ID,
|
|
275
|
+
axis: "components",
|
|
276
|
+
severity: "error",
|
|
277
|
+
location: { file: f.path, line: pf.line, column: pf.column },
|
|
278
|
+
message: `Prop '${pf.componentName}.${pf.propName}' is typed '${pf.kind}' — AI agents cannot infer valid values`,
|
|
279
|
+
suggestion: pf.kind === "any"
|
|
280
|
+
? `replace 'any' with a concrete type (string-literal union, interface, or imported type)`
|
|
281
|
+
: `replace 'unknown' with a concrete type or refine with a runtime guard`,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
findings.push({
|
|
286
|
+
ruleId: RULE_ID,
|
|
287
|
+
axis: "components",
|
|
288
|
+
severity: "warning",
|
|
289
|
+
location: { file: f.path, line: pf.line, column: pf.column },
|
|
290
|
+
message: `Variant-like prop '${pf.componentName}.${pf.propName}' is typed 'string' — use a string-literal union so AI agents know the allowed values`,
|
|
291
|
+
suggestion: `change to a union like '"primary" | "secondary" | "ghost"'`,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (ctx.repoRoot) {
|
|
297
|
+
const pkgJsonFiles = discoverPackageJsonFiles(ctx);
|
|
298
|
+
for (const rel of pkgJsonFiles) {
|
|
299
|
+
const abs = join(ctx.repoRoot, rel);
|
|
300
|
+
const data = readJsonIfSmall(abs);
|
|
301
|
+
if (!data)
|
|
302
|
+
continue;
|
|
303
|
+
if (!looksLikePublishablePackage(data))
|
|
304
|
+
continue;
|
|
305
|
+
const outcome = checkPackageJsonTypes(data, dirname(abs));
|
|
306
|
+
if (outcome.kind === "missing-types") {
|
|
307
|
+
findings.push({
|
|
308
|
+
ruleId: RULE_ID,
|
|
309
|
+
axis: "components",
|
|
310
|
+
severity: "warning",
|
|
311
|
+
location: { file: relative(ctx.repoRoot, abs) || rel, line: 1, column: 1 },
|
|
312
|
+
message: `package.json is missing the 'types' (or 'typings') field — consumers and AI agents get no .d.ts surface`,
|
|
313
|
+
suggestion: `add '"types": "./dist/index.d.ts"' (or the matching path for your build output)`,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
else if (outcome.kind === "types-points-to-missing-file") {
|
|
317
|
+
findings.push({
|
|
318
|
+
ruleId: RULE_ID,
|
|
319
|
+
axis: "components",
|
|
320
|
+
severity: "warning",
|
|
321
|
+
location: { file: relative(ctx.repoRoot, abs) || rel, line: 1, column: 1 },
|
|
322
|
+
message: `package.json 'types' points to '${outcome.typesPath}' which does not exist — build output is missing or path is wrong`,
|
|
323
|
+
suggestion: `run the package build, or update the 'types' field to point at the produced .d.ts file`,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return { findings, opportunities };
|
|
329
|
+
};
|
|
330
|
+
export const rule = createLyseRule({
|
|
331
|
+
meta: {
|
|
332
|
+
axis: "components",
|
|
333
|
+
lyseRuleId: RULE_ID,
|
|
334
|
+
defaultSeverity: "warning",
|
|
335
|
+
shortDescription: "Component prop contracts must be strictly typed and .d.ts shipped",
|
|
336
|
+
fullDescription: "Scans exported PascalCase components in .tsx/.jsx files for lax TypeScript prop contracts that hinder AI-agent code generation: props typed `any` or `unknown` (error), and variant-like props (name matching variant/size/intent/color/tone/appearance/kind) typed plain `string` instead of a string-literal union (warning). Also checks each publishable package.json for a `types` or `typings` field and that the referenced file exists post-build (warning when missing).",
|
|
337
|
+
helpUri: "https://github.com/lyse-labs/lyse/blob/main/docs/rules/components-contracts-strictness.md",
|
|
338
|
+
rationale: `Why it matters
|
|
339
|
+
|
|
340
|
+
AI coding agents and IDE tooling rely on TypeScript prop signatures to suggest valid usages. A prop typed \`any\` or \`unknown\` is a black hole — the agent has nothing to constrain its output and falls back to guesses. A variant prop typed plain \`string\` (\`variant: string\`) is just as bad: the agent has no way to know the component accepts only \`"primary" | "secondary" | "ghost"\` and will happily suggest \`variant="huge"\`.
|
|
341
|
+
|
|
342
|
+
Shipping a \`.d.ts\` (declared via \`package.json\` \`types\` / \`typings\`) is the same problem at the package boundary: without a declaration file, downstream consumers and agents fall back to untyped any-mode and lose every guarantee the source code put in.
|
|
343
|
+
|
|
344
|
+
The rule errors on \`any\` / \`unknown\` because those are silent footguns. It warns on variant-string and missing \`.d.ts\` because there are legitimate (if narrow) reasons to leave them, and because the auto-fix path differs from the unsafe types.`,
|
|
345
|
+
examples: [
|
|
346
|
+
{
|
|
347
|
+
good: `type ButtonVariant = "primary" | "secondary" | "ghost";\ninterface ButtonProps { variant: ButtonVariant; size: "sm" | "md" | "lg"; }\nexport function Button(props: ButtonProps) { return <button />; }`,
|
|
348
|
+
bad: `interface ButtonProps { variant: string; size: any; data: unknown; }\nexport function Button(props: ButtonProps) { return <button />; }`,
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
good: `{ "name": "@acme/ui", "main": "./dist/index.js", "types": "./dist/index.d.ts" }`,
|
|
352
|
+
bad: `{ "name": "@acme/ui", "main": "./dist/index.js" }`,
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
allowlist: [
|
|
356
|
+
"framework-allowed props: `children`, `ref`, `key`, `as`, `asChild` (rest-spread `...rest` and ref-forwarded types are skipped)",
|
|
357
|
+
"private packages (`\"private\": true`) and non-publishable package.json files (no `name`/`main`/`module`/`exports`/`types`/`typings`)",
|
|
358
|
+
"test files (.test.tsx, .spec.tsx)",
|
|
359
|
+
"inline `// lyse-disable-next-line components/contracts-strictness` directive (handled by the global suppression engine)",
|
|
360
|
+
],
|
|
361
|
+
},
|
|
362
|
+
defaultOptions: [],
|
|
363
|
+
create: () => ({ evaluate }),
|
|
364
|
+
});
|
|
365
|
+
export const _internal = {
|
|
366
|
+
scanComponentContracts,
|
|
367
|
+
checkPackageJsonTypes,
|
|
368
|
+
looksLikePublishablePackage,
|
|
369
|
+
VARIANT_PROP_RE,
|
|
370
|
+
FRAMEWORK_ALLOWED_PROPS,
|
|
371
|
+
};
|
|
372
|
+
//# sourceMappingURL=components-contracts-strictness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components-contracts-strictness.js","sourceRoot":"","sources":["../../src/rules/components-contracts-strictness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAUxC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,QAAQ,GAAG,CACd,SAAgD,CAAC,OAAO;IACxD,SAAmC,CACrC,CAAC;AAEF,MAAM,OAAO,GAAG,iCAAiC,CAAC;AAClD,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,MAAM,eAAe,GAAG,qDAAqD,CAAC;AAC9E,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,UAAU;IACV,KAAK;IACL,KAAK;IACL,SAAS;IACT,IAAI;CACL,CAAC,CAAC;AAUH,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CAAC,cAAwB;IAChD,IAAI,cAAc,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,KAAK,CAAC;IACzD,IAAI,cAAc,CAAC,IAAI,KAAK,kBAAkB;QAAE,OAAO,SAAS,CAAC;IACjE,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,QAAQ,CAAC;IAC/D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAC1B,aAAqB,EACrB,WAA8B,EAC9B,QAAgC;IAEhC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAqB;YAAE,SAAS;QACpD,MAAM,OAAO,GAAG,MAA+B,CAAC;QAChD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY;YAAE,SAAS;QAChD,MAAM,QAAQ,GAAI,OAAO,CAAC,GAAoB,CAAC,IAAI,CAAC;QACpD,IAAI,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QACpD,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAEzD,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC;gBACZ,aAAa;gBACb,QAAQ;gBACR,IAAI;gBACJ,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC;gBACZ,aAAa;gBACb,QAAQ;gBACR,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAc;IAEd,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE;YACvB,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;YAC9B,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9D,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE;YACZ,sBAAsB,CAAC,IAAI;gBACzB,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,CAAC;YACD,sBAAsB,CAAC,IAAI;gBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;gBACrC,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBACjC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAG,GAAuB,CAAC,OAAO,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,MAAM,iBAAiB,GAAG,CAAC,aAAqB,EAAE,MAAgB,EAAQ,EAAE;QAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACzB,IAAI,cAAoC,CAAC;QACzC,IACE,KAAK,CAAC,IAAI,KAAK,YAAY;YAC1B,KAAsB,CAAC,cAAc,EAAE,IAAI,KAAK,kBAAkB,EACnE,CAAC;YACD,cAAc,GACX,KAAsB,CAAC,cACzB,CAAC,cAAc,CAAC;QACnB,CAAC;aAAM,IACL,KAAK,CAAC,IAAI,KAAK,eAAe;YAC7B,KAAyB,CAAC,cAAc,EAAE,IAAI,KAAK,kBAAkB,EACtE,CAAC;YACD,cAAc,GACX,KAAyB,CAAC,cAC5B,CAAC,cAAc,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,cAAc;YAAE,OAAO;QAE5B,cAAc,EAAE,CAAC;QAEjB,IAAI,cAAc,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAC5C,mBAAmB,CACjB,aAAa,EACZ,cAAkC,CAAC,OAAO,EAC3C,QAAQ,CACT,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,cAAmC,CAAC;YAChD,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO;YAC/C,MAAM,OAAO,GAAI,GAAG,CAAC,QAAyB,CAAC,IAAI,CAAC;YACpD,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,OAAO,EAAE,CAAC;gBACZ,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE;YACZ,sBAAsB,CAAC,IAAI;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;gBACnC,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAClB,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;oBACxC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;oBACnB,IAAI,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;oBAC/C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;4BAAE,SAAS;wBACzC,MAAM,IAAI,GAAI,CAAC,CAAC,EAAmB,CAAC,IAAI,CAAC;wBACzC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;4BAAE,SAAS;wBAClC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;wBACpB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;4BACpD,iBAAiB,CAAC,IAAI,EAAG,IAAkC,CAAC,MAAM,CAAC,CAAC;wBACtE,CAAC;6BAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;4BACtD,iBAAiB,CAAC,IAAI,EAAG,IAA6B,CAAC,MAAM,CAAC,CAAC;wBACjE,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,wBAAwB,CAAC,IAAI;gBAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;gBACnC,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;oBACxC,MAAM,EAAE,GAAI,IAA8B,CAAC,EAAE,CAAC;oBAC9C,MAAM,IAAI,GAAG,EAAE,EAAE,IAAI,IAAI,SAAS,CAAC;oBACnC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,iBAAiB,CAAC,IAAI,EAAG,IAA8B,CAAC,MAAM,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACtC,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,MAAM,qBAAqB,GAAG;IAC5B,iBAAiB;CAClB,CAAC;AAYF,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,GAAG,cAAc;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAOD,MAAM,UAAU,qBAAqB,CACnC,GAAqB,EACrB,UAAkB;IAElB,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,MAAM,QAAQ,GAAG,UAAU,IAAI,YAAY,CAAC;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,8BAA8B,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAqB;IACxD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,CACL,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAC9B,GAAG,CAAC,OAAO,KAAK,SAAS;QACzB,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAC7B,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAgB;IAChD,IAAI,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE;YACvC,GAAG,EAAE,GAAG,CAAC,QAAQ;YACjB,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,KAAK;YACV,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;YACzE,mBAAmB,EAAE,KAAK;SAC3B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC;YAAE,SAAS;QACpD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAgB,EAChB,KAAkB,EACO,EAAE;IAC3B,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;QACzB,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC;YAAE,SAAS;QACvD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC3C,IAAI,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACzD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QAE3C,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,sBAAsB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACpF,aAAa,IAAI,cAAc,CAAC;QAEhC,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,OAAO;oBACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;oBAC5D,OAAO,EAAE,SAAS,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,QAAQ,eAAe,EAAE,CAAC,IAAI,yCAAyC;oBAChH,UAAU,EACR,EAAE,CAAC,IAAI,KAAK,KAAK;wBACf,CAAC,CAAC,wFAAwF;wBAC1F,CAAC,CAAC,uEAAuE;iBAC9E,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,SAAS;oBACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;oBAC5D,OAAO,EAAE,sBAAsB,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,QAAQ,uFAAuF;oBACrJ,UAAU,EAAE,4DAA4D;iBACzE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAA4B,CAAC;YAC7D,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC;gBAAE,SAAS;YACjD,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACrC,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,SAAS;oBACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;oBAC1E,OAAO,EAAE,yGAAyG;oBAClH,UAAU,EAAE,iFAAiF;iBAC9F,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,8BAA8B,EAAE,CAAC;gBAC3D,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,SAAS;oBACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;oBAC1E,OAAO,EAAE,mCAAmC,OAAO,CAAC,SAAS,mEAAmE;oBAChI,UAAU,EAAE,wFAAwF;iBACrG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAS,cAAc,CAAC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,OAAO;QACnB,eAAe,EAAE,SAAS;QAC1B,gBAAgB,EAAE,mEAAmE;QACrF,eAAe,EACb,mdAAmd;QACrd,OAAO,EACL,2FAA2F;QAC7F,SAAS,EAAE;;;;;;0PAM2O;QACtP,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,yMAAyM;gBAC/M,GAAG,EAAE,yIAAyI;aAC/I;YACD;gBACE,IAAI,EAAE,iFAAiF;gBACvF,GAAG,EAAE,mDAAmD;aACzD;SACF;QACD,SAAS,EAAE;YACT,gIAAgI;YAChI,uIAAuI;YACvI,mCAAmC;YACnC,yHAAyH;SAC1H;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,2BAA2B;IAC3B,eAAe;IACf,uBAAuB;CACxB,CAAC"}
|
package/dist/rules/registry.js
CHANGED
|
@@ -3,6 +3,7 @@ import { rule as rSpacing } from "./tokens-no-hardcoded-spacing.js";
|
|
|
3
3
|
import { rule as rDtcgConformance } from "./tokens-dtcg-conformance.js";
|
|
4
4
|
import { rule as rDescriptionCoverage } from "./tokens-description-coverage.js";
|
|
5
5
|
import { rule as rShadowNative } from "./components-shadow-native.js";
|
|
6
|
+
import { rule as rContractsStrictness } from "./components-contracts-strictness.js";
|
|
6
7
|
import { rule as rNamingPascalCase } from "./naming-component-pascalcase.js";
|
|
7
8
|
import { rule as rNamingHookPrefix } from "./naming-hook-prefix.js";
|
|
8
9
|
import { rule as rA11y } from "./a11y-essentials.js";
|
|
@@ -10,12 +11,28 @@ import { rule as rStorybook } from "./storybook-coverage.js";
|
|
|
10
11
|
import { rule as rAgentsMdQuality } from "./ai-surface-agents-md-quality.js";
|
|
11
12
|
import { rule as rComponentManifestJson } from "./ai-surface-component-manifest-json.js";
|
|
12
13
|
import { rule as rDsIndexExported } from "./ai-surface-ds-index-exported.js";
|
|
14
|
+
import { rule as rMcpConfigPresent } from "./ai-surface-mcp-config-present.js";
|
|
15
|
+
import { rule as rLlmsTxtStructure } from "./ai-surface-llms-txt-structure.js";
|
|
16
|
+
import { rule as rShadcnRegistryValid } from "./ai-surface-shadcn-registry-valid.js";
|
|
17
|
+
import { rule as rAgentInstructionFiles } from "./ai-surface-agent-instruction-files.js";
|
|
18
|
+
import { rule as rAiTokensReserved } from "./ai-governance-ai-tokens-reserved.js";
|
|
19
|
+
import { rule as rAiMarkerComponentPresent } from "./ai-governance-ai-marker-component-present.js";
|
|
20
|
+
import { rule as rExplainabilityAffordance } from "./ai-governance-explainability-affordance.js";
|
|
21
|
+
import { rule as rAiTokenRequiresMarker } from "./ai-governance-ai-token-requires-marker.js";
|
|
22
|
+
import { rule as rAiLoadingErrorStates } from "./ai-governance-ai-loading-error-states.js";
|
|
23
|
+
import { rule as rHumanControlAffordances } from "./ai-governance-human-control-affordances.js";
|
|
24
|
+
import { rule as rAiMarkerAntiPatterns } from "./ai-governance-ai-marker-anti-patterns.js";
|
|
25
|
+
import { rule as rAiContentLiveRegion } from "./ai-governance-ai-content-live-region.js";
|
|
26
|
+
import { rule as rDisclaimerPresent } from "./ai-governance-disclaimer-present.js";
|
|
27
|
+
import { rule as rFeedbackControlPresent } from "./ai-governance-feedback-control-present.js";
|
|
28
|
+
import { rule as rValueGateDocPresent } from "./ai-governance-value-gate-doc-present.js";
|
|
13
29
|
export const ruleObjects = [
|
|
14
30
|
rColor,
|
|
15
31
|
rSpacing,
|
|
16
32
|
rDtcgConformance,
|
|
17
33
|
rDescriptionCoverage,
|
|
18
34
|
rShadowNative,
|
|
35
|
+
rContractsStrictness,
|
|
19
36
|
rNamingPascalCase,
|
|
20
37
|
rNamingHookPrefix,
|
|
21
38
|
rA11y,
|
|
@@ -23,6 +40,21 @@ export const ruleObjects = [
|
|
|
23
40
|
rAgentsMdQuality,
|
|
24
41
|
rComponentManifestJson,
|
|
25
42
|
rDsIndexExported,
|
|
43
|
+
rMcpConfigPresent,
|
|
44
|
+
rLlmsTxtStructure,
|
|
45
|
+
rShadcnRegistryValid,
|
|
46
|
+
rAgentInstructionFiles,
|
|
47
|
+
rAiTokensReserved,
|
|
48
|
+
rAiMarkerComponentPresent,
|
|
49
|
+
rExplainabilityAffordance,
|
|
50
|
+
rAiTokenRequiresMarker,
|
|
51
|
+
rAiLoadingErrorStates,
|
|
52
|
+
rHumanControlAffordances,
|
|
53
|
+
rAiMarkerAntiPatterns,
|
|
54
|
+
rAiContentLiveRegion,
|
|
55
|
+
rDisclaimerPresent,
|
|
56
|
+
rFeedbackControlPresent,
|
|
57
|
+
rValueGateDocPresent,
|
|
26
58
|
];
|
|
27
59
|
export const ruleMap = new Map(ruleObjects.map((r) => [r.id, r]));
|
|
28
60
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,IAAI,IAAI,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,IAAI,IAAI,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,IAAI,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,IAAI,IAAI,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/rules/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Rule, RuleContext } from "../types.js";
|
|
2
|
-
import { type DtcgDocument, type DtcgType } from "../tokens/dtcg-model.js";
|
|
1
|
+
import type { Rule, RuleContext, Severity } from "../types.js";
|
|
2
|
+
import { type DtcgDocument, type DtcgToken, type DtcgType } from "../tokens/dtcg-model.js";
|
|
3
3
|
/**
|
|
4
4
|
* Discovers DTCG-shaped JSON files under the repo:
|
|
5
5
|
* - `**\/*.tokens.json`
|
|
@@ -16,25 +16,46 @@ declare function looksLikeDtcg(data: unknown): boolean;
|
|
|
16
16
|
* tokens that have `$value` but no `$type` when one is clearly inferable.
|
|
17
17
|
*/
|
|
18
18
|
declare function inferTypeFromValue(value: unknown): DtcgType | null;
|
|
19
|
+
interface ValueShape {
|
|
20
|
+
ok: boolean;
|
|
21
|
+
reason?: string;
|
|
22
|
+
}
|
|
23
|
+
declare function validateColorValue(value: unknown): ValueShape;
|
|
24
|
+
declare function validateDimensionValue(value: unknown): ValueShape;
|
|
25
|
+
declare function validateFontWeightValue(value: unknown): ValueShape;
|
|
26
|
+
declare function validateDurationValue(value: unknown): ValueShape;
|
|
27
|
+
declare function validateCubicBezierValue(value: unknown): ValueShape;
|
|
28
|
+
declare function validateNumberValue(value: unknown): ValueShape;
|
|
29
|
+
declare function validateFontFamilyValue(value: unknown): ValueShape;
|
|
30
|
+
declare function validateStrokeStyleValue(value: unknown): ValueShape;
|
|
31
|
+
declare function validateShadowValue(value: unknown): ValueShape;
|
|
32
|
+
declare function validateTypographyValue(value: unknown): ValueShape;
|
|
33
|
+
declare function validateBorderValue(value: unknown): ValueShape;
|
|
34
|
+
declare function validateTransitionValue(value: unknown): ValueShape;
|
|
35
|
+
declare function validateGradientValue(value: unknown): ValueShape;
|
|
36
|
+
/**
|
|
37
|
+
* Dispatches to the right type-specific validator for a non-alias value.
|
|
38
|
+
* Returns null when the type has no validator or the value is an alias.
|
|
39
|
+
*/
|
|
40
|
+
declare function validateTypedValue(type: DtcgType, value: unknown): ValueShape | null;
|
|
41
|
+
/**
|
|
42
|
+
* Per-token allowlist: a token may opt out of dtcg-conformance checks via
|
|
43
|
+
*
|
|
44
|
+
* "$extensions": { "lyse": { "disable": ["tokens/dtcg-conformance"] } }
|
|
45
|
+
*
|
|
46
|
+
* This is the standard DTCG escape hatch — `$extensions` is reserved for
|
|
47
|
+
* tool-specific metadata.
|
|
48
|
+
*/
|
|
49
|
+
declare function isTokenDisabled(token: DtcgToken<unknown>): boolean;
|
|
50
|
+
interface TokenIssue {
|
|
51
|
+
path: string;
|
|
52
|
+
severity: Severity;
|
|
53
|
+
message: string;
|
|
54
|
+
suggestion?: string;
|
|
55
|
+
}
|
|
19
56
|
interface WalkOutcome {
|
|
20
57
|
tokenCount: number;
|
|
21
|
-
|
|
22
|
-
path: string;
|
|
23
|
-
groupType: DtcgType;
|
|
24
|
-
tokenType: DtcgType;
|
|
25
|
-
}[];
|
|
26
|
-
brokenAliases: {
|
|
27
|
-
path: string;
|
|
28
|
-
alias: string;
|
|
29
|
-
}[];
|
|
30
|
-
missingInferableTypes: {
|
|
31
|
-
path: string;
|
|
32
|
-
inferred: DtcgType;
|
|
33
|
-
}[];
|
|
34
|
-
shapeIssues: {
|
|
35
|
-
path: string;
|
|
36
|
-
reason: string;
|
|
37
|
-
}[];
|
|
58
|
+
issues: TokenIssue[];
|
|
38
59
|
}
|
|
39
60
|
declare function walkDocument(doc: DtcgDocument): WalkOutcome;
|
|
40
61
|
export declare const rule: Rule;
|
|
@@ -43,5 +64,20 @@ export declare const _internal: {
|
|
|
43
64
|
walkDocument: typeof walkDocument;
|
|
44
65
|
looksLikeDtcg: typeof looksLikeDtcg;
|
|
45
66
|
inferTypeFromValue: typeof inferTypeFromValue;
|
|
67
|
+
validateColorValue: typeof validateColorValue;
|
|
68
|
+
validateDimensionValue: typeof validateDimensionValue;
|
|
69
|
+
validateFontWeightValue: typeof validateFontWeightValue;
|
|
70
|
+
validateDurationValue: typeof validateDurationValue;
|
|
71
|
+
validateCubicBezierValue: typeof validateCubicBezierValue;
|
|
72
|
+
validateNumberValue: typeof validateNumberValue;
|
|
73
|
+
validateFontFamilyValue: typeof validateFontFamilyValue;
|
|
74
|
+
validateStrokeStyleValue: typeof validateStrokeStyleValue;
|
|
75
|
+
validateShadowValue: typeof validateShadowValue;
|
|
76
|
+
validateTypographyValue: typeof validateTypographyValue;
|
|
77
|
+
validateBorderValue: typeof validateBorderValue;
|
|
78
|
+
validateTransitionValue: typeof validateTransitionValue;
|
|
79
|
+
validateGradientValue: typeof validateGradientValue;
|
|
80
|
+
validateTypedValue: typeof validateTypedValue;
|
|
81
|
+
isTokenDisabled: typeof isTokenDisabled;
|
|
46
82
|
};
|
|
47
83
|
export {};
|