@gallop.software/canon 2.25.0 → 2.29.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/cli/commands/generate.d.ts +2 -1
- package/dist/cli/commands/generate.js +337 -76
- package/dist/cli/config.d.ts +6 -0
- package/dist/cli/config.js +17 -0
- package/dist/cli/index.js +36 -10
- package/dist/eslint/index.d.ts +8 -0
- package/dist/eslint/index.js +13 -1
- package/dist/eslint/rules/no-classnames-package.d.ts +3 -0
- package/dist/eslint/rules/no-classnames-package.js +46 -0
- package/dist/eslint/rules/no-inline-svg.d.ts +3 -0
- package/dist/eslint/rules/no-inline-svg.js +37 -0
- package/dist/eslint/rules/no-raw-colors.d.ts +3 -0
- package/dist/eslint/rules/no-raw-colors.js +139 -0
- package/dist/eslint/rules/prefer-alias-imports.d.ts +3 -0
- package/dist/eslint/rules/prefer-alias-imports.js +105 -0
- package/dist/eslint/rules/prefer-list-components.js +3 -3
- package/dist/eslint/rules/prefer-typography-components.js +7 -1
- package/dist/eslint/rules/require-canon-setup.js +5 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/types/config.d.ts +36 -0
- package/dist/types/config.js +2 -0
- package/package.json +5 -1
- package/patterns/007-import-paths.md +4 -3
- package/patterns/009-color-tokens.md +4 -3
- package/patterns/012-icon-system.md +4 -3
- package/patterns/014-clsx-not-classnames.md +3 -3
- package/schema.json +8 -8
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
const CONFIG_FILENAME = 'canon.config.json';
|
|
4
|
+
/**
|
|
5
|
+
* Load canon.config.json from the current working directory.
|
|
6
|
+
* Returns null if no config file is found.
|
|
7
|
+
*/
|
|
8
|
+
export function loadConfig(cwd) {
|
|
9
|
+
const dir = cwd || process.cwd();
|
|
10
|
+
const configPath = path.join(dir, CONFIG_FILENAME);
|
|
11
|
+
if (!fs.existsSync(configPath)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
15
|
+
return JSON.parse(raw);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDeEIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUE7QUFHNUIsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUE7QUFFM0M7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFZO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDaEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUE7SUFFbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUF3QixDQUFBO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB0eXBlIHsgQ2Fub25UZW1wbGF0ZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbmZpZy5qcydcblxuY29uc3QgQ09ORklHX0ZJTEVOQU1FID0gJ2Nhbm9uLmNvbmZpZy5qc29uJ1xuXG4vKipcbiAqIExvYWQgY2Fub24uY29uZmlnLmpzb24gZnJvbSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAqIFJldHVybnMgbnVsbCBpZiBubyBjb25maWcgZmlsZSBpcyBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb25maWcoY3dkPzogc3RyaW5nKTogQ2Fub25UZW1wbGF0ZUNvbmZpZyB8IG51bGwge1xuICBjb25zdCBkaXIgPSBjd2QgfHwgcHJvY2Vzcy5jd2QoKVxuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGRpciwgQ09ORklHX0ZJTEVOQU1FKVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04JylcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDYW5vblRlbXBsYXRlQ29uZmlnXG59XG4iXX0=
|
package/dist/cli/index.js
CHANGED
|
@@ -26,7 +26,7 @@ ${colors.bold}Usage:${colors.reset}
|
|
|
26
26
|
|
|
27
27
|
${colors.bold}Commands:${colors.reset}
|
|
28
28
|
audit [path] Check Canon compliance (default: src/blocks/)
|
|
29
|
-
generate [output] Generate AI rules from Canon
|
|
29
|
+
generate [output] Generate AI rules from Canon
|
|
30
30
|
version Show version information
|
|
31
31
|
help Show this help message
|
|
32
32
|
|
|
@@ -35,13 +35,18 @@ ${colors.bold}Audit Options:${colors.reset}
|
|
|
35
35
|
--json Output as JSON
|
|
36
36
|
|
|
37
37
|
${colors.bold}Generate Options:${colors.reset}
|
|
38
|
-
|
|
38
|
+
gallop generate Generate all files (.cursorrules, CLAUDE.md, copilot-instructions.md)
|
|
39
|
+
gallop generate .cursorrules Generate .cursorrules only
|
|
40
|
+
gallop generate CLAUDE.md Generate CLAUDE.md only
|
|
41
|
+
gallop generate .github/copilot-instructions.md
|
|
42
|
+
--output, -o Output file path
|
|
39
43
|
|
|
40
44
|
${colors.bold}Examples:${colors.reset}
|
|
41
45
|
gallop audit
|
|
42
46
|
gallop audit src/blocks/ --strict
|
|
43
47
|
gallop generate
|
|
44
48
|
gallop generate .cursorrules
|
|
49
|
+
gallop generate CLAUDE.md
|
|
45
50
|
gallop generate --output .github/copilot-instructions.md
|
|
46
51
|
`);
|
|
47
52
|
}
|
|
@@ -49,6 +54,17 @@ function showVersion() {
|
|
|
49
54
|
console.log(`Gallop CLI v1.0.0`);
|
|
50
55
|
console.log(`Canon v${version}`);
|
|
51
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Detect output format from filename
|
|
59
|
+
*/
|
|
60
|
+
function detectFormat(filename) {
|
|
61
|
+
const lower = filename.toLowerCase();
|
|
62
|
+
if (lower.endsWith('claude.md'))
|
|
63
|
+
return 'claude';
|
|
64
|
+
if (lower.endsWith('copilot-instructions.md'))
|
|
65
|
+
return 'copilot';
|
|
66
|
+
return 'cursorrules';
|
|
67
|
+
}
|
|
52
68
|
async function main() {
|
|
53
69
|
switch (command) {
|
|
54
70
|
case 'audit':
|
|
@@ -60,11 +76,11 @@ async function main() {
|
|
|
60
76
|
};
|
|
61
77
|
await audit(auditPath, auditOptions);
|
|
62
78
|
break;
|
|
63
|
-
case 'generate':
|
|
79
|
+
case 'generate': {
|
|
64
80
|
// Find output path from args
|
|
65
|
-
let outputPath = '.cursorrules';
|
|
66
81
|
const outputIndex = args.indexOf('--output');
|
|
67
82
|
const outputIndexShort = args.indexOf('-o');
|
|
83
|
+
let outputPath = null;
|
|
68
84
|
if (outputIndex !== -1 && args[outputIndex + 1]) {
|
|
69
85
|
outputPath = args[outputIndex + 1];
|
|
70
86
|
}
|
|
@@ -74,12 +90,22 @@ async function main() {
|
|
|
74
90
|
else if (args[1] && !args[1].startsWith('--')) {
|
|
75
91
|
outputPath = args[1];
|
|
76
92
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
93
|
+
if (outputPath) {
|
|
94
|
+
// Single-file generation
|
|
95
|
+
await generate({
|
|
96
|
+
output: outputPath,
|
|
97
|
+
format: detectFormat(outputPath),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// No args → generate all files
|
|
102
|
+
await generate({
|
|
103
|
+
output: 'all',
|
|
104
|
+
format: 'cursorrules', // unused when output is 'all'
|
|
105
|
+
});
|
|
106
|
+
}
|
|
82
107
|
break;
|
|
108
|
+
}
|
|
83
109
|
case 'version':
|
|
84
110
|
case '-v':
|
|
85
111
|
case '--version':
|
|
@@ -101,4 +127,4 @@ main().catch((error) => {
|
|
|
101
127
|
console.error('Error:', error.message);
|
|
102
128
|
process.exit(1);
|
|
103
129
|
});
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRXZCLDZCQUE2QjtBQUM3QixNQUFNLE1BQU0sR0FBRztJQUNiLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLElBQUksRUFBRSxVQUFVO0NBQ2pCLENBQUE7QUFFRCxTQUFTLFFBQVE7SUFDZixPQUFPLENBQUMsR0FBRyxDQUFDO0VBQ1osTUFBTSxDQUFDLElBQUksYUFBYSxNQUFNLENBQUMsS0FBSztFQUNwQyxNQUFNLENBQUMsR0FBRyxrQkFBa0IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLOztFQUVsRCxNQUFNLENBQUMsSUFBSSxTQUFTLE1BQU0sQ0FBQyxLQUFLOzs7RUFHaEMsTUFBTSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsS0FBSzs7Ozs7O0VBTW5DLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixNQUFNLENBQUMsS0FBSzs7OztFQUl4QyxNQUFNLENBQUMsSUFBSSxvQkFBb0IsTUFBTSxDQUFDLEtBQUs7Ozs7Ozs7RUFPM0MsTUFBTSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsS0FBSzs7Ozs7OztDQU9wQyxDQUFDLENBQUE7QUFDRixDQUFDO0FBRUQsU0FBUyxXQUFXO0lBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtJQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsT0FBTyxFQUFFLENBQUMsQ0FBQTtBQUNsQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxRQUFnQjtJQUNwQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQ2hELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFBO0lBQy9ELE9BQU8sYUFBYSxDQUFBO0FBQ3RCLENBQUM7QUFFRCxLQUFLLFVBQVUsSUFBSTtJQUNqQixRQUFRLE9BQU8sRUFBRSxDQUFDO1FBQ2hCLEtBQUssT0FBTztZQUNWLE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFBO1lBQ2hFLE1BQU0sWUFBWSxHQUFHO2dCQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDN0IsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2FBQzVCLENBQUE7WUFDRCxNQUFNLEtBQUssQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFDcEMsTUFBSztRQUVQLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNoQiw2QkFBNkI7WUFDN0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM1QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDM0MsSUFBSSxVQUFVLEdBQWtCLElBQUksQ0FBQTtZQUVwQyxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3BDLENBQUM7aUJBQU0sSUFBSSxnQkFBZ0IsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUN6QyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3RCLENBQUM7WUFFRCxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLHlCQUF5QjtnQkFDekIsTUFBTSxRQUFRLENBQUM7b0JBQ2IsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLE1BQU0sRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDO2lCQUNqQyxDQUFDLENBQUE7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sK0JBQStCO2dCQUMvQixNQUFNLFFBQVEsQ0FBQztvQkFDYixNQUFNLEVBQUUsS0FBSztvQkFDYixNQUFNLEVBQUUsYUFBYSxFQUFFLDhCQUE4QjtpQkFDdEQsQ0FBQyxDQUFBO1lBQ0osQ0FBQztZQUNELE1BQUs7UUFDUCxDQUFDO1FBRUQsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssV0FBVztZQUNkLFdBQVcsRUFBRSxDQUFBO1lBQ2IsTUFBSztRQUVQLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssU0FBUztZQUNaLFFBQVEsRUFBRSxDQUFBO1lBQ1YsTUFBSztRQUVQO1lBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUE7WUFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pCLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBhdWRpdCB9IGZyb20gJy4vY29tbWFuZHMvYXVkaXQuanMnXG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29tbWFuZHMvZ2VuZXJhdGUuanMnXG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vaW5kZXguanMnXG5cbmNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilcbmNvbnN0IGNvbW1hbmQgPSBhcmdzWzBdXG5cbi8vIENvbG9ycyBmb3IgdGVybWluYWwgb3V0cHV0XG5jb25zdCBjb2xvcnMgPSB7XG4gIHJlc2V0OiAnXFx4MWJbMG0nLFxuICBib2xkOiAnXFx4MWJbMW0nLFxuICBkaW06ICdcXHgxYlsybScsXG4gIHJlZDogJ1xceDFiWzMxbScsXG4gIGdyZWVuOiAnXFx4MWJbMzJtJyxcbiAgeWVsbG93OiAnXFx4MWJbMzNtJyxcbiAgYmx1ZTogJ1xceDFiWzM0bScsXG4gIG1hZ2VudGE6ICdcXHgxYlszNW0nLFxuICBjeWFuOiAnXFx4MWJbMzZtJyxcbn1cblxuZnVuY3Rpb24gc2hvd0hlbHAoKSB7XG4gIGNvbnNvbGUubG9nKGBcbiR7Y29sb3JzLmJvbGR9R2FsbG9wIENMSSR7Y29sb3JzLnJlc2V0fSAtIENhbm9uIENvbXBsaWFuY2UgVG9vbGluZ1xuJHtjb2xvcnMuZGltfUNhbm9uIFZlcnNpb246ICR7dmVyc2lvbn0ke2NvbG9ycy5yZXNldH1cblxuJHtjb2xvcnMuYm9sZH1Vc2FnZToke2NvbG9ycy5yZXNldH1cbiAgZ2FsbG9wIDxjb21tYW5kPiBbb3B0aW9uc11cblxuJHtjb2xvcnMuYm9sZH1Db21tYW5kczoke2NvbG9ycy5yZXNldH1cbiAgYXVkaXQgW3BhdGhdICAgICAgIENoZWNrIENhbm9uIGNvbXBsaWFuY2UgKGRlZmF1bHQ6IHNyYy9ibG9ja3MvKVxuICBnZW5lcmF0ZSBbb3V0cHV0XSAgR2VuZXJhdGUgQUkgcnVsZXMgZnJvbSBDYW5vblxuICB2ZXJzaW9uICAgICAgICAgICAgU2hvdyB2ZXJzaW9uIGluZm9ybWF0aW9uXG4gIGhlbHAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXG5cbiR7Y29sb3JzLmJvbGR9QXVkaXQgT3B0aW9uczoke2NvbG9ycy5yZXNldH1cbiAgLS1zdHJpY3QgICAgICAgICAgIEV4aXQgd2l0aCBlcnJvciBjb2RlIG9uIHZpb2xhdGlvbnNcbiAgLS1qc29uICAgICAgICAgICAgIE91dHB1dCBhcyBKU09OXG5cbiR7Y29sb3JzLmJvbGR9R2VuZXJhdGUgT3B0aW9uczoke2NvbG9ycy5yZXNldH1cbiAgZ2FsbG9wIGdlbmVyYXRlICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgYWxsIGZpbGVzICguY3Vyc29ycnVsZXMsIENMQVVERS5tZCwgY29waWxvdC1pbnN0cnVjdGlvbnMubWQpXG4gIGdhbGxvcCBnZW5lcmF0ZSAuY3Vyc29ycnVsZXMgICAgIEdlbmVyYXRlIC5jdXJzb3JydWxlcyBvbmx5XG4gIGdhbGxvcCBnZW5lcmF0ZSBDTEFVREUubWQgICAgICAgIEdlbmVyYXRlIENMQVVERS5tZCBvbmx5XG4gIGdhbGxvcCBnZW5lcmF0ZSAuZ2l0aHViL2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kXG4gIC0tb3V0cHV0LCAtbyAgICAgICBPdXRwdXQgZmlsZSBwYXRoXG5cbiR7Y29sb3JzLmJvbGR9RXhhbXBsZXM6JHtjb2xvcnMucmVzZXR9XG4gIGdhbGxvcCBhdWRpdFxuICBnYWxsb3AgYXVkaXQgc3JjL2Jsb2Nrcy8gLS1zdHJpY3RcbiAgZ2FsbG9wIGdlbmVyYXRlXG4gIGdhbGxvcCBnZW5lcmF0ZSAuY3Vyc29ycnVsZXNcbiAgZ2FsbG9wIGdlbmVyYXRlIENMQVVERS5tZFxuICBnYWxsb3AgZ2VuZXJhdGUgLS1vdXRwdXQgLmdpdGh1Yi9jb3BpbG90LWluc3RydWN0aW9ucy5tZFxuYClcbn1cblxuZnVuY3Rpb24gc2hvd1ZlcnNpb24oKSB7XG4gIGNvbnNvbGUubG9nKGBHYWxsb3AgQ0xJIHYxLjAuMGApXG4gIGNvbnNvbGUubG9nKGBDYW5vbiB2JHt2ZXJzaW9ufWApXG59XG5cbi8qKlxuICogRGV0ZWN0IG91dHB1dCBmb3JtYXQgZnJvbSBmaWxlbmFtZVxuICovXG5mdW5jdGlvbiBkZXRlY3RGb3JtYXQoZmlsZW5hbWU6IHN0cmluZyk6ICdjdXJzb3JydWxlcycgfCAnY2xhdWRlJyB8ICdjb3BpbG90JyB7XG4gIGNvbnN0IGxvd2VyID0gZmlsZW5hbWUudG9Mb3dlckNhc2UoKVxuICBpZiAobG93ZXIuZW5kc1dpdGgoJ2NsYXVkZS5tZCcpKSByZXR1cm4gJ2NsYXVkZSdcbiAgaWYgKGxvd2VyLmVuZHNXaXRoKCdjb3BpbG90LWluc3RydWN0aW9ucy5tZCcpKSByZXR1cm4gJ2NvcGlsb3QnXG4gIHJldHVybiAnY3Vyc29ycnVsZXMnXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIHN3aXRjaCAoY29tbWFuZCkge1xuICAgIGNhc2UgJ2F1ZGl0JzpcbiAgICAgIGNvbnN0IGF1ZGl0UGF0aCA9XG4gICAgICAgIGFyZ3NbMV0gJiYgIWFyZ3NbMV0uc3RhcnRzV2l0aCgnLS0nKSA/IGFyZ3NbMV0gOiAnc3JjL2Jsb2Nrcy8nXG4gICAgICBjb25zdCBhdWRpdE9wdGlvbnMgPSB7XG4gICAgICAgIHN0cmljdDogYXJncy5pbmNsdWRlcygnLS1zdHJpY3QnKSxcbiAgICAgICAganNvbjogYXJncy5pbmNsdWRlcygnLS1qc29uJyksXG4gICAgICAgIGZpeDogYXJncy5pbmNsdWRlcygnLS1maXgnKSxcbiAgICAgIH1cbiAgICAgIGF3YWl0IGF1ZGl0KGF1ZGl0UGF0aCwgYXVkaXRPcHRpb25zKVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgLy8gRmluZCBvdXRwdXQgcGF0aCBmcm9tIGFyZ3NcbiAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gYXJncy5pbmRleE9mKCctLW91dHB1dCcpXG4gICAgICBjb25zdCBvdXRwdXRJbmRleFNob3J0ID0gYXJncy5pbmRleE9mKCctbycpXG4gICAgICBsZXQgb3V0cHV0UGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgICAgaWYgKG91dHB1dEluZGV4ICE9PSAtMSAmJiBhcmdzW291dHB1dEluZGV4ICsgMV0pIHtcbiAgICAgICAgb3V0cHV0UGF0aCA9IGFyZ3Nbb3V0cHV0SW5kZXggKyAxXVxuICAgICAgfSBlbHNlIGlmIChvdXRwdXRJbmRleFNob3J0ICE9PSAtMSAmJiBhcmdzW291dHB1dEluZGV4U2hvcnQgKyAxXSkge1xuICAgICAgICBvdXRwdXRQYXRoID0gYXJnc1tvdXRwdXRJbmRleFNob3J0ICsgMV1cbiAgICAgIH0gZWxzZSBpZiAoYXJnc1sxXSAmJiAhYXJnc1sxXS5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICAgIG91dHB1dFBhdGggPSBhcmdzWzFdXG4gICAgICB9XG5cbiAgICAgIGlmIChvdXRwdXRQYXRoKSB7XG4gICAgICAgIC8vIFNpbmdsZS1maWxlIGdlbmVyYXRpb25cbiAgICAgICAgYXdhaXQgZ2VuZXJhdGUoe1xuICAgICAgICAgIG91dHB1dDogb3V0cHV0UGF0aCxcbiAgICAgICAgICBmb3JtYXQ6IGRldGVjdEZvcm1hdChvdXRwdXRQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGFyZ3Mg4oaSIGdlbmVyYXRlIGFsbCBmaWxlc1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZSh7XG4gICAgICAgICAgb3V0cHV0OiAnYWxsJyxcbiAgICAgICAgICBmb3JtYXQ6ICdjdXJzb3JydWxlcycsIC8vIHVudXNlZCB3aGVuIG91dHB1dCBpcyAnYWxsJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjYXNlICd2ZXJzaW9uJzpcbiAgICBjYXNlICctdic6XG4gICAgY2FzZSAnLS12ZXJzaW9uJzpcbiAgICAgIHNob3dWZXJzaW9uKClcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdoZWxwJzpcbiAgICBjYXNlICctaCc6XG4gICAgY2FzZSAnLS1oZWxwJzpcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHNob3dIZWxwKClcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJ1biAnZ2FsbG9wIGhlbHAnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi5gKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cblxubWFpbigpLmNhdGNoKChlcnJvcikgPT4ge1xuICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvci5tZXNzYWdlKVxuICBwcm9jZXNzLmV4aXQoMSlcbn0pXG4iXX0=
|
package/dist/eslint/index.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ declare const plugin: {
|
|
|
21
21
|
'no-arbitrary-colors': import("@typescript-eslint/utils/ts-eslint").RuleModule<"noArbitraryColors", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
22
22
|
name: string;
|
|
23
23
|
};
|
|
24
|
+
'no-raw-colors': import("eslint").Rule.RuleModule;
|
|
24
25
|
'no-cross-zone-imports': import("@typescript-eslint/utils/ts-eslint").RuleModule<"blocksImportBlocks" | "componentsImportBlocks" | "runtimeImportScripts", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
25
26
|
name: string;
|
|
26
27
|
};
|
|
@@ -29,6 +30,9 @@ declare const plugin: {
|
|
|
29
30
|
'prefer-list-components': import("eslint").Rule.RuleModule;
|
|
30
31
|
'no-native-date': import("eslint").Rule.RuleModule;
|
|
31
32
|
'require-canon-setup': import("eslint").Rule.RuleModule;
|
|
33
|
+
'no-classnames-package': import("eslint").Rule.RuleModule;
|
|
34
|
+
'prefer-alias-imports': import("eslint").Rule.RuleModule;
|
|
35
|
+
'no-inline-svg': import("eslint").Rule.RuleModule;
|
|
32
36
|
};
|
|
33
37
|
/**
|
|
34
38
|
* Recommended rule configurations - spread into your ESLint config
|
|
@@ -42,12 +46,16 @@ declare const plugin: {
|
|
|
42
46
|
readonly 'gallop/prefer-typography-components': "warn";
|
|
43
47
|
readonly 'gallop/prefer-layout-components': "warn";
|
|
44
48
|
readonly 'gallop/no-arbitrary-colors': "warn";
|
|
49
|
+
readonly 'gallop/no-raw-colors': "warn";
|
|
45
50
|
readonly 'gallop/no-cross-zone-imports': "warn";
|
|
46
51
|
readonly 'gallop/no-native-intersection-observer': "warn";
|
|
47
52
|
readonly 'gallop/no-component-in-blocks': "warn";
|
|
48
53
|
readonly 'gallop/prefer-list-components': "warn";
|
|
49
54
|
readonly 'gallop/no-native-date': "warn";
|
|
50
55
|
readonly 'gallop/require-canon-setup': "warn";
|
|
56
|
+
readonly 'gallop/no-classnames-package': "warn";
|
|
57
|
+
readonly 'gallop/prefer-alias-imports': "warn";
|
|
58
|
+
readonly 'gallop/no-inline-svg': "warn";
|
|
51
59
|
};
|
|
52
60
|
};
|
|
53
61
|
export default plugin;
|
package/dist/eslint/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import preferComponentProps from './rules/prefer-component-props.js';
|
|
|
4
4
|
import preferTypographyComponents from './rules/prefer-typography-components.js';
|
|
5
5
|
import preferLayoutComponents from './rules/prefer-layout-components.js';
|
|
6
6
|
import noArbitraryColors from './rules/no-arbitrary-colors.js';
|
|
7
|
+
import noRawColors from './rules/no-raw-colors.js';
|
|
7
8
|
import noCrossZoneImports from './rules/no-cross-zone-imports.js';
|
|
8
9
|
import noNativeIntersectionObserver from './rules/no-native-intersection-observer.js';
|
|
9
10
|
import noComponentInBlocks from './rules/no-component-in-blocks.js';
|
|
@@ -11,6 +12,9 @@ import preferListComponents from './rules/prefer-list-components.js';
|
|
|
11
12
|
import noNativeDate from './rules/no-native-date.js';
|
|
12
13
|
import blockNamingConvention from './rules/block-naming-convention.js';
|
|
13
14
|
import requireCanonSetup from './rules/require-canon-setup.js';
|
|
15
|
+
import noClassnamesPackage from './rules/no-classnames-package.js';
|
|
16
|
+
import preferAliasImports from './rules/prefer-alias-imports.js';
|
|
17
|
+
import noInlineSvg from './rules/no-inline-svg.js';
|
|
14
18
|
/**
|
|
15
19
|
* All Canon ESLint rules with recommended severity levels
|
|
16
20
|
*/
|
|
@@ -22,12 +26,16 @@ const recommended = {
|
|
|
22
26
|
'gallop/prefer-typography-components': 'warn',
|
|
23
27
|
'gallop/prefer-layout-components': 'warn',
|
|
24
28
|
'gallop/no-arbitrary-colors': 'warn',
|
|
29
|
+
'gallop/no-raw-colors': 'warn',
|
|
25
30
|
'gallop/no-cross-zone-imports': 'warn',
|
|
26
31
|
'gallop/no-native-intersection-observer': 'warn',
|
|
27
32
|
'gallop/no-component-in-blocks': 'warn',
|
|
28
33
|
'gallop/prefer-list-components': 'warn',
|
|
29
34
|
'gallop/no-native-date': 'warn',
|
|
30
35
|
'gallop/require-canon-setup': 'warn',
|
|
36
|
+
'gallop/no-classnames-package': 'warn',
|
|
37
|
+
'gallop/prefer-alias-imports': 'warn',
|
|
38
|
+
'gallop/no-inline-svg': 'warn',
|
|
31
39
|
};
|
|
32
40
|
const plugin = {
|
|
33
41
|
meta: {
|
|
@@ -42,12 +50,16 @@ const plugin = {
|
|
|
42
50
|
'prefer-typography-components': preferTypographyComponents,
|
|
43
51
|
'prefer-layout-components': preferLayoutComponents,
|
|
44
52
|
'no-arbitrary-colors': noArbitraryColors,
|
|
53
|
+
'no-raw-colors': noRawColors,
|
|
45
54
|
'no-cross-zone-imports': noCrossZoneImports,
|
|
46
55
|
'no-native-intersection-observer': noNativeIntersectionObserver,
|
|
47
56
|
'no-component-in-blocks': noComponentInBlocks,
|
|
48
57
|
'prefer-list-components': preferListComponents,
|
|
49
58
|
'no-native-date': noNativeDate,
|
|
50
59
|
'require-canon-setup': requireCanonSetup,
|
|
60
|
+
'no-classnames-package': noClassnamesPackage,
|
|
61
|
+
'prefer-alias-imports': preferAliasImports,
|
|
62
|
+
'no-inline-svg': noInlineSvg,
|
|
51
63
|
},
|
|
52
64
|
/**
|
|
53
65
|
* Recommended rule configurations - spread into your ESLint config
|
|
@@ -56,4 +68,4 @@ const plugin = {
|
|
|
56
68
|
recommended,
|
|
57
69
|
};
|
|
58
70
|
export default plugin;
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXNsaW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFBO0FBQ3hELE9BQU8sb0JBQW9CLE1BQU0sb0NBQW9DLENBQUE7QUFDckUsT0FBTyxvQkFBb0IsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNwRSxPQUFPLDBCQUEwQixNQUFNLHlDQUF5QyxDQUFBO0FBQ2hGLE9BQU8sc0JBQXNCLE1BQU0scUNBQXFDLENBQUE7QUFDeEUsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUM5RCxPQUFPLFdBQVcsTUFBTSwwQkFBMEIsQ0FBQTtBQUNsRCxPQUFPLGtCQUFrQixNQUFNLGtDQUFrQyxDQUFBO0FBQ2pFLE9BQU8sNEJBQTRCLE1BQU0sNENBQTRDLENBQUE7QUFDckYsT0FBTyxtQkFBbUIsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNuRSxPQUFPLG9CQUFvQixNQUFNLG1DQUFtQyxDQUFBO0FBQ3BFLE9BQU8sWUFBWSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8scUJBQXFCLE1BQU0sb0NBQW9DLENBQUE7QUFDdEUsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUM5RCxPQUFPLG1CQUFtQixNQUFNLGtDQUFrQyxDQUFBO0FBQ2xFLE9BQU8sa0JBQWtCLE1BQU0saUNBQWlDLENBQUE7QUFDaEUsT0FBTyxXQUFXLE1BQU0sMEJBQTBCLENBQUE7QUFFbEQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsR0FBRztJQUNsQix5QkFBeUIsRUFBRSxNQUFNO0lBQ2pDLGdDQUFnQyxFQUFFLE1BQU07SUFDeEMsZ0NBQWdDLEVBQUUsTUFBTTtJQUN4QywrQkFBK0IsRUFBRSxNQUFNO0lBQ3ZDLHFDQUFxQyxFQUFFLE1BQU07SUFDN0MsaUNBQWlDLEVBQUUsTUFBTTtJQUN6Qyw0QkFBNEIsRUFBRSxNQUFNO0lBQ3BDLHNCQUFzQixFQUFFLE1BQU07SUFDOUIsOEJBQThCLEVBQUUsTUFBTTtJQUN0Qyx3Q0FBd0MsRUFBRSxNQUFNO0lBQ2hELCtCQUErQixFQUFFLE1BQU07SUFDdkMsK0JBQStCLEVBQUUsTUFBTTtJQUN2Qyx1QkFBdUIsRUFBRSxNQUFNO0lBQy9CLDRCQUE0QixFQUFFLE1BQU07SUFDcEMsOEJBQThCLEVBQUUsTUFBTTtJQUN0Qyw2QkFBNkIsRUFBRSxNQUFNO0lBQ3JDLHNCQUFzQixFQUFFLE1BQU07Q0FDdEIsQ0FBQTtBQUVWLE1BQU0sTUFBTSxHQUFHO0lBQ2IsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLHNCQUFzQjtRQUM1QixPQUFPLEVBQUUsUUFBUTtLQUNsQjtJQUNELEtBQUssRUFBRTtRQUNMLGtCQUFrQixFQUFFLGNBQWM7UUFDbEMseUJBQXlCLEVBQUUscUJBQXFCO1FBQ2hELHlCQUF5QixFQUFFLG9CQUFvQjtRQUMvQyx3QkFBd0IsRUFBRSxvQkFBb0I7UUFDOUMsOEJBQThCLEVBQUUsMEJBQTBCO1FBQzFELDBCQUEwQixFQUFFLHNCQUFzQjtRQUNsRCxxQkFBcUIsRUFBRSxpQkFBaUI7UUFDeEMsZUFBZSxFQUFFLFdBQVc7UUFDNUIsdUJBQXVCLEVBQUUsa0JBQWtCO1FBQzNDLGlDQUFpQyxFQUFFLDRCQUE0QjtRQUMvRCx3QkFBd0IsRUFBRSxtQkFBbUI7UUFDN0Msd0JBQXdCLEVBQUUsb0JBQW9CO1FBQzlDLGdCQUFnQixFQUFFLFlBQVk7UUFDOUIscUJBQXFCLEVBQUUsaUJBQWlCO1FBQ3hDLHVCQUF1QixFQUFFLG1CQUFtQjtRQUM1QyxzQkFBc0IsRUFBRSxrQkFBa0I7UUFDMUMsZUFBZSxFQUFFLFdBQVc7S0FDN0I7SUFDRDs7O09BR0c7SUFDSCxXQUFXO0NBQ1osQ0FBQTtBQUVELGVBQWUsTUFBTSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vQ2xpZW50QmxvY2tzIGZyb20gJy4vcnVsZXMvbm8tY2xpZW50LWJsb2Nrcy5qcydcbmltcG9ydCBub0NvbnRhaW5lckluU2VjdGlvbiBmcm9tICcuL3J1bGVzL25vLWNvbnRhaW5lci1pbi1zZWN0aW9uLmpzJ1xuaW1wb3J0IHByZWZlckNvbXBvbmVudFByb3BzIGZyb20gJy4vcnVsZXMvcHJlZmVyLWNvbXBvbmVudC1wcm9wcy5qcydcbmltcG9ydCBwcmVmZXJUeXBvZ3JhcGh5Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci10eXBvZ3JhcGh5LWNvbXBvbmVudHMuanMnXG5pbXBvcnQgcHJlZmVyTGF5b3V0Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci1sYXlvdXQtY29tcG9uZW50cy5qcydcbmltcG9ydCBub0FyYml0cmFyeUNvbG9ycyBmcm9tICcuL3J1bGVzL25vLWFyYml0cmFyeS1jb2xvcnMuanMnXG5pbXBvcnQgbm9SYXdDb2xvcnMgZnJvbSAnLi9ydWxlcy9uby1yYXctY29sb3JzLmpzJ1xuaW1wb3J0IG5vQ3Jvc3Nab25lSW1wb3J0cyBmcm9tICcuL3J1bGVzL25vLWNyb3NzLXpvbmUtaW1wb3J0cy5qcydcbmltcG9ydCBub05hdGl2ZUludGVyc2VjdGlvbk9ic2VydmVyIGZyb20gJy4vcnVsZXMvbm8tbmF0aXZlLWludGVyc2VjdGlvbi1vYnNlcnZlci5qcydcbmltcG9ydCBub0NvbXBvbmVudEluQmxvY2tzIGZyb20gJy4vcnVsZXMvbm8tY29tcG9uZW50LWluLWJsb2Nrcy5qcydcbmltcG9ydCBwcmVmZXJMaXN0Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci1saXN0LWNvbXBvbmVudHMuanMnXG5pbXBvcnQgbm9OYXRpdmVEYXRlIGZyb20gJy4vcnVsZXMvbm8tbmF0aXZlLWRhdGUuanMnXG5pbXBvcnQgYmxvY2tOYW1pbmdDb252ZW50aW9uIGZyb20gJy4vcnVsZXMvYmxvY2stbmFtaW5nLWNvbnZlbnRpb24uanMnXG5pbXBvcnQgcmVxdWlyZUNhbm9uU2V0dXAgZnJvbSAnLi9ydWxlcy9yZXF1aXJlLWNhbm9uLXNldHVwLmpzJ1xuaW1wb3J0IG5vQ2xhc3NuYW1lc1BhY2thZ2UgZnJvbSAnLi9ydWxlcy9uby1jbGFzc25hbWVzLXBhY2thZ2UuanMnXG5pbXBvcnQgcHJlZmVyQWxpYXNJbXBvcnRzIGZyb20gJy4vcnVsZXMvcHJlZmVyLWFsaWFzLWltcG9ydHMuanMnXG5pbXBvcnQgbm9JbmxpbmVTdmcgZnJvbSAnLi9ydWxlcy9uby1pbmxpbmUtc3ZnLmpzJ1xuXG4vKipcbiAqIEFsbCBDYW5vbiBFU0xpbnQgcnVsZXMgd2l0aCByZWNvbW1lbmRlZCBzZXZlcml0eSBsZXZlbHNcbiAqL1xuY29uc3QgcmVjb21tZW5kZWQgPSB7XG4gICdnYWxsb3Avbm8tY2xpZW50LWJsb2Nrcyc6ICd3YXJuJyxcbiAgJ2dhbGxvcC9ibG9jay1uYW1pbmctY29udmVudGlvbic6ICd3YXJuJyxcbiAgJ2dhbGxvcC9uby1jb250YWluZXItaW4tc2VjdGlvbic6ICd3YXJuJyxcbiAgJ2dhbGxvcC9wcmVmZXItY29tcG9uZW50LXByb3BzJzogJ3dhcm4nLFxuICAnZ2FsbG9wL3ByZWZlci10eXBvZ3JhcGh5LWNvbXBvbmVudHMnOiAnd2FybicsXG4gICdnYWxsb3AvcHJlZmVyLWxheW91dC1jb21wb25lbnRzJzogJ3dhcm4nLFxuICAnZ2FsbG9wL25vLWFyYml0cmFyeS1jb2xvcnMnOiAnd2FybicsXG4gICdnYWxsb3Avbm8tcmF3LWNvbG9ycyc6ICd3YXJuJyxcbiAgJ2dhbGxvcC9uby1jcm9zcy16b25lLWltcG9ydHMnOiAnd2FybicsXG4gICdnYWxsb3Avbm8tbmF0aXZlLWludGVyc2VjdGlvbi1vYnNlcnZlcic6ICd3YXJuJyxcbiAgJ2dhbGxvcC9uby1jb21wb25lbnQtaW4tYmxvY2tzJzogJ3dhcm4nLFxuICAnZ2FsbG9wL3ByZWZlci1saXN0LWNvbXBvbmVudHMnOiAnd2FybicsXG4gICdnYWxsb3Avbm8tbmF0aXZlLWRhdGUnOiAnd2FybicsXG4gICdnYWxsb3AvcmVxdWlyZS1jYW5vbi1zZXR1cCc6ICd3YXJuJyxcbiAgJ2dhbGxvcC9uby1jbGFzc25hbWVzLXBhY2thZ2UnOiAnd2FybicsXG4gICdnYWxsb3AvcHJlZmVyLWFsaWFzLWltcG9ydHMnOiAnd2FybicsXG4gICdnYWxsb3Avbm8taW5saW5lLXN2Zyc6ICd3YXJuJyxcbn0gYXMgY29uc3RcblxuY29uc3QgcGx1Z2luID0ge1xuICBtZXRhOiB7XG4gICAgbmFtZTogJ2VzbGludC1wbHVnaW4tZ2FsbG9wJyxcbiAgICB2ZXJzaW9uOiAnMi4xMi4wJyxcbiAgfSxcbiAgcnVsZXM6IHtcbiAgICAnbm8tY2xpZW50LWJsb2Nrcyc6IG5vQ2xpZW50QmxvY2tzLFxuICAgICdibG9jay1uYW1pbmctY29udmVudGlvbic6IGJsb2NrTmFtaW5nQ29udmVudGlvbixcbiAgICAnbm8tY29udGFpbmVyLWluLXNlY3Rpb24nOiBub0NvbnRhaW5lckluU2VjdGlvbixcbiAgICAncHJlZmVyLWNvbXBvbmVudC1wcm9wcyc6IHByZWZlckNvbXBvbmVudFByb3BzLFxuICAgICdwcmVmZXItdHlwb2dyYXBoeS1jb21wb25lbnRzJzogcHJlZmVyVHlwb2dyYXBoeUNvbXBvbmVudHMsXG4gICAgJ3ByZWZlci1sYXlvdXQtY29tcG9uZW50cyc6IHByZWZlckxheW91dENvbXBvbmVudHMsXG4gICAgJ25vLWFyYml0cmFyeS1jb2xvcnMnOiBub0FyYml0cmFyeUNvbG9ycyxcbiAgICAnbm8tcmF3LWNvbG9ycyc6IG5vUmF3Q29sb3JzLFxuICAgICduby1jcm9zcy16b25lLWltcG9ydHMnOiBub0Nyb3NzWm9uZUltcG9ydHMsXG4gICAgJ25vLW5hdGl2ZS1pbnRlcnNlY3Rpb24tb2JzZXJ2ZXInOiBub05hdGl2ZUludGVyc2VjdGlvbk9ic2VydmVyLFxuICAgICduby1jb21wb25lbnQtaW4tYmxvY2tzJzogbm9Db21wb25lbnRJbkJsb2NrcyxcbiAgICAncHJlZmVyLWxpc3QtY29tcG9uZW50cyc6IHByZWZlckxpc3RDb21wb25lbnRzLFxuICAgICduby1uYXRpdmUtZGF0ZSc6IG5vTmF0aXZlRGF0ZSxcbiAgICAncmVxdWlyZS1jYW5vbi1zZXR1cCc6IHJlcXVpcmVDYW5vblNldHVwLFxuICAgICduby1jbGFzc25hbWVzLXBhY2thZ2UnOiBub0NsYXNzbmFtZXNQYWNrYWdlLFxuICAgICdwcmVmZXItYWxpYXMtaW1wb3J0cyc6IHByZWZlckFsaWFzSW1wb3J0cyxcbiAgICAnbm8taW5saW5lLXN2Zyc6IG5vSW5saW5lU3ZnLFxuICB9LFxuICAvKipcbiAgICogUmVjb21tZW5kZWQgcnVsZSBjb25maWd1cmF0aW9ucyAtIHNwcmVhZCBpbnRvIHlvdXIgRVNMaW50IGNvbmZpZ1xuICAgKiBAZXhhbXBsZSBydWxlczogeyAuLi5nYWxsb3AucmVjb21tZW5kZWQgfVxuICAgKi9cbiAgcmVjb21tZW5kZWQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IHBsdWdpblxuIl19
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getCanonUrl, getCanonPattern } from '../utils/canon.js';
|
|
2
|
+
const RULE_NAME = 'no-classnames-package';
|
|
3
|
+
const pattern = getCanonPattern(RULE_NAME);
|
|
4
|
+
const CLASSNAMES_SOURCES = ['classnames', 'classnames/bind', 'classnames/dedupe'];
|
|
5
|
+
const rule = {
|
|
6
|
+
meta: {
|
|
7
|
+
type: 'suggestion',
|
|
8
|
+
docs: {
|
|
9
|
+
description: pattern?.summary || 'Use clsx instead of classnames',
|
|
10
|
+
recommended: true,
|
|
11
|
+
url: getCanonUrl(RULE_NAME),
|
|
12
|
+
},
|
|
13
|
+
messages: {
|
|
14
|
+
noClassnames: `[Canon ${pattern?.id || '014'}] Use "clsx" instead of "classnames". Import: import { clsx } from "clsx"`,
|
|
15
|
+
},
|
|
16
|
+
schema: [],
|
|
17
|
+
},
|
|
18
|
+
create(context) {
|
|
19
|
+
return {
|
|
20
|
+
ImportDeclaration(node) {
|
|
21
|
+
const source = node.source?.value;
|
|
22
|
+
if (typeof source === 'string' && CLASSNAMES_SOURCES.includes(source)) {
|
|
23
|
+
context.report({
|
|
24
|
+
node,
|
|
25
|
+
messageId: 'noClassnames',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
CallExpression(node) {
|
|
30
|
+
// Check for require('classnames')
|
|
31
|
+
if (node.callee?.name === 'require' &&
|
|
32
|
+
node.arguments?.length === 1 &&
|
|
33
|
+
node.arguments[0]?.type === 'Literal' &&
|
|
34
|
+
typeof node.arguments[0].value === 'string' &&
|
|
35
|
+
CLASSNAMES_SOURCES.includes(node.arguments[0].value)) {
|
|
36
|
+
context.report({
|
|
37
|
+
node,
|
|
38
|
+
messageId: 'noClassnames',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
export default rule;
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tY2xhc3NuYW1lcy1wYWNrYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VzbGludC9ydWxlcy9uby1jbGFzc25hbWVzLXBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUVoRSxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQTtBQUN6QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFMUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO0FBRWpGLE1BQU0sSUFBSSxHQUFvQjtJQUM1QixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUU7WUFDSixXQUFXLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxnQ0FBZ0M7WUFDakUsV0FBVyxFQUFFLElBQUk7WUFDakIsR0FBRyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUM7U0FDNUI7UUFDRCxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsVUFBVSxPQUFPLEVBQUUsRUFBRSxJQUFJLEtBQUssMkVBQTJFO1NBQ3hIO1FBQ0QsTUFBTSxFQUFFLEVBQUU7S0FDWDtJQUVELE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTztZQUNMLGlCQUFpQixDQUFDLElBQVM7Z0JBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFBO2dCQUNqQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDdEUsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDYixJQUFJO3dCQUNKLFNBQVMsRUFBRSxjQUFjO3FCQUMxQixDQUFDLENBQUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCxjQUFjLENBQUMsSUFBUztnQkFDdEIsa0NBQWtDO2dCQUNsQyxJQUNFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLLFNBQVM7b0JBQy9CLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxLQUFLLENBQUM7b0JBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLFNBQVM7b0JBQ3JDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUTtvQkFDM0Msa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQ3BELENBQUM7b0JBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDYixJQUFJO3dCQUNKLFNBQVMsRUFBRSxjQUFjO3FCQUMxQixDQUFDLENBQUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7U0FDRixDQUFBO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUFFRCxlQUFlLElBQUksQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gJ2VzbGludCdcbmltcG9ydCB7IGdldENhbm9uVXJsLCBnZXRDYW5vblBhdHRlcm4gfSBmcm9tICcuLi91dGlscy9jYW5vbi5qcydcblxuY29uc3QgUlVMRV9OQU1FID0gJ25vLWNsYXNzbmFtZXMtcGFja2FnZSdcbmNvbnN0IHBhdHRlcm4gPSBnZXRDYW5vblBhdHRlcm4oUlVMRV9OQU1FKVxuXG5jb25zdCBDTEFTU05BTUVTX1NPVVJDRVMgPSBbJ2NsYXNzbmFtZXMnLCAnY2xhc3NuYW1lcy9iaW5kJywgJ2NsYXNzbmFtZXMvZGVkdXBlJ11cblxuY29uc3QgcnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXR0ZXJuPy5zdW1tYXJ5IHx8ICdVc2UgY2xzeCBpbnN0ZWFkIG9mIGNsYXNzbmFtZXMnLFxuICAgICAgcmVjb21tZW5kZWQ6IHRydWUsXG4gICAgICB1cmw6IGdldENhbm9uVXJsKFJVTEVfTkFNRSksXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgbm9DbGFzc25hbWVzOiBgW0Nhbm9uICR7cGF0dGVybj8uaWQgfHwgJzAxNCd9XSBVc2UgXCJjbHN4XCIgaW5zdGVhZCBvZiBcImNsYXNzbmFtZXNcIi4gSW1wb3J0OiBpbXBvcnQgeyBjbHN4IH0gZnJvbSBcImNsc3hcImAsXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKG5vZGU6IGFueSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBub2RlLnNvdXJjZT8udmFsdWVcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnICYmIENMQVNTTkFNRVNfU09VUkNFUy5pbmNsdWRlcyhzb3VyY2UpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogJ25vQ2xhc3NuYW1lcycsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGU6IGFueSkge1xuICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZSgnY2xhc3NuYW1lcycpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBub2RlLmNhbGxlZT8ubmFtZSA9PT0gJ3JlcXVpcmUnICYmXG4gICAgICAgICAgbm9kZS5hcmd1bWVudHM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzBdPy50eXBlID09PSAnTGl0ZXJhbCcgJiZcbiAgICAgICAgICB0eXBlb2Ygbm9kZS5hcmd1bWVudHNbMF0udmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgQ0xBU1NOQU1FU19TT1VSQ0VTLmluY2x1ZGVzKG5vZGUuYXJndW1lbnRzWzBdLnZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZUlkOiAnbm9DbGFzc25hbWVzJyxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcnVsZVxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { getCanonUrl, getCanonPattern } from '../utils/canon.js';
|
|
2
|
+
const RULE_NAME = 'no-inline-svg';
|
|
3
|
+
const pattern = getCanonPattern(RULE_NAME);
|
|
4
|
+
const rule = {
|
|
5
|
+
meta: {
|
|
6
|
+
type: 'suggestion',
|
|
7
|
+
docs: {
|
|
8
|
+
description: pattern?.summary || 'Use Icon component instead of inline SVGs',
|
|
9
|
+
recommended: true,
|
|
10
|
+
url: getCanonUrl(RULE_NAME),
|
|
11
|
+
},
|
|
12
|
+
messages: {
|
|
13
|
+
noInlineSvg: `[Canon ${pattern?.id || '012'}] Use the Icon component with Iconify icons instead of inline <svg>. Import: import { Icon } from "@/components/icon"`,
|
|
14
|
+
},
|
|
15
|
+
schema: [],
|
|
16
|
+
},
|
|
17
|
+
create(context) {
|
|
18
|
+
const filename = context.filename || context.getFilename();
|
|
19
|
+
// Only apply to block files
|
|
20
|
+
if (!filename.includes('/blocks/')) {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
JSXOpeningElement(node) {
|
|
25
|
+
const elementName = node.name?.name;
|
|
26
|
+
if (elementName === 'svg') {
|
|
27
|
+
context.report({
|
|
28
|
+
node,
|
|
29
|
+
messageId: 'noInlineSvg',
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export default rule;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8taW5saW5lLXN2Zy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lc2xpbnQvcnVsZXMvbm8taW5saW5lLXN2Zy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWhFLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQTtBQUNqQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFMUMsTUFBTSxJQUFJLEdBQW9CO0lBQzVCLElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxZQUFZO1FBQ2xCLElBQUksRUFBRTtZQUNKLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLDJDQUEyQztZQUM1RSxXQUFXLEVBQUUsSUFBSTtZQUNqQixHQUFHLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQztTQUM1QjtRQUNELFFBQVEsRUFBRTtZQUNSLFdBQVcsRUFBRSxVQUFVLE9BQU8sRUFBRSxFQUFFLElBQUksS0FBSyx1SEFBdUg7U0FDbks7UUFDRCxNQUFNLEVBQUUsRUFBRTtLQUNYO0lBRUQsTUFBTSxDQUFDLE9BQU87UUFDWixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUUxRCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLEVBQUUsQ0FBQTtRQUNYLENBQUM7UUFFRCxPQUFPO1lBQ0wsaUJBQWlCLENBQUMsSUFBUztnQkFDekIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUE7Z0JBRW5DLElBQUksV0FBVyxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDO3dCQUNiLElBQUk7d0JBQ0osU0FBUyxFQUFFLGFBQWE7cUJBQ3pCLENBQUMsQ0FBQTtnQkFDSixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQUVELGVBQWUsSUFBSSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSAnZXNsaW50J1xuaW1wb3J0IHsgZ2V0Q2Fub25VcmwsIGdldENhbm9uUGF0dGVybiB9IGZyb20gJy4uL3V0aWxzL2Nhbm9uLmpzJ1xuXG5jb25zdCBSVUxFX05BTUUgPSAnbm8taW5saW5lLXN2ZydcbmNvbnN0IHBhdHRlcm4gPSBnZXRDYW5vblBhdHRlcm4oUlVMRV9OQU1FKVxuXG5jb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246IHBhdHRlcm4/LnN1bW1hcnkgfHwgJ1VzZSBJY29uIGNvbXBvbmVudCBpbnN0ZWFkIG9mIGlubGluZSBTVkdzJyxcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgICAgdXJsOiBnZXRDYW5vblVybChSVUxFX05BTUUpLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIG5vSW5saW5lU3ZnOiBgW0Nhbm9uICR7cGF0dGVybj8uaWQgfHwgJzAxMid9XSBVc2UgdGhlIEljb24gY29tcG9uZW50IHdpdGggSWNvbmlmeSBpY29ucyBpbnN0ZWFkIG9mIGlubGluZSA8c3ZnPi4gSW1wb3J0OiBpbXBvcnQgeyBJY29uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9pY29uXCJgLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gY29udGV4dC5maWxlbmFtZSB8fCBjb250ZXh0LmdldEZpbGVuYW1lKClcblxuICAgIC8vIE9ubHkgYXBwbHkgdG8gYmxvY2sgZmlsZXNcbiAgICBpZiAoIWZpbGVuYW1lLmluY2x1ZGVzKCcvYmxvY2tzLycpKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSlNYT3BlbmluZ0VsZW1lbnQobm9kZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gbm9kZS5uYW1lPy5uYW1lXG5cbiAgICAgICAgaWYgKGVsZW1lbnROYW1lID09PSAnc3ZnJykge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlSWQ6ICdub0lubGluZVN2ZycsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IHJ1bGVcbiJdfQ==
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { getCanonUrl, getCanonPattern } from '../utils/canon.js';
|
|
2
|
+
const RULE_NAME = 'no-raw-colors';
|
|
3
|
+
const pattern = getCanonPattern(RULE_NAME);
|
|
4
|
+
// Tailwind color prefixes (shared concept with no-arbitrary-colors)
|
|
5
|
+
const COLOR_PREFIXES = [
|
|
6
|
+
'bg',
|
|
7
|
+
'text',
|
|
8
|
+
'border',
|
|
9
|
+
'ring',
|
|
10
|
+
'outline',
|
|
11
|
+
'shadow',
|
|
12
|
+
'accent',
|
|
13
|
+
'caret',
|
|
14
|
+
'fill',
|
|
15
|
+
'stroke',
|
|
16
|
+
'decoration',
|
|
17
|
+
'divide',
|
|
18
|
+
'from',
|
|
19
|
+
'via',
|
|
20
|
+
'to',
|
|
21
|
+
];
|
|
22
|
+
// Standard Tailwind named color families
|
|
23
|
+
const DEFAULT_FORBIDDEN_FAMILIES = [
|
|
24
|
+
'white',
|
|
25
|
+
'black',
|
|
26
|
+
'gray',
|
|
27
|
+
'slate',
|
|
28
|
+
'zinc',
|
|
29
|
+
'neutral',
|
|
30
|
+
'stone',
|
|
31
|
+
'red',
|
|
32
|
+
'orange',
|
|
33
|
+
'amber',
|
|
34
|
+
'yellow',
|
|
35
|
+
'lime',
|
|
36
|
+
'green',
|
|
37
|
+
'emerald',
|
|
38
|
+
'teal',
|
|
39
|
+
'cyan',
|
|
40
|
+
'sky',
|
|
41
|
+
'blue',
|
|
42
|
+
'indigo',
|
|
43
|
+
'violet',
|
|
44
|
+
'purple',
|
|
45
|
+
'fuchsia',
|
|
46
|
+
'pink',
|
|
47
|
+
'rose',
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* Build regex to match raw Tailwind color classes.
|
|
51
|
+
* Matches: text-white, bg-gray-500, border-slate-200, etc.
|
|
52
|
+
*/
|
|
53
|
+
function buildRawColorRegex(families) {
|
|
54
|
+
const prefixes = COLOR_PREFIXES.join('|');
|
|
55
|
+
const familyGroup = families.join('|');
|
|
56
|
+
// Match {prefix}-{family} or {prefix}-{family}-{shade}
|
|
57
|
+
return new RegExp(`\\b(?:${prefixes})-(?:${familyGroup})(?:-\\d{1,3})?\\b`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extract all raw color class matches from a className string
|
|
61
|
+
*/
|
|
62
|
+
function findRawColorClasses(classValue, families, allowedClasses) {
|
|
63
|
+
const prefixes = COLOR_PREFIXES.join('|');
|
|
64
|
+
const familyGroup = families.join('|');
|
|
65
|
+
const globalRegex = new RegExp(`\\b(?:${prefixes})-(?:${familyGroup})(?:-\\d{1,3})?\\b`, 'g');
|
|
66
|
+
const matches = [];
|
|
67
|
+
let match;
|
|
68
|
+
while ((match = globalRegex.exec(classValue)) !== null) {
|
|
69
|
+
if (!allowedClasses.includes(match[0])) {
|
|
70
|
+
matches.push(match[0]);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return matches;
|
|
74
|
+
}
|
|
75
|
+
const rule = {
|
|
76
|
+
meta: {
|
|
77
|
+
type: 'suggestion',
|
|
78
|
+
docs: {
|
|
79
|
+
description: pattern?.summary || 'Use semantic color tokens, not raw Tailwind colors',
|
|
80
|
+
recommended: true,
|
|
81
|
+
url: getCanonUrl(RULE_NAME),
|
|
82
|
+
},
|
|
83
|
+
messages: {
|
|
84
|
+
noRawColors: `[Canon ${pattern?.id || '009'}] Avoid raw Tailwind color "{{class}}". Use a semantic token instead.`,
|
|
85
|
+
},
|
|
86
|
+
schema: [
|
|
87
|
+
{
|
|
88
|
+
type: 'object',
|
|
89
|
+
properties: {
|
|
90
|
+
allowedClasses: {
|
|
91
|
+
type: 'array',
|
|
92
|
+
items: { type: 'string' },
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
additionalProperties: false,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
create(context) {
|
|
100
|
+
const options = context.options[0] || {};
|
|
101
|
+
const allowedClasses = options.allowedClasses || [];
|
|
102
|
+
return {
|
|
103
|
+
JSXAttribute(node) {
|
|
104
|
+
// Only check className attributes
|
|
105
|
+
if (node.name?.name !== 'className') {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Extract className value
|
|
109
|
+
let classValue = '';
|
|
110
|
+
if (node.value?.type === 'Literal' && typeof node.value.value === 'string') {
|
|
111
|
+
classValue = node.value.value;
|
|
112
|
+
}
|
|
113
|
+
else if (node.value?.type === 'JSXExpressionContainer' &&
|
|
114
|
+
node.value.expression?.type === 'Literal' &&
|
|
115
|
+
typeof node.value.expression.value === 'string') {
|
|
116
|
+
classValue = node.value.expression.value;
|
|
117
|
+
}
|
|
118
|
+
else if (node.value?.type === 'JSXExpressionContainer' &&
|
|
119
|
+
node.value.expression?.type === 'TemplateLiteral') {
|
|
120
|
+
classValue = node.value.expression.quasis
|
|
121
|
+
.map((quasi) => quasi.value.raw)
|
|
122
|
+
.join(' ');
|
|
123
|
+
}
|
|
124
|
+
if (!classValue)
|
|
125
|
+
return;
|
|
126
|
+
const matches = findRawColorClasses(classValue, DEFAULT_FORBIDDEN_FAMILIES, allowedClasses);
|
|
127
|
+
for (const cls of matches) {
|
|
128
|
+
context.report({
|
|
129
|
+
node,
|
|
130
|
+
messageId: 'noRawColors',
|
|
131
|
+
data: { class: cls },
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
export default rule;
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tcmF3LWNvbG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lc2xpbnQvcnVsZXMvbm8tcmF3LWNvbG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWhFLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQTtBQUNqQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFMUMsb0VBQW9FO0FBQ3BFLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLElBQUk7SUFDSixNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixZQUFZO0lBQ1osUUFBUTtJQUNSLE1BQU07SUFDTixLQUFLO0lBQ0wsSUFBSTtDQUNMLENBQUE7QUFFRCx5Q0FBeUM7QUFDekMsTUFBTSwwQkFBMEIsR0FBRztJQUNqQyxPQUFPO0lBQ1AsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLFNBQVM7SUFDVCxPQUFPO0lBQ1AsS0FBSztJQUNMLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLE1BQU07Q0FDUCxDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxRQUFrQjtJQUM1QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3pDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFD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SUFDTCxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksS0FBSyx3QkFBd0I7b0JBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksS0FBSyxpQkFBaUIsRUFDakQsQ0FBQztvQkFDRCxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTTt5QkFDdEMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzt5QkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNkLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFVBQVU7b0JBQUUsT0FBTTtnQkFFdkIsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxFQUFFLDBCQUEwQixFQUFFLGNBQWMsQ0FBQyxDQUFBO2dCQUMzRixLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDO3dCQUNiLElBQUk7d0JBQ0osU0FBUyxFQUFFLGFBQWE7d0JBQ3hCLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7cUJBQ3JCLENBQUMsQ0FBQTtnQkFDSixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQUVELGVBQWUsSUFBSSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSAnZXNsaW50J1xuaW1wb3J0IHsgZ2V0Q2Fub25VcmwsIGdldENhbm9uUGF0dGVybiB9IGZyb20gJy4uL3V0aWxzL2Nhbm9uLmpzJ1xuXG5jb25zdCBSVUxFX05BTUUgPSAnbm8tcmF3LWNvbG9ycydcbmNvbnN0IHBhdHRlcm4gPSBnZXRDYW5vblBhdHRlcm4oUlVMRV9OQU1FKVxuXG4vLyBUYWlsd2luZCBjb2xvciBwcmVmaXhlcyAoc2hhcmVkIGNvbmNlcHQgd2l0aCBuby1hcmJpdHJhcnktY29sb3JzKVxuY29uc3QgQ09MT1JfUFJFRklYRVMgPSBbXG4gICdiZycsXG4gICd0ZXh0JyxcbiAgJ2JvcmRlcicsXG4gICdyaW5nJyxcbiAgJ291dGxpbmUnLFxuICAnc2hhZG93JyxcbiAgJ2FjY2VudCcsXG4gICdjYXJldCcsXG4gICdmaWxsJyxcbiAgJ3N0cm9rZScsXG4gICdkZWNvcmF0aW9uJyxcbiAgJ2RpdmlkZScsXG4gICdmcm9tJyxcbiAgJ3ZpYScsXG4gICd0bycsXG5dXG5cbi8vIFN0YW5kYXJkIFRhaWx3aW5kIG5hbWVkIGNvbG9yIGZhbWlsaWVzXG5jb25zdCBERUZBVUxUX0ZPUkJJRERFTl9GQU1JTElFUyA9IFtcbiAgJ3doaXRlJyxcbiAgJ2JsYWNrJyxcbiAgJ2dyYXknLFxuICAnc2xhdGUnLFxuICAnemluYycsXG4gICduZXV0cmFsJyxcbiAgJ3N0b25lJyxcbiAgJ3JlZCcsXG4gICdvcmFuZ2UnLFxuICAnYW1iZXInLFxuICAneWVsbG93JyxcbiAgJ2xpbWUnLFxuICAnZ3JlZW4nLFxuICAnZW1lcmFsZCcsXG4gICd0ZWFsJyxcbiAgJ2N5YW4nLFxuICAnc2t5JyxcbiAgJ2JsdWUnLFxuICAnaW5kaWdvJyxcbiAgJ3Zpb2xldCcsXG4gICdwdXJwbGUnLFxuICAnZnVjaHNpYScsXG4gICdwaW5rJyxcbiAgJ3Jvc2UnLFxuXVxuXG4vKipcbiAqIEJ1aWxkIHJlZ2V4IHRvIG1hdGNoIHJhdyBUYWlsd2luZCBjb2xvciBjbGFzc2VzLlxuICogTWF0Y2hlczogdGV4dC13aGl0ZSwgYmctZ3JheS01MDAsIGJvcmRlci1zbGF0ZS0yMDAsIGV0Yy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRSYXdDb2xvclJlZ2V4KGZhbWlsaWVzOiBzdHJpbmdbXSk6IFJlZ0V4cCB7XG4gIGNvbnN0IHByZWZpeGVzID0gQ09MT1JfUFJFRklYRVMuam9pbignfCcpXG4gIGNvbnN0IGZhbWlseUdyb3VwID0gZmFtaWxpZXMuam9pbignfCcpXG4gIC8vIE1hdGNoIHtwcmVmaXh9LXtmYW1pbHl9IG9yIHtwcmVmaXh9LXtmYW1pbHl9LXtzaGFkZX1cbiAgcmV0dXJuIG5ldyBSZWdFeHAoYFxcXFxiKD86JHtwcmVmaXhlc30pLSg/OiR7ZmFtaWx5R3JvdXB9KSg/Oi1cXFxcZHsxLDN9KT9cXFxcYmApXG59XG5cbi8qKlxuICogRXh0cmFjdCBhbGwgcmF3IGNvbG9yIGNsYXNzIG1hdGNoZXMgZnJvbSBhIGNsYXNzTmFtZSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZmluZFJhd0NvbG9yQ2xhc3NlcyhjbGFzc1ZhbHVlOiBzdHJpbmcsIGZhbWlsaWVzOiBzdHJpbmdbXSwgYWxsb3dlZENsYXNzZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBwcmVmaXhlcyA9IENPTE9SX1BSRUZJWEVTLmpvaW4oJ3wnKVxuICBjb25zdCBmYW1pbHlHcm91cCA9IGZhbWlsaWVzLmpvaW4oJ3wnKVxuICBjb25zdCBnbG9iYWxSZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxiKD86JHtwcmVmaXhlc30pLSg/OiR7ZmFtaWx5R3JvdXB9KSg/Oi1cXFxcZHsxLDN9KT9cXFxcYmAsICdnJylcbiAgY29uc3QgbWF0Y2hlczogc3RyaW5nW10gPSBbXVxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgd2hpbGUgKChtYXRjaCA9IGdsb2JhbFJlZ2V4LmV4ZWMoY2xhc3NWYWx1ZSkpICE9PSBudWxsKSB7XG4gICAgaWYgKCFhbGxvd2VkQ2xhc3Nlcy5pbmNsdWRlcyhtYXRjaFswXSkpIHtcbiAgICAgIG1hdGNoZXMucHVzaChtYXRjaFswXSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXNcbn1cblxuY29uc3QgcnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXR0ZXJuPy5zdW1tYXJ5IHx8ICdVc2Ugc2VtYW50aWMgY29sb3IgdG9rZW5zLCBub3QgcmF3IFRhaWx3aW5kIGNvbG9ycycsXG4gICAgICByZWNvbW1lbmRlZDogdHJ1ZSxcbiAgICAgIHVybDogZ2V0Q2Fub25VcmwoUlVMRV9OQU1FKSxcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBub1Jhd0NvbG9yczogYFtDYW5vbiAke3BhdHRlcm4/LmlkIHx8ICcwMDknfV0gQXZvaWQgcmF3IFRhaWx3aW5kIGNvbG9yIFwie3tjbGFzc319XCIuIFVzZSBhIHNlbWFudGljIHRva2VuIGluc3RlYWQuYCxcbiAgICB9LFxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGFsbG93ZWRDbGFzc2VzOiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgaXRlbXM6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9XG4gICAgY29uc3QgYWxsb3dlZENsYXNzZXM6IHN0cmluZ1tdID0gb3B0aW9ucy5hbGxvd2VkQ2xhc3NlcyB8fCBbXVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEpTWEF0dHJpYnV0ZShub2RlOiBhbnkpIHtcbiAgICAgICAgLy8gT25seSBjaGVjayBjbGFzc05hbWUgYXR0cmlidXRlc1xuICAgICAgICBpZiAobm9kZS5uYW1lPy5uYW1lICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmFjdCBjbGFzc05hbWUgdmFsdWVcbiAgICAgICAgbGV0IGNsYXNzVmFsdWUgPSAnJ1xuXG4gICAgICAgIGlmIChub2RlLnZhbHVlPy50eXBlID09PSAnTGl0ZXJhbCcgJiYgdHlwZW9mIG5vZGUudmFsdWUudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY2xhc3NWYWx1ZSA9IG5vZGUudmFsdWUudmFsdWVcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBub2RlLnZhbHVlPy50eXBlID09PSAnSlNYRXhwcmVzc2lvbkNvbnRhaW5lcicgJiZcbiAgICAgICAgICBub2RlLnZhbHVlLmV4cHJlc3Npb24/LnR5cGUgPT09ICdMaXRlcmFsJyAmJlxuICAgICAgICAgIHR5cGVvZiBub2RlLnZhbHVlLmV4cHJlc3Npb24udmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIGNsYXNzVmFsdWUgPSBub2RlLnZhbHVlLmV4cHJlc3Npb24udmFsdWVcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBub2RlLnZhbHVlPy50eXBlID09PSAnSlNYRXhwcmVzc2lvbkNvbnRhaW5lcicgJiZcbiAgICAgICAgICBub2RlLnZhbHVlLmV4cHJlc3Npb24/LnR5cGUgPT09ICdUZW1wbGF0ZUxpdGVyYWwnXG4gICAgICAgICkge1xuICAgICAgICAgIGNsYXNzVmFsdWUgPSBub2RlLnZhbHVlLmV4cHJlc3Npb24ucXVhc2lzXG4gICAgICAgICAgICAubWFwKChxdWFzaTogYW55KSA9PiBxdWFzaS52YWx1ZS5yYXcpXG4gICAgICAgICAgICAuam9pbignICcpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNsYXNzVmFsdWUpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBmaW5kUmF3Q29sb3JDbGFzc2VzKGNsYXNzVmFsdWUsIERFRkFVTFRfRk9SQklEREVOX0ZBTUlMSUVTLCBhbGxvd2VkQ2xhc3NlcylcbiAgICAgICAgZm9yIChjb25zdCBjbHMgb2YgbWF0Y2hlcykge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlSWQ6ICdub1Jhd0NvbG9ycycsXG4gICAgICAgICAgICBkYXRhOiB7IGNsYXNzOiBjbHMgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcnVsZVxuIl19
|