@gallop.software/canon 1.0.0 → 2.0.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/audit.d.ts +7 -0
- package/dist/cli/commands/audit.js +172 -0
- package/dist/cli/commands/generate.d.ts +6 -0
- package/dist/cli/commands/generate.js +170 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +104 -0
- package/dist/eslint/configs/recommended.d.ts +13 -0
- package/dist/eslint/configs/recommended.js +15 -0
- package/dist/eslint/configs/speedwell.d.ts +13 -0
- package/dist/eslint/configs/speedwell.js +17 -0
- package/dist/eslint/index.d.ts +37 -0
- package/dist/eslint/index.js +24 -0
- package/dist/eslint/rules/no-client-blocks.d.ts +5 -0
- package/dist/eslint/rules/no-client-blocks.js +45 -0
- package/dist/eslint/rules/no-container-in-section.d.ts +5 -0
- package/dist/eslint/rules/no-container-in-section.js +50 -0
- package/dist/eslint/rules/prefer-component-props.d.ts +5 -0
- package/dist/eslint/rules/prefer-component-props.js +100 -0
- package/dist/eslint/rules/prefer-typography-components.d.ts +3 -0
- package/dist/eslint/rules/prefer-typography-components.js +76 -0
- package/dist/eslint/utils/canon.d.ts +25 -0
- package/dist/eslint/utils/canon.js +50 -0
- package/dist/index.js +28 -42
- package/package.json +33 -3
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { version, patterns, getPattern } from '../../index.js';
|
|
3
|
+
// Colors for terminal output
|
|
4
|
+
const c = {
|
|
5
|
+
reset: '\x1b[0m',
|
|
6
|
+
bold: '\x1b[1m',
|
|
7
|
+
dim: '\x1b[2m',
|
|
8
|
+
red: '\x1b[31m',
|
|
9
|
+
green: '\x1b[32m',
|
|
10
|
+
yellow: '\x1b[33m',
|
|
11
|
+
blue: '\x1b[34m',
|
|
12
|
+
cyan: '\x1b[36m',
|
|
13
|
+
};
|
|
14
|
+
// Build rule-to-pattern mapping from Canon schema (single source of truth)
|
|
15
|
+
const ruleToPattern = {};
|
|
16
|
+
for (const pattern of patterns) {
|
|
17
|
+
if (pattern.rule) {
|
|
18
|
+
ruleToPattern[pattern.rule] = pattern.id;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function parseCanonFromMessage(message) {
|
|
22
|
+
const match = message.match(/\[Canon (\d{3})\]/);
|
|
23
|
+
return match ? match[1] : null;
|
|
24
|
+
}
|
|
25
|
+
function extractViolations(eslintOutput) {
|
|
26
|
+
const violations = [];
|
|
27
|
+
const lines = eslintOutput.split('\n');
|
|
28
|
+
let currentFile = '';
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
// File path line (starts with /)
|
|
31
|
+
if (line.startsWith('/') && !line.includes(':')) {
|
|
32
|
+
currentFile = line.trim();
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// Violation line (starts with spaces, has line:col pattern)
|
|
36
|
+
const match = line.match(/^\s+(\d+):(\d+)\s+(warning|error)\s+(.+?)\s{2,}([\w/-]+)$/);
|
|
37
|
+
if (match && currentFile) {
|
|
38
|
+
const [, lineNum, column, , message, ruleId] = match;
|
|
39
|
+
const canonPattern = ruleToPattern[ruleId] || parseCanonFromMessage(message);
|
|
40
|
+
const pattern = canonPattern ? getPattern(canonPattern) : null;
|
|
41
|
+
violations.push({
|
|
42
|
+
file: currentFile,
|
|
43
|
+
line: parseInt(lineNum, 10),
|
|
44
|
+
column: parseInt(column, 10),
|
|
45
|
+
message: message.trim(),
|
|
46
|
+
ruleId,
|
|
47
|
+
canonPattern,
|
|
48
|
+
patternTitle: pattern?.title || null,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return violations;
|
|
53
|
+
}
|
|
54
|
+
function countByPattern(violations) {
|
|
55
|
+
const counts = {};
|
|
56
|
+
for (const v of violations) {
|
|
57
|
+
const key = v.canonPattern || 'other';
|
|
58
|
+
counts[key] = (counts[key] || 0) + 1;
|
|
59
|
+
}
|
|
60
|
+
return counts;
|
|
61
|
+
}
|
|
62
|
+
function groupByFile(violations) {
|
|
63
|
+
const groups = new Map();
|
|
64
|
+
for (const v of violations) {
|
|
65
|
+
const existing = groups.get(v.file) || [];
|
|
66
|
+
existing.push(v);
|
|
67
|
+
groups.set(v.file, existing);
|
|
68
|
+
}
|
|
69
|
+
return groups;
|
|
70
|
+
}
|
|
71
|
+
function printReport(result, options) {
|
|
72
|
+
if (options.json) {
|
|
73
|
+
console.log(JSON.stringify(result, null, 2));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Header
|
|
77
|
+
console.log('');
|
|
78
|
+
console.log(`${c.bold}╔════════════════════════════════════════════════════════════╗${c.reset}`);
|
|
79
|
+
console.log(`${c.bold}║${c.reset} ${c.cyan}Gallop Canon${c.reset} ${c.dim}v${result.version}${c.reset} ${c.bold}Compliance Report${c.reset} ${c.bold}║${c.reset}`);
|
|
80
|
+
console.log(`${c.bold}╚════════════════════════════════════════════════════════════╝${c.reset}`);
|
|
81
|
+
console.log('');
|
|
82
|
+
if (result.violations.length === 0) {
|
|
83
|
+
console.log(` ${c.green}✓${c.reset} ${c.bold}All files pass Canon compliance checks${c.reset}`);
|
|
84
|
+
console.log(` ${c.dim}Path: ${result.path}${c.reset}`);
|
|
85
|
+
console.log('');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Summary
|
|
89
|
+
const filesWithViolations = new Set(result.violations.map(v => v.file)).size;
|
|
90
|
+
console.log(` ${c.red}✗${c.reset} ${c.bold}${result.violations.length} violation${result.violations.length === 1 ? '' : 's'}${c.reset} in ${filesWithViolations} file${filesWithViolations === 1 ? '' : 's'}`);
|
|
91
|
+
console.log(` ${c.dim}Path: ${result.path}${c.reset}`);
|
|
92
|
+
console.log('');
|
|
93
|
+
// Violations by pattern
|
|
94
|
+
console.log(`${c.bold} Violations by Pattern:${c.reset}`);
|
|
95
|
+
for (const [patternId, count] of Object.entries(result.summary.byPattern).sort()) {
|
|
96
|
+
const pattern = getPattern(patternId);
|
|
97
|
+
const title = pattern?.title || 'Other';
|
|
98
|
+
console.log(` ${c.yellow}${patternId}${c.reset} ${title}: ${c.bold}${count}${c.reset}`);
|
|
99
|
+
}
|
|
100
|
+
console.log('');
|
|
101
|
+
// Detailed violations by file
|
|
102
|
+
console.log(`${c.bold} Details:${c.reset}`);
|
|
103
|
+
console.log('');
|
|
104
|
+
const byFile = groupByFile(result.violations);
|
|
105
|
+
for (const [file, violations] of byFile) {
|
|
106
|
+
// Shorten file path for display
|
|
107
|
+
const shortPath = file.replace(process.cwd() + '/', '');
|
|
108
|
+
console.log(` ${c.cyan}${shortPath}${c.reset}`);
|
|
109
|
+
for (const v of violations) {
|
|
110
|
+
const patternLabel = v.canonPattern
|
|
111
|
+
? `${c.yellow}[${v.canonPattern}]${c.reset}`
|
|
112
|
+
: `${c.dim}[---]${c.reset}`;
|
|
113
|
+
const location = `${c.dim}${v.line}:${v.column}${c.reset}`;
|
|
114
|
+
// Clean up message (remove [Canon XXX] prefix since we show it separately)
|
|
115
|
+
const cleanMessage = v.message.replace(/\[Canon \d{3}\]\s*/, '');
|
|
116
|
+
console.log(` ${location} ${patternLabel} ${cleanMessage}`);
|
|
117
|
+
}
|
|
118
|
+
console.log('');
|
|
119
|
+
}
|
|
120
|
+
// Footer
|
|
121
|
+
console.log(`${c.dim} ─────────────────────────────────────────────────────────${c.reset}`);
|
|
122
|
+
console.log(` ${c.dim}Fix violations manually following the Canon patterns${c.reset}`);
|
|
123
|
+
console.log('');
|
|
124
|
+
}
|
|
125
|
+
export async function audit(path, options) {
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
const args = [
|
|
128
|
+
'eslint',
|
|
129
|
+
path,
|
|
130
|
+
'--format', 'stylish',
|
|
131
|
+
];
|
|
132
|
+
if (options.fix) {
|
|
133
|
+
args.push('--fix');
|
|
134
|
+
}
|
|
135
|
+
const eslint = spawn('npx', args, {
|
|
136
|
+
cwd: process.cwd(),
|
|
137
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
138
|
+
shell: true,
|
|
139
|
+
});
|
|
140
|
+
let stdout = '';
|
|
141
|
+
let stderr = '';
|
|
142
|
+
eslint.stdout?.on('data', (data) => {
|
|
143
|
+
stdout += data.toString();
|
|
144
|
+
});
|
|
145
|
+
eslint.stderr?.on('data', (data) => {
|
|
146
|
+
stderr += data.toString();
|
|
147
|
+
});
|
|
148
|
+
eslint.on('close', (code) => {
|
|
149
|
+
const violations = extractViolations(stdout);
|
|
150
|
+
const result = {
|
|
151
|
+
version,
|
|
152
|
+
timestamp: new Date().toISOString(),
|
|
153
|
+
path,
|
|
154
|
+
totalFiles: 0, // ESLint stylish format doesn't give us this easily
|
|
155
|
+
violations,
|
|
156
|
+
summary: {
|
|
157
|
+
total: violations.length,
|
|
158
|
+
byPattern: countByPattern(violations),
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
printReport(result, options);
|
|
162
|
+
if (options.strict && violations.length > 0) {
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
resolve();
|
|
166
|
+
});
|
|
167
|
+
eslint.on('error', (error) => {
|
|
168
|
+
reject(error);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2F1ZGl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUE4QjlELDZCQUE2QjtBQUM3QixNQUFNLENBQUMsR0FBRztJQUNSLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxVQUFVO0NBQ2pCLENBQUE7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxhQUFhLEdBQTJCLEVBQUUsQ0FBQTtBQUNoRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQy9CLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQTtJQUMxQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsT0FBZTtJQUM1QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDaEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ2hDLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFlBQW9CO0lBQzdDLE1BQU0sVUFBVSxHQUFnQixFQUFFLENBQUE7SUFDbEMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtB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LENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IHZlcnNpb24sIHBhdHRlcm5zLCBnZXRQYXR0ZXJuIH0gZnJvbSAnLi4vLi4vaW5kZXguanMnXG5cbmludGVyZmFjZSBBdWRpdE9wdGlvbnMge1xuICBzdHJpY3Q6IGJvb2xlYW5cbiAganNvbjogYm9vbGVhblxuICBmaXg6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFZpb2xhdGlvbiB7XG4gIGZpbGU6IHN0cmluZ1xuICBsaW5lOiBudW1iZXJcbiAgY29sdW1uOiBudW1iZXJcbiAgbWVzc2FnZTogc3RyaW5nXG4gIHJ1bGVJZDogc3RyaW5nXG4gIGNhbm9uUGF0dGVybjogc3RyaW5nIHwgbnVsbFxuICBwYXR0ZXJuVGl0bGU6IHN0cmluZyB8IG51bGxcbn1cblxuaW50ZXJmYWNlIEF1ZGl0UmVzdWx0IHtcbiAgdmVyc2lvbjogc3RyaW5nXG4gIHRpbWVzdGFtcDogc3RyaW5nXG4gIHBhdGg6IHN0cmluZ1xuICB0b3RhbEZpbGVzOiBudW1iZXJcbiAgdmlvbGF0aW9uczogVmlvbGF0aW9uW11cbiAgc3VtbWFyeToge1xuICAgIHRvdGFsOiBudW1iZXJcbiAgICBieVBhdHRlcm46IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbiAgfVxufVxuXG4vLyBDb2xvcnMgZm9yIHRlcm1pbmFsIG91dHB1dFxuY29uc3QgYyA9IHtcbiAgcmVzZXQ6ICdcXHgxYlswbScsXG4gIGJvbGQ6ICdcXHgxYlsxbScsXG4gIGRpbTogJ1xceDFiWzJtJyxcbiAgcmVkOiAnXFx4MWJbMzFtJyxcbiAgZ3JlZW46ICdcXHgxYlszMm0nLFxuICB5ZWxsb3c6ICdcXHgxYlszM20nLFxuICBibHVlOiAnXFx4MWJbMzRtJyxcbiAgY3lhbjogJ1xceDFiWzM2bScsXG59XG5cbi8vIEJ1aWxkIHJ1bGUtdG8tcGF0dGVybiBtYXBwaW5nIGZyb20gQ2Fub24gc2NoZW1hIChzaW5nbGUgc291cmNlIG9mIHRydXRoKVxuY29uc3QgcnVsZVRvUGF0dGVybjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5mb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgaWYgKHBhdHRlcm4ucnVsZSkge1xuICAgIHJ1bGVUb1BhdHRlcm5bcGF0dGVybi5ydWxlXSA9IHBhdHRlcm4uaWRcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNhbm9uRnJvbU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoID0gbWVzc2FnZS5tYXRjaCgvXFxbQ2Fub24gKFxcZHszfSlcXF0vKVxuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGxcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFZpb2xhdGlvbnMoZXNsaW50T3V0cHV0OiBzdHJpbmcpOiBWaW9sYXRpb25bXSB7XG4gIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW11cbiAgY29uc3QgbGluZXMgPSBlc2xpbnRPdXRwdXQuc3BsaXQoJ1xcbicpXG4gIFxuICBsZXQgY3VycmVudEZpbGUgPSAnJ1xuICBcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgLy8gRmlsZSBwYXRoIGxpbmUgKHN0YXJ0cyB3aXRoIC8pXG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnLycpICYmICFsaW5lLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIGN1cnJlbnRGaWxlID0gbGluZS50cmltKClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIFxuICAgIC8vIFZpb2xhdGlvbiBsaW5lIChzdGFydHMgd2l0aCBzcGFjZXMsIGhhcyBsaW5lOmNvbCBwYXR0ZXJuKVxuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXlxccysoXFxkKyk6KFxcZCspXFxzKyh3YXJuaW5nfGVycm9yKVxccysoLis/KVxcc3syLH0oW1xcdy8tXSspJC8pXG4gICAgaWYgKG1hdGNoICYmIGN1cnJlbnRGaWxlKSB7XG4gICAgICBjb25zdCBbLCBsaW5lTnVtLCBjb2x1bW4sICwgbWVzc2FnZSwgcnVsZUlkXSA9IG1hdGNoXG4gICAgICBjb25zdCBjYW5vblBhdHRlcm4gPSBydWxlVG9QYXR0ZXJuW3J1bGVJZF0gfHwgcGFyc2VDYW5vbkZyb21NZXNzYWdlKG1lc3NhZ2UpXG4gICAgICBjb25zdCBwYXR0ZXJuID0gY2Fub25QYXR0ZXJuID8gZ2V0UGF0dGVybihjYW5vblBhdHRlcm4pIDogbnVsbFxuICAgICAgXG4gICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICBmaWxlOiBjdXJyZW50RmlsZSxcbiAgICAgICAgbGluZTogcGFyc2VJbnQobGluZU51bSwgMTApLFxuICAgICAgICBjb2x1bW46IHBhcnNlSW50KGNvbHVtbiwgMTApLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLnRyaW0oKSxcbiAgICAgICAgcnVsZUlkLFxuICAgICAgICBjYW5vblBhdHRlcm4sXG4gICAgICAgIHBhdHRlcm5UaXRsZTogcGF0dGVybj8udGl0bGUgfHwgbnVsbCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gdmlvbGF0aW9uc1xufVxuXG5mdW5jdGlvbiBjb3VudEJ5UGF0dGVybih2aW9sYXRpb25zOiBWaW9sYXRpb25bXSk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fVxuICBmb3IgKGNvbnN0IHYgb2YgdmlvbGF0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IHYuY2Fub25QYXR0ZXJuIHx8ICdvdGhlcidcbiAgICBjb3VudHNba2V5XSA9IChjb3VudHNba2V5XSB8fCAwKSArIDFcbiAgfVxuICByZXR1cm4gY291bnRzXG59XG5cbmZ1bmN0aW9uIGdyb3VwQnlGaWxlKHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdKTogTWFwPHN0cmluZywgVmlvbGF0aW9uW10+IHtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFZpb2xhdGlvbltdPigpXG4gIGZvciAoY29uc3QgdiBvZiB2aW9sYXRpb25zKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBncm91cHMuZ2V0KHYuZmlsZSkgfHwgW11cbiAgICBleGlzdGluZy5wdXNoKHYpXG4gICAgZ3JvdXBzLnNldCh2LmZpbGUsIGV4aXN0aW5nKVxuICB9XG4gIHJldHVybiBncm91cHNcbn1cblxuZnVuY3Rpb24gcHJpbnRSZXBvcnQocmVzdWx0OiBBdWRpdFJlc3VsdCwgb3B0aW9uczogQXVkaXRPcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSGVhZGVyXG4gIGNvbnNvbGUubG9nKCcnKVxuICBjb25zb2xlLmxvZyhgJHtjLmJvbGR94pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXJHtjLnJlc2V0fWApXG4gIGNvbnNvbGUubG9nKGAke2MuYm9sZH3ilZEke2MucmVzZXR9ICAgICAgICAgICAke2MuY3lhbn1HYWxsb3AgQ2Fub24ke2MucmVzZXR9ICR7Yy5kaW19diR7cmVzdWx0LnZlcnNpb259JHtjLnJlc2V0fSAke2MuYm9sZH1Db21wbGlhbmNlIFJlcG9ydCR7Yy5yZXNldH0gICAgICAgICAgICR7Yy5ib2xkfeKVkSR7Yy5yZXNldH1gKVxuICBjb25zb2xlLmxvZyhgJHtjLmJvbGR94pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdJHtjLnJlc2V0fWApXG4gIGNvbnNvbGUubG9nKCcnKVxuXG4gIGlmIChyZXN1bHQudmlvbGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2MuZ3JlZW594pyTJHtjLnJlc2V0fSAke2MuYm9sZH1BbGwgZmlsZXMgcGFzcyBDYW5vbiBjb21wbGlhbmNlIGNoZWNrcyR7Yy5yZXNldH1gKVxuICAgIGNvbnNvbGUubG9nKGAgICR7Yy5kaW19UGF0aDogJHtyZXN1bHQucGF0aH0ke2MucmVzZXR9YClcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFN1bW1hcnlcbiAgY29uc3QgZmlsZXNXaXRoVmlvbGF0aW9ucyA9IG5ldyBTZXQocmVzdWx0LnZpb2xhdGlvbnMubWFwKHYgPT4gdi5maWxlKSkuc2l6ZVxuICBjb25zb2xlLmxvZyhgICAke2MucmVkfeKclyR7Yy5yZXNldH0gJHtjLmJvbGR9JHtyZXN1bHQudmlvbGF0aW9ucy5sZW5ndGh9IHZpb2xhdGlvbiR7cmVzdWx0LnZpb2xhdGlvbnMubGVuZ3RoID09PSAxID8gJycgOiAncyd9JHtjLnJlc2V0fSBpbiAke2ZpbGVzV2l0aFZpb2xhdGlvbnN9IGZpbGUke2ZpbGVzV2l0aFZpb2xhdGlvbnMgPT09IDEgPyAnJyA6ICdzJ31gKVxuICBjb25zb2xlLmxvZyhgICAke2MuZGltfVBhdGg6ICR7cmVzdWx0LnBhdGh9JHtjLnJlc2V0fWApXG4gIGNvbnNvbGUubG9nKCcnKVxuXG4gIC8vIFZpb2xhdGlvbnMgYnkgcGF0dGVyblxuICBjb25zb2xlLmxvZyhgJHtjLmJvbGR9ICBWaW9sYXRpb25zIGJ5IFBhdHRlcm46JHtjLnJlc2V0fWApXG4gIGZvciAoY29uc3QgW3BhdHRlcm5JZCwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5zdW1tYXJ5LmJ5UGF0dGVybikuc29ydCgpKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IGdldFBhdHRlcm4ocGF0dGVybklkKVxuICAgIGNvbnN0IHRpdGxlID0gcGF0dGVybj8udGl0bGUgfHwgJ090aGVyJ1xuICAgIGNvbnNvbGUubG9nKGAgICAgJHtjLnllbGxvd30ke3BhdHRlcm5JZH0ke2MucmVzZXR9ICR7dGl0bGV9OiAke2MuYm9sZH0ke2NvdW50fSR7Yy5yZXNldH1gKVxuICB9XG4gIGNvbnNvbGUubG9nKCcnKVxuXG4gIC8vIERldGFpbGVkIHZpb2xhdGlvbnMgYnkgZmlsZVxuICBjb25zb2xlLmxvZyhgJHtjLmJvbGR9ICBEZXRhaWxzOiR7Yy5yZXNldH1gKVxuICBjb25zb2xlLmxvZygnJylcblxuICBjb25zdCBieUZpbGUgPSBncm91cEJ5RmlsZShyZXN1bHQudmlvbGF0aW9ucylcbiAgZm9yIChjb25zdCBbZmlsZSwgdmlvbGF0aW9uc10gb2YgYnlGaWxlKSB7XG4gICAgLy8gU2hvcnRlbiBmaWxlIHBhdGggZm9yIGRpc3BsYXlcbiAgICBjb25zdCBzaG9ydFBhdGggPSBmaWxlLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArICcvJywgJycpXG4gICAgY29uc29sZS5sb2coYCAgJHtjLmN5YW59JHtzaG9ydFBhdGh9JHtjLnJlc2V0fWApXG4gICAgXG4gICAgZm9yIChjb25zdCB2IG9mIHZpb2xhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHBhdHRlcm5MYWJlbCA9IHYuY2Fub25QYXR0ZXJuIFxuICAgICAgICA/IGAke2MueWVsbG93fVske3YuY2Fub25QYXR0ZXJufV0ke2MucmVzZXR9YCBcbiAgICAgICAgOiBgJHtjLmRpbX1bLS0tXSR7Yy5yZXNldH1gXG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGAke2MuZGltfSR7di5saW5lfToke3YuY29sdW1ufSR7Yy5yZXNldH1gXG4gICAgICBcbiAgICAgIC8vIENsZWFuIHVwIG1lc3NhZ2UgKHJlbW92ZSBbQ2Fub24gWFhYXSBwcmVmaXggc2luY2Ugd2Ugc2hvdyBpdCBzZXBhcmF0ZWx5KVxuICAgICAgY29uc3QgY2xlYW5NZXNzYWdlID0gdi5tZXNzYWdlLnJlcGxhY2UoL1xcW0Nhbm9uIFxcZHszfVxcXVxccyovLCAnJylcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coYCAgICAke2xvY2F0aW9ufSAke3BhdHRlcm5MYWJlbH0gJHtjbGVhbk1lc3NhZ2V9YClcbiAgICB9XG4gICAgY29uc29sZS5sb2coJycpXG4gIH1cblxuICAvLyBGb290ZXJcbiAgY29uc29sZS5sb2coYCR7Yy5kaW19ICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAke2MucmVzZXR9YClcbiAgY29uc29sZS5sb2coYCAgJHtjLmRpbX1GaXggdmlvbGF0aW9ucyBtYW51YWxseSBmb2xsb3dpbmcgdGhlIENhbm9uIHBhdHRlcm5zJHtjLnJlc2V0fWApXG4gIGNvbnNvbGUubG9nKCcnKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXVkaXQocGF0aDogc3RyaW5nLCBvcHRpb25zOiBBdWRpdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgJ2VzbGludCcsXG4gICAgICBwYXRoLFxuICAgICAgJy0tZm9ybWF0JywgJ3N0eWxpc2gnLFxuICAgIF1cblxuICAgIGlmIChvcHRpb25zLmZpeCkge1xuICAgICAgYXJncy5wdXNoKCctLWZpeCcpXG4gICAgfVxuXG4gICAgY29uc3QgZXNsaW50ID0gc3Bhd24oJ25weCcsIGFyZ3MsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIHN0ZGlvOiBbJ2luaGVyaXQnLCAncGlwZScsICdwaXBlJ10sXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgbGV0IHN0ZG91dCA9ICcnXG4gICAgbGV0IHN0ZGVyciA9ICcnXG5cbiAgICBlc2xpbnQuc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBzdGRvdXQgKz0gZGF0YS50b1N0cmluZygpXG4gICAgfSlcblxuICAgIGVzbGludC5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIHN0ZGVyciArPSBkYXRhLnRvU3RyaW5nKClcbiAgICB9KVxuXG4gICAgZXNsaW50Lm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICBjb25zdCB2aW9sYXRpb25zID0gZXh0cmFjdFZpb2xhdGlvbnMoc3Rkb3V0KVxuICAgICAgXG4gICAgICBjb25zdCByZXN1bHQ6IEF1ZGl0UmVzdWx0ID0ge1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgdG90YWxGaWxlczogMCwgLy8gRVNMaW50IHN0eWxpc2ggZm9ybWF0IGRvZXNuJ3QgZ2l2ZSB1cyB0aGlzIGVhc2lseVxuICAgICAgICB2aW9sYXRpb25zLFxuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgdG90YWw6IHZpb2xhdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIGJ5UGF0dGVybjogY291bnRCeVBhdHRlcm4odmlvbGF0aW9ucyksXG4gICAgICAgIH0sXG4gICAgICB9XG5cbiAgICAgIHByaW50UmVwb3J0KHJlc3VsdCwgb3B0aW9ucylcblxuICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0ICYmIHZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcblxuICAgIGVzbGludC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIHJlamVjdChlcnJvcilcbiAgICB9KVxuICB9KVxufVxuIl19
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { version, patterns, guarantees } from '../../index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Read a pattern markdown file and extract sections
|
|
6
|
+
*/
|
|
7
|
+
function readPatternFile(patternFile) {
|
|
8
|
+
// Try to find the canon package patterns directory
|
|
9
|
+
const possiblePaths = [
|
|
10
|
+
path.join(process.cwd(), 'node_modules/@gallop.software/canon', patternFile),
|
|
11
|
+
// Fallback for development
|
|
12
|
+
path.join(import.meta.dirname, '../../../', patternFile),
|
|
13
|
+
];
|
|
14
|
+
for (const filePath of possiblePaths) {
|
|
15
|
+
if (fs.existsSync(filePath)) {
|
|
16
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract examples from pattern markdown
|
|
23
|
+
*/
|
|
24
|
+
function extractExamples(content) {
|
|
25
|
+
const good = [];
|
|
26
|
+
const bad = [];
|
|
27
|
+
// Find code blocks after "### Good" or "### Bad" headers
|
|
28
|
+
const goodMatch = content.match(/### Good\s*\n```[\s\S]*?```/g);
|
|
29
|
+
const badMatch = content.match(/### Bad\s*\n```[\s\S]*?```/g);
|
|
30
|
+
if (goodMatch) {
|
|
31
|
+
for (const match of goodMatch) {
|
|
32
|
+
const code = match.replace(/### Good\s*\n/, '').trim();
|
|
33
|
+
good.push(code);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (badMatch) {
|
|
37
|
+
for (const match of badMatch) {
|
|
38
|
+
const code = match.replace(/### Bad\s*\n/, '').trim();
|
|
39
|
+
bad.push(code);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { good, bad };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generate .cursorrules content from Canon
|
|
46
|
+
*/
|
|
47
|
+
function generateCursorrules() {
|
|
48
|
+
const lines = [];
|
|
49
|
+
// Header
|
|
50
|
+
lines.push(`# Gallop Canon v${version} - AI Rules`);
|
|
51
|
+
lines.push('');
|
|
52
|
+
lines.push('This file is auto-generated from @gallop.software/canon. Do not edit manually.');
|
|
53
|
+
lines.push('Regenerate with: npm run generate:ai-rules');
|
|
54
|
+
lines.push('');
|
|
55
|
+
// Tech stack (from speedwell context)
|
|
56
|
+
lines.push('## Tech Stack');
|
|
57
|
+
lines.push('');
|
|
58
|
+
lines.push('- Next.js 16 with App Router');
|
|
59
|
+
lines.push('- React 19');
|
|
60
|
+
lines.push('- TypeScript');
|
|
61
|
+
lines.push('- Tailwind CSS v4');
|
|
62
|
+
lines.push('- clsx for conditional class names');
|
|
63
|
+
lines.push('');
|
|
64
|
+
// Enforced patterns (ESLint rules)
|
|
65
|
+
lines.push('## Enforced Patterns (ESLint)');
|
|
66
|
+
lines.push('');
|
|
67
|
+
lines.push('These patterns are enforced by `@gallop.software/canon/eslint`. Violations will be flagged.');
|
|
68
|
+
lines.push('');
|
|
69
|
+
const enforcedPatterns = patterns.filter(p => p.enforcement === 'eslint' && p.rule);
|
|
70
|
+
for (const pattern of enforcedPatterns) {
|
|
71
|
+
lines.push(`### ${pattern.id}: ${pattern.title}`);
|
|
72
|
+
lines.push('');
|
|
73
|
+
lines.push(pattern.summary);
|
|
74
|
+
lines.push('');
|
|
75
|
+
lines.push(`- **ESLint Rule:** \`${pattern.rule}\``);
|
|
76
|
+
lines.push(`- **Category:** ${pattern.category}`);
|
|
77
|
+
lines.push('');
|
|
78
|
+
// Try to read and include examples
|
|
79
|
+
const content = readPatternFile(pattern.file);
|
|
80
|
+
if (content) {
|
|
81
|
+
const { good, bad } = extractExamples(content);
|
|
82
|
+
if (bad.length > 0) {
|
|
83
|
+
lines.push('**Bad:**');
|
|
84
|
+
lines.push('');
|
|
85
|
+
lines.push(bad[0]);
|
|
86
|
+
lines.push('');
|
|
87
|
+
}
|
|
88
|
+
if (good.length > 0) {
|
|
89
|
+
lines.push('**Good:**');
|
|
90
|
+
lines.push('');
|
|
91
|
+
lines.push(good[0]);
|
|
92
|
+
lines.push('');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Documentation patterns
|
|
97
|
+
lines.push('## Documentation Patterns');
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push('These patterns are not enforced by ESLint but should be followed.');
|
|
100
|
+
lines.push('');
|
|
101
|
+
const docPatterns = patterns.filter(p => p.enforcement === 'documentation');
|
|
102
|
+
for (const pattern of docPatterns) {
|
|
103
|
+
lines.push(`### ${pattern.id}: ${pattern.title}`);
|
|
104
|
+
lines.push('');
|
|
105
|
+
lines.push(pattern.summary);
|
|
106
|
+
lines.push('');
|
|
107
|
+
}
|
|
108
|
+
// Guarantees
|
|
109
|
+
lines.push('## Canon Guarantees');
|
|
110
|
+
lines.push('');
|
|
111
|
+
lines.push('Following these patterns provides these guarantees:');
|
|
112
|
+
lines.push('');
|
|
113
|
+
for (const guarantee of guarantees) {
|
|
114
|
+
lines.push(`- **${guarantee.name}** (${guarantee.id}): Patterns ${guarantee.patterns.join(', ')}`);
|
|
115
|
+
}
|
|
116
|
+
lines.push('');
|
|
117
|
+
// Quick reference for components
|
|
118
|
+
lines.push('## Component Quick Reference');
|
|
119
|
+
lines.push('');
|
|
120
|
+
lines.push('### Typography');
|
|
121
|
+
lines.push('- `Heading` - props: `as`, `color`, `margin`, `fontSize`, `fontWeight`, `textAlign`');
|
|
122
|
+
lines.push('- `Paragraph` - props: `color`, `margin`, `fontSize`, `lineHeight`, `textAlign`');
|
|
123
|
+
lines.push('- `Span` - props: `color`, `margin`, `fontSize` (inline text, mb-0 default)');
|
|
124
|
+
lines.push('- `Label` - props: `color`, `margin`, `fontSize`, `fontWeight`, `textAlign`');
|
|
125
|
+
lines.push('');
|
|
126
|
+
lines.push('### Layout');
|
|
127
|
+
lines.push('- `Section` - semantic section wrapper');
|
|
128
|
+
lines.push('- `Columns` - grid layout, props: `cols`, `gap`, `align`');
|
|
129
|
+
lines.push('- `Column` - column child');
|
|
130
|
+
lines.push('');
|
|
131
|
+
lines.push('### Interactive');
|
|
132
|
+
lines.push('- `Button` - props: `href`, `variant`, `icon`, `iconPlacement`, `margin`');
|
|
133
|
+
lines.push('- `Icon` - Iconify icon wrapper');
|
|
134
|
+
lines.push('');
|
|
135
|
+
// Do NOT section
|
|
136
|
+
lines.push('## Do NOT');
|
|
137
|
+
lines.push('');
|
|
138
|
+
lines.push('- Use `\'use client\'` in blocks - extract to components');
|
|
139
|
+
lines.push('- Use raw `<p>` or `<span>` - use Paragraph/Span components');
|
|
140
|
+
lines.push('- Use className for margin/color/fontSize when component has props');
|
|
141
|
+
lines.push('- Use Container inside Section - Section already provides containment');
|
|
142
|
+
lines.push('- Use `classnames` package - use `clsx` instead');
|
|
143
|
+
lines.push('- Use inline styles for hover states - use Tailwind classes');
|
|
144
|
+
lines.push('');
|
|
145
|
+
// Post-edit verification
|
|
146
|
+
lines.push('## Post-Edit Verification');
|
|
147
|
+
lines.push('');
|
|
148
|
+
lines.push('After editing files:');
|
|
149
|
+
lines.push('1. Run `npm run lint` to check for errors');
|
|
150
|
+
lines.push('2. Fix any violations before committing');
|
|
151
|
+
lines.push('');
|
|
152
|
+
lines.push('Note: Only lint files you edited, not the entire codebase.');
|
|
153
|
+
lines.push('');
|
|
154
|
+
return lines.join('\n');
|
|
155
|
+
}
|
|
156
|
+
export async function generate(options) {
|
|
157
|
+
const content = generateCursorrules();
|
|
158
|
+
if (options.output === '-') {
|
|
159
|
+
// Output to stdout
|
|
160
|
+
console.log(content);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// Write to file
|
|
164
|
+
const outputPath = path.resolve(process.cwd(), options.output);
|
|
165
|
+
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
166
|
+
console.log(`✓ Generated ${options.output} from Canon v${version}`);
|
|
167
|
+
console.log(` ${patterns.length} patterns, ${guarantees.length} guarantees`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2dlbmVyYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFjLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTzFFOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsV0FBbUI7SUFDMUMsbURBQW1EO0lBQ25ELE1BQU0sYUFBYSxHQUFHO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLHFDQUFxQyxFQUFFLFdBQVcsQ0FBQztRQUM1RSwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO0tBQ3pELENBQUE7SUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQWU7SUFDdEMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBQ3pCLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQTtJQUV4Qix5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtJQUU3RCxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDckQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUE7QUFDdEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxtQkFBbUI7SUFDMUIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBRTFCLFNBQVM7SUFDVCxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixPQUFPLGFBQWEsQ0FBQyxDQUFBO0lBQ25ELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLGdGQUFnRixDQUFDLENBQUE7SUFDNUYsS0FBSyxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO0lBQ3hELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZCxzQ0FBc0M7SUFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQzFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO0lBQ2hELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZCxtQ0FBbUM7SUFDbkMsS0FBSyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0lBQzNDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLDZGQUE2RixDQUFDLENBQUE7SUFDekcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNuRixLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQTtRQUNwRCxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUNqRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWQsbUNBQW1DO1FBQ25DLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzlDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2hCLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNoQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCx5QkFBeUI7SUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO0lBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUE7SUFDL0UsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLGVBQWUsQ0FBQyxDQUFBO0lBQzNFLEtBQUssTUFBTSxPQUFPLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDaEIsQ0FBQztJQUVELGFBQWE7SUFDYixLQUFLLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQTtJQUNqRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRWQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sU0FBUyxDQUFDLElBQUksT0FBTyxTQUFTLENBQUMsRUFBRSxlQUFlLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNwRyxDQUFDO0lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLGlDQUFpQztJQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLHFGQUFxRixDQUFDLENBQUE7SUFDakcsS0FBSyxDQUFDLElBQUksQ0FBQyxpRkFBaUYsQ0FBQyxDQUFBO0lBQzdGLEtBQUssQ0FBQyxJQUFJLENBQUMsNkVBQTZFLENBQUMsQ0FBQTtJQUN6RixLQUFLLENBQUMsSUFBSSxDQUFDLDZFQUE2RSxDQUFDLENBQUE7SUFDekYsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO0lBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsMERBQTBELENBQUMsQ0FBQTtJQUN0RSxLQUFLLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLDBFQUEwRSxDQUFDLENBQUE7SUFDdEYsS0FBSyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO0lBQzdDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZCxpQkFBaUI7SUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQywwREFBMEQsQ0FBQyxDQUFBO0lBQ3RFLEtBQUssQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQTtJQUN6RSxLQUFLLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDLENBQUE7SUFDaEYsS0FBSyxDQUFDLElBQUksQ0FBQyx1RUFBdUUsQ0FBQyxDQUFBO0lBQ25GLEtBQUssQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQTtJQUM3RCxLQUFLLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUE7SUFDekUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLHlCQUF5QjtJQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUE7SUFDdkQsS0FBSyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO0lBQ3JELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUE7SUFDeEUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxRQUFRLENBQUMsT0FBd0I7SUFDckQsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQTtJQUVyQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDM0IsbUJBQW1CO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDdEIsQ0FBQztTQUFNLENBQUM7UUFDTixnQkFBZ0I7UUFDaEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzlELEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsT0FBTyxDQUFDLE1BQU0sZ0JBQWdCLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxNQUFNLGNBQWMsVUFBVSxDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUE7SUFDL0UsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IHZlcnNpb24sIHBhdHRlcm5zLCBjYXRlZ29yaWVzLCBndWFyYW50ZWVzIH0gZnJvbSAnLi4vLi4vaW5kZXguanMnXG5cbmludGVyZmFjZSBHZW5lcmF0ZU9wdGlvbnMge1xuICBvdXRwdXQ6IHN0cmluZ1xuICBmb3JtYXQ6ICdjdXJzb3JydWxlcycgfCAnbWFya2Rvd24nXG59XG5cbi8qKlxuICogUmVhZCBhIHBhdHRlcm4gbWFya2Rvd24gZmlsZSBhbmQgZXh0cmFjdCBzZWN0aW9uc1xuICovXG5mdW5jdGlvbiByZWFkUGF0dGVybkZpbGUocGF0dGVybkZpbGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAvLyBUcnkgdG8gZmluZCB0aGUgY2Fub24gcGFja2FnZSBwYXR0ZXJucyBkaXJlY3RvcnlcbiAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uJywgcGF0dGVybkZpbGUpLFxuICAgIC8vIEZhbGxiYWNrIGZvciBkZXZlbG9wbWVudFxuICAgIHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCAnLi4vLi4vLi4vJywgcGF0dGVybkZpbGUpLFxuICBdXG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogRXh0cmFjdCBleGFtcGxlcyBmcm9tIHBhdHRlcm4gbWFya2Rvd25cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV4YW1wbGVzKGNvbnRlbnQ6IHN0cmluZyk6IHsgZ29vZDogc3RyaW5nW107IGJhZDogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGdvb2Q6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgYmFkOiBzdHJpbmdbXSA9IFtdXG5cbiAgLy8gRmluZCBjb2RlIGJsb2NrcyBhZnRlciBcIiMjIyBHb29kXCIgb3IgXCIjIyMgQmFkXCIgaGVhZGVyc1xuICBjb25zdCBnb29kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC8jIyMgR29vZFxccypcXG5gYGBbXFxzXFxTXSo/YGBgL2cpXG4gIGNvbnN0IGJhZE1hdGNoID0gY29udGVudC5tYXRjaCgvIyMjIEJhZFxccypcXG5gYGBbXFxzXFxTXSo/YGBgL2cpXG5cbiAgaWYgKGdvb2RNYXRjaCkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZ29vZE1hdGNoKSB7XG4gICAgICBjb25zdCBjb2RlID0gbWF0Y2gucmVwbGFjZSgvIyMjIEdvb2RcXHMqXFxuLywgJycpLnRyaW0oKVxuICAgICAgZ29vZC5wdXNoKGNvZGUpXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhZE1hdGNoKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBiYWRNYXRjaCkge1xuICAgICAgY29uc3QgY29kZSA9IG1hdGNoLnJlcGxhY2UoLyMjIyBCYWRcXHMqXFxuLywgJycpLnRyaW0oKVxuICAgICAgYmFkLnB1c2goY29kZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBnb29kLCBiYWQgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIC5jdXJzb3JydWxlcyBjb250ZW50IGZyb20gQ2Fub25cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JydWxlcygpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEhlYWRlclxuICBsaW5lcy5wdXNoKGAjIEdhbGxvcCBDYW5vbiB2JHt2ZXJzaW9ufSAtIEFJIFJ1bGVzYClcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGZyb20gQGdhbGxvcC5zb2Z0d2FyZS9jYW5vbi4gRG8gbm90IGVkaXQgbWFudWFsbHkuJylcbiAgbGluZXMucHVzaCgnUmVnZW5lcmF0ZSB3aXRoOiBucG0gcnVuIGdlbmVyYXRlOmFpLXJ1bGVzJylcbiAgbGluZXMucHVzaCgnJylcblxuICAvLyBUZWNoIHN0YWNrIChmcm9tIHNwZWVkd2VsbCBjb250ZXh0KVxuICBsaW5lcy5wdXNoKCcjIyBUZWNoIFN0YWNrJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnLSBOZXh0LmpzIDE2IHdpdGggQXBwIFJvdXRlcicpXG4gIGxpbmVzLnB1c2goJy0gUmVhY3QgMTknKVxuICBsaW5lcy5wdXNoKCctIFR5cGVTY3JpcHQnKVxuICBsaW5lcy5wdXNoKCctIFRhaWx3aW5kIENTUyB2NCcpXG4gIGxpbmVzLnB1c2goJy0gY2xzeCBmb3IgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIEVuZm9yY2VkIHBhdHRlcm5zIChFU0xpbnQgcnVsZXMpXG4gIGxpbmVzLnB1c2goJyMjIEVuZm9yY2VkIFBhdHRlcm5zIChFU0xpbnQpJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnVGhlc2UgcGF0dGVybnMgYXJlIGVuZm9yY2VkIGJ5IGBAZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uL2VzbGludGAuIFZpb2xhdGlvbnMgd2lsbCBiZSBmbGFnZ2VkLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgY29uc3QgZW5mb3JjZWRQYXR0ZXJucyA9IHBhdHRlcm5zLmZpbHRlcihwID0+IHAuZW5mb3JjZW1lbnQgPT09ICdlc2xpbnQnICYmIHAucnVsZSlcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGVuZm9yY2VkUGF0dGVybnMpIHtcbiAgICBsaW5lcy5wdXNoKGAjIyMgJHtwYXR0ZXJuLmlkfTogJHtwYXR0ZXJuLnRpdGxlfWApXG4gICAgbGluZXMucHVzaCgnJylcbiAgICBsaW5lcy5wdXNoKHBhdHRlcm4uc3VtbWFyeSlcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2goYC0gKipFU0xpbnQgUnVsZToqKiBcXGAke3BhdHRlcm4ucnVsZX1cXGBgKVxuICAgIGxpbmVzLnB1c2goYC0gKipDYXRlZ29yeToqKiAke3BhdHRlcm4uY2F0ZWdvcnl9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuXG4gICAgLy8gVHJ5IHRvIHJlYWQgYW5kIGluY2x1ZGUgZXhhbXBsZXNcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZFBhdHRlcm5GaWxlKHBhdHRlcm4uZmlsZSlcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgY29uc3QgeyBnb29kLCBiYWQgfSA9IGV4dHJhY3RFeGFtcGxlcyhjb250ZW50KVxuICAgICAgaWYgKGJhZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyoqQmFkOioqJylcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgICAgbGluZXMucHVzaChiYWRbMF0pXG4gICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICB9XG4gICAgICBpZiAoZ29vZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyoqR29vZDoqKicpXG4gICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICAgIGxpbmVzLnB1c2goZ29vZFswXSlcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEb2N1bWVudGF0aW9uIHBhdHRlcm5zXG4gIGxpbmVzLnB1c2goJyMjIERvY3VtZW50YXRpb24gUGF0dGVybnMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGVuZm9yY2VkIGJ5IEVTTGludCBidXQgc2hvdWxkIGJlIGZvbGxvd2VkLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgY29uc3QgZG9jUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIocCA9PiBwLmVuZm9yY2VtZW50ID09PSAnZG9jdW1lbnRhdGlvbicpXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBkb2NQYXR0ZXJucykge1xuICAgIGxpbmVzLnB1c2goYCMjIyAke3BhdHRlcm4uaWR9OiAke3BhdHRlcm4udGl0bGV9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2gocGF0dGVybi5zdW1tYXJ5KVxuICAgIGxpbmVzLnB1c2goJycpXG4gIH1cblxuICAvLyBHdWFyYW50ZWVzXG4gIGxpbmVzLnB1c2goJyMjIENhbm9uIEd1YXJhbnRlZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdGb2xsb3dpbmcgdGhlc2UgcGF0dGVybnMgcHJvdmlkZXMgdGhlc2UgZ3VhcmFudGVlczonKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGZvciAoY29uc3QgZ3VhcmFudGVlIG9mIGd1YXJhbnRlZXMpIHtcbiAgICBsaW5lcy5wdXNoKGAtICoqJHtndWFyYW50ZWUubmFtZX0qKiAoJHtndWFyYW50ZWUuaWR9KTogUGF0dGVybnMgJHtndWFyYW50ZWUucGF0dGVybnMuam9pbignLCAnKX1gKVxuICB9XG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gUXVpY2sgcmVmZXJlbmNlIGZvciBjb21wb25lbnRzXG4gIGxpbmVzLnB1c2goJyMjIENvbXBvbmVudCBRdWljayBSZWZlcmVuY2UnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCcjIyMgVHlwb2dyYXBoeScpXG4gIGxpbmVzLnB1c2goJy0gYEhlYWRpbmdgIC0gcHJvcHM6IGBhc2AsIGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgLCBgZm9udFdlaWdodGAsIGB0ZXh0QWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgUGFyYWdyYXBoYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGxpbmVIZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gIGxpbmVzLnB1c2goJy0gYFNwYW5gIC0gcHJvcHM6IGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgIChpbmxpbmUgdGV4dCwgbWItMCBkZWZhdWx0KScpXG4gIGxpbmVzLnB1c2goJy0gYExhYmVsYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGZvbnRXZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBMYXlvdXQnKVxuICBsaW5lcy5wdXNoKCctIGBTZWN0aW9uYCAtIHNlbWFudGljIHNlY3Rpb24gd3JhcHBlcicpXG4gIGxpbmVzLnB1c2goJy0gYENvbHVtbnNgIC0gZ3JpZCBsYXlvdXQsIHByb3BzOiBgY29sc2AsIGBnYXBgLCBgYWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgQ29sdW1uYCAtIGNvbHVtbiBjaGlsZCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBJbnRlcmFjdGl2ZScpXG4gIGxpbmVzLnB1c2goJy0gYEJ1dHRvbmAgLSBwcm9wczogYGhyZWZgLCBgdmFyaWFudGAsIGBpY29uYCwgYGljb25QbGFjZW1lbnRgLCBgbWFyZ2luYCcpXG4gIGxpbmVzLnB1c2goJy0gYEljb25gIC0gSWNvbmlmeSBpY29uIHdyYXBwZXInKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIERvIE5PVCBzZWN0aW9uXG4gIGxpbmVzLnB1c2goJyMjIERvIE5PVCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGBcXCd1c2UgY2xpZW50XFwnYCBpbiBibG9ja3MgLSBleHRyYWN0IHRvIGNvbXBvbmVudHMnKVxuICBsaW5lcy5wdXNoKCctIFVzZSByYXcgYDxwPmAgb3IgYDxzcGFuPmAgLSB1c2UgUGFyYWdyYXBoL1NwYW4gY29tcG9uZW50cycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGNsYXNzTmFtZSBmb3IgbWFyZ2luL2NvbG9yL2ZvbnRTaXplIHdoZW4gY29tcG9uZW50IGhhcyBwcm9wcycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIENvbnRhaW5lciBpbnNpZGUgU2VjdGlvbiAtIFNlY3Rpb24gYWxyZWFkeSBwcm92aWRlcyBjb250YWlubWVudCcpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGBjbGFzc25hbWVzYCBwYWNrYWdlIC0gdXNlIGBjbHN4YCBpbnN0ZWFkJylcbiAgbGluZXMucHVzaCgnLSBVc2UgaW5saW5lIHN0eWxlcyBmb3IgaG92ZXIgc3RhdGVzIC0gdXNlIFRhaWx3aW5kIGNsYXNzZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIFBvc3QtZWRpdCB2ZXJpZmljYXRpb25cbiAgbGluZXMucHVzaCgnIyMgUG9zdC1FZGl0IFZlcmlmaWNhdGlvbicpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ0FmdGVyIGVkaXRpbmcgZmlsZXM6JylcbiAgbGluZXMucHVzaCgnMS4gUnVuIGBucG0gcnVuIGxpbnRgIHRvIGNoZWNrIGZvciBlcnJvcnMnKVxuICBsaW5lcy5wdXNoKCcyLiBGaXggYW55IHZpb2xhdGlvbnMgYmVmb3JlIGNvbW1pdHRpbmcnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdOb3RlOiBPbmx5IGxpbnQgZmlsZXMgeW91IGVkaXRlZCwgbm90IHRoZSBlbnRpcmUgY29kZWJhc2UuJylcbiAgbGluZXMucHVzaCgnJylcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlKG9wdGlvbnM6IEdlbmVyYXRlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JydWxlcygpXG5cbiAgaWYgKG9wdGlvbnMub3V0cHV0ID09PSAnLScpIHtcbiAgICAvLyBPdXRwdXQgdG8gc3Rkb3V0XG4gICAgY29uc29sZS5sb2coY29udGVudClcbiAgfSBlbHNlIHtcbiAgICAvLyBXcml0ZSB0byBmaWxlXG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLm91dHB1dClcbiAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGNvbnRlbnQsICd1dGYtOCcpXG4gICAgY29uc29sZS5sb2coYOKckyBHZW5lcmF0ZWQgJHtvcHRpb25zLm91dHB1dH0gZnJvbSBDYW5vbiB2JHt2ZXJzaW9ufWApXG4gICAgY29uc29sZS5sb2coYCAgJHtwYXR0ZXJucy5sZW5ndGh9IHBhdHRlcm5zLCAke2d1YXJhbnRlZXMubGVuZ3RofSBndWFyYW50ZWVzYClcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { audit } from './commands/audit.js';
|
|
3
|
+
import { generate } from './commands/generate.js';
|
|
4
|
+
import { version } from '../index.js';
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const command = args[0];
|
|
7
|
+
// Colors for terminal output
|
|
8
|
+
const colors = {
|
|
9
|
+
reset: '\x1b[0m',
|
|
10
|
+
bold: '\x1b[1m',
|
|
11
|
+
dim: '\x1b[2m',
|
|
12
|
+
red: '\x1b[31m',
|
|
13
|
+
green: '\x1b[32m',
|
|
14
|
+
yellow: '\x1b[33m',
|
|
15
|
+
blue: '\x1b[34m',
|
|
16
|
+
magenta: '\x1b[35m',
|
|
17
|
+
cyan: '\x1b[36m',
|
|
18
|
+
};
|
|
19
|
+
function showHelp() {
|
|
20
|
+
console.log(`
|
|
21
|
+
${colors.bold}Gallop CLI${colors.reset} - Canon Compliance Tooling
|
|
22
|
+
${colors.dim}Canon Version: ${version}${colors.reset}
|
|
23
|
+
|
|
24
|
+
${colors.bold}Usage:${colors.reset}
|
|
25
|
+
gallop <command> [options]
|
|
26
|
+
|
|
27
|
+
${colors.bold}Commands:${colors.reset}
|
|
28
|
+
audit [path] Check Canon compliance (default: src/blocks/)
|
|
29
|
+
generate [output] Generate AI rules from Canon (default: .cursorrules)
|
|
30
|
+
version Show version information
|
|
31
|
+
help Show this help message
|
|
32
|
+
|
|
33
|
+
${colors.bold}Audit Options:${colors.reset}
|
|
34
|
+
--strict Exit with error code on violations
|
|
35
|
+
--json Output as JSON
|
|
36
|
+
|
|
37
|
+
${colors.bold}Generate Options:${colors.reset}
|
|
38
|
+
--output, -o Output file path (default: .cursorrules)
|
|
39
|
+
|
|
40
|
+
${colors.bold}Examples:${colors.reset}
|
|
41
|
+
gallop audit
|
|
42
|
+
gallop audit src/blocks/ --strict
|
|
43
|
+
gallop generate
|
|
44
|
+
gallop generate .cursorrules
|
|
45
|
+
gallop generate --output .github/copilot-instructions.md
|
|
46
|
+
`);
|
|
47
|
+
}
|
|
48
|
+
function showVersion() {
|
|
49
|
+
console.log(`Gallop CLI v1.0.0`);
|
|
50
|
+
console.log(`Canon v${version}`);
|
|
51
|
+
}
|
|
52
|
+
async function main() {
|
|
53
|
+
switch (command) {
|
|
54
|
+
case 'audit':
|
|
55
|
+
const auditPath = args[1] && !args[1].startsWith('--') ? args[1] : 'src/blocks/';
|
|
56
|
+
const auditOptions = {
|
|
57
|
+
strict: args.includes('--strict'),
|
|
58
|
+
json: args.includes('--json'),
|
|
59
|
+
fix: args.includes('--fix'),
|
|
60
|
+
};
|
|
61
|
+
await audit(auditPath, auditOptions);
|
|
62
|
+
break;
|
|
63
|
+
case 'generate':
|
|
64
|
+
// Find output path from args
|
|
65
|
+
let outputPath = '.cursorrules';
|
|
66
|
+
const outputIndex = args.indexOf('--output');
|
|
67
|
+
const outputIndexShort = args.indexOf('-o');
|
|
68
|
+
if (outputIndex !== -1 && args[outputIndex + 1]) {
|
|
69
|
+
outputPath = args[outputIndex + 1];
|
|
70
|
+
}
|
|
71
|
+
else if (outputIndexShort !== -1 && args[outputIndexShort + 1]) {
|
|
72
|
+
outputPath = args[outputIndexShort + 1];
|
|
73
|
+
}
|
|
74
|
+
else if (args[1] && !args[1].startsWith('--')) {
|
|
75
|
+
outputPath = args[1];
|
|
76
|
+
}
|
|
77
|
+
const generateOptions = {
|
|
78
|
+
output: outputPath,
|
|
79
|
+
format: 'cursorrules',
|
|
80
|
+
};
|
|
81
|
+
await generate(generateOptions);
|
|
82
|
+
break;
|
|
83
|
+
case 'version':
|
|
84
|
+
case '-v':
|
|
85
|
+
case '--version':
|
|
86
|
+
showVersion();
|
|
87
|
+
break;
|
|
88
|
+
case 'help':
|
|
89
|
+
case '-h':
|
|
90
|
+
case '--help':
|
|
91
|
+
case undefined:
|
|
92
|
+
showHelp();
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
console.error(`Unknown command: ${command}`);
|
|
96
|
+
console.error(`Run 'gallop help' for usage information.`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
main().catch((error) => {
|
|
101
|
+
console.error('Error:', error.message);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRXZCLDZCQUE2QjtBQUM3QixNQUFNLE1BQU0sR0FBRztJQUNiLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLElBQUksRUFBRSxVQUFVO0NBQ2pCLENBQUE7QUFFRCxTQUFTLFFBQVE7SUFDZixPQUFPLENBQUMsR0FBRyxDQUFDO0VBQ1osTUFBTSxDQUFDLElBQUksYUFBYSxNQUFNLENBQUMsS0FBSztFQUNwQyxNQUFNLENBQUMsR0FBRyxrQkFBa0IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLOztFQUVsRCxNQUFNLENBQUMsSUFBSSxTQUFTLE1BQU0sQ0FBQyxLQUFLOzs7RUFHaEMsTUFBTSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsS0FBSzs7Ozs7O0VBTW5DLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixNQUFNLENBQUMsS0FBSzs7OztFQUl4QyxNQUFNLENBQUMsSUFBSSxvQkFBb0IsTUFBTSxDQUFDLEtBQUs7OztFQUczQyxNQUFN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QUMsT0FBTyxDQUFDLENBQUE7SUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqQixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgYXVkaXQgfSBmcm9tICcuL2NvbW1hbmRzL2F1ZGl0LmpzJ1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuL2NvbW1hbmRzL2dlbmVyYXRlLmpzJ1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL2luZGV4LmpzJ1xuXG5jb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpXG5jb25zdCBjb21tYW5kID0gYXJnc1swXVxuXG4vLyBDb2xvcnMgZm9yIHRlcm1pbmFsIG91dHB1dFxuY29uc3QgY29sb3JzID0ge1xuICByZXNldDogJ1xceDFiWzBtJyxcbiAgYm9sZDogJ1xceDFiWzFtJyxcbiAgZGltOiAnXFx4MWJbMm0nLFxuICByZWQ6ICdcXHgxYlszMW0nLFxuICBncmVlbjogJ1xceDFiWzMybScsXG4gIHllbGxvdzogJ1xceDFiWzMzbScsXG4gIGJsdWU6ICdcXHgxYlszNG0nLFxuICBtYWdlbnRhOiAnXFx4MWJbMzVtJyxcbiAgY3lhbjogJ1xceDFiWzM2bScsXG59XG5cbmZ1bmN0aW9uIHNob3dIZWxwKCkge1xuICBjb25zb2xlLmxvZyhgXG4ke2NvbG9ycy5ib2xkfUdhbGxvcCBDTEkke2NvbG9ycy5yZXNldH0gLSBDYW5vbiBDb21wbGlhbmNlIFRvb2xpbmdcbiR7Y29sb3JzLmRpbX1DYW5vbiBWZXJzaW9uOiAke3ZlcnNpb259JHtjb2xvcnMucmVzZXR9XG5cbiR7Y29sb3JzLmJvbGR9VXNhZ2U6JHtjb2xvcnMucmVzZXR9XG4gIGdhbGxvcCA8Y29tbWFuZD4gW29wdGlvbnNdXG5cbiR7Y29sb3JzLmJvbGR9Q29tbWFuZHM6JHtjb2xvcnMucmVzZXR9XG4gIGF1ZGl0IFtwYXRoXSAgICAgICBDaGVjayBDYW5vbiBjb21wbGlhbmNlIChkZWZhdWx0OiBzcmMvYmxvY2tzLylcbiAgZ2VuZXJhdGUgW291dHB1dF0gIEdlbmVyYXRlIEFJIHJ1bGVzIGZyb20gQ2Fub24gKGRlZmF1bHQ6IC5jdXJzb3JydWxlcylcbiAgdmVyc2lvbiAgICAgICAgICAgIFNob3cgdmVyc2lvbiBpbmZvcm1hdGlvblxuICBoZWxwICAgICAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgbWVzc2FnZVxuXG4ke2NvbG9ycy5ib2xkfUF1ZGl0IE9wdGlvbnM6JHtjb2xvcnMucmVzZXR9XG4gIC0tc3RyaWN0ICAgICAgICAgICBFeGl0IHdpdGggZXJyb3IgY29kZSBvbiB2aW9sYXRpb25zXG4gIC0tanNvbiAgICAgICAgICAgICBPdXRwdXQgYXMgSlNPTlxuXG4ke2NvbG9ycy5ib2xkfUdlbmVyYXRlIE9wdGlvbnM6JHtjb2xvcnMucmVzZXR9XG4gIC0tb3V0cHV0LCAtbyAgICAgICBPdXRwdXQgZmlsZSBwYXRoIChkZWZhdWx0OiAuY3Vyc29ycnVsZXMpXG5cbiR7Y29sb3JzLmJvbGR9RXhhbXBsZXM6JHtjb2xvcnMucmVzZXR9XG4gIGdhbGxvcCBhdWRpdFxuICBnYWxsb3AgYXVkaXQgc3JjL2Jsb2Nrcy8gLS1zdHJpY3RcbiAgZ2FsbG9wIGdlbmVyYXRlXG4gIGdhbGxvcCBnZW5lcmF0ZSAuY3Vyc29ycnVsZXNcbiAgZ2FsbG9wIGdlbmVyYXRlIC0tb3V0cHV0IC5naXRodWIvY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbmApXG59XG5cbmZ1bmN0aW9uIHNob3dWZXJzaW9uKCkge1xuICBjb25zb2xlLmxvZyhgR2FsbG9wIENMSSB2MS4wLjBgKVxuICBjb25zb2xlLmxvZyhgQ2Fub24gdiR7dmVyc2lvbn1gKVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBzd2l0Y2ggKGNvbW1hbmQpIHtcbiAgICBjYXNlICdhdWRpdCc6XG4gICAgICBjb25zdCBhdWRpdFBhdGggPVxuICAgICAgICBhcmdzWzFdICYmICFhcmdzWzFdLnN0YXJ0c1dpdGgoJy0tJykgPyBhcmdzWzFdIDogJ3NyYy9ibG9ja3MvJ1xuICAgICAgY29uc3QgYXVkaXRPcHRpb25zID0ge1xuICAgICAgICBzdHJpY3Q6IGFyZ3MuaW5jbHVkZXMoJy0tc3RyaWN0JyksXG4gICAgICAgIGpzb246IGFyZ3MuaW5jbHVkZXMoJy0tanNvbicpLFxuICAgICAgICBmaXg6IGFyZ3MuaW5jbHVkZXMoJy0tZml4JyksXG4gICAgICB9XG4gICAgICBhd2FpdCBhdWRpdChhdWRpdFBhdGgsIGF1ZGl0T3B0aW9ucylcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdnZW5lcmF0ZSc6XG4gICAgICAvLyBGaW5kIG91dHB1dCBwYXRoIGZyb20gYXJnc1xuICAgICAgbGV0IG91dHB1dFBhdGggPSAnLmN1cnNvcnJ1bGVzJ1xuICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBhcmdzLmluZGV4T2YoJy0tb3V0cHV0JylcbiAgICAgIGNvbnN0IG91dHB1dEluZGV4U2hvcnQgPSBhcmdzLmluZGV4T2YoJy1vJylcbiAgICAgIGlmIChvdXRwdXRJbmRleCAhPT0gLTEgJiYgYXJnc1tvdXRwdXRJbmRleCArIDFdKSB7XG4gICAgICAgIG91dHB1dFBhdGggPSBhcmdzW291dHB1dEluZGV4ICsgMV1cbiAgICAgIH0gZWxzZSBpZiAob3V0cHV0SW5kZXhTaG9ydCAhPT0gLTEgJiYgYXJnc1tvdXRwdXRJbmRleFNob3J0ICsgMV0pIHtcbiAgICAgICAgb3V0cHV0UGF0aCA9IGFyZ3Nbb3V0cHV0SW5kZXhTaG9ydCArIDFdXG4gICAgICB9IGVsc2UgaWYgKGFyZ3NbMV0gJiYgIWFyZ3NbMV0uc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICBvdXRwdXRQYXRoID0gYXJnc1sxXVxuICAgICAgfVxuICAgICAgY29uc3QgZ2VuZXJhdGVPcHRpb25zID0ge1xuICAgICAgICBvdXRwdXQ6IG91dHB1dFBhdGgsXG4gICAgICAgIGZvcm1hdDogJ2N1cnNvcnJ1bGVzJyBhcyBjb25zdCxcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlKGdlbmVyYXRlT3B0aW9ucylcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICd2ZXJzaW9uJzpcbiAgICBjYXNlICctdic6XG4gICAgY2FzZSAnLS12ZXJzaW9uJzpcbiAgICAgIHNob3dWZXJzaW9uKClcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdoZWxwJzpcbiAgICBjYXNlICctaCc6XG4gICAgY2FzZSAnLS1oZWxwJzpcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHNob3dIZWxwKClcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJ1biAnZ2FsbG9wIGhlbHAnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi5gKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cblxubWFpbigpLmNhdGNoKChlcnJvcikgPT4ge1xuICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvci5tZXNzYWdlKVxuICBwcm9jZXNzLmV4aXQoMSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommended configuration
|
|
3
|
+
* A sensible default for any Gallop-based template
|
|
4
|
+
*/
|
|
5
|
+
declare const recommendedConfig: {
|
|
6
|
+
plugins: string[];
|
|
7
|
+
rules: {
|
|
8
|
+
'gallop/no-client-blocks': string;
|
|
9
|
+
'gallop/no-container-in-section': string;
|
|
10
|
+
'gallop/prefer-component-props': string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export default recommendedConfig;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommended configuration
|
|
3
|
+
* A sensible default for any Gallop-based template
|
|
4
|
+
*/
|
|
5
|
+
const recommendedConfig = {
|
|
6
|
+
plugins: ['gallop'],
|
|
7
|
+
rules: {
|
|
8
|
+
// Core rules that apply to most templates
|
|
9
|
+
'gallop/no-client-blocks': 'warn',
|
|
10
|
+
'gallop/no-container-in-section': 'warn',
|
|
11
|
+
'gallop/prefer-component-props': 'warn',
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
export default recommendedConfig;
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb21tZW5kZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXNsaW50L2NvbmZpZ3MvcmVjb21tZW5kZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDbkIsS0FBSyxFQUFFO1FBQ0wsMENBQTBDO1FBQzFDLHlCQUF5QixFQUFFLE1BQU07UUFDakMsZ0NBQWdDLEVBQUUsTUFBTTtRQUN4QywrQkFBK0IsRUFBRSxNQUFNO0tBQ3hDO0NBQ0YsQ0FBQTtBQUVELGVBQWUsaUJBQWlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlY29tbWVuZGVkIGNvbmZpZ3VyYXRpb25cbiAqIEEgc2Vuc2libGUgZGVmYXVsdCBmb3IgYW55IEdhbGxvcC1iYXNlZCB0ZW1wbGF0ZVxuICovXG5jb25zdCByZWNvbW1lbmRlZENvbmZpZyA9IHtcbiAgcGx1Z2luczogWydnYWxsb3AnXSxcbiAgcnVsZXM6IHtcbiAgICAvLyBDb3JlIHJ1bGVzIHRoYXQgYXBwbHkgdG8gbW9zdCB0ZW1wbGF0ZXNcbiAgICAnZ2FsbG9wL25vLWNsaWVudC1ibG9ja3MnOiAnd2FybicsXG4gICAgJ2dhbGxvcC9uby1jb250YWluZXItaW4tc2VjdGlvbic6ICd3YXJuJyxcbiAgICAnZ2FsbG9wL3ByZWZlci1jb21wb25lbnQtcHJvcHMnOiAnd2FybicsXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlY29tbWVuZGVkQ29uZmlnXG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Speedwell template configuration
|
|
3
|
+
* Enables all Gallop rules relevant to the Speedwell architecture
|
|
4
|
+
*/
|
|
5
|
+
declare const speedwellConfig: {
|
|
6
|
+
plugins: string[];
|
|
7
|
+
rules: {
|
|
8
|
+
'gallop/no-client-blocks': string;
|
|
9
|
+
'gallop/no-container-in-section': string;
|
|
10
|
+
'gallop/prefer-component-props': string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export default speedwellConfig;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Speedwell template configuration
|
|
3
|
+
* Enables all Gallop rules relevant to the Speedwell architecture
|
|
4
|
+
*/
|
|
5
|
+
const speedwellConfig = {
|
|
6
|
+
plugins: ['gallop'],
|
|
7
|
+
rules: {
|
|
8
|
+
// Blocks should be server components - extract client logic to components
|
|
9
|
+
'gallop/no-client-blocks': 'warn',
|
|
10
|
+
// Section already provides containment
|
|
11
|
+
'gallop/no-container-in-section': 'warn',
|
|
12
|
+
// Use component props instead of className for style values
|
|
13
|
+
'gallop/prefer-component-props': 'warn',
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export default speedwellConfig;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlZWR3ZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VzbGludC9jb25maWdzL3NwZWVkd2VsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsR0FBRztJQUN0QixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDbkIsS0FBSyxFQUFFO1FBQ0wsMEVBQTBFO1FBQzFFLHlCQUF5QixFQUFFLE1BQU07UUFFakMsdUNBQXVDO1FBQ3ZDLGdDQUFnQyxFQUFFLE1BQU07UUFFeEMsNERBQTREO1FBQzVELCtCQUErQixFQUFFLE1BQU07S0FDeEM7Q0FDRixDQUFBO0FBRUQsZUFBZSxlQUFlLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNwZWVkd2VsbCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uXG4gKiBFbmFibGVzIGFsbCBHYWxsb3AgcnVsZXMgcmVsZXZhbnQgdG8gdGhlIFNwZWVkd2VsbCBhcmNoaXRlY3R1cmVcbiAqL1xuY29uc3Qgc3BlZWR3ZWxsQ29uZmlnID0ge1xuICBwbHVnaW5zOiBbJ2dhbGxvcCddLFxuICBydWxlczoge1xuICAgIC8vIEJsb2NrcyBzaG91bGQgYmUgc2VydmVyIGNvbXBvbmVudHMgLSBleHRyYWN0IGNsaWVudCBsb2dpYyB0byBjb21wb25lbnRzXG4gICAgJ2dhbGxvcC9uby1jbGllbnQtYmxvY2tzJzogJ3dhcm4nLFxuXG4gICAgLy8gU2VjdGlvbiBhbHJlYWR5IHByb3ZpZGVzIGNvbnRhaW5tZW50XG4gICAgJ2dhbGxvcC9uby1jb250YWluZXItaW4tc2VjdGlvbic6ICd3YXJuJyxcblxuICAgIC8vIFVzZSBjb21wb25lbnQgcHJvcHMgaW5zdGVhZCBvZiBjbGFzc05hbWUgZm9yIHN0eWxlIHZhbHVlc1xuICAgICdnYWxsb3AvcHJlZmVyLWNvbXBvbmVudC1wcm9wcyc6ICd3YXJuJyxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3BlZWR3ZWxsQ29uZmlnXG4iXX0=
|