@carlesandres/component-identity 0.1.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/LICENSE +21 -0
- package/README.md +132 -0
- package/dist/audit.d.ts +3 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +179 -0
- package/dist/audit.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +96 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -0
- package/dist/glob.d.ts +2 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +97 -0
- package/dist/glob.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/naming.d.ts +2 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +8 -0
- package/dist/naming.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Carles Andres
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# @carlesandres/component-identity
|
|
2
|
+
|
|
3
|
+
Audit exported React components for a canonical `data-component` root attribute.
|
|
4
|
+
|
|
5
|
+
The convention is intentionally strict:
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
export function UserMenu() {
|
|
9
|
+
return <div data-component="user-menu" />;
|
|
10
|
+
}
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`UserMenu` maps to `data-component="user-menu"`. The mapping is one-to-one and uses kebab-case derived from the component name.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm install --save-dev @carlesandres/component-identity
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Use
|
|
22
|
+
|
|
23
|
+
Add a config file:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
npx component-identity init
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Run the audit:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
npx component-identity audit
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Use JSON output for CI, reports, or agent tooling:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
npx component-identity report
|
|
39
|
+
npx component-identity audit --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The audit exits with code `1` when violations are found, so it can be used directly in CI.
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"scripts": {
|
|
47
|
+
"audit:components": "component-identity audit"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## What v0.1 Checks
|
|
53
|
+
|
|
54
|
+
The MVP checks exported React components that return a root host DOM element:
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
export function UserMenu() {
|
|
58
|
+
return <div data-component="user-menu" />;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export const AccountCard = () => {
|
|
62
|
+
return <section data-component="account-card" />;
|
|
63
|
+
};
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
It also supports simple `forwardRef` wrappers:
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
export const Button = forwardRef<HTMLButtonElement>((props, ref) => {
|
|
70
|
+
return <button ref={ref} data-component="button" {...props} />;
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The MVP intentionally ignores components whose root is another custom component, a fragment, a portal, or an `asChild` pattern.
|
|
75
|
+
|
|
76
|
+
## Config
|
|
77
|
+
|
|
78
|
+
`component-identity.config.json`:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"attribute": "data-component",
|
|
83
|
+
"include": [
|
|
84
|
+
"src/**/*.{ts,tsx,js,jsx}",
|
|
85
|
+
"app/**/*.{ts,tsx,js,jsx}",
|
|
86
|
+
"components/**/*.{ts,tsx,js,jsx}"
|
|
87
|
+
],
|
|
88
|
+
"exclude": [
|
|
89
|
+
"**/components/ui/**",
|
|
90
|
+
"**/*.test.*",
|
|
91
|
+
"**/*.spec.*",
|
|
92
|
+
"**/*.stories.*",
|
|
93
|
+
"**/*.d.ts",
|
|
94
|
+
"**/node_modules/**",
|
|
95
|
+
"**/dist/**"
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Use `--config` to point at another config file and `--cwd` to audit a different directory.
|
|
101
|
+
|
|
102
|
+
## Library API
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
import { audit, componentNameToKebabCase } from "@carlesandres/component-identity";
|
|
106
|
+
|
|
107
|
+
const result = audit({ cwd: process.cwd() });
|
|
108
|
+
|
|
109
|
+
if (!result.ok) {
|
|
110
|
+
console.log(result.violations);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
console.log(componentNameToKebabCase("UserMenu")); // "user-menu"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Versioning And Publishing
|
|
117
|
+
|
|
118
|
+
This package is designed for normal npm versioning:
|
|
119
|
+
|
|
120
|
+
```sh
|
|
121
|
+
npm run check
|
|
122
|
+
npm test
|
|
123
|
+
npm run pack:dry
|
|
124
|
+
npm run version:patch
|
|
125
|
+
npm run publish:public
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`npm run prepack` builds `dist/` before packaging.
|
|
129
|
+
|
|
130
|
+
## Contributions
|
|
131
|
+
|
|
132
|
+
This project is in a very early stage. For now, issues are accepted as contributions, but pull requests are not.
|
package/dist/audit.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAsC,MAAM,YAAY,CAAC;AAOhG,wBAAgB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,WAAW,CAsC7D"}
|
package/dist/audit.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import ts from "typescript";
|
|
4
|
+
import { loadConfig } from "./config.js";
|
|
5
|
+
import { findCandidateFiles } from "./glob.js";
|
|
6
|
+
import { componentNameToKebabCase } from "./naming.js";
|
|
7
|
+
export function audit(options = {}) {
|
|
8
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
9
|
+
const config = loadConfig(cwd, options.configPath);
|
|
10
|
+
const files = findCandidateFiles(cwd, config.include, config.exclude);
|
|
11
|
+
const violations = [];
|
|
12
|
+
let componentsChecked = 0;
|
|
13
|
+
for (const file of files) {
|
|
14
|
+
const absolutePath = path.join(cwd, file);
|
|
15
|
+
const sourceText = readFileSync(absolutePath, "utf8");
|
|
16
|
+
const sourceFile = ts.createSourceFile(absolutePath, sourceText, ts.ScriptTarget.Latest, true, scriptKindForFile(file));
|
|
17
|
+
for (const candidate of findExportedComponents(sourceFile)) {
|
|
18
|
+
const root = findRootJsxElement(candidate.body);
|
|
19
|
+
if (!root || !isHostElement(root.tagName)) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
componentsChecked += 1;
|
|
23
|
+
const violation = auditRootElement(sourceFile, file, candidate.name, root, config);
|
|
24
|
+
if (violation) {
|
|
25
|
+
violations.push(violation);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
ok: violations.length === 0,
|
|
31
|
+
filesChecked: files.length,
|
|
32
|
+
componentsChecked,
|
|
33
|
+
violations,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function findExportedComponents(sourceFile) {
|
|
37
|
+
const candidates = [];
|
|
38
|
+
for (const statement of sourceFile.statements) {
|
|
39
|
+
if (ts.isFunctionDeclaration(statement) && statement.name && isExported(statement) && isComponentName(statement.name.text)) {
|
|
40
|
+
candidates.push({ name: statement.name.text, body: statement.body ?? statement });
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (ts.isVariableStatement(statement) && isExported(statement)) {
|
|
44
|
+
for (const declaration of statement.declarationList.declarations) {
|
|
45
|
+
if (!ts.isIdentifier(declaration.name) || !isComponentName(declaration.name.text) || !declaration.initializer) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const body = componentBodyFromInitializer(declaration.initializer);
|
|
49
|
+
if (body) {
|
|
50
|
+
candidates.push({ name: declaration.name.text, body });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (ts.isExportAssignment(statement)) {
|
|
55
|
+
const candidate = componentFromDefaultExport(statement.expression);
|
|
56
|
+
if (candidate) {
|
|
57
|
+
candidates.push(candidate);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return candidates;
|
|
62
|
+
}
|
|
63
|
+
function componentFromDefaultExport(expression) {
|
|
64
|
+
if (ts.isIdentifier(expression) && isComponentName(expression.text)) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
if (ts.isArrowFunction(expression) || ts.isFunctionExpression(expression)) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
function componentBodyFromInitializer(initializer) {
|
|
73
|
+
if (ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer)) {
|
|
74
|
+
return initializer.body;
|
|
75
|
+
}
|
|
76
|
+
if (ts.isCallExpression(initializer) && isForwardRefCall(initializer)) {
|
|
77
|
+
const render = initializer.arguments[0];
|
|
78
|
+
if (render && (ts.isArrowFunction(render) || ts.isFunctionExpression(render))) {
|
|
79
|
+
return render.body;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
function isForwardRefCall(call) {
|
|
85
|
+
const expression = call.expression;
|
|
86
|
+
if (ts.isIdentifier(expression)) {
|
|
87
|
+
return expression.text === "forwardRef";
|
|
88
|
+
}
|
|
89
|
+
return ts.isPropertyAccessExpression(expression) && expression.name.text === "forwardRef";
|
|
90
|
+
}
|
|
91
|
+
function findRootJsxElement(body) {
|
|
92
|
+
if (ts.isJsxElement(body)) {
|
|
93
|
+
return body.openingElement;
|
|
94
|
+
}
|
|
95
|
+
if (ts.isJsxSelfClosingElement(body)) {
|
|
96
|
+
return body;
|
|
97
|
+
}
|
|
98
|
+
if (ts.isParenthesizedExpression(body)) {
|
|
99
|
+
return findRootJsxElement(body.expression);
|
|
100
|
+
}
|
|
101
|
+
if (ts.isBlock(body)) {
|
|
102
|
+
for (const statement of body.statements) {
|
|
103
|
+
if (ts.isReturnStatement(statement) && statement.expression) {
|
|
104
|
+
return findRootJsxElement(statement.expression);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
function auditRootElement(sourceFile, file, componentName, root, config) {
|
|
111
|
+
const expectedValue = componentNameToKebabCase(componentName);
|
|
112
|
+
const attribute = findJsxAttribute(root, config.attribute);
|
|
113
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(root.getStart(sourceFile));
|
|
114
|
+
if (!attribute) {
|
|
115
|
+
return {
|
|
116
|
+
code: "missing-attribute",
|
|
117
|
+
file,
|
|
118
|
+
line: line + 1,
|
|
119
|
+
column: character + 1,
|
|
120
|
+
componentName,
|
|
121
|
+
expectedValue,
|
|
122
|
+
message: `${componentName} must set ${config.attribute}="${expectedValue}" on its root DOM element.`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const actualValue = getStaticAttributeValue(attribute);
|
|
126
|
+
if (actualValue !== expectedValue) {
|
|
127
|
+
return {
|
|
128
|
+
code: "mismatched-attribute",
|
|
129
|
+
file,
|
|
130
|
+
line: line + 1,
|
|
131
|
+
column: character + 1,
|
|
132
|
+
componentName,
|
|
133
|
+
expectedValue,
|
|
134
|
+
actualValue,
|
|
135
|
+
message: `${componentName} must use ${config.attribute}="${expectedValue}" on its root DOM element.`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
function findJsxAttribute(root, attributeName) {
|
|
141
|
+
return root.attributes.properties.find((property) => ts.isJsxAttribute(property) && ts.isIdentifier(property.name) && property.name.text === attributeName);
|
|
142
|
+
}
|
|
143
|
+
function getStaticAttributeValue(attribute) {
|
|
144
|
+
if (!attribute.initializer) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
if (ts.isStringLiteral(attribute.initializer)) {
|
|
148
|
+
return attribute.initializer.text;
|
|
149
|
+
}
|
|
150
|
+
if (ts.isJsxExpression(attribute.initializer)) {
|
|
151
|
+
const expression = attribute.initializer.expression;
|
|
152
|
+
if (expression && ts.isStringLiteral(expression)) {
|
|
153
|
+
return expression.text;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
function isHostElement(tagName) {
|
|
159
|
+
return ts.isIdentifier(tagName) && /^[a-z]/.test(tagName.text);
|
|
160
|
+
}
|
|
161
|
+
function isComponentName(name) {
|
|
162
|
+
return /^[A-Z]/.test(name);
|
|
163
|
+
}
|
|
164
|
+
function isExported(node) {
|
|
165
|
+
return ts.canHaveModifiers(node) && Boolean(ts.getModifiers(node)?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword));
|
|
166
|
+
}
|
|
167
|
+
function scriptKindForFile(file) {
|
|
168
|
+
if (file.endsWith(".tsx")) {
|
|
169
|
+
return ts.ScriptKind.TSX;
|
|
170
|
+
}
|
|
171
|
+
if (file.endsWith(".jsx")) {
|
|
172
|
+
return ts.ScriptKind.JSX;
|
|
173
|
+
}
|
|
174
|
+
if (file.endsWith(".js")) {
|
|
175
|
+
return ts.ScriptKind.JS;
|
|
176
|
+
}
|
|
177
|
+
return ts.ScriptKind.TS;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { writeFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { defaultConfig } from "./config.js";
|
|
5
|
+
import { audit } from "./audit.js";
|
|
6
|
+
async function main() {
|
|
7
|
+
const args = parseArgs(process.argv.slice(2));
|
|
8
|
+
if (args.command === "help" || args.command === "--help" || args.command === "-h") {
|
|
9
|
+
printHelp();
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (args.command === "init") {
|
|
13
|
+
const cwd = path.resolve(args.cwd ?? process.cwd());
|
|
14
|
+
const configPath = path.join(cwd, "component-identity.config.json");
|
|
15
|
+
writeFileSync(`${configPath}`, `${JSON.stringify(defaultConfig, null, 2)}\n`, { flag: "wx" });
|
|
16
|
+
console.log(`Created ${path.relative(process.cwd(), configPath)}`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (args.command !== "audit" && args.command !== "report") {
|
|
20
|
+
console.error(`Unknown command: ${args.command}`);
|
|
21
|
+
printHelp();
|
|
22
|
+
process.exitCode = 2;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const auditOptions = {};
|
|
26
|
+
if (args.cwd) {
|
|
27
|
+
auditOptions.cwd = args.cwd;
|
|
28
|
+
}
|
|
29
|
+
if (args.configPath) {
|
|
30
|
+
auditOptions.configPath = args.configPath;
|
|
31
|
+
}
|
|
32
|
+
const result = audit(auditOptions);
|
|
33
|
+
if (args.json || args.command === "report") {
|
|
34
|
+
console.log(JSON.stringify(result, null, 2));
|
|
35
|
+
}
|
|
36
|
+
else if (result.ok) {
|
|
37
|
+
console.log(`component-identity: checked ${result.componentsChecked} component(s) in ${result.filesChecked} file(s), no violations found.`);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
for (const violation of result.violations) {
|
|
41
|
+
console.error(`${violation.file}:${violation.line}:${violation.column} ${violation.message}`);
|
|
42
|
+
}
|
|
43
|
+
console.error(`component-identity: found ${result.violations.length} violation(s).`);
|
|
44
|
+
}
|
|
45
|
+
process.exitCode = args.command === "report" || result.ok ? 0 : 1;
|
|
46
|
+
}
|
|
47
|
+
function parseArgs(rawArgs) {
|
|
48
|
+
const [command = "audit", ...rest] = rawArgs;
|
|
49
|
+
const parsed = {
|
|
50
|
+
command,
|
|
51
|
+
json: false,
|
|
52
|
+
};
|
|
53
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
54
|
+
const arg = rest[index];
|
|
55
|
+
if (arg === "--json") {
|
|
56
|
+
parsed.json = true;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (arg === "--config") {
|
|
60
|
+
const value = rest[index + 1];
|
|
61
|
+
if (value) {
|
|
62
|
+
parsed.configPath = value;
|
|
63
|
+
}
|
|
64
|
+
index += 1;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (arg === "--cwd") {
|
|
68
|
+
const value = rest[index + 1];
|
|
69
|
+
if (value) {
|
|
70
|
+
parsed.cwd = value;
|
|
71
|
+
}
|
|
72
|
+
index += 1;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return parsed;
|
|
77
|
+
}
|
|
78
|
+
function printHelp() {
|
|
79
|
+
console.log(`component-identity
|
|
80
|
+
|
|
81
|
+
Usage:
|
|
82
|
+
component-identity audit [--json] [--config path] [--cwd path]
|
|
83
|
+
component-identity report [--config path] [--cwd path]
|
|
84
|
+
component-identity init [--cwd path]
|
|
85
|
+
|
|
86
|
+
Commands:
|
|
87
|
+
audit Check exported React components and exit non-zero on violations.
|
|
88
|
+
report Print the same audit result as JSON.
|
|
89
|
+
init Create component-identity.config.json in the target directory.
|
|
90
|
+
`);
|
|
91
|
+
}
|
|
92
|
+
main().catch((error) => {
|
|
93
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,eAAO,MAAM,aAAa,EAAE,uBAgB3B,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAgBpF"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const defaultConfig = {
|
|
4
|
+
attribute: "data-component",
|
|
5
|
+
include: [
|
|
6
|
+
"src/**/*.{ts,tsx,js,jsx}",
|
|
7
|
+
"app/**/*.{ts,tsx,js,jsx}",
|
|
8
|
+
"components/**/*.{ts,tsx,js,jsx}",
|
|
9
|
+
],
|
|
10
|
+
exclude: [
|
|
11
|
+
"**/components/ui/**",
|
|
12
|
+
"**/*.test.*",
|
|
13
|
+
"**/*.spec.*",
|
|
14
|
+
"**/*.stories.*",
|
|
15
|
+
"**/*.d.ts",
|
|
16
|
+
"**/node_modules/**",
|
|
17
|
+
"**/dist/**",
|
|
18
|
+
],
|
|
19
|
+
};
|
|
20
|
+
export function loadConfig(cwd, configPath) {
|
|
21
|
+
const resolvedPath = configPath
|
|
22
|
+
? path.resolve(cwd, configPath)
|
|
23
|
+
: path.join(cwd, "component-identity.config.json");
|
|
24
|
+
if (!existsSync(resolvedPath)) {
|
|
25
|
+
return defaultConfig;
|
|
26
|
+
}
|
|
27
|
+
const parsed = JSON.parse(readFileSync(resolvedPath, "utf8"));
|
|
28
|
+
return {
|
|
29
|
+
attribute: parsed.attribute ?? defaultConfig.attribute,
|
|
30
|
+
include: parsed.include ?? defaultConfig.include,
|
|
31
|
+
exclude: parsed.exclude ?? defaultConfig.exclude,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,MAAM,aAAa,GAA4B;IACpD,SAAS,EAAE,gBAAgB;IAC3B,OAAO,EAAE;QACP,0BAA0B;QAC1B,0BAA0B;QAC1B,iCAAiC;KAClC;IACD,OAAO,EAAE;QACP,qBAAqB;QACrB,aAAa;QACb,aAAa;QACb,gBAAgB;QAChB,WAAW;QACX,oBAAoB;QACpB,YAAY;KACb;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,UAAmB;IACzD,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;QAC/B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC;IAErD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAqC,CAAC;IAElG,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS;QACtD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO;QAChD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO;KACjD,CAAC;AACJ,CAAC"}
|
package/dist/glob.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../src/glob.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAc9F"}
|
package/dist/glob.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { readdirSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const DEFAULT_IGNORED_DIRS = new Set([".git", "node_modules", "dist"]);
|
|
4
|
+
export function findCandidateFiles(cwd, include, exclude) {
|
|
5
|
+
const roots = rootsFromIncludePatterns(include);
|
|
6
|
+
const files = new Set();
|
|
7
|
+
for (const root of roots) {
|
|
8
|
+
const absoluteRoot = path.join(cwd, root);
|
|
9
|
+
collectFiles(cwd, absoluteRoot, files);
|
|
10
|
+
}
|
|
11
|
+
return [...files]
|
|
12
|
+
.filter((file) => isSupportedSourceFile(file))
|
|
13
|
+
.filter((file) => matchesAnyInclude(file, include))
|
|
14
|
+
.filter((file) => !matchesAnyExclude(file, exclude))
|
|
15
|
+
.sort();
|
|
16
|
+
}
|
|
17
|
+
function collectFiles(cwd, absolutePath, files) {
|
|
18
|
+
let stat;
|
|
19
|
+
try {
|
|
20
|
+
stat = statSync(absolutePath);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (stat.isFile()) {
|
|
26
|
+
files.add(toPosix(path.relative(cwd, absolutePath)));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!stat.isDirectory()) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const basename = path.basename(absolutePath);
|
|
33
|
+
if (DEFAULT_IGNORED_DIRS.has(basename)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const entry of readdirSync(absolutePath)) {
|
|
37
|
+
collectFiles(cwd, path.join(absolutePath, entry), files);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function rootsFromIncludePatterns(include) {
|
|
41
|
+
const roots = include.map((pattern) => {
|
|
42
|
+
const wildcardIndex = pattern.search(/[*{]/);
|
|
43
|
+
const prefix = wildcardIndex === -1 ? pattern : pattern.slice(0, wildcardIndex);
|
|
44
|
+
const root = prefix.split("/").filter(Boolean)[0];
|
|
45
|
+
return root ?? ".";
|
|
46
|
+
});
|
|
47
|
+
return [...new Set(roots)];
|
|
48
|
+
}
|
|
49
|
+
function matchesAnyInclude(file, include) {
|
|
50
|
+
return include.some((pattern) => matchesPattern(file, pattern));
|
|
51
|
+
}
|
|
52
|
+
function matchesAnyExclude(file, exclude) {
|
|
53
|
+
return exclude.some((pattern) => matchesPattern(file, pattern));
|
|
54
|
+
}
|
|
55
|
+
function matchesPattern(file, pattern) {
|
|
56
|
+
const normalizedPattern = toPosix(pattern);
|
|
57
|
+
if (normalizedPattern.includes("{ts,tsx,js,jsx}")) {
|
|
58
|
+
const base = normalizedPattern.replace(".{ts,tsx,js,jsx}", "");
|
|
59
|
+
return matchesPattern(file, `${base}.ts`) || matchesPattern(file, `${base}.tsx`) || matchesPattern(file, `${base}.js`) || matchesPattern(file, `${base}.jsx`);
|
|
60
|
+
}
|
|
61
|
+
return globToRegExp(normalizedPattern).test(file);
|
|
62
|
+
}
|
|
63
|
+
function isSupportedSourceFile(file) {
|
|
64
|
+
return /\.(tsx?|jsx?)$/.test(file) && !file.endsWith(".d.ts");
|
|
65
|
+
}
|
|
66
|
+
function toPosix(value) {
|
|
67
|
+
return value.split(path.sep).join("/");
|
|
68
|
+
}
|
|
69
|
+
function globToRegExp(pattern) {
|
|
70
|
+
let source = "^";
|
|
71
|
+
for (let index = 0; index < pattern.length; index += 1) {
|
|
72
|
+
const character = pattern[index];
|
|
73
|
+
const next = pattern[index + 1];
|
|
74
|
+
const afterNext = pattern[index + 2];
|
|
75
|
+
if (character === "*" && next === "*" && afterNext === "/") {
|
|
76
|
+
source += "(?:.*/)?";
|
|
77
|
+
index += 2;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (character === "*" && next === "*") {
|
|
81
|
+
source += ".*";
|
|
82
|
+
index += 1;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (character === "*") {
|
|
86
|
+
source += "[^/]*";
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
source += escapeRegExp(character);
|
|
90
|
+
}
|
|
91
|
+
source += "$";
|
|
92
|
+
return new RegExp(source);
|
|
93
|
+
}
|
|
94
|
+
function escapeRegExp(value) {
|
|
95
|
+
return value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=glob.js.map
|
package/dist/glob.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../src/glob.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { audit } from "./audit.js";
|
|
2
|
+
export { defaultConfig, loadConfig } from "./config.js";
|
|
3
|
+
export { componentNameToKebabCase } from "./naming.js";
|
|
4
|
+
export type { AuditOptions, AuditResult, ComponentIdentityConfig, Violation, ViolationCode } from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/naming.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAMtE"}
|
package/dist/naming.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,wBAAwB,CAAC,aAAqB;IAC5D,OAAO,aAAa;SACjB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type ComponentIdentityConfig = {
|
|
2
|
+
attribute: string;
|
|
3
|
+
include: string[];
|
|
4
|
+
exclude: string[];
|
|
5
|
+
};
|
|
6
|
+
export type AuditOptions = {
|
|
7
|
+
cwd?: string | undefined;
|
|
8
|
+
configPath?: string | undefined;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type ViolationCode = "missing-attribute" | "mismatched-attribute";
|
|
12
|
+
export type Violation = {
|
|
13
|
+
code: ViolationCode;
|
|
14
|
+
file: string;
|
|
15
|
+
line: number;
|
|
16
|
+
column: number;
|
|
17
|
+
componentName: string;
|
|
18
|
+
expectedValue: string;
|
|
19
|
+
actualValue?: string | undefined;
|
|
20
|
+
message: string;
|
|
21
|
+
};
|
|
22
|
+
export type AuditResult = {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
filesChecked: number;
|
|
25
|
+
componentsChecked: number;
|
|
26
|
+
violations: Violation[];
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG,sBAAsB,CAAC;AAEzE,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@carlesandres/component-identity",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Audit exported React components for canonical data-component root attributes.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"component-identity": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -p tsconfig.json",
|
|
18
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
19
|
+
"test": "node --test test/*.test.mjs",
|
|
20
|
+
"prepack": "npm run build",
|
|
21
|
+
"pack:dry": "npm pack --dry-run",
|
|
22
|
+
"version:patch": "npm version patch",
|
|
23
|
+
"version:minor": "npm version minor",
|
|
24
|
+
"version:major": "npm version major",
|
|
25
|
+
"publish:public": "npm publish --access public"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"react",
|
|
29
|
+
"components",
|
|
30
|
+
"lint",
|
|
31
|
+
"audit",
|
|
32
|
+
"data-component"
|
|
33
|
+
],
|
|
34
|
+
"author": "Carles Andres",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/carlesandres/component-identity.git"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/carlesandres/component-identity/issues"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/carlesandres/component-identity#readme",
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=20"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"typescript": "^5.8.3"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "25.9.3"
|
|
52
|
+
}
|
|
53
|
+
}
|