@gallop.software/canon 2.6.0 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -52,7 +52,7 @@ function generateCursorrules() {
52
52
  lines.push('This file is auto-generated from @gallop.software/canon. Do not edit manually.');
53
53
  lines.push('Regenerate with: npm run generate:ai-rules');
54
54
  lines.push('');
55
- // Tech stack (from speedwell context)
55
+ // Tech stack (Canon-compatible templates)
56
56
  lines.push('## Tech Stack');
57
57
  lines.push('');
58
58
  lines.push('- Next.js 16 with App Router');
@@ -142,6 +142,82 @@ function generateCursorrules() {
142
142
  lines.push('- Use `classnames` package - use `clsx` instead');
143
143
  lines.push('- Use inline styles for hover states - use Tailwind classes');
144
144
  lines.push('');
145
+ // File & Folder Authority section
146
+ lines.push('## File & Folder Authority');
147
+ lines.push('');
148
+ lines.push('These rules govern what AI is allowed and forbidden to do when creating, moving, or modifying files and folders.');
149
+ lines.push('');
150
+ lines.push('### Defined `/src` Structure');
151
+ lines.push('');
152
+ lines.push('```');
153
+ lines.push('src/');
154
+ lines.push('├── app/ # Routes, layouts, metadata (Next.js App Router)');
155
+ lines.push('├── blocks/ # Page-level content sections');
156
+ lines.push('├── blog/ # Blog content (archive content type)');
157
+ lines.push('├── components/ # Reusable UI primitives');
158
+ lines.push('├── hooks/ # Custom React hooks');
159
+ lines.push('├── styles/ # CSS, Tailwind, fonts');
160
+ lines.push('├── template/ # Template-level components');
161
+ lines.push('├── tools/ # Utility tools');
162
+ lines.push('├── types/ # TypeScript types');
163
+ lines.push('├── utils/ # Utility functions');
164
+ lines.push('└── state.ts # Global state');
165
+ lines.push('```');
166
+ lines.push('');
167
+ lines.push('### App Router Structure');
168
+ lines.push('');
169
+ lines.push('Routes must use Next.js route groups. At minimum, `(default)` must exist:');
170
+ lines.push('');
171
+ lines.push('```');
172
+ lines.push('src/app/');
173
+ lines.push('├── (default)/ # Required - default layout group');
174
+ lines.push('│ ├── layout.tsx');
175
+ lines.push('│ └── {routes}/');
176
+ lines.push('├── (hero)/ # Optional - hero layout variant');
177
+ lines.push('├── api/ # API routes (exception - no grouping)');
178
+ lines.push('├── layout.tsx # Root layout');
179
+ lines.push('└── metadata.tsx # Shared metadata');
180
+ lines.push('```');
181
+ lines.push('');
182
+ lines.push('- All page routes must be inside a route group (parentheses folder)');
183
+ lines.push('- Never create routes directly under `src/app/` (except `api/`, root files)');
184
+ lines.push('- New route groups are allowed freely when a new layout variant is needed');
185
+ lines.push('');
186
+ lines.push('### File Structure Rules');
187
+ lines.push('');
188
+ lines.push('**Blocks:**');
189
+ lines.push('- Always single files directly in `src/blocks/`');
190
+ lines.push('- Never create folders inside `src/blocks/`');
191
+ lines.push('- Example: `src/blocks/hero-1.tsx`, `src/blocks/testimonial-3.tsx`');
192
+ lines.push('');
193
+ lines.push('**Components:**');
194
+ lines.push('- Simple components: Single file in `src/components/`');
195
+ lines.push('- Complex components: Folder with `index.tsx`');
196
+ lines.push('- Use folders when component has multiple sub-files');
197
+ lines.push('');
198
+ lines.push('### DO - What AI IS Allowed To Do');
199
+ lines.push('');
200
+ lines.push('- Create files only inside existing Canon-defined zones');
201
+ lines.push('- Place new files in the zone that matches their architectural role');
202
+ lines.push('- Follow existing folder conventions within a zone');
203
+ lines.push('- Reuse existing folders when possible');
204
+ lines.push('- Create new route groups in `src/app/` when new layouts are needed');
205
+ lines.push('- Create new archive content folders (like `blog/`, `portfolio/`) in `/src`');
206
+ lines.push('- Create dotfiles/directories at project root (`.github/`, `.cursor/`, etc.)');
207
+ lines.push('- Ask for confirmation if the correct zone is ambiguous');
208
+ lines.push('');
209
+ lines.push('### DO NOT - What AI Is Forbidden To Do');
210
+ lines.push('');
211
+ lines.push('- Create new top-level directories (except dotfiles)');
212
+ lines.push('- Create new folders in `/src` (except archive content or route groups)');
213
+ lines.push('- Place files outside Canon-defined zones');
214
+ lines.push('- Mix responsibilities across zones (components importing blocks, etc.)');
215
+ lines.push('- Reorganize or move folders without explicit instruction');
216
+ lines.push('- Invent new organizational conventions');
217
+ lines.push('- Create placeholder or speculative files');
218
+ lines.push('- Import from `_scripts/` or `_data/` in runtime code');
219
+ lines.push('- Manually edit files in `_data/` (generated only)');
220
+ lines.push('');
145
221
  // Post-edit verification
146
222
  lines.push('## Post-Edit Verification');
147
223
  lines.push('');
@@ -167,4 +243,4 @@ export async function generate(options) {
167
243
  console.log(` ${patterns.length} patterns, ${guarantees.length} guarantees`);
168
244
  }
169
245
  }
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2dlbmVyYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFjLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTzFFOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsV0FBbUI7SUFDMUMsbURBQW1EO0lBQ25ELE1BQU0sYUFBYSxHQUFHO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLHFDQUFxQyxFQUFFLFdBQVcsQ0FBQztRQUM1RSwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO0tBQ3pELENBQUE7SUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQWU7SUFDdEMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBQ3pCLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQTtJQUV4Qix5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FB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UUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxNQUFNLGNBQWMsVUFBVSxDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUE7SUFDL0UsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IHZlcnNpb24sIHBhdHRlcm5zLCBjYXRlZ29yaWVzLCBndWFyYW50ZWVzIH0gZnJvbSAnLi4vLi4vaW5kZXguanMnXG5cbmludGVyZmFjZSBHZW5lcmF0ZU9wdGlvbnMge1xuICBvdXRwdXQ6IHN0cmluZ1xuICBmb3JtYXQ6ICdjdXJzb3JydWxlcycgfCAnbWFya2Rvd24nXG59XG5cbi8qKlxuICogUmVhZCBhIHBhdHRlcm4gbWFya2Rvd24gZmlsZSBhbmQgZXh0cmFjdCBzZWN0aW9uc1xuICovXG5mdW5jdGlvbiByZWFkUGF0dGVybkZpbGUocGF0dGVybkZpbGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAvLyBUcnkgdG8gZmluZCB0aGUgY2Fub24gcGFja2FnZSBwYXR0ZXJucyBkaXJlY3RvcnlcbiAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uJywgcGF0dGVybkZpbGUpLFxuICAgIC8vIEZhbGxiYWNrIGZvciBkZXZlbG9wbWVudFxuICAgIHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCAnLi4vLi4vLi4vJywgcGF0dGVybkZpbGUpLFxuICBdXG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogRXh0cmFjdCBleGFtcGxlcyBmcm9tIHBhdHRlcm4gbWFya2Rvd25cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV4YW1wbGVzKGNvbnRlbnQ6IHN0cmluZyk6IHsgZ29vZDogc3RyaW5nW107IGJhZDogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGdvb2Q6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgYmFkOiBzdHJpbmdbXSA9IFtdXG5cbiAgLy8gRmluZCBjb2RlIGJsb2NrcyBhZnRlciBcIiMjIyBHb29kXCIgb3IgXCIjIyMgQmFkXCIgaGVhZGVyc1xuICBjb25zdCBnb29kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC8jIyMgR29vZFxccypcXG5gYGBbXFxzXFxTXSo/YGBgL2cpXG4gIGNvbnN0IGJhZE1hdGNoID0gY29udGVudC5tYXRjaCgvIyMjIEJhZFxccypcXG5gYGBbXFxzXFxTXSo/YGBgL2cpXG5cbiAgaWYgKGdvb2RNYXRjaCkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZ29vZE1hdGNoKSB7XG4gICAgICBjb25zdCBjb2RlID0gbWF0Y2gucmVwbGFjZSgvIyMjIEdvb2RcXHMqXFxuLywgJycpLnRyaW0oKVxuICAgICAgZ29vZC5wdXNoKGNvZGUpXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhZE1hdGNoKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBiYWRNYXRjaCkge1xuICAgICAgY29uc3QgY29kZSA9IG1hdGNoLnJlcGxhY2UoLyMjIyBCYWRcXHMqXFxuLywgJycpLnRyaW0oKVxuICAgICAgYmFkLnB1c2goY29kZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBnb29kLCBiYWQgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIC5jdXJzb3JydWxlcyBjb250ZW50IGZyb20gQ2Fub25cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JydWxlcygpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEhlYWRlclxuICBsaW5lcy5wdXNoKGAjIEdhbGxvcCBDYW5vbiB2JHt2ZXJzaW9ufSAtIEFJIFJ1bGVzYClcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGZyb20gQGdhbGxvcC5zb2Z0d2FyZS9jYW5vbi4gRG8gbm90IGVkaXQgbWFudWFsbHkuJylcbiAgbGluZXMucHVzaCgnUmVnZW5lcmF0ZSB3aXRoOiBucG0gcnVuIGdlbmVyYXRlOmFpLXJ1bGVzJylcbiAgbGluZXMucHVzaCgnJylcblxuICAvLyBUZWNoIHN0YWNrIChmcm9tIHNwZWVkd2VsbCBjb250ZXh0KVxuICBsaW5lcy5wdXNoKCcjIyBUZWNoIFN0YWNrJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnLSBOZXh0LmpzIDE2IHdpdGggQXBwIFJvdXRlcicpXG4gIGxpbmVzLnB1c2goJy0gUmVhY3QgMTknKVxuICBsaW5lcy5wdXNoKCctIFR5cGVTY3JpcHQnKVxuICBsaW5lcy5wdXNoKCctIFRhaWx3aW5kIENTUyB2NCcpXG4gIGxpbmVzLnB1c2goJy0gY2xzeCBmb3IgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIEVuZm9yY2VkIHBhdHRlcm5zIChFU0xpbnQgcnVsZXMpXG4gIGxpbmVzLnB1c2goJyMjIEVuZm9yY2VkIFBhdHRlcm5zIChFU0xpbnQpJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnVGhlc2UgcGF0dGVybnMgYXJlIGVuZm9yY2VkIGJ5IGBAZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uL2VzbGludGAuIFZpb2xhdGlvbnMgd2lsbCBiZSBmbGFnZ2VkLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgY29uc3QgZW5mb3JjZWRQYXR0ZXJucyA9IHBhdHRlcm5zLmZpbHRlcihwID0+IHAuZW5mb3JjZW1lbnQgPT09ICdlc2xpbnQnICYmIHAucnVsZSlcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGVuZm9yY2VkUGF0dGVybnMpIHtcbiAgICBsaW5lcy5wdXNoKGAjIyMgJHtwYXR0ZXJuLmlkfTogJHtwYXR0ZXJuLnRpdGxlfWApXG4gICAgbGluZXMucHVzaCgnJylcbiAgICBsaW5lcy5wdXNoKHBhdHRlcm4uc3VtbWFyeSlcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2goYC0gKipFU0xpbnQgUnVsZToqKiBcXGAke3BhdHRlcm4ucnVsZX1cXGBgKVxuICAgIGxpbmVzLnB1c2goYC0gKipDYXRlZ29yeToqKiAke3BhdHRlcm4uY2F0ZWdvcnl9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuXG4gICAgLy8gVHJ5IHRvIHJlYWQgYW5kIGluY2x1ZGUgZXhhbXBsZXNcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZFBhdHRlcm5GaWxlKHBhdHRlcm4uZmlsZSlcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgY29uc3QgeyBnb29kLCBiYWQgfSA9IGV4dHJhY3RFeGFtcGxlcyhjb250ZW50KVxuICAgICAgaWYgKGJhZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyoqQmFkOioqJylcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgICAgbGluZXMucHVzaChiYWRbMF0pXG4gICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICB9XG4gICAgICBpZiAoZ29vZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyoqR29vZDoqKicpXG4gICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICAgIGxpbmVzLnB1c2goZ29vZFswXSlcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEb2N1bWVudGF0aW9uIHBhdHRlcm5zXG4gIGxpbmVzLnB1c2goJyMjIERvY3VtZW50YXRpb24gUGF0dGVybnMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGVuZm9yY2VkIGJ5IEVTTGludCBidXQgc2hvdWxkIGJlIGZvbGxvd2VkLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgY29uc3QgZG9jUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIocCA9PiBwLmVuZm9yY2VtZW50ID09PSAnZG9jdW1lbnRhdGlvbicpXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBkb2NQYXR0ZXJucykge1xuICAgIGxpbmVzLnB1c2goYCMjIyAke3BhdHRlcm4uaWR9OiAke3BhdHRlcm4udGl0bGV9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2gocGF0dGVybi5zdW1tYXJ5KVxuICAgIGxpbmVzLnB1c2goJycpXG4gIH1cblxuICAvLyBHdWFyYW50ZWVzXG4gIGxpbmVzLnB1c2goJyMjIENhbm9uIEd1YXJhbnRlZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdGb2xsb3dpbmcgdGhlc2UgcGF0dGVybnMgcHJvdmlkZXMgdGhlc2UgZ3VhcmFudGVlczonKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGZvciAoY29uc3QgZ3VhcmFudGVlIG9mIGd1YXJhbnRlZXMpIHtcbiAgICBsaW5lcy5wdXNoKGAtICoqJHtndWFyYW50ZWUubmFtZX0qKiAoJHtndWFyYW50ZWUuaWR9KTogUGF0dGVybnMgJHtndWFyYW50ZWUucGF0dGVybnMuam9pbignLCAnKX1gKVxuICB9XG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gUXVpY2sgcmVmZXJlbmNlIGZvciBjb21wb25lbnRzXG4gIGxpbmVzLnB1c2goJyMjIENvbXBvbmVudCBRdWljayBSZWZlcmVuY2UnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCcjIyMgVHlwb2dyYXBoeScpXG4gIGxpbmVzLnB1c2goJy0gYEhlYWRpbmdgIC0gcHJvcHM6IGBhc2AsIGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgLCBgZm9udFdlaWdodGAsIGB0ZXh0QWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgUGFyYWdyYXBoYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGxpbmVIZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gIGxpbmVzLnB1c2goJy0gYFNwYW5gIC0gcHJvcHM6IGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgIChpbmxpbmUgdGV4dCwgbWItMCBkZWZhdWx0KScpXG4gIGxpbmVzLnB1c2goJy0gYExhYmVsYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGZvbnRXZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBMYXlvdXQnKVxuICBsaW5lcy5wdXNoKCctIGBTZWN0aW9uYCAtIHNlbWFudGljIHNlY3Rpb24gd3JhcHBlcicpXG4gIGxpbmVzLnB1c2goJy0gYENvbHVtbnNgIC0gZ3JpZCBsYXlvdXQsIHByb3BzOiBgY29sc2AsIGBnYXBgLCBgYWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgQ29sdW1uYCAtIGNvbHVtbiBjaGlsZCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBJbnRlcmFjdGl2ZScpXG4gIGxpbmVzLnB1c2goJy0gYEJ1dHRvbmAgLSBwcm9wczogYGhyZWZgLCBgdmFyaWFudGAsIGBpY29uYCwgYGljb25QbGFjZW1lbnRgLCBgbWFyZ2luYCcpXG4gIGxpbmVzLnB1c2goJy0gYEljb25gIC0gSWNvbmlmeSBpY29uIHdyYXBwZXInKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIERvIE5PVCBzZWN0aW9uXG4gIGxpbmVzLnB1c2goJyMjIERvIE5PVCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGBcXCd1c2UgY2xpZW50XFwnYCBpbiBibG9ja3MgLSBleHRyYWN0IHRvIGNvbXBvbmVudHMnKVxuICBsaW5lcy5wdXNoKCctIFVzZSByYXcgYDxwPmAgb3IgYDxzcGFuPmAgLSB1c2UgUGFyYWdyYXBoL1NwYW4gY29tcG9uZW50cycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGNsYXNzTmFtZSBmb3IgbWFyZ2luL2NvbG9yL2ZvbnRTaXplIHdoZW4gY29tcG9uZW50IGhhcyBwcm9wcycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIENvbnRhaW5lciBpbnNpZGUgU2VjdGlvbiAtIFNlY3Rpb24gYWxyZWFkeSBwcm92aWRlcyBjb250YWlubWVudCcpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGBjbGFzc25hbWVzYCBwYWNrYWdlIC0gdXNlIGBjbHN4YCBpbnN0ZWFkJylcbiAgbGluZXMucHVzaCgnLSBVc2UgaW5saW5lIHN0eWxlcyBmb3IgaG92ZXIgc3RhdGVzIC0gdXNlIFRhaWx3aW5kIGNsYXNzZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIFBvc3QtZWRpdCB2ZXJpZmljYXRpb25cbiAgbGluZXMucHVzaCgnIyMgUG9zdC1FZGl0IFZlcmlmaWNhdGlvbicpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ0FmdGVyIGVkaXRpbmcgZmlsZXM6JylcbiAgbGluZXMucHVzaCgnMS4gUnVuIGBucG0gcnVuIGxpbnRgIHRvIGNoZWNrIGZvciBlcnJvcnMnKVxuICBsaW5lcy5wdXNoKCcyLiBGaXggYW55IHZpb2xhdGlvbnMgYmVmb3JlIGNvbW1pdHRpbmcnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdOb3RlOiBPbmx5IGxpbnQgZmlsZXMgeW91IGVkaXRlZCwgbm90IHRoZSBlbnRpcmUgY29kZWJhc2UuJylcbiAgbGluZXMucHVzaCgnJylcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlKG9wdGlvbnM6IEdlbmVyYXRlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JydWxlcygpXG5cbiAgaWYgKG9wdGlvbnMub3V0cHV0ID09PSAnLScpIHtcbiAgICAvLyBPdXRwdXQgdG8gc3Rkb3V0XG4gICAgY29uc29sZS5sb2coY29udGVudClcbiAgfSBlbHNlIHtcbiAgICAvLyBXcml0ZSB0byBmaWxlXG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLm91dHB1dClcbiAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGNvbnRlbnQsICd1dGYtOCcpXG4gICAgY29uc29sZS5sb2coYOKckyBHZW5lcmF0ZWQgJHtvcHRpb25zLm91dHB1dH0gZnJvbSBDYW5vbiB2JHt2ZXJzaW9ufWApXG4gICAgY29uc29sZS5sb2coYCAgJHtwYXR0ZXJucy5sZW5ndGh9IHBhdHRlcm5zLCAke2d1YXJhbnRlZXMubGVuZ3RofSBndWFyYW50ZWVzYClcbiAgfVxufVxuIl19
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2dlbmVyYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFjLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTzFFOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsV0FBbUI7SUFDMUMsbURBQW1EO0lBQ25ELE1BQU0sYUFBYSxHQUFHO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLHFDQUFxQyxFQUFFLFdBQVcsQ0FBQztRQUM1RSwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO0tBQ3pELENBQUE7SUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQWU7SUFDdEMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBQ3pCLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQTtJQUV4Qix5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FB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LENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3pCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLFFBQVEsQ0FBQyxPQUF3QjtJQUNyRCxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsRUFBRSxDQUFBO0lBRXJDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUMzQixtQkFBbUI7UUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN0QixDQUFDO1NBQU0sQ0FBQztRQUNOLGdCQUFnQjtRQUNoQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDOUQsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxPQUFPLENBQUMsTUFBTSxnQkFBZ0IsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sY0FBYyxVQUFVLENBQUMsTUFBTSxhQUFhLENBQUMsQ0FBQTtJQUMvRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJ1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgdmVyc2lvbiwgcGF0dGVybnMsIGNhdGVnb3JpZXMsIGd1YXJhbnRlZXMgfSBmcm9tICcuLi8uLi9pbmRleC5qcydcblxuaW50ZXJmYWNlIEdlbmVyYXRlT3B0aW9ucyB7XG4gIG91dHB1dDogc3RyaW5nXG4gIGZvcm1hdDogJ2N1cnNvcnJ1bGVzJyB8ICdtYXJrZG93bidcbn1cblxuLyoqXG4gKiBSZWFkIGEgcGF0dGVybiBtYXJrZG93biBmaWxlIGFuZCBleHRyYWN0IHNlY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHJlYWRQYXR0ZXJuRmlsZShwYXR0ZXJuRmlsZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIC8vIFRyeSB0byBmaW5kIHRoZSBjYW5vbiBwYWNrYWdlIHBhdHRlcm5zIGRpcmVjdG9yeVxuICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BnYWxsb3Auc29mdHdhcmUvY2Fub24nLCBwYXR0ZXJuRmlsZSksXG4gICAgLy8gRmFsbGJhY2sgZm9yIGRldmVsb3BtZW50XG4gICAgcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsICcuLi8uLi8uLi8nLCBwYXR0ZXJuRmlsZSksXG4gIF1cblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGV4YW1wbGVzIGZyb20gcGF0dGVybiBtYXJrZG93blxuICovXG5mdW5jdGlvbiBleHRyYWN0RXhhbXBsZXMoY29udGVudDogc3RyaW5nKTogeyBnb29kOiBzdHJpbmdbXTsgYmFkOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgZ29vZDogc3RyaW5nW10gPSBbXVxuICBjb25zdCBiYWQ6IHN0cmluZ1tdID0gW11cblxuICAvLyBGaW5kIGNvZGUgYmxvY2tzIGFmdGVyIFwiIyMjIEdvb2RcIiBvciBcIiMjIyBCYWRcIiBoZWFkZXJzXG4gIGNvbnN0IGdvb2RNYXRjaCA9IGNvbnRlbnQubWF0Y2goLyMjIyBHb29kXFxzKlxcbmBgYFtcXHNcXFNdKj9gYGAvZylcbiAgY29uc3QgYmFkTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC8jIyMgQmFkXFxzKlxcbmBgYFtcXHNcXFNdKj9gYGAvZylcblxuICBpZiAoZ29vZE1hdGNoKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBnb29kTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBtYXRjaC5yZXBsYWNlKC8jIyMgR29vZFxccypcXG4vLCAnJykudHJpbSgpXG4gICAgICBnb29kLnB1c2goY29kZSlcbiAgICB9XG4gIH1cblxuICBpZiAoYmFkTWF0Y2gpIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGJhZE1hdGNoKSB7XG4gICAgICBjb25zdCBjb2RlID0gbWF0Y2gucmVwbGFjZSgvIyMjIEJhZFxccypcXG4vLCAnJykudHJpbSgpXG4gICAgICBiYWQucHVzaChjb2RlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGdvb2QsIGJhZCB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgLmN1cnNvcnJ1bGVzIGNvbnRlbnQgZnJvbSBDYW5vblxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvcnJ1bGVzKCk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgLy8gSGVhZGVyXG4gIGxpbmVzLnB1c2goYCMgR2FsbG9wIENhbm9uIHYke3ZlcnNpb259IC0gQUkgUnVsZXNgKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBAZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uLiBEbyBub3QgZWRpdCBtYW51YWxseS4nKVxuICBsaW5lcy5wdXNoKCdSZWdlbmVyYXRlIHdpdGg6IG5wbSBydW4gZ2VuZXJhdGU6YWktcnVsZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIFRlY2ggc3RhY2sgKENhbm9uLWNvbXBhdGlibGUgdGVtcGxhdGVzKVxuICBsaW5lcy5wdXNoKCcjIyBUZWNoIFN0YWNrJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnLSBOZXh0LmpzIDE2IHdpdGggQXBwIFJvdXRlcicpXG4gIGxpbmVzLnB1c2goJy0gUmVhY3QgMTknKVxuICBsaW5lcy5wdXNoKCctIFR5cGVTY3JpcHQnKVxuICBsaW5lcy5wdXNoKCctIFRhaWx3aW5kIENTUyB2NCcpXG4gIGxpbmVzLnB1c2goJy0gY2xzeCBmb3IgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIEVuZm9yY2VkIHBhdHRlcm5zIChFU0xpbnQgcnVsZXMpXG4gIGxpbmVzLnB1c2goJyMjIEVuZm9yY2VkIFBhdHRlcm5zIChFU0xpbnQpJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnVGhlc2UgcGF0dGVybnMgYXJlIGVuZm9yY2VkIGJ5IGBAZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uL2VzbGludGAuIFZpb2xhdGlvbnMgd2lsbCBiZSBmbGFnZ2VkLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgY29uc3QgZW5mb3JjZWRQYXR0ZXJucyA9IHBhdHRlcm5zLmZpbHRlcihwID0+IHAuZW5mb3JjZW1lbnQgPT09ICdlc2xpbnQnICYmIHAucnVsZSlcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGVuZm9yY2VkUGF0dGVybnMpIHtcbiAgICBsaW5lcy5wdXNoKGAjIyMgJHtwYXR0ZXJuLmlkfTogJHtwYXR0ZXJuLnRpdGxlfWApXG4gICAgbGluZXMucHVzaCgnJylcbiAgICBsaW5lcy5wdXNoKHBhdHRlcm4uc3VtbWFyeSlcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2goYC0gKipFU0xpbnQgUnVsZToqKiBcXGAke3BhdHRlcm4ucnVsZX1cXGBgKVxuICAgIGxpbmVzLnB1c2goYC0gKipDYXRlZ29yeToqKiAke3BhdHRlcm4uY2F0ZWdvcnl9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuXG4gICAgLy8gVHJ5IHRvIHJlYWQgYW5kIGluY2x1ZGUgZXhhbXBsZXNcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZFBhdHRlcm5GaWxlKHBhdHRlcm4uZmlsZSlcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgY29uc3QgeyBnb29kLCBiYWQgfSA9IGV4dHJhY3RFeGFtcGxlcyhjb250ZW50KVxuICAgICAgaWYgKGJhZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyoqQmFkOioqJylcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgICAgbGluZXMucHVzaChiYWRbMF0pXG4gICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICB9XG4gICAgICBpZiAoZ29vZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyoqR29vZDoqKicpXG4gICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICAgIGxpbmVzLnB1c2goZ29vZFswXSlcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEb2N1bWVudGF0aW9uIHBhdHRlcm5zXG4gIGxpbmVzLnB1c2goJyMjIERvY3VtZW50YXRpb24gUGF0dGVybnMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGVuZm9yY2VkIGJ5IEVTTGludCBidXQgc2hvdWxkIGJlIGZvbGxvd2VkLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgY29uc3QgZG9jUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIocCA9PiBwLmVuZm9yY2VtZW50ID09PSAnZG9jdW1lbnRhdGlvbicpXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBkb2NQYXR0ZXJucykge1xuICAgIGxpbmVzLnB1c2goYCMjIyAke3BhdHRlcm4uaWR9OiAke3BhdHRlcm4udGl0bGV9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2gocGF0dGVybi5zdW1tYXJ5KVxuICAgIGxpbmVzLnB1c2goJycpXG4gIH1cblxuICAvLyBHdWFyYW50ZWVzXG4gIGxpbmVzLnB1c2goJyMjIENhbm9uIEd1YXJhbnRlZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdGb2xsb3dpbmcgdGhlc2UgcGF0dGVybnMgcHJvdmlkZXMgdGhlc2UgZ3VhcmFudGVlczonKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGZvciAoY29uc3QgZ3VhcmFudGVlIG9mIGd1YXJhbnRlZXMpIHtcbiAgICBsaW5lcy5wdXNoKGAtICoqJHtndWFyYW50ZWUubmFtZX0qKiAoJHtndWFyYW50ZWUuaWR9KTogUGF0dGVybnMgJHtndWFyYW50ZWUucGF0dGVybnMuam9pbignLCAnKX1gKVxuICB9XG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gUXVpY2sgcmVmZXJlbmNlIGZvciBjb21wb25lbnRzXG4gIGxpbmVzLnB1c2goJyMjIENvbXBvbmVudCBRdWljayBSZWZlcmVuY2UnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCcjIyMgVHlwb2dyYXBoeScpXG4gIGxpbmVzLnB1c2goJy0gYEhlYWRpbmdgIC0gcHJvcHM6IGBhc2AsIGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgLCBgZm9udFdlaWdodGAsIGB0ZXh0QWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgUGFyYWdyYXBoYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGxpbmVIZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gIGxpbmVzLnB1c2goJy0gYFNwYW5gIC0gcHJvcHM6IGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgIChpbmxpbmUgdGV4dCwgbWItMCBkZWZhdWx0KScpXG4gIGxpbmVzLnB1c2goJy0gYExhYmVsYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGZvbnRXZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBMYXlvdXQnKVxuICBsaW5lcy5wdXNoKCctIGBTZWN0aW9uYCAtIHNlbWFudGljIHNlY3Rpb24gd3JhcHBlcicpXG4gIGxpbmVzLnB1c2goJy0gYENvbHVtbnNgIC0gZ3JpZCBsYXlvdXQsIHByb3BzOiBgY29sc2AsIGBnYXBgLCBgYWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgQ29sdW1uYCAtIGNvbHVtbiBjaGlsZCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBJbnRlcmFjdGl2ZScpXG4gIGxpbmVzLnB1c2goJy0gYEJ1dHRvbmAgLSBwcm9wczogYGhyZWZgLCBgdmFyaWFudGAsIGBpY29uYCwgYGljb25QbGFjZW1lbnRgLCBgbWFyZ2luYCcpXG4gIGxpbmVzLnB1c2goJy0gYEljb25gIC0gSWNvbmlmeSBpY29uIHdyYXBwZXInKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIERvIE5PVCBzZWN0aW9uXG4gIGxpbmVzLnB1c2goJyMjIERvIE5PVCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGBcXCd1c2UgY2xpZW50XFwnYCBpbiBibG9ja3MgLSBleHRyYWN0IHRvIGNvbXBvbmVudHMnKVxuICBsaW5lcy5wdXNoKCctIFVzZSByYXcgYDxwPmAgb3IgYDxzcGFuPmAgLSB1c2UgUGFyYWdyYXBoL1NwYW4gY29tcG9uZW50cycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGNsYXNzTmFtZSBmb3IgbWFyZ2luL2NvbG9yL2ZvbnRTaXplIHdoZW4gY29tcG9uZW50IGhhcyBwcm9wcycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIENvbnRhaW5lciBpbnNpZGUgU2VjdGlvbiAtIFNlY3Rpb24gYWxyZWFkeSBwcm92aWRlcyBjb250YWlubWVudCcpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGBjbGFzc25hbWVzYCBwYWNrYWdlIC0gdXNlIGBjbHN4YCBpbnN0ZWFkJylcbiAgbGluZXMucHVzaCgnLSBVc2UgaW5saW5lIHN0eWxlcyBmb3IgaG92ZXIgc3RhdGVzIC0gdXNlIFRhaWx3aW5kIGNsYXNzZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIEZpbGUgJiBGb2xkZXIgQXV0aG9yaXR5IHNlY3Rpb25cbiAgbGluZXMucHVzaCgnIyMgRmlsZSAmIEZvbGRlciBBdXRob3JpdHknKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdUaGVzZSBydWxlcyBnb3Zlcm4gd2hhdCBBSSBpcyBhbGxvd2VkIGFuZCBmb3JiaWRkZW4gdG8gZG8gd2hlbiBjcmVhdGluZywgbW92aW5nLCBvciBtb2RpZnlpbmcgZmlsZXMgYW5kIGZvbGRlcnMuJylcbiAgbGluZXMucHVzaCgnJylcblxuICBsaW5lcy5wdXNoKCcjIyMgRGVmaW5lZCBgL3NyY2AgU3RydWN0dXJlJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnYGBgJylcbiAgbGluZXMucHVzaCgnc3JjLycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCBhcHAvICAgICAgICAgICMgUm91dGVzLCBsYXlvdXRzLCBtZXRhZGF0YSAoTmV4dC5qcyBBcHAgUm91dGVyKScpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCBibG9ja3MvICAgICAgICMgUGFnZS1sZXZlbCBjb250ZW50IHNlY3Rpb25zJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIGJsb2cvICAgICAgICAgIyBCbG9nIGNvbnRlbnQgKGFyY2hpdmUgY29udGVudCB0eXBlKScpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCBjb21wb25lbnRzLyAgICMgUmV1c2FibGUgVUkgcHJpbWl0aXZlcycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCBob29rcy8gICAgICAgICMgQ3VzdG9tIFJlYWN0IGhvb2tzJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIHN0eWxlcy8gICAgICAgIyBDU1MsIFRhaWx3aW5kLCBmb250cycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCB0ZW1wbGF0ZS8gICAgICMgVGVtcGxhdGUtbGV2ZWwgY29tcG9uZW50cycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCB0b29scy8gICAgICAgICMgVXRpbGl0eSB0b29scycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCB0eXBlcy8gICAgICAgICMgVHlwZVNjcmlwdCB0eXBlcycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCB1dGlscy8gICAgICAgICMgVXRpbGl0eSBmdW5jdGlvbnMnKVxuICBsaW5lcy5wdXNoKCfilJTilIDilIAgc3RhdGUudHMgICAgICAjIEdsb2JhbCBzdGF0ZScpXG4gIGxpbmVzLnB1c2goJ2BgYCcpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgbGluZXMucHVzaCgnIyMjIEFwcCBSb3V0ZXIgU3RydWN0dXJlJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnUm91dGVzIG11c3QgdXNlIE5leHQuanMgcm91dGUgZ3JvdXBzLiBBdCBtaW5pbXVtLCBgKGRlZmF1bHQpYCBtdXN0IGV4aXN0OicpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ2BgYCcpXG4gIGxpbmVzLnB1c2goJ3NyYy9hcHAvJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIChkZWZhdWx0KS8gICAgICAgICMgUmVxdWlyZWQgLSBkZWZhdWx0IGxheW91dCBncm91cCcpXG4gIGxpbmVzLnB1c2goJ+KUgiAgIOKUnOKUgOKUgCBsYXlvdXQudHN4JylcbiAgbGluZXMucHVzaCgn4pSCICAg4pSU4pSA4pSAIHtyb3V0ZXN9LycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCAoaGVybykvICAgICAgICAgICAjIE9wdGlvbmFsIC0gaGVybyBsYXlvdXQgdmFyaWFudCcpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCBhcGkvICAgICAgICAgICAgICAjIEFQSSByb3V0ZXMgKGV4Y2VwdGlvbiAtIG5vIGdyb3VwaW5nKScpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCBsYXlvdXQudHN4ICAgICAgICAjIFJvb3QgbGF5b3V0JylcbiAgbGluZXMucHVzaCgn4pSU4pSA4pSAIG1ldGFkYXRhLnRzeCAgICAgICMgU2hhcmVkIG1ldGFkYXRhJylcbiAgbGluZXMucHVzaCgnYGBgJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnLSBBbGwgcGFnZSByb3V0ZXMgbXVzdCBiZSBpbnNpZGUgYSByb3V0ZSBncm91cCAocGFyZW50aGVzZXMgZm9sZGVyKScpXG4gIGxpbmVzLnB1c2goJy0gTmV2ZXIgY3JlYXRlIHJvdXRlcyBkaXJlY3RseSB1bmRlciBgc3JjL2FwcC9gIChleGNlcHQgYGFwaS9gLCByb290IGZpbGVzKScpXG4gIGxpbmVzLnB1c2goJy0gTmV3IHJvdXRlIGdyb3VwcyBhcmUgYWxsb3dlZCBmcmVlbHkgd2hlbiBhIG5ldyBsYXlvdXQgdmFyaWFudCBpcyBuZWVkZWQnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGxpbmVzLnB1c2goJyMjIyBGaWxlIFN0cnVjdHVyZSBSdWxlcycpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyoqQmxvY2tzOioqJylcbiAgbGluZXMucHVzaCgnLSBBbHdheXMgc2luZ2xlIGZpbGVzIGRpcmVjdGx5IGluIGBzcmMvYmxvY2tzL2AnKVxuICBsaW5lcy5wdXNoKCctIE5ldmVyIGNyZWF0ZSBmb2xkZXJzIGluc2lkZSBgc3JjL2Jsb2Nrcy9gJylcbiAgbGluZXMucHVzaCgnLSBFeGFtcGxlOiBgc3JjL2Jsb2Nrcy9oZXJvLTEudHN4YCwgYHNyYy9ibG9ja3MvdGVzdGltb25pYWwtMy50c3hgJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnKipDb21wb25lbnRzOioqJylcbiAgbGluZXMucHVzaCgnLSBTaW1wbGUgY29tcG9uZW50czogU2luZ2xlIGZpbGUgaW4gYHNyYy9jb21wb25lbnRzL2AnKVxuICBsaW5lcy5wdXNoKCctIENvbXBsZXggY29tcG9uZW50czogRm9sZGVyIHdpdGggYGluZGV4LnRzeGAnKVxuICBsaW5lcy5wdXNoKCctIFVzZSBmb2xkZXJzIHdoZW4gY29tcG9uZW50IGhhcyBtdWx0aXBsZSBzdWItZmlsZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGxpbmVzLnB1c2goJyMjIyBETyAtIFdoYXQgQUkgSVMgQWxsb3dlZCBUbyBEbycpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJy0gQ3JlYXRlIGZpbGVzIG9ubHkgaW5zaWRlIGV4aXN0aW5nIENhbm9uLWRlZmluZWQgem9uZXMnKVxuICBsaW5lcy5wdXNoKCctIFBsYWNlIG5ldyBmaWxlcyBpbiB0aGUgem9uZSB0aGF0IG1hdGNoZXMgdGhlaXIgYXJjaGl0ZWN0dXJhbCByb2xlJylcbiAgbGluZXMucHVzaCgnLSBGb2xsb3cgZXhpc3RpbmcgZm9sZGVyIGNvbnZlbnRpb25zIHdpdGhpbiBhIHpvbmUnKVxuICBsaW5lcy5wdXNoKCctIFJldXNlIGV4aXN0aW5nIGZvbGRlcnMgd2hlbiBwb3NzaWJsZScpXG4gIGxpbmVzLnB1c2goJy0gQ3JlYXRlIG5ldyByb3V0ZSBncm91cHMgaW4gYHNyYy9hcHAvYCB3aGVuIG5ldyBsYXlvdXRzIGFyZSBuZWVkZWQnKVxuICBsaW5lcy5wdXNoKCctIENyZWF0ZSBuZXcgYXJjaGl2ZSBjb250ZW50IGZvbGRlcnMgKGxpa2UgYGJsb2cvYCwgYHBvcnRmb2xpby9gKSBpbiBgL3NyY2AnKVxuICBsaW5lcy5wdXNoKCctIENyZWF0ZSBkb3RmaWxlcy9kaXJlY3RvcmllcyBhdCBwcm9qZWN0IHJvb3QgKGAuZ2l0aHViL2AsIGAuY3Vyc29yL2AsIGV0Yy4pJylcbiAgbGluZXMucHVzaCgnLSBBc2sgZm9yIGNvbmZpcm1hdGlvbiBpZiB0aGUgY29ycmVjdCB6b25lIGlzIGFtYmlndW91cycpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgbGluZXMucHVzaCgnIyMjIERPIE5PVCAtIFdoYXQgQUkgSXMgRm9yYmlkZGVuIFRvIERvJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnLSBDcmVhdGUgbmV3IHRvcC1sZXZlbCBkaXJlY3RvcmllcyAoZXhjZXB0IGRvdGZpbGVzKScpXG4gIGxpbmVzLnB1c2goJy0gQ3JlYXRlIG5ldyBmb2xkZXJzIGluIGAvc3JjYCAoZXhjZXB0IGFyY2hpdmUgY29udGVudCBvciByb3V0ZSBncm91cHMpJylcbiAgbGluZXMucHVzaCgnLSBQbGFjZSBmaWxlcyBvdXRzaWRlIENhbm9uLWRlZmluZWQgem9uZXMnKVxuICBsaW5lcy5wdXNoKCctIE1peCByZXNwb25zaWJpbGl0aWVzIGFjcm9zcyB6b25lcyAoY29tcG9uZW50cyBpbXBvcnRpbmcgYmxvY2tzLCBldGMuKScpXG4gIGxpbmVzLnB1c2goJy0gUmVvcmdhbml6ZSBvciBtb3ZlIGZvbGRlcnMgd2l0aG91dCBleHBsaWNpdCBpbnN0cnVjdGlvbicpXG4gIGxpbmVzLnB1c2goJy0gSW52ZW50IG5ldyBvcmdhbml6YXRpb25hbCBjb252ZW50aW9ucycpXG4gIGxpbmVzLnB1c2goJy0gQ3JlYXRlIHBsYWNlaG9sZGVyIG9yIHNwZWN1bGF0aXZlIGZpbGVzJylcbiAgbGluZXMucHVzaCgnLSBJbXBvcnQgZnJvbSBgX3NjcmlwdHMvYCBvciBgX2RhdGEvYCBpbiBydW50aW1lIGNvZGUnKVxuICBsaW5lcy5wdXNoKCctIE1hbnVhbGx5IGVkaXQgZmlsZXMgaW4gYF9kYXRhL2AgKGdlbmVyYXRlZCBvbmx5KScpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gUG9zdC1lZGl0IHZlcmlmaWNhdGlvblxuICBsaW5lcy5wdXNoKCcjIyBQb3N0LUVkaXQgVmVyaWZpY2F0aW9uJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnQWZ0ZXIgZWRpdGluZyBmaWxlczonKVxuICBsaW5lcy5wdXNoKCcxLiBSdW4gYG5wbSBydW4gbGludGAgdG8gY2hlY2sgZm9yIGVycm9ycycpXG4gIGxpbmVzLnB1c2goJzIuIEZpeCBhbnkgdmlvbGF0aW9ucyBiZWZvcmUgY29tbWl0dGluZycpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ05vdGU6IE9ubHkgbGludCBmaWxlcyB5b3UgZWRpdGVkLCBub3QgdGhlIGVudGlyZSBjb2RlYmFzZS4nKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGUob3B0aW9uczogR2VuZXJhdGVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvcnJ1bGVzKClcblxuICBpZiAob3B0aW9ucy5vdXRwdXQgPT09ICctJykge1xuICAgIC8vIE91dHB1dCB0byBzdGRvdXRcbiAgICBjb25zb2xlLmxvZyhjb250ZW50KVxuICB9IGVsc2Uge1xuICAgIC8vIFdyaXRlIHRvIGZpbGVcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIG9wdGlvbnMub3V0cHV0KVxuICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgY29udGVudCwgJ3V0Zi04JylcbiAgICBjb25zb2xlLmxvZyhg4pyTIEdlbmVyYXRlZCAke29wdGlvbnMub3V0cHV0fSBmcm9tIENhbm9uIHYke3ZlcnNpb259YClcbiAgICBjb25zb2xlLmxvZyhgICAke3BhdHRlcm5zLmxlbmd0aH0gcGF0dGVybnMsICR7Z3VhcmFudGVlcy5sZW5ndGh9IGd1YXJhbnRlZXNgKVxuICB9XG59XG4iXX0=
@@ -0,0 +1,9 @@
1
+ interface ValidateOptions {
2
+ strict: boolean;
3
+ json: boolean;
4
+ }
5
+ /**
6
+ * Validate project structure
7
+ */
8
+ export declare function validate(projectPath: string, options: ValidateOptions): Promise<void>;
9
+ export {};
@@ -0,0 +1,168 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ // Allowed top-level directories (non-dotfiles)
4
+ const ALLOWED_TOP_LEVEL = [
5
+ 'src',
6
+ 'public',
7
+ '_scripts',
8
+ '_data',
9
+ '_docs',
10
+ 'node_modules',
11
+ ];
12
+ // Allowed folders directly under /src
13
+ const ALLOWED_SRC_FOLDERS = [
14
+ 'app',
15
+ 'blocks',
16
+ 'blog',
17
+ 'components',
18
+ 'hooks',
19
+ 'styles',
20
+ 'template',
21
+ 'tools',
22
+ 'types',
23
+ 'utils',
24
+ ];
25
+ // Files allowed at top level
26
+ const ALLOWED_TOP_LEVEL_FILES = [
27
+ 'package.json',
28
+ 'package-lock.json',
29
+ 'tsconfig.json',
30
+ 'tsconfig.tsbuildinfo',
31
+ 'next.config.mjs',
32
+ 'next.config.js',
33
+ 'next-env.d.ts',
34
+ 'eslint.config.mjs',
35
+ 'eslint.config.js',
36
+ '.eslintrc.js',
37
+ '.eslintrc.json',
38
+ 'postcss.config.js',
39
+ 'tailwind.config.js',
40
+ 'tailwind.config.ts',
41
+ 'README.md',
42
+ 'LICENSE',
43
+ 'CHANGELOG.md',
44
+ '.gitignore',
45
+ '.cursorrules',
46
+ ];
47
+ /**
48
+ * Check if a path is a dotfile or dotfolder
49
+ */
50
+ function isDotfile(name) {
51
+ return name.startsWith('.');
52
+ }
53
+ /**
54
+ * Check if a path is an archive content folder (allowed new folders in /src)
55
+ */
56
+ function isArchiveContentFolder(name) {
57
+ // Archive folders typically have plural names for content collections
58
+ // We allow any folder that could reasonably be archive content
59
+ // This is a heuristic - we check if it looks like a content collection
60
+ return !ALLOWED_SRC_FOLDERS.includes(name);
61
+ }
62
+ /**
63
+ * Validate project structure
64
+ */
65
+ export async function validate(projectPath, options) {
66
+ const violations = [];
67
+ const absolutePath = path.resolve(process.cwd(), projectPath);
68
+ if (!fs.existsSync(absolutePath)) {
69
+ console.error(`Path does not exist: ${projectPath}`);
70
+ process.exit(1);
71
+ }
72
+ // Check top-level directories
73
+ const topLevelItems = fs.readdirSync(absolutePath);
74
+ for (const item of topLevelItems) {
75
+ const itemPath = path.join(absolutePath, item);
76
+ const stat = fs.statSync(itemPath);
77
+ if (stat.isDirectory()) {
78
+ // Dotfolders are exempt
79
+ if (isDotfile(item)) {
80
+ continue;
81
+ }
82
+ // Check if it's an allowed top-level directory
83
+ if (!ALLOWED_TOP_LEVEL.includes(item)) {
84
+ violations.push({
85
+ type: 'invalid-top-level',
86
+ path: item,
87
+ message: `Invalid top-level directory: ${item}. Allowed: ${ALLOWED_TOP_LEVEL.join(', ')} (dotfolders exempt)`,
88
+ });
89
+ }
90
+ }
91
+ else {
92
+ // It's a file - check if it's allowed at top level
93
+ if (!isDotfile(item) && !ALLOWED_TOP_LEVEL_FILES.includes(item)) {
94
+ // Allow common config file patterns
95
+ const isConfigFile = item.endsWith('.config.js') ||
96
+ item.endsWith('.config.mjs') ||
97
+ item.endsWith('.config.ts') ||
98
+ item.endsWith('.json') ||
99
+ item.endsWith('.md') ||
100
+ item.endsWith('.sh');
101
+ if (!isConfigFile) {
102
+ violations.push({
103
+ type: 'orphan-file',
104
+ path: item,
105
+ message: `Orphan file at project root: ${item}. Files should be in defined zones.`,
106
+ });
107
+ }
108
+ }
109
+ }
110
+ }
111
+ // Check /src folder structure
112
+ const srcPath = path.join(absolutePath, 'src');
113
+ if (fs.existsSync(srcPath)) {
114
+ const srcItems = fs.readdirSync(srcPath);
115
+ for (const item of srcItems) {
116
+ const itemPath = path.join(srcPath, item);
117
+ const stat = fs.statSync(itemPath);
118
+ if (stat.isDirectory()) {
119
+ // Check if it's an allowed /src folder
120
+ if (!ALLOWED_SRC_FOLDERS.includes(item) &&
121
+ !isArchiveContentFolder(item)) {
122
+ violations.push({
123
+ type: 'invalid-src-folder',
124
+ path: `src/${item}`,
125
+ message: `Invalid folder in /src: ${item}. Allowed: ${ALLOWED_SRC_FOLDERS.join(', ')} or archive content folders`,
126
+ });
127
+ }
128
+ }
129
+ }
130
+ // Check that src/app has route groups
131
+ const appPath = path.join(srcPath, 'app');
132
+ if (fs.existsSync(appPath)) {
133
+ const appItems = fs.readdirSync(appPath);
134
+ const hasDefaultGroup = appItems.some((item) => item === '(default)' || item.startsWith('('));
135
+ if (!hasDefaultGroup) {
136
+ violations.push({
137
+ type: 'invalid-src-folder',
138
+ path: 'src/app',
139
+ message: 'src/app should have at least one route group folder (e.g., (default)/)',
140
+ });
141
+ }
142
+ }
143
+ }
144
+ // Output results
145
+ if (options.json) {
146
+ console.log(JSON.stringify({
147
+ valid: violations.length === 0,
148
+ violations,
149
+ }, null, 2));
150
+ }
151
+ else {
152
+ if (violations.length === 0) {
153
+ console.log('✓ Project structure is valid');
154
+ }
155
+ else {
156
+ console.log(`Found ${violations.length} violation(s):\n`);
157
+ for (const v of violations) {
158
+ console.log(` ✗ ${v.message}`);
159
+ }
160
+ console.log('');
161
+ }
162
+ }
163
+ // Exit with error code if strict mode and violations found
164
+ if (options.strict && violations.length > 0) {
165
+ process.exit(1);
166
+ }
167
+ }
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBYTVCLCtDQUErQztBQUMvQyxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLEtBQUs7SUFDTCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsY0FBYztDQUNmLENBQUE7QUFFRCxzQ0FBc0M7QUFDdEMsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixLQUFLO0lBQ0wsUUFBUTtJQUNSLE1BQU07SUFDTixZQUFZO0lBQ1osT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0NBQ1IsQ0FBQTtBQUVELDZCQUE2QjtBQUM3QixNQUFNLHVCQUF1QixHQUFHO0lBQzlCLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLHNCQUFzQjtJQUN0QixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixvQkFBb0I7SUFDcEIsV0FBVztJQUNYLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLGNBQWM7Q0FDZixDQUFBO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxJQUFZO0lBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUM3QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLElBQVk7SUFDMUMsc0VBQXNFO0lBQ3RFLCtEQUErRDtJQUMvRCx1RUFBdUU7SUFDdkUsT0FBTyxDQUFD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QUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7SUFDakIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxJQUFJLENBQUMsU0FBUyxDQUNaO1lBQ0UsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM5QixVQUFVO1NBQ1gsRUFDRCxJQUFJLEVBQ0osQ0FBQyxDQUNGLENBQ0YsQ0FBQTtJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxVQUFVLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxDQUFBO1lBQ3pELEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUNqQyxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnXG5cbmludGVyZmFjZSBWYWxpZGF0ZU9wdGlvbnMge1xuICBzdHJpY3Q6IGJvb2xlYW5cbiAganNvbjogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgVmlvbGF0aW9uIHtcbiAgdHlwZTogJ29ycGhhbi1maWxlJyB8ICdpbnZhbGlkLXRvcC1sZXZlbCcgfCAnaW52YWxpZC1zcmMtZm9sZGVyJ1xuICBwYXRoOiBzdHJpbmdcbiAgbWVzc2FnZTogc3RyaW5nXG59XG5cbi8vIEFsbG93ZWQgdG9wLWxldmVsIGRpcmVjdG9yaWVzIChub24tZG90ZmlsZXMpXG5jb25zdCBBTExPV0VEX1RPUF9MRVZFTCA9IFtcbiAgJ3NyYycsXG4gICdwdWJsaWMnLFxuICAnX3NjcmlwdHMnLFxuICAnX2RhdGEnLFxuICAnX2RvY3MnLFxuICAnbm9kZV9tb2R1bGVzJyxcbl1cblxuLy8gQWxsb3dlZCBmb2xkZXJzIGRpcmVjdGx5IHVuZGVyIC9zcmNcbmNvbnN0IEFMTE9XRURfU1JDX0ZPTERFUlMgPSBbXG4gICdhcHAnLFxuICAnYmxvY2tzJyxcbiAgJ2Jsb2cnLFxuICAnY29tcG9uZW50cycsXG4gICdob29rcycsXG4gICdzdHlsZXMnLFxuICAndGVtcGxhdGUnLFxuICAndG9vbHMnLFxuICAndHlwZXMnLFxuICAndXRpbHMnLFxuXVxuXG4vLyBGaWxlcyBhbGxvd2VkIGF0IHRvcCBsZXZlbFxuY29uc3QgQUxMT1dFRF9UT1BfTEVWRUxfRklMRVMgPSBbXG4gICdwYWNrYWdlLmpzb24nLFxuICAncGFja2FnZS1sb2NrLmpzb24nLFxuICAndHNjb25maWcuanNvbicsXG4gICd0c2NvbmZpZy50c2J1aWxkaW5mbycsXG4gICduZXh0LmNvbmZpZy5tanMnLFxuICAnbmV4dC5jb25maWcuanMnLFxuICAnbmV4dC1lbnYuZC50cycsXG4gICdlc2xpbnQuY29uZmlnLm1qcycsXG4gICdlc2xpbnQuY29uZmlnLmpzJyxcbiAgJy5lc2xpbnRyYy5qcycsXG4gICcuZXNsaW50cmMuanNvbicsXG4gICdwb3N0Y3NzLmNvbmZpZy5qcycsXG4gICd0YWlsd2luZC5jb25maWcuanMnLFxuICAndGFpbHdpbmQuY29uZmlnLnRzJyxcbiAgJ1JFQURNRS5tZCcsXG4gICdMSUNFTlNFJyxcbiAgJ0NIQU5HRUxPRy5tZCcsXG4gICcuZ2l0aWdub3JlJyxcbiAgJy5jdXJzb3JydWxlcycsXG5dXG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwYXRoIGlzIGEgZG90ZmlsZSBvciBkb3Rmb2xkZXJcbiAqL1xuZnVuY3Rpb24gaXNEb3RmaWxlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKCcuJylcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhdGggaXMgYW4gYXJjaGl2ZSBjb250ZW50IGZvbGRlciAoYWxsb3dlZCBuZXcgZm9sZGVycyBpbiAvc3JjKVxuICovXG5mdW5jdGlvbiBpc0FyY2hpdmVDb250ZW50Rm9sZGVyKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBBcmNoaXZlIGZvbGRlcnMgdHlwaWNhbGx5IGhhdmUgcGx1cmFsIG5hbWVzIGZvciBjb250ZW50IGNvbGxlY3Rpb25zXG4gIC8vIFdlIGFsbG93IGFueSBmb2xkZXIgdGhhdCBjb3VsZCByZWFzb25hYmx5IGJlIGFyY2hpdmUgY29udGVudFxuICAvLyBUaGlzIGlzIGEgaGV1cmlzdGljIC0gd2UgY2hlY2sgaWYgaXQgbG9va3MgbGlrZSBhIGNvbnRlbnQgY29sbGVjdGlvblxuICByZXR1cm4gIUFMTE9XRURfU1JDX0ZPTERFUlMuaW5jbHVkZXMobmFtZSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBwcm9qZWN0IHN0cnVjdHVyZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGUoXG4gIHByb2plY3RQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFZhbGlkYXRlT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW11cbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHByb2plY3RQYXRoKVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNvbHV0ZVBhdGgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgUGF0aCBkb2VzIG5vdCBleGlzdDogJHtwcm9qZWN0UGF0aH1gKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG5cbiAgLy8gQ2hlY2sgdG9wLWxldmVsIGRpcmVjdG9yaWVzXG4gIGNvbnN0IHRvcExldmVsSXRlbXMgPSBmcy5yZWFkZGlyU3luYyhhYnNvbHV0ZVBhdGgpXG4gIGZvciAoY29uc3QgaXRlbSBvZiB0b3BMZXZlbEl0ZW1zKSB7XG4gICAgY29uc3QgaXRlbVBhdGggPSBwYXRoLmpvaW4oYWJzb2x1dGVQYXRoLCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhpdGVtUGF0aClcblxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIC8vIERvdGZvbGRlcnMgYXJlIGV4ZW1wdFxuICAgICAgaWYgKGlzRG90ZmlsZShpdGVtKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIGFsbG93ZWQgdG9wLWxldmVsIGRpcmVjdG9yeVxuICAgICAgaWYgKCFBTExPV0VEX1RPUF9MRVZFTC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdpbnZhbGlkLXRvcC1sZXZlbCcsXG4gICAgICAgICAgcGF0aDogaXRlbSxcbiAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCB0b3AtbGV2ZWwgZGlyZWN0b3J5OiAke2l0ZW19LiBBbGxvd2VkOiAke0FMTE9XRURfVE9QX0xFVkVMLmpvaW4oJywgJyl9IChkb3Rmb2xkZXJzIGV4ZW1wdClgLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJdCdzIGEgZmlsZSAtIGNoZWNrIGlmIGl0J3MgYWxsb3dlZCBhdCB0b3AgbGV2ZWxcbiAgICAgIGlmICghaXNEb3RmaWxlKGl0ZW0pICYmICFBTExPV0VEX1RPUF9MRVZFTF9GSUxFUy5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICAvLyBBbGxvdyBjb21tb24gY29uZmlnIGZpbGUgcGF0dGVybnNcbiAgICAgICAgY29uc3QgaXNDb25maWdGaWxlID1cbiAgICAgICAgICBpdGVtLmVuZHNXaXRoKCcuY29uZmlnLmpzJykgfHxcbiAgICAgICAgICBpdGVtLmVuZHNXaXRoKCcuY29uZmlnLm1qcycpIHx8XG4gICAgICAgICAgaXRlbS5lbmRzV2l0aCgnLmNvbmZpZy50cycpIHx8XG4gICAgICAgICAgaXRlbS5lbmRzV2l0aCgnLmpzb24nKSB8fFxuICAgICAgICAgIGl0ZW0uZW5kc1dpdGgoJy5tZCcpIHx8XG4gICAgICAgICAgaXRlbS5lbmRzV2l0aCgnLnNoJylcblxuICAgICAgICBpZiAoIWlzQ29uZmlnRmlsZSkge1xuICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnb3JwaGFuLWZpbGUnLFxuICAgICAgICAgICAgcGF0aDogaXRlbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBPcnBoYW4gZmlsZSBhdCBwcm9qZWN0IHJvb3Q6ICR7aXRlbX0uIEZpbGVzIHNob3VsZCBiZSBpbiBkZWZpbmVkIHpvbmVzLmAsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIC9zcmMgZm9sZGVyIHN0cnVjdHVyZVxuICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKGFic29sdXRlUGF0aCwgJ3NyYycpXG4gIGlmIChmcy5leGlzdHNTeW5jKHNyY1BhdGgpKSB7XG4gICAgY29uc3Qgc3JjSXRlbXMgPSBmcy5yZWFkZGlyU3luYyhzcmNQYXRoKVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzcmNJdGVtcykge1xuICAgICAgY29uc3QgaXRlbVBhdGggPSBwYXRoLmpvaW4oc3JjUGF0aCwgaXRlbSlcbiAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhpdGVtUGF0aClcblxuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIGFsbG93ZWQgL3NyYyBmb2xkZXJcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFBTExPV0VEX1NSQ19GT0xERVJTLmluY2x1ZGVzKGl0ZW0pICYmXG4gICAgICAgICAgIWlzQXJjaGl2ZUNvbnRlbnRGb2xkZXIoaXRlbSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdpbnZhbGlkLXNyYy1mb2xkZXInLFxuICAgICAgICAgICAgcGF0aDogYHNyYy8ke2l0ZW19YCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBJbnZhbGlkIGZvbGRlciBpbiAvc3JjOiAke2l0ZW19LiBBbGxvd2VkOiAke0FMTE9XRURfU1JDX0ZPTERFUlMuam9pbignLCAnKX0gb3IgYXJjaGl2ZSBjb250ZW50IGZvbGRlcnNgLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGF0IHNyYy9hcHAgaGFzIHJvdXRlIGdyb3Vwc1xuICAgIGNvbnN0IGFwcFBhdGggPSBwYXRoLmpvaW4oc3JjUGF0aCwgJ2FwcCcpXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYXBwUGF0aCkpIHtcbiAgICAgIGNvbnN0IGFwcEl0ZW1zID0gZnMucmVhZGRpclN5bmMoYXBwUGF0aClcbiAgICAgIGNvbnN0IGhhc0RlZmF1bHRHcm91cCA9IGFwcEl0ZW1zLnNvbWUoXG4gICAgICAgIChpdGVtKSA9PiBpdGVtID09PSAnKGRlZmF1bHQpJyB8fCBpdGVtLnN0YXJ0c1dpdGgoJygnKVxuICAgICAgKVxuXG4gICAgICBpZiAoIWhhc0RlZmF1bHRHcm91cCkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdpbnZhbGlkLXNyYy1mb2xkZXInLFxuICAgICAgICAgIHBhdGg6ICdzcmMvYXBwJyxcbiAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgJ3NyYy9hcHAgc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIHJvdXRlIGdyb3VwIGZvbGRlciAoZS5nLiwgKGRlZmF1bHQpLyknLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE91dHB1dCByZXN1bHRzXG4gIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICB7XG4gICAgICAgICAgdmFsaWQ6IHZpb2xhdGlvbnMubGVuZ3RoID09PSAwLFxuICAgICAgICAgIHZpb2xhdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIDJcbiAgICAgIClcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygn4pyTIFByb2plY3Qgc3RydWN0dXJlIGlzIHZhbGlkJylcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYEZvdW5kICR7dmlvbGF0aW9ucy5sZW5ndGh9IHZpb2xhdGlvbihzKTpcXG5gKVxuICAgICAgZm9yIChjb25zdCB2IG9mIHZpb2xhdGlvbnMpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAg4pyXICR7di5tZXNzYWdlfWApXG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnJylcbiAgICB9XG4gIH1cblxuICAvLyBFeGl0IHdpdGggZXJyb3IgY29kZSBpZiBzdHJpY3QgbW9kZSBhbmQgdmlvbGF0aW9ucyBmb3VuZFxuICBpZiAob3B0aW9ucy5zdHJpY3QgJiYgdmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cbiJdfQ==
package/dist/cli/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { audit } from './commands/audit.js';
3
3
  import { generate } from './commands/generate.js';
4
+ import { validate } from './commands/validate.js';
4
5
  import { version } from '../index.js';
5
6
  const args = process.argv.slice(2);
6
7
  const command = args[0];
@@ -27,6 +28,7 @@ ${colors.bold}Usage:${colors.reset}
27
28
  ${colors.bold}Commands:${colors.reset}
28
29
  audit [path] Check Canon compliance (default: src/blocks/)
29
30
  generate [output] Generate AI rules from Canon (default: .cursorrules)
31
+ validate [path] Validate project folder structure (default: .)
30
32
  version Show version information
31
33
  help Show this help message
32
34
 
@@ -37,12 +39,18 @@ ${colors.bold}Audit Options:${colors.reset}
37
39
  ${colors.bold}Generate Options:${colors.reset}
38
40
  --output, -o Output file path (default: .cursorrules)
39
41
 
42
+ ${colors.bold}Validate Options:${colors.reset}
43
+ --strict Exit with error code on violations
44
+ --json Output as JSON
45
+
40
46
  ${colors.bold}Examples:${colors.reset}
41
47
  gallop audit
42
48
  gallop audit src/blocks/ --strict
43
49
  gallop generate
44
50
  gallop generate .cursorrules
45
51
  gallop generate --output .github/copilot-instructions.md
52
+ gallop validate
53
+ gallop validate . --strict
46
54
  `);
47
55
  }
48
56
  function showVersion() {
@@ -80,6 +88,14 @@ async function main() {
80
88
  };
81
89
  await generate(generateOptions);
82
90
  break;
91
+ case 'validate':
92
+ const validatePath = args[1] && !args[1].startsWith('--') ? args[1] : '.';
93
+ const validateOptions = {
94
+ strict: args.includes('--strict'),
95
+ json: args.includes('--json'),
96
+ };
97
+ await validate(validatePath, validateOptions);
98
+ break;
83
99
  case 'version':
84
100
  case '-v':
85
101
  case '--version':
@@ -101,4 +117,4 @@ main().catch((error) => {
101
117
  console.error('Error:', error.message);
102
118
  process.exit(1);
103
119
  });
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRXZCLDZCQUE2QjtBQUM3QixNQUFNLE1BQU0sR0FBRztJQUNiLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLElBQUksRUFBRSxVQUFVO0NBQ2pCLENBQUE7QUFFRCxTQUFTLFFBQVE7SUFDZixPQUFPLENBQUMsR0FBRyxDQUFDO0VBQ1osTUFBTSxDQUFDLElBQUksYUFBYSxNQUFNLENBQUMsS0FBSztFQUNwQyxNQUFNLENBQUMsR0FBRyxrQkFBa0IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLOztFQUVsRCxNQUFNLENBQUMsSUFBSSxTQUFTLE1BQU0sQ0FBQyxLQUFLOzs7RUFHaEMsTUFBTSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsS0FBSzs7Ozs7O0VBTW5DLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixNQUFNLENBQUMsS0FBSzs7OztFQUl4QyxNQUFNLENBQUMsSUFBSSxvQkFBb0IsTUFBTSxDQUFDLEtBQUs7OztFQUczQyxNQUFN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QUMsT0FBTyxDQUFDLENBQUE7SUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqQixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgYXVkaXQgfSBmcm9tICcuL2NvbW1hbmRzL2F1ZGl0LmpzJ1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuL2NvbW1hbmRzL2dlbmVyYXRlLmpzJ1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL2luZGV4LmpzJ1xuXG5jb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpXG5jb25zdCBjb21tYW5kID0gYXJnc1swXVxuXG4vLyBDb2xvcnMgZm9yIHRlcm1pbmFsIG91dHB1dFxuY29uc3QgY29sb3JzID0ge1xuICByZXNldDogJ1xceDFiWzBtJyxcbiAgYm9sZDogJ1xceDFiWzFtJyxcbiAgZGltOiAnXFx4MWJbMm0nLFxuICByZWQ6ICdcXHgxYlszMW0nLFxuICBncmVlbjogJ1xceDFiWzMybScsXG4gIHllbGxvdzogJ1xceDFiWzMzbScsXG4gIGJsdWU6ICdcXHgxYlszNG0nLFxuICBtYWdlbnRhOiAnXFx4MWJbMzVtJyxcbiAgY3lhbjogJ1xceDFiWzM2bScsXG59XG5cbmZ1bmN0aW9uIHNob3dIZWxwKCkge1xuICBjb25zb2xlLmxvZyhgXG4ke2NvbG9ycy5ib2xkfUdhbGxvcCBDTEkke2NvbG9ycy5yZXNldH0gLSBDYW5vbiBDb21wbGlhbmNlIFRvb2xpbmdcbiR7Y29sb3JzLmRpbX1DYW5vbiBWZXJzaW9uOiAke3ZlcnNpb259JHtjb2xvcnMucmVzZXR9XG5cbiR7Y29sb3JzLmJvbGR9VXNhZ2U6JHtjb2xvcnMucmVzZXR9XG4gIGdhbGxvcCA8Y29tbWFuZD4gW29wdGlvbnNdXG5cbiR7Y29sb3JzLmJvbGR9Q29tbWFuZHM6JHtjb2xvcnMucmVzZXR9XG4gIGF1ZGl0IFtwYXRoXSAgICAgICBDaGVjayBDYW5vbiBjb21wbGlhbmNlIChkZWZhdWx0OiBzcmMvYmxvY2tzLylcbiAgZ2VuZXJhdGUgW291dHB1dF0gIEdlbmVyYXRlIEFJIHJ1bGVzIGZyb20gQ2Fub24gKGRlZmF1bHQ6IC5jdXJzb3JydWxlcylcbiAgdmVyc2lvbiAgICAgICAgICAgIFNob3cgdmVyc2lvbiBpbmZvcm1hdGlvblxuICBoZWxwICAgICAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgbWVzc2FnZVxuXG4ke2NvbG9ycy5ib2xkfUF1ZGl0IE9wdGlvbnM6JHtjb2xvcnMucmVzZXR9XG4gIC0tc3RyaWN0ICAgICAgICAgICBFeGl0IHdpdGggZXJyb3IgY29kZSBvbiB2aW9sYXRpb25zXG4gIC0tanNvbiAgICAgICAgICAgICBPdXRwdXQgYXMgSlNPTlxuXG4ke2NvbG9ycy5ib2xkfUdlbmVyYXRlIE9wdGlvbnM6JHtjb2xvcnMucmVzZXR9XG4gIC0tb3V0cHV0LCAtbyAgICAgICBPdXRwdXQgZmlsZSBwYXRoIChkZWZhdWx0OiAuY3Vyc29ycnVsZXMpXG5cbiR7Y29sb3JzLmJvbGR9RXhhbXBsZXM6JHtjb2xvcnMucmVzZXR9XG4gIGdhbGxvcCBhdWRpdFxuICBnYWxsb3AgYXVkaXQgc3JjL2Jsb2Nrcy8gLS1zdHJpY3RcbiAgZ2FsbG9wIGdlbmVyYXRlXG4gIGdhbGxvcCBnZW5lcmF0ZSAuY3Vyc29ycnVsZXNcbiAgZ2FsbG9wIGdlbmVyYXRlIC0tb3V0cHV0IC5naXRodWIvY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbmApXG59XG5cbmZ1bmN0aW9uIHNob3dWZXJzaW9uKCkge1xuICBjb25zb2xlLmxvZyhgR2FsbG9wIENMSSB2MS4wLjBgKVxuICBjb25zb2xlLmxvZyhgQ2Fub24gdiR7dmVyc2lvbn1gKVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBzd2l0Y2ggKGNvbW1hbmQpIHtcbiAgICBjYXNlICdhdWRpdCc6XG4gICAgICBjb25zdCBhdWRpdFBhdGggPVxuICAgICAgICBhcmdzWzFdICYmICFhcmdzWzFdLnN0YXJ0c1dpdGgoJy0tJykgPyBhcmdzWzFdIDogJ3NyYy9ibG9ja3MvJ1xuICAgICAgY29uc3QgYXVkaXRPcHRpb25zID0ge1xuICAgICAgICBzdHJpY3Q6IGFyZ3MuaW5jbHVkZXMoJy0tc3RyaWN0JyksXG4gICAgICAgIGpzb246IGFyZ3MuaW5jbHVkZXMoJy0tanNvbicpLFxuICAgICAgICBmaXg6IGFyZ3MuaW5jbHVkZXMoJy0tZml4JyksXG4gICAgICB9XG4gICAgICBhd2FpdCBhdWRpdChhdWRpdFBhdGgsIGF1ZGl0T3B0aW9ucylcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdnZW5lcmF0ZSc6XG4gICAgICAvLyBGaW5kIG91dHB1dCBwYXRoIGZyb20gYXJnc1xuICAgICAgbGV0IG91dHB1dFBhdGggPSAnLmN1cnNvcnJ1bGVzJ1xuICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBhcmdzLmluZGV4T2YoJy0tb3V0cHV0JylcbiAgICAgIGNvbnN0IG91dHB1dEluZGV4U2hvcnQgPSBhcmdzLmluZGV4T2YoJy1vJylcbiAgICAgIGlmIChvdXRwdXRJbmRleCAhPT0gLTEgJiYgYXJnc1tvdXRwdXRJbmRleCArIDFdKSB7XG4gICAgICAgIG91dHB1dFBhdGggPSBhcmdzW291dHB1dEluZGV4ICsgMV1cbiAgICAgIH0gZWxzZSBpZiAob3V0cHV0SW5kZXhTaG9ydCAhPT0gLTEgJiYgYXJnc1tvdXRwdXRJbmRleFNob3J0ICsgMV0pIHtcbiAgICAgICAgb3V0cHV0UGF0aCA9IGFyZ3Nbb3V0cHV0SW5kZXhTaG9ydCArIDFdXG4gICAgICB9IGVsc2UgaWYgKGFyZ3NbMV0gJiYgIWFyZ3NbMV0uc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICBvdXRwdXRQYXRoID0gYXJnc1sxXVxuICAgICAgfVxuICAgICAgY29uc3QgZ2VuZXJhdGVPcHRpb25zID0ge1xuICAgICAgICBvdXRwdXQ6IG91dHB1dFBhdGgsXG4gICAgICAgIGZvcm1hdDogJ2N1cnNvcnJ1bGVzJyBhcyBjb25zdCxcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlKGdlbmVyYXRlT3B0aW9ucylcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICd2ZXJzaW9uJzpcbiAgICBjYXNlICctdic6XG4gICAgY2FzZSAnLS12ZXJzaW9uJzpcbiAgICAgIHNob3dWZXJzaW9uKClcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdoZWxwJzpcbiAgICBjYXNlICctaCc6XG4gICAgY2FzZSAnLS1oZWxwJzpcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHNob3dIZWxwKClcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJ1biAnZ2FsbG9wIGhlbHAnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi5gKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cblxubWFpbigpLmNhdGNoKChlcnJvcikgPT4ge1xuICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvci5tZXNzYWdlKVxuICBwcm9jZXNzLmV4aXQoMSlcbn0pXG4iXX0=
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRXJDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUV2Qiw2QkFBNkI7QUFDN0IsTUFBTSxNQUFNLEdBQUc7SUFDYixLQUFLLEVBQUUsU0FBUztJQUNoQixJQUFJLEVBQUUsU0FBUztJQUNmLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixLQUFLLEVBQUUsVUFBVTtJQUNqQixNQUFNLEVBQUUsVUFBVTtJQUNsQixJQUFJLEVBQUUsVUFBVTtJQUNoQixPQUFPLEVBQUUsVUFBVTtJQUNuQixJQUFJLEVBQUUsVUFBVTtDQUNqQixDQUFBO0FBRUQsU0FBUyxRQUFRO0lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQztFQUNaLE1BQU0sQ0FBQyxJQUFJLGFBQWEsTUFBTSxDQUFDLEtBQUs7RUFDcEMsTUFBTSxDQUFDLEdBQUcsa0JBQWtCLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSzs7RUFFbEQsTUFBTSxDQUFDLElBQUksU0FBUyxNQUFNLENBQUMsS0FBSzs7O0VBR2hDLE1BQU0sQ0FBQyxJQUFJLFlBQVksTUFBTSxDQUFDLEtBQUs7Ozs7Ozs7RUFPbkMsTUFBTSxDQUFDLElBQUksaUJBQWlCLE1BQU0sQ0FBQyxLQUFLOzs7O0VBSXhDLE1BQU0s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UUFFUCxLQUFLLFNBQVMsQ0FBQztRQUNmLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxXQUFXO1lBQ2QsV0FBVyxFQUFFLENBQUE7WUFDYixNQUFLO1FBRVAsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssUUFBUSxDQUFDO1FBQ2QsS0FBSyxTQUFTO1lBQ1osUUFBUSxFQUFFLENBQUE7WUFDVixNQUFLO1FBRVA7WUFDRSxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQzVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQTtZQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakIsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IGF1ZGl0IH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC5qcydcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5lcmF0ZS5qcydcbmltcG9ydCB7IHZhbGlkYXRlIH0gZnJvbSAnLi9jb21tYW5kcy92YWxpZGF0ZS5qcydcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9pbmRleC5qcydcblxuY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKVxuY29uc3QgY29tbWFuZCA9IGFyZ3NbMF1cblxuLy8gQ29sb3JzIGZvciB0ZXJtaW5hbCBvdXRwdXRcbmNvbnN0IGNvbG9ycyA9IHtcbiAgcmVzZXQ6ICdcXHgxYlswbScsXG4gIGJvbGQ6ICdcXHgxYlsxbScsXG4gIGRpbTogJ1xceDFiWzJtJyxcbiAgcmVkOiAnXFx4MWJbMzFtJyxcbiAgZ3JlZW46ICdcXHgxYlszMm0nLFxuICB5ZWxsb3c6ICdcXHgxYlszM20nLFxuICBibHVlOiAnXFx4MWJbMzRtJyxcbiAgbWFnZW50YTogJ1xceDFiWzM1bScsXG4gIGN5YW46ICdcXHgxYlszNm0nLFxufVxuXG5mdW5jdGlvbiBzaG93SGVscCgpIHtcbiAgY29uc29sZS5sb2coYFxuJHtjb2xvcnMuYm9sZH1HYWxsb3AgQ0xJJHtjb2xvcnMucmVzZXR9IC0gQ2Fub24gQ29tcGxpYW5jZSBUb29saW5nXG4ke2NvbG9ycy5kaW19Q2Fub24gVmVyc2lvbjogJHt2ZXJzaW9ufSR7Y29sb3JzLnJlc2V0fVxuXG4ke2NvbG9ycy5ib2xkfVVzYWdlOiR7Y29sb3JzLnJlc2V0fVxuICBnYWxsb3AgPGNvbW1hbmQ+IFtvcHRpb25zXVxuXG4ke2NvbG9ycy5ib2xkfUNvbW1hbmRzOiR7Y29sb3JzLnJlc2V0fVxuICBhdWRpdCBbcGF0aF0gICAgICAgQ2hlY2sgQ2Fub24gY29tcGxpYW5jZSAoZGVmYXVsdDogc3JjL2Jsb2Nrcy8pXG4gIGdlbmVyYXRlIFtvdXRwdXRdICBHZW5lcmF0ZSBBSSBydWxlcyBmcm9tIENhbm9uIChkZWZhdWx0OiAuY3Vyc29ycnVsZXMpXG4gIHZhbGlkYXRlIFtwYXRoXSAgICBWYWxpZGF0ZSBwcm9qZWN0IGZvbGRlciBzdHJ1Y3R1cmUgKGRlZmF1bHQ6IC4pXG4gIHZlcnNpb24gICAgICAgICAgICBTaG93IHZlcnNpb24gaW5mb3JtYXRpb25cbiAgaGVscCAgICAgICAgICAgICAgIFNob3cgdGhpcyBoZWxwIG1lc3NhZ2VcblxuJHtjb2xvcnMuYm9sZH1BdWRpdCBPcHRpb25zOiR7Y29sb3JzLnJlc2V0fVxuICAtLXN0cmljdCAgICAgICAgICAgRXhpdCB3aXRoIGVycm9yIGNvZGUgb24gdmlvbGF0aW9uc1xuICAtLWpzb24gICAgICAgICAgICAgT3V0cHV0IGFzIEpTT05cblxuJHtjb2xvcnMuYm9sZH1HZW5lcmF0ZSBPcHRpb25zOiR7Y29sb3JzLnJlc2V0fVxuICAtLW91dHB1dCwgLW8gICAgICAgT3V0cHV0IGZpbGUgcGF0aCAoZGVmYXVsdDogLmN1cnNvcnJ1bGVzKVxuXG4ke2NvbG9ycy5ib2xkfVZhbGlkYXRlIE9wdGlvbnM6JHtjb2xvcnMucmVzZXR9XG4gIC0tc3RyaWN0ICAgICAgICAgICBFeGl0IHdpdGggZXJyb3IgY29kZSBvbiB2aW9sYXRpb25zXG4gIC0tanNvbiAgICAgICAgICAgICBPdXRwdXQgYXMgSlNPTlxuXG4ke2NvbG9ycy5ib2xkfUV4YW1wbGVzOiR7Y29sb3JzLnJlc2V0fVxuICBnYWxsb3AgYXVkaXRcbiAgZ2FsbG9wIGF1ZGl0IHNyYy9ibG9ja3MvIC0tc3RyaWN0XG4gIGdhbGxvcCBnZW5lcmF0ZVxuICBnYWxsb3AgZ2VuZXJhdGUgLmN1cnNvcnJ1bGVzXG4gIGdhbGxvcCBnZW5lcmF0ZSAtLW91dHB1dCAuZ2l0aHViL2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kXG4gIGdhbGxvcCB2YWxpZGF0ZVxuICBnYWxsb3AgdmFsaWRhdGUgLiAtLXN0cmljdFxuYClcbn1cblxuZnVuY3Rpb24gc2hvd1ZlcnNpb24oKSB7XG4gIGNvbnNvbGUubG9nKGBHYWxsb3AgQ0xJIHYxLjAuMGApXG4gIGNvbnNvbGUubG9nKGBDYW5vbiB2JHt2ZXJzaW9ufWApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIHN3aXRjaCAoY29tbWFuZCkge1xuICAgIGNhc2UgJ2F1ZGl0JzpcbiAgICAgIGNvbnN0IGF1ZGl0UGF0aCA9XG4gICAgICAgIGFyZ3NbMV0gJiYgIWFyZ3NbMV0uc3RhcnRzV2l0aCgnLS0nKSA/IGFyZ3NbMV0gOiAnc3JjL2Jsb2Nrcy8nXG4gICAgICBjb25zdCBhdWRpdE9wdGlvbnMgPSB7XG4gICAgICAgIHN0cmljdDogYXJncy5pbmNsdWRlcygnLS1zdHJpY3QnKSxcbiAgICAgICAganNvbjogYXJncy5pbmNsdWRlcygnLS1qc29uJyksXG4gICAgICAgIGZpeDogYXJncy5pbmNsdWRlcygnLS1maXgnKSxcbiAgICAgIH1cbiAgICAgIGF3YWl0IGF1ZGl0KGF1ZGl0UGF0aCwgYXVkaXRPcHRpb25zKVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ2dlbmVyYXRlJzpcbiAgICAgIC8vIEZpbmQgb3V0cHV0IHBhdGggZnJvbSBhcmdzXG4gICAgICBsZXQgb3V0cHV0UGF0aCA9ICcuY3Vyc29ycnVsZXMnXG4gICAgICBjb25zdCBvdXRwdXRJbmRleCA9IGFyZ3MuaW5kZXhPZignLS1vdXRwdXQnKVxuICAgICAgY29uc3Qgb3V0cHV0SW5kZXhTaG9ydCA9IGFyZ3MuaW5kZXhPZignLW8nKVxuICAgICAgaWYgKG91dHB1dEluZGV4ICE9PSAtMSAmJiBhcmdzW291dHB1dEluZGV4ICsgMV0pIHtcbiAgICAgICAgb3V0cHV0UGF0aCA9IGFyZ3Nbb3V0cHV0SW5kZXggKyAxXVxuICAgICAgfSBlbHNlIGlmIChvdXRwdXRJbmRleFNob3J0ICE9PSAtMSAmJiBhcmdzW291dHB1dEluZGV4U2hvcnQgKyAxXSkge1xuICAgICAgICBvdXRwdXRQYXRoID0gYXJnc1tvdXRwdXRJbmRleFNob3J0ICsgMV1cbiAgICAgIH0gZWxzZSBpZiAoYXJnc1sxXSAmJiAhYXJnc1sxXS5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICAgIG91dHB1dFBhdGggPSBhcmdzWzFdXG4gICAgICB9XG4gICAgICBjb25zdCBnZW5lcmF0ZU9wdGlvbnMgPSB7XG4gICAgICAgIG91dHB1dDogb3V0cHV0UGF0aCxcbiAgICAgICAgZm9ybWF0OiAnY3Vyc29ycnVsZXMnIGFzIGNvbnN0LFxuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGUoZ2VuZXJhdGVPcHRpb25zKVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ3ZhbGlkYXRlJzpcbiAgICAgIGNvbnN0IHZhbGlkYXRlUGF0aCA9XG4gICAgICAgIGFyZ3NbMV0gJiYgIWFyZ3NbMV0uc3RhcnRzV2l0aCgnLS0nKSA/IGFyZ3NbMV0gOiAnLidcbiAgICAgIGNvbnN0IHZhbGlkYXRlT3B0aW9ucyA9IHtcbiAgICAgICAgc3RyaWN0OiBhcmdzLmluY2x1ZGVzKCctLXN0cmljdCcpLFxuICAgICAgICBqc29uOiBhcmdzLmluY2x1ZGVzKCctLWpzb24nKSxcbiAgICAgIH1cbiAgICAgIGF3YWl0IHZhbGlkYXRlKHZhbGlkYXRlUGF0aCwgdmFsaWRhdGVPcHRpb25zKVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ3ZlcnNpb24nOlxuICAgIGNhc2UgJy12JzpcbiAgICBjYXNlICctLXZlcnNpb24nOlxuICAgICAgc2hvd1ZlcnNpb24oKVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ2hlbHAnOlxuICAgIGNhc2UgJy1oJzpcbiAgICBjYXNlICctLWhlbHAnOlxuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgc2hvd0hlbHAoKVxuICAgICAgYnJlYWtcblxuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKVxuICAgICAgY29uc29sZS5lcnJvcihgUnVuICdnYWxsb3AgaGVscCcgZm9yIHVzYWdlIGluZm9ybWF0aW9uLmApXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxufVxuXG5tYWluKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yLm1lc3NhZ2UpXG4gIHByb2Nlc3MuZXhpdCgxKVxufSlcbiJdfQ==
@@ -11,5 +11,7 @@ declare const recommendedRules: {
11
11
  readonly 'gallop/background-image-rounded': "warn";
12
12
  readonly 'gallop/no-inline-styles': "warn";
13
13
  readonly 'gallop/no-arbitrary-colors': "warn";
14
+ readonly 'gallop/no-cross-zone-imports': "warn";
15
+ readonly 'gallop/no-data-imports': "warn";
14
16
  };
15
17
  export default recommendedRules;
@@ -19,6 +19,10 @@ const recommendedRules = {
19
19
  'gallop/no-inline-styles': 'warn',
20
20
  // Use defined color tokens, not arbitrary colors
21
21
  'gallop/no-arbitrary-colors': 'warn',
22
+ // Enforce import boundaries between Canon zones
23
+ 'gallop/no-cross-zone-imports': 'warn',
24
+ // Prevent runtime code from importing _data/ directly
25
+ 'gallop/no-data-imports': 'warn',
22
26
  };
23
27
  export default recommendedRules;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb21tZW5kZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXNsaW50L2NvbmZpZ3MvcmVjb21tZW5kZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixxQ0FBcUM7SUFDckMseUJBQXlCLEVBQUUsTUFBTTtJQUVqQyx1Q0FBdUM7SUFDdkMsZ0NBQWdDLEVBQUUsTUFBTTtJQUV4Qyw0REFBNEQ7SUFDNUQsK0JBQStCLEVBQUUsTUFBTTtJQUV2Qyx1REFBdUQ7SUFDdkQscUNBQXFDLEVBQUUsTUFBTTtJQUU3Qyx3REFBd0Q7SUFDeEQsaUNBQWlDLEVBQUUsTUFBTTtJQUV6QyxxREFBcUQ7SUFDckQsaUNBQWlDLEVBQUUsTUFBTTtJQUV6Qyw2Q0FBNkM7SUFDN0MseUJBQXlCLEVBQUUsTUFBTTtJQUVqQyxpREFBaUQ7SUFDakQsNEJBQTRCLEVBQUUsTUFBTTtDQUM1QixDQUFBO0FBRVYsZUFBZSxnQkFBZ0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVjb21tZW5kZWQgY29uZmlndXJhdGlvbiBmb3IgRVNMaW50IGZsYXQgY29uZmlnXG4gKiBBIHNlbnNpYmxlIGRlZmF1bHQgZm9yIGFueSBHYWxsb3AtYmFzZWQgdGVtcGxhdGVcbiAqL1xuY29uc3QgcmVjb21tZW5kZWRSdWxlcyA9IHtcbiAgLy8gQmxvY2tzIHNob3VsZCBiZSBzZXJ2ZXIgY29tcG9uZW50c1xuICAnZ2FsbG9wL25vLWNsaWVudC1ibG9ja3MnOiAnd2FybicsXG5cbiAgLy8gU2VjdGlvbiBhbHJlYWR5IHByb3ZpZGVzIGNvbnRhaW5tZW50XG4gICdnYWxsb3Avbm8tY29udGFpbmVyLWluLXNlY3Rpb24nOiAnd2FybicsXG5cbiAgLy8gVXNlIGNvbXBvbmVudCBwcm9wcyBpbnN0ZWFkIG9mIGNsYXNzTmFtZSBmb3Igc3R5bGUgdmFsdWVzXG4gICdnYWxsb3AvcHJlZmVyLWNvbXBvbmVudC1wcm9wcyc6ICd3YXJuJyxcblxuICAvLyBVc2UgVHlwb2dyYXBoeSBjb21wb25lbnRzIGluc3RlYWQgb2YgcmF3IHAvc3BhbiB0YWdzXG4gICdnYWxsb3AvcHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cyc6ICd3YXJuJyxcblxuICAvLyBVc2UgR3JpZC9Db2x1bW5zIGluc3RlYWQgb2YgcmF3IGRpdiB3aXRoIGdyaWQgY2xhc3Nlc1xuICAnZ2FsbG9wL3ByZWZlci1sYXlvdXQtY29tcG9uZW50cyc6ICd3YXJuJyxcblxuICAvLyBCYWNrZ3JvdW5kIGltYWdlcyBtdXN0IGhhdmUgcm91bmRlZD1cInJvdW5kZWQtbm9uZVwiXG4gICdnYWxsb3AvYmFja2dyb3VuZC1pbWFnZS1yb3VuZGVkJzogJ3dhcm4nLFxuXG4gIC8vIE5vIGlubGluZSBzdHlsZXMsIHVzZSBUYWlsd2luZCBleGNsdXNpdmVseVxuICAnZ2FsbG9wL25vLWlubGluZS1zdHlsZXMnOiAnd2FybicsXG5cbiAgLy8gVXNlIGRlZmluZWQgY29sb3IgdG9rZW5zLCBub3QgYXJiaXRyYXJ5IGNvbG9yc1xuICAnZ2FsbG9wL25vLWFyYml0cmFyeS1jb2xvcnMnOiAnd2FybicsXG59IGFzIGNvbnN0XG5cbmV4cG9ydCBkZWZhdWx0IHJlY29tbWVuZGVkUnVsZXNcbiJdfQ==
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb21tZW5kZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXNsaW50L2NvbmZpZ3MvcmVjb21tZW5kZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixxQ0FBcUM7SUFDckMseUJBQXlCLEVBQUUsTUFBTTtJQUVqQyx1Q0FBdUM7SUFDdkMsZ0NBQWdDLEVBQUUsTUFBTTtJQUV4Qyw0REFBNEQ7SUFDNUQsK0JBQStCLEVBQUUsTUFBTTtJQUV2Qyx1REFBdUQ7SUFDdkQscUNBQXFDLEVBQUUsTUFBTTtJQUU3Qyx3REFBd0Q7SUFDeEQsaUNBQWlDLEVBQUUsTUFBTTtJQUV6QyxxREFBcUQ7SUFDckQsaUNBQWlDLEVBQUUsTUFBTTtJQUV6Qyw2Q0FBNkM7SUFDN0MseUJBQXlCLEVBQUUsTUFBTTtJQUVqQyxpREFBaUQ7SUFDakQsNEJBQTRCLEVBQUUsTUFBTTtJQUVwQyxnREFBZ0Q7SUFDaEQsOEJBQThCLEVBQUUsTUFBTTtJQUV0QyxzREFBc0Q7SUFDdEQsd0JBQXdCLEVBQUUsTUFBTTtDQUN4QixDQUFBO0FBRVYsZUFBZSxnQkFBZ0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVjb21tZW5kZWQgY29uZmlndXJhdGlvbiBmb3IgRVNMaW50IGZsYXQgY29uZmlnXG4gKiBBIHNlbnNpYmxlIGRlZmF1bHQgZm9yIGFueSBHYWxsb3AtYmFzZWQgdGVtcGxhdGVcbiAqL1xuY29uc3QgcmVjb21tZW5kZWRSdWxlcyA9IHtcbiAgLy8gQmxvY2tzIHNob3VsZCBiZSBzZXJ2ZXIgY29tcG9uZW50c1xuICAnZ2FsbG9wL25vLWNsaWVudC1ibG9ja3MnOiAnd2FybicsXG5cbiAgLy8gU2VjdGlvbiBhbHJlYWR5IHByb3ZpZGVzIGNvbnRhaW5tZW50XG4gICdnYWxsb3Avbm8tY29udGFpbmVyLWluLXNlY3Rpb24nOiAnd2FybicsXG5cbiAgLy8gVXNlIGNvbXBvbmVudCBwcm9wcyBpbnN0ZWFkIG9mIGNsYXNzTmFtZSBmb3Igc3R5bGUgdmFsdWVzXG4gICdnYWxsb3AvcHJlZmVyLWNvbXBvbmVudC1wcm9wcyc6ICd3YXJuJyxcblxuICAvLyBVc2UgVHlwb2dyYXBoeSBjb21wb25lbnRzIGluc3RlYWQgb2YgcmF3IHAvc3BhbiB0YWdzXG4gICdnYWxsb3AvcHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cyc6ICd3YXJuJyxcblxuICAvLyBVc2UgR3JpZC9Db2x1bW5zIGluc3RlYWQgb2YgcmF3IGRpdiB3aXRoIGdyaWQgY2xhc3Nlc1xuICAnZ2FsbG9wL3ByZWZlci1sYXlvdXQtY29tcG9uZW50cyc6ICd3YXJuJyxcblxuICAvLyBCYWNrZ3JvdW5kIGltYWdlcyBtdXN0IGhhdmUgcm91bmRlZD1cInJvdW5kZWQtbm9uZVwiXG4gICdnYWxsb3AvYmFja2dyb3VuZC1pbWFnZS1yb3VuZGVkJzogJ3dhcm4nLFxuXG4gIC8vIE5vIGlubGluZSBzdHlsZXMsIHVzZSBUYWlsd2luZCBleGNsdXNpdmVseVxuICAnZ2FsbG9wL25vLWlubGluZS1zdHlsZXMnOiAnd2FybicsXG5cbiAgLy8gVXNlIGRlZmluZWQgY29sb3IgdG9rZW5zLCBub3QgYXJiaXRyYXJ5IGNvbG9yc1xuICAnZ2FsbG9wL25vLWFyYml0cmFyeS1jb2xvcnMnOiAnd2FybicsXG5cbiAgLy8gRW5mb3JjZSBpbXBvcnQgYm91bmRhcmllcyBiZXR3ZWVuIENhbm9uIHpvbmVzXG4gICdnYWxsb3Avbm8tY3Jvc3Mtem9uZS1pbXBvcnRzJzogJ3dhcm4nLFxuXG4gIC8vIFByZXZlbnQgcnVudGltZSBjb2RlIGZyb20gaW1wb3J0aW5nIF9kYXRhLyBkaXJlY3RseVxuICAnZ2FsbG9wL25vLWRhdGEtaW1wb3J0cyc6ICd3YXJuJyxcbn0gYXMgY29uc3RcblxuZXhwb3J0IGRlZmF1bHQgcmVjb21tZW5kZWRSdWxlc1xuIl19
@@ -22,6 +22,12 @@ declare const plugin: {
22
22
  'no-arbitrary-colors': import("@typescript-eslint/utils/ts-eslint").RuleModule<"noArbitraryColors", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
23
23
  name: string;
24
24
  };
25
+ 'no-cross-zone-imports': import("@typescript-eslint/utils/ts-eslint").RuleModule<"blocksImportBlocks" | "componentsImportBlocks" | "runtimeImportScripts", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
26
+ name: string;
27
+ };
28
+ 'no-data-imports': import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDataImports", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
29
+ name: string;
30
+ };
25
31
  };
26
32
  /**
27
33
  * Recommended rule configurations - spread into your ESLint config
@@ -36,6 +42,8 @@ declare const plugin: {
36
42
  readonly 'gallop/background-image-rounded': "warn";
37
43
  readonly 'gallop/no-inline-styles': "warn";
38
44
  readonly 'gallop/no-arbitrary-colors': "warn";
45
+ readonly 'gallop/no-cross-zone-imports': "warn";
46
+ readonly 'gallop/no-data-imports': "warn";
39
47
  };
40
48
  };
41
49
  export default plugin;
@@ -6,6 +6,8 @@ import preferLayoutComponents from './rules/prefer-layout-components.js';
6
6
  import backgroundImageRounded from './rules/background-image-rounded.js';
7
7
  import noInlineStyles from './rules/no-inline-styles.js';
8
8
  import noArbitraryColors from './rules/no-arbitrary-colors.js';
9
+ import noCrossZoneImports from './rules/no-cross-zone-imports.js';
10
+ import noDataImports from './rules/no-data-imports.js';
9
11
  /**
10
12
  * All Canon ESLint rules with recommended severity levels
11
13
  */
@@ -18,11 +20,13 @@ const recommended = {
18
20
  'gallop/background-image-rounded': 'warn',
19
21
  'gallop/no-inline-styles': 'warn',
20
22
  'gallop/no-arbitrary-colors': 'warn',
23
+ 'gallop/no-cross-zone-imports': 'warn',
24
+ 'gallop/no-data-imports': 'warn',
21
25
  };
22
26
  const plugin = {
23
27
  meta: {
24
28
  name: 'eslint-plugin-gallop',
25
- version: '2.6.0',
29
+ version: '2.7.0',
26
30
  },
27
31
  rules: {
28
32
  'no-client-blocks': noClientBlocks,
@@ -33,6 +37,8 @@ const plugin = {
33
37
  'background-image-rounded': backgroundImageRounded,
34
38
  'no-inline-styles': noInlineStyles,
35
39
  'no-arbitrary-colors': noArbitraryColors,
40
+ 'no-cross-zone-imports': noCrossZoneImports,
41
+ 'no-data-imports': noDataImports,
36
42
  },
37
43
  /**
38
44
  * Recommended rule configurations - spread into your ESLint config
@@ -41,4 +47,4 @@ const plugin = {
41
47
  recommended,
42
48
  };
43
49
  export default plugin;
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXNsaW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFBO0FBQ3hELE9BQU8sb0JBQW9CLE1BQU0sb0NBQW9DLENBQUE7QUFDckUsT0FBTyxvQkFBb0IsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNwRSxPQUFPLDBCQUEwQixNQUFNLHlDQUF5QyxDQUFBO0FBQ2hGLE9BQU8sc0JBQXNCLE1BQU0scUNBQXFDLENBQUE7QUFDeEUsT0FBTyxzQkFBc0IsTUFBTSxxQ0FBcUMsQ0FBQTtBQUN4RSxPQUFPLGNBQWMsTUFBTSw2QkFBNkIsQ0FBQTtBQUN4RCxPQUFPLGlCQUFpQixNQUFNLGdDQUFnQyxDQUFBO0FBRTlEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLEdBQUc7SUFDbEIseUJBQXlCLEVBQUUsTUFBTTtJQUNqQyxnQ0FBZ0MsRUFBRSxNQUFNO0lBQ3hDLCtCQUErQixFQUFFLE1BQU07SUFDdkMscUNBQXFDLEVBQUUsTUFBTTtJQUM3QyxpQ0FBaUMsRUFBRSxNQUFNO0lBQ3pDLGlDQUFpQyxFQUFFLE1BQU07SUFDekMseUJBQXlCLEVBQUUsTUFBTTtJQUNqQyw0QkFBNEIsRUFBRSxNQUFNO0NBQzVCLENBQUE7QUFFVixNQUFNLE1BQU0sR0FBRztJQUNiLElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxzQkFBc0I7UUFDNUIsT0FBTyxFQUFFLE9BQU87S0FDakI7SUFDRCxLQUFLLEVBQUU7UUFDTCxrQkFBa0IsRUFBRSxjQUFjO1FBQ2xDLHlCQUF5QixFQUFFLG9CQUFvQjtRQUMvQyx3QkFBd0IsRUFBRSxvQkFBb0I7UUFDOUMsOEJBQThCLEVBQUUsMEJBQTBCO1FBQzFELDBCQUEwQixFQUFFLHNCQUFzQjtRQUNsRCwwQkFBMEIsRUFBRSxzQkFBc0I7UUFDbEQsa0JBQWtCLEVBQUUsY0FBYztRQUNsQyxxQkFBcUIsRUFBRSxpQkFBaUI7S0FDekM7SUFDRDs7O09BR0c7SUFDSCxXQUFXO0NBQ1osQ0FBQTtBQUVELGVBQWUsTUFBTSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vQ2xpZW50QmxvY2tzIGZyb20gJy4vcnVsZXMvbm8tY2xpZW50LWJsb2Nrcy5qcydcbmltcG9ydCBub0NvbnRhaW5lckluU2VjdGlvbiBmcm9tICcuL3J1bGVzL25vLWNvbnRhaW5lci1pbi1zZWN0aW9uLmpzJ1xuaW1wb3J0IHByZWZlckNvbXBvbmVudFByb3BzIGZyb20gJy4vcnVsZXMvcHJlZmVyLWNvbXBvbmVudC1wcm9wcy5qcydcbmltcG9ydCBwcmVmZXJUeXBvZ3JhcGh5Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci10eXBvZ3JhcGh5LWNvbXBvbmVudHMuanMnXG5pbXBvcnQgcHJlZmVyTGF5b3V0Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci1sYXlvdXQtY29tcG9uZW50cy5qcydcbmltcG9ydCBiYWNrZ3JvdW5kSW1hZ2VSb3VuZGVkIGZyb20gJy4vcnVsZXMvYmFja2dyb3VuZC1pbWFnZS1yb3VuZGVkLmpzJ1xuaW1wb3J0IG5vSW5saW5lU3R5bGVzIGZyb20gJy4vcnVsZXMvbm8taW5saW5lLXN0eWxlcy5qcydcbmltcG9ydCBub0FyYml0cmFyeUNvbG9ycyBmcm9tICcuL3J1bGVzL25vLWFyYml0cmFyeS1jb2xvcnMuanMnXG5cbi8qKlxuICogQWxsIENhbm9uIEVTTGludCBydWxlcyB3aXRoIHJlY29tbWVuZGVkIHNldmVyaXR5IGxldmVsc1xuICovXG5jb25zdCByZWNvbW1lbmRlZCA9IHtcbiAgJ2dhbGxvcC9uby1jbGllbnQtYmxvY2tzJzogJ3dhcm4nLFxuICAnZ2FsbG9wL25vLWNvbnRhaW5lci1pbi1zZWN0aW9uJzogJ3dhcm4nLFxuICAnZ2FsbG9wL3ByZWZlci1jb21wb25lbnQtcHJvcHMnOiAnd2FybicsXG4gICdnYWxsb3AvcHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cyc6ICd3YXJuJyxcbiAgJ2dhbGxvcC9wcmVmZXItbGF5b3V0LWNvbXBvbmVudHMnOiAnd2FybicsXG4gICdnYWxsb3AvYmFja2dyb3VuZC1pbWFnZS1yb3VuZGVkJzogJ3dhcm4nLFxuICAnZ2FsbG9wL25vLWlubGluZS1zdHlsZXMnOiAnd2FybicsXG4gICdnYWxsb3Avbm8tYXJiaXRyYXJ5LWNvbG9ycyc6ICd3YXJuJyxcbn0gYXMgY29uc3RcblxuY29uc3QgcGx1Z2luID0ge1xuICBtZXRhOiB7XG4gICAgbmFtZTogJ2VzbGludC1wbHVnaW4tZ2FsbG9wJyxcbiAgICB2ZXJzaW9uOiAnMi42LjAnLFxuICB9LFxuICBydWxlczoge1xuICAgICduby1jbGllbnQtYmxvY2tzJzogbm9DbGllbnRCbG9ja3MsXG4gICAgJ25vLWNvbnRhaW5lci1pbi1zZWN0aW9uJzogbm9Db250YWluZXJJblNlY3Rpb24sXG4gICAgJ3ByZWZlci1jb21wb25lbnQtcHJvcHMnOiBwcmVmZXJDb21wb25lbnRQcm9wcyxcbiAgICAncHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cyc6IHByZWZlclR5cG9ncmFwaHlDb21wb25lbnRzLFxuICAgICdwcmVmZXItbGF5b3V0LWNvbXBvbmVudHMnOiBwcmVmZXJMYXlvdXRDb21wb25lbnRzLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLXJvdW5kZWQnOiBiYWNrZ3JvdW5kSW1hZ2VSb3VuZGVkLFxuICAgICduby1pbmxpbmUtc3R5bGVzJzogbm9JbmxpbmVTdHlsZXMsXG4gICAgJ25vLWFyYml0cmFyeS1jb2xvcnMnOiBub0FyYml0cmFyeUNvbG9ycyxcbiAgfSxcbiAgLyoqXG4gICAqIFJlY29tbWVuZGVkIHJ1bGUgY29uZmlndXJhdGlvbnMgLSBzcHJlYWQgaW50byB5b3VyIEVTTGludCBjb25maWdcbiAgICogQGV4YW1wbGUgcnVsZXM6IHsgLi4uZ2FsbG9wLnJlY29tbWVuZGVkIH1cbiAgICovXG4gIHJlY29tbWVuZGVkLFxufVxuXG5leHBvcnQgZGVmYXVsdCBwbHVnaW5cbiJdfQ==
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXNsaW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFBO0FBQ3hELE9BQU8sb0JBQW9CLE1BQU0sb0NBQW9DLENBQUE7QUFDckUsT0FBTyxvQkFBb0IsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNwRSxPQUFPLDBCQUEwQixNQUFNLHlDQUF5QyxDQUFBO0FBQ2hGLE9BQU8sc0JBQXNCLE1BQU0scUNBQXFDLENBQUE7QUFDeEUsT0FBTyxzQkFBc0IsTUFBTSxxQ0FBcUMsQ0FBQTtBQUN4RSxPQUFPLGNBQWMsTUFBTSw2QkFBNkIsQ0FBQTtBQUN4RCxPQUFPLGlCQUFpQixNQUFNLGdDQUFnQyxDQUFBO0FBQzlELE9BQU8sa0JBQWtCLE1BQU0sa0NBQWtDLENBQUE7QUFDakUsT0FBTyxhQUFhLE1BQU0sNEJBQTRCLENBQUE7QUFFdEQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsR0FBRztJQUNsQix5QkFBeUIsRUFBRSxNQUFNO0lBQ2pDLGdDQUFnQyxFQUFFLE1BQU07SUFDeEMsK0JBQStCLEVBQUUsTUFBTTtJQUN2QyxxQ0FBcUMsRUFBRSxNQUFNO0lBQzdDLGlDQUFpQyxFQUFFLE1BQU07SUFDekMsaUNBQWlDLEVBQUUsTUFBTTtJQUN6Qyx5QkFBeUIsRUFBRSxNQUFNO0lBQ2pDLDRCQUE0QixFQUFFLE1BQU07SUFDcEMsOEJBQThCLEVBQUUsTUFBTTtJQUN0Qyx3QkFBd0IsRUFBRSxNQUFNO0NBQ3hCLENBQUE7QUFFVixNQUFNLE1BQU0sR0FBRztJQUNiLElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxzQkFBc0I7UUFDNUIsT0FBTyxFQUFFLE9BQU87S0FDakI7SUFDRCxLQUFLLEVBQUU7UUFDTCxrQkFBa0IsRUFBRSxjQUFjO1FBQ2xDLHlCQUF5QixFQUFFLG9CQUFvQjtRQUMvQyx3QkFBd0IsRUFBRSxvQkFBb0I7UUFDOUMsOEJBQThCLEVBQUUsMEJBQTBCO1FBQzFELDBCQUEwQixFQUFFLHNCQUFzQjtRQUNsRCwwQkFBMEIsRUFBRSxzQkFBc0I7UUFDbEQsa0JBQWtCLEVBQUUsY0FBYztRQUNsQyxxQkFBcUIsRUFBRSxpQkFBaUI7UUFDeEMsdUJBQXVCLEVBQUUsa0JBQWtCO1FBQzNDLGlCQUFpQixFQUFFLGFBQWE7S0FDakM7SUFDRDs7O09BR0c7SUFDSCxXQUFXO0NBQ1osQ0FBQTtBQUVELGVBQWUsTUFBTSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vQ2xpZW50QmxvY2tzIGZyb20gJy4vcnVsZXMvbm8tY2xpZW50LWJsb2Nrcy5qcydcbmltcG9ydCBub0NvbnRhaW5lckluU2VjdGlvbiBmcm9tICcuL3J1bGVzL25vLWNvbnRhaW5lci1pbi1zZWN0aW9uLmpzJ1xuaW1wb3J0IHByZWZlckNvbXBvbmVudFByb3BzIGZyb20gJy4vcnVsZXMvcHJlZmVyLWNvbXBvbmVudC1wcm9wcy5qcydcbmltcG9ydCBwcmVmZXJUeXBvZ3JhcGh5Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci10eXBvZ3JhcGh5LWNvbXBvbmVudHMuanMnXG5pbXBvcnQgcHJlZmVyTGF5b3V0Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci1sYXlvdXQtY29tcG9uZW50cy5qcydcbmltcG9ydCBiYWNrZ3JvdW5kSW1hZ2VSb3VuZGVkIGZyb20gJy4vcnVsZXMvYmFja2dyb3VuZC1pbWFnZS1yb3VuZGVkLmpzJ1xuaW1wb3J0IG5vSW5saW5lU3R5bGVzIGZyb20gJy4vcnVsZXMvbm8taW5saW5lLXN0eWxlcy5qcydcbmltcG9ydCBub0FyYml0cmFyeUNvbG9ycyBmcm9tICcuL3J1bGVzL25vLWFyYml0cmFyeS1jb2xvcnMuanMnXG5pbXBvcnQgbm9Dcm9zc1pvbmVJbXBvcnRzIGZyb20gJy4vcnVsZXMvbm8tY3Jvc3Mtem9uZS1pbXBvcnRzLmpzJ1xuaW1wb3J0IG5vRGF0YUltcG9ydHMgZnJvbSAnLi9ydWxlcy9uby1kYXRhLWltcG9ydHMuanMnXG5cbi8qKlxuICogQWxsIENhbm9uIEVTTGludCBydWxlcyB3aXRoIHJlY29tbWVuZGVkIHNldmVyaXR5IGxldmVsc1xuICovXG5jb25zdCByZWNvbW1lbmRlZCA9IHtcbiAgJ2dhbGxvcC9uby1jbGllbnQtYmxvY2tzJzogJ3dhcm4nLFxuICAnZ2FsbG9wL25vLWNvbnRhaW5lci1pbi1zZWN0aW9uJzogJ3dhcm4nLFxuICAnZ2FsbG9wL3ByZWZlci1jb21wb25lbnQtcHJvcHMnOiAnd2FybicsXG4gICdnYWxsb3AvcHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cyc6ICd3YXJuJyxcbiAgJ2dhbGxvcC9wcmVmZXItbGF5b3V0LWNvbXBvbmVudHMnOiAnd2FybicsXG4gICdnYWxsb3AvYmFja2dyb3VuZC1pbWFnZS1yb3VuZGVkJzogJ3dhcm4nLFxuICAnZ2FsbG9wL25vLWlubGluZS1zdHlsZXMnOiAnd2FybicsXG4gICdnYWxsb3Avbm8tYXJiaXRyYXJ5LWNvbG9ycyc6ICd3YXJuJyxcbiAgJ2dhbGxvcC9uby1jcm9zcy16b25lLWltcG9ydHMnOiAnd2FybicsXG4gICdnYWxsb3Avbm8tZGF0YS1pbXBvcnRzJzogJ3dhcm4nLFxufSBhcyBjb25zdFxuXG5jb25zdCBwbHVnaW4gPSB7XG4gIG1ldGE6IHtcbiAgICBuYW1lOiAnZXNsaW50LXBsdWdpbi1nYWxsb3AnLFxuICAgIHZlcnNpb246ICcyLjcuMCcsXG4gIH0sXG4gIHJ1bGVzOiB7XG4gICAgJ25vLWNsaWVudC1ibG9ja3MnOiBub0NsaWVudEJsb2NrcyxcbiAgICAnbm8tY29udGFpbmVyLWluLXNlY3Rpb24nOiBub0NvbnRhaW5lckluU2VjdGlvbixcbiAgICAncHJlZmVyLWNvbXBvbmVudC1wcm9wcyc6IHByZWZlckNvbXBvbmVudFByb3BzLFxuICAgICdwcmVmZXItdHlwb2dyYXBoeS1jb21wb25lbnRzJzogcHJlZmVyVHlwb2dyYXBoeUNvbXBvbmVudHMsXG4gICAgJ3ByZWZlci1sYXlvdXQtY29tcG9uZW50cyc6IHByZWZlckxheW91dENvbXBvbmVudHMsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2Utcm91bmRlZCc6IGJhY2tncm91bmRJbWFnZVJvdW5kZWQsXG4gICAgJ25vLWlubGluZS1zdHlsZXMnOiBub0lubGluZVN0eWxlcyxcbiAgICAnbm8tYXJiaXRyYXJ5LWNvbG9ycyc6IG5vQXJiaXRyYXJ5Q29sb3JzLFxuICAgICduby1jcm9zcy16b25lLWltcG9ydHMnOiBub0Nyb3NzWm9uZUltcG9ydHMsXG4gICAgJ25vLWRhdGEtaW1wb3J0cyc6IG5vRGF0YUltcG9ydHMsXG4gIH0sXG4gIC8qKlxuICAgKiBSZWNvbW1lbmRlZCBydWxlIGNvbmZpZ3VyYXRpb25zIC0gc3ByZWFkIGludG8geW91ciBFU0xpbnQgY29uZmlnXG4gICAqIEBleGFtcGxlIHJ1bGVzOiB7IC4uLmdhbGxvcC5yZWNvbW1lbmRlZCB9XG4gICAqL1xuICByZWNvbW1lbmRlZCxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcGx1Z2luXG4iXX0=
@@ -0,0 +1,6 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ type MessageIds = 'blocksImportBlocks' | 'componentsImportBlocks' | 'runtimeImportScripts';
3
+ declare const _default: ESLintUtils.RuleModule<MessageIds, [], unknown, ESLintUtils.RuleListener> & {
4
+ name: string;
5
+ };
6
+ export default _default;
@@ -0,0 +1,99 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ import { getCanonUrl, getCanonPattern } from '../utils/canon.js';
3
+ const RULE_NAME = 'no-cross-zone-imports';
4
+ const pattern = getCanonPattern(RULE_NAME);
5
+ const createRule = ESLintUtils.RuleCreator(() => getCanonUrl(RULE_NAME));
6
+ /**
7
+ * Determine which zone a file is in based on its path
8
+ */
9
+ function getZone(filename) {
10
+ if (filename.includes('/blocks/') || filename.includes('\\blocks\\')) {
11
+ return 'blocks';
12
+ }
13
+ if (filename.includes('/components/') || filename.includes('\\components\\')) {
14
+ return 'components';
15
+ }
16
+ if (filename.includes('/app/') || filename.includes('\\app\\')) {
17
+ return 'app';
18
+ }
19
+ if (filename.includes('/hooks/') || filename.includes('\\hooks\\')) {
20
+ return 'hooks';
21
+ }
22
+ if (filename.includes('/utils/') || filename.includes('\\utils\\')) {
23
+ return 'utils';
24
+ }
25
+ if (filename.includes('/tools/') || filename.includes('\\tools\\')) {
26
+ return 'tools';
27
+ }
28
+ return null;
29
+ }
30
+ /**
31
+ * Check if an import path targets a specific zone
32
+ */
33
+ function importsZone(importPath, zone) {
34
+ // Handle alias imports like @/blocks/... or @/components/...
35
+ if (importPath.startsWith('@/')) {
36
+ return importPath.startsWith(`@/${zone}/`);
37
+ }
38
+ // Handle relative imports
39
+ return importPath.includes(`/${zone}/`) || importPath.includes(`\\${zone}\\`);
40
+ }
41
+ /**
42
+ * Check if an import targets _scripts
43
+ */
44
+ function importsScripts(importPath) {
45
+ return (importPath.includes('_scripts/') ||
46
+ importPath.includes('_scripts\\') ||
47
+ importPath.startsWith('@/_scripts/'));
48
+ }
49
+ export default createRule({
50
+ name: RULE_NAME,
51
+ meta: {
52
+ type: 'problem',
53
+ docs: {
54
+ description: pattern?.summary || 'Enforce import boundaries between Canon zones',
55
+ },
56
+ messages: {
57
+ blocksImportBlocks: `[Canon ${pattern?.id || '021'}] Blocks cannot import from other blocks. Each block should be self-contained or import from components.`,
58
+ componentsImportBlocks: `[Canon ${pattern?.id || '021'}] Components cannot import from blocks. Blocks compose components, not the other way around.`,
59
+ runtimeImportScripts: `[Canon ${pattern?.id || '021'}] Runtime code cannot import from _scripts/. Scripts are for build-time only.`,
60
+ },
61
+ schema: [],
62
+ },
63
+ defaultOptions: [],
64
+ create(context) {
65
+ const filename = context.filename || context.getFilename();
66
+ const currentZone = getZone(filename);
67
+ // Skip files not in a known zone
68
+ if (!currentZone) {
69
+ return {};
70
+ }
71
+ return {
72
+ ImportDeclaration(node) {
73
+ const importPath = node.source.value;
74
+ // Rule 1: Blocks cannot import from other blocks
75
+ if (currentZone === 'blocks' && importsZone(importPath, 'blocks')) {
76
+ context.report({
77
+ node,
78
+ messageId: 'blocksImportBlocks',
79
+ });
80
+ }
81
+ // Rule 2: Components cannot import from blocks
82
+ if (currentZone === 'components' && importsZone(importPath, 'blocks')) {
83
+ context.report({
84
+ node,
85
+ messageId: 'componentsImportBlocks',
86
+ });
87
+ }
88
+ // Rule 3: No runtime code can import from _scripts
89
+ if (importsScripts(importPath)) {
90
+ context.report({
91
+ node,
92
+ messageId: 'runtimeImportScripts',
93
+ });
94
+ }
95
+ },
96
+ };
97
+ },
98
+ });
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tY3Jvc3Mtem9uZS1pbXBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VzbGludC9ydWxlcy9uby1jcm9zcy16b25lLWltcG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFaEUsTUFBTSxTQUFTLEdBQUcsdUJBQXVCLENBQUE7QUFDekMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBRTFDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7QUFJeEU7O0dBRUc7QUFDSCxTQUFTLE9BQU8sQ0FBQyxRQUFnQjtJQUMvQixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDN0UsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDL0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxPQUFPLE9B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LENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDYixJQUFJO3dCQUNKLFNBQVMsRUFBRSxzQkFBc0I7cUJBQ2xDLENBQUMsQ0FBQTtnQkFDSixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0NBQ0YsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRVNMaW50VXRpbHMgfSBmcm9tICdAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHMnXG5pbXBvcnQgeyBnZXRDYW5vblVybCwgZ2V0Q2Fub25QYXR0ZXJuIH0gZnJvbSAnLi4vdXRpbHMvY2Fub24uanMnXG5cbmNvbnN0IFJVTEVfTkFNRSA9ICduby1jcm9zcy16b25lLWltcG9ydHMnXG5jb25zdCBwYXR0ZXJuID0gZ2V0Q2Fub25QYXR0ZXJuKFJVTEVfTkFNRSlcblxuY29uc3QgY3JlYXRlUnVsZSA9IEVTTGludFV0aWxzLlJ1bGVDcmVhdG9yKCgpID0+IGdldENhbm9uVXJsKFJVTEVfTkFNRSkpXG5cbnR5cGUgTWVzc2FnZUlkcyA9ICdibG9ja3NJbXBvcnRCbG9ja3MnIHwgJ2NvbXBvbmVudHNJbXBvcnRCbG9ja3MnIHwgJ3J1bnRpbWVJbXBvcnRTY3JpcHRzJ1xuXG4vKipcbiAqIERldGVybWluZSB3aGljaCB6b25lIGEgZmlsZSBpcyBpbiBiYXNlZCBvbiBpdHMgcGF0aFxuICovXG5mdW5jdGlvbiBnZXRab25lKGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKCcvYmxvY2tzLycpIHx8IGZpbGVuYW1lLmluY2x1ZGVzKCdcXFxcYmxvY2tzXFxcXCcpKSB7XG4gICAgcmV0dXJuICdibG9ja3MnXG4gIH1cbiAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSB8fCBmaWxlbmFtZS5pbmNsdWRlcygnXFxcXGNvbXBvbmVudHNcXFxcJykpIHtcbiAgICByZXR1cm4gJ2NvbXBvbmVudHMnXG4gIH1cbiAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKCcvYXBwLycpIHx8IGZpbGVuYW1lLmluY2x1ZGVzKCdcXFxcYXBwXFxcXCcpKSB7XG4gICAgcmV0dXJuICdhcHAnXG4gIH1cbiAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKCcvaG9va3MvJykgfHwgZmlsZW5hbWUuaW5jbHVkZXMoJ1xcXFxob29rc1xcXFwnKSkge1xuICAgIHJldHVybiAnaG9va3MnXG4gIH1cbiAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKCcvdXRpbHMvJykgfHwgZmlsZW5hbWUuaW5jbHVkZXMoJ1xcXFx1dGlsc1xcXFwnKSkge1xuICAgIHJldHVybiAndXRpbHMnXG4gIH1cbiAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKCcvdG9vbHMvJykgfHwgZmlsZW5hbWUuaW5jbHVkZXMoJ1xcXFx0b29sc1xcXFwnKSkge1xuICAgIHJldHVybiAndG9vbHMnXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBpbXBvcnQgcGF0aCB0YXJnZXRzIGEgc3BlY2lmaWMgem9uZVxuICovXG5mdW5jdGlvbiBpbXBvcnRzWm9uZShpbXBvcnRQYXRoOiBzdHJpbmcsIHpvbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBIYW5kbGUgYWxpYXMgaW1wb3J0cyBsaWtlIEAvYmxvY2tzLy4uLiBvciBAL2NvbXBvbmVudHMvLi4uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJ0AvJykpIHtcbiAgICByZXR1cm4gaW1wb3J0UGF0aC5zdGFydHNXaXRoKGBALyR7em9uZX0vYClcbiAgfVxuICAvLyBIYW5kbGUgcmVsYXRpdmUgaW1wb3J0c1xuICByZXR1cm4gaW1wb3J0UGF0aC5pbmNsdWRlcyhgLyR7em9uZX0vYCkgfHwgaW1wb3J0UGF0aC5pbmNsdWRlcyhgXFxcXCR7em9uZX1cXFxcYClcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBpbXBvcnQgdGFyZ2V0cyBfc2NyaXB0c1xuICovXG5mdW5jdGlvbiBpbXBvcnRzU2NyaXB0cyhpbXBvcnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpbXBvcnRQYXRoLmluY2x1ZGVzKCdfc2NyaXB0cy8nKSB8fFxuICAgIGltcG9ydFBhdGguaW5jbHVkZXMoJ19zY3JpcHRzXFxcXCcpIHx8XG4gICAgaW1wb3J0UGF0aC5zdGFydHNXaXRoKCdAL19zY3JpcHRzLycpXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlUnVsZTxbXSwgTWVzc2FnZUlkcz4oe1xuICBuYW1lOiBSVUxFX05BTUUsXG4gIG1ldGE6IHtcbiAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIHBhdHRlcm4/LnN1bW1hcnkgfHwgJ0VuZm9yY2UgaW1wb3J0IGJvdW5kYXJpZXMgYmV0d2VlbiBDYW5vbiB6b25lcycsXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgYmxvY2tzSW1wb3J0QmxvY2tzOiBgW0Nhbm9uICR7cGF0dGVybj8uaWQgfHwgJzAyMSd9XSBCbG9ja3MgY2Fubm90IGltcG9ydCBmcm9tIG90aGVyIGJsb2Nrcy4gRWFjaCBibG9jayBzaG91bGQgYmUgc2VsZi1jb250YWluZWQgb3IgaW1wb3J0IGZyb20gY29tcG9uZW50cy5gLFxuICAgICAgY29tcG9uZW50c0ltcG9ydEJsb2NrczogYFtDYW5vbiAke3BhdHRlcm4/LmlkIHx8ICcwMjEnfV0gQ29tcG9uZW50cyBjYW5ub3QgaW1wb3J0IGZyb20gYmxvY2tzLiBCbG9ja3MgY29tcG9zZSBjb21wb25lbnRzLCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQuYCxcbiAgICAgIHJ1bnRpbWVJbXBvcnRTY3JpcHRzOiBgW0Nhbm9uICR7cGF0dGVybj8uaWQgfHwgJzAyMSd9XSBSdW50aW1lIGNvZGUgY2Fubm90IGltcG9ydCBmcm9tIF9zY3JpcHRzLy4gU2NyaXB0cyBhcmUgZm9yIGJ1aWxkLXRpbWUgb25seS5gLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcbiAgZGVmYXVsdE9wdGlvbnM6IFtdLFxuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gY29udGV4dC5maWxlbmFtZSB8fCBjb250ZXh0LmdldEZpbGVuYW1lKClcbiAgICBjb25zdCBjdXJyZW50Wm9uZSA9IGdldFpvbmUoZmlsZW5hbWUpXG5cbiAgICAvLyBTa2lwIGZpbGVzIG5vdCBpbiBhIGtub3duIHpvbmVcbiAgICBpZiAoIWN1cnJlbnRab25lKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbm9kZS5zb3VyY2UudmFsdWUgYXMgc3RyaW5nXG5cbiAgICAgICAgLy8gUnVsZSAxOiBCbG9ja3MgY2Fubm90IGltcG9ydCBmcm9tIG90aGVyIGJsb2Nrc1xuICAgICAgICBpZiAoY3VycmVudFpvbmUgPT09ICdibG9ja3MnICYmIGltcG9ydHNab25lKGltcG9ydFBhdGgsICdibG9ja3MnKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlSWQ6ICdibG9ja3NJbXBvcnRCbG9ja3MnLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdWxlIDI6IENvbXBvbmVudHMgY2Fubm90IGltcG9ydCBmcm9tIGJsb2Nrc1xuICAgICAgICBpZiAoY3VycmVudFpvbmUgPT09ICdjb21wb25lbnRzJyAmJiBpbXBvcnRzWm9uZShpbXBvcnRQYXRoLCAnYmxvY2tzJykpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZUlkOiAnY29tcG9uZW50c0ltcG9ydEJsb2NrcycsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1bGUgMzogTm8gcnVudGltZSBjb2RlIGNhbiBpbXBvcnQgZnJvbSBfc2NyaXB0c1xuICAgICAgICBpZiAoaW1wb3J0c1NjcmlwdHMoaW1wb3J0UGF0aCkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZUlkOiAncnVudGltZUltcG9ydFNjcmlwdHMnLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufSlcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ declare const _default: ESLintUtils.RuleModule<"noDataImports", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ export default _default;
@@ -0,0 +1,49 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ import { getCanonUrl, getCanonPattern } from '../utils/canon.js';
3
+ const RULE_NAME = 'no-data-imports';
4
+ const pattern = getCanonPattern(RULE_NAME);
5
+ const createRule = ESLintUtils.RuleCreator(() => getCanonUrl(RULE_NAME));
6
+ /**
7
+ * Check if an import targets _data
8
+ */
9
+ function importsData(importPath) {
10
+ return (importPath.includes('_data/') ||
11
+ importPath.includes('_data\\') ||
12
+ importPath.startsWith('@/_data/') ||
13
+ importPath === '_data' ||
14
+ importPath === '@/_data');
15
+ }
16
+ export default createRule({
17
+ name: RULE_NAME,
18
+ meta: {
19
+ type: 'problem',
20
+ docs: {
21
+ description: pattern?.summary ||
22
+ 'Prevent runtime code from directly importing _data/ files',
23
+ },
24
+ messages: {
25
+ noDataImports: `[Canon ${pattern?.id || '022'}] Do not import directly from _data/. Use utility functions or fetch data through proper APIs. _data/ is for generated content only.`,
26
+ },
27
+ schema: [],
28
+ },
29
+ defaultOptions: [],
30
+ create(context) {
31
+ const filename = context.filename || context.getFilename();
32
+ // Allow _scripts to import from _data (they generate it)
33
+ if (filename.includes('_scripts/') || filename.includes('_scripts\\')) {
34
+ return {};
35
+ }
36
+ return {
37
+ ImportDeclaration(node) {
38
+ const importPath = node.source.value;
39
+ if (importsData(importPath)) {
40
+ context.report({
41
+ node,
42
+ messageId: 'noDataImports',
43
+ });
44
+ }
45
+ },
46
+ };
47
+ },
48
+ });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tZGF0YS1pbXBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VzbGludC9ydWxlcy9uby1kYXRhLWltcG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFaEUsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUE7QUFDbkMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBRTFDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7QUFJeEU7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxVQUFrQjtJQUNyQyxPQUFPLENBQ0wsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDN0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDOUIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDakMsVUFBVSxLQUFLLE9BQU87UUFDdEIsVUFBVSxLQUFLLFNBQVMsQ0FDekIsQ0FBQTtBQUNILENBQUM7QUFFRCxlQUFlLFVBQVUsQ0FBaUI7SUFDeEMsSUFBSSxFQUFFLFNBQVM7SUFDZixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUksRUFBRTtZQUNKLFdBQVcsRUFDVCxPQUFPLEVBQUUsT0FBTztnQkFDaEIsMkRBQTJEO1NBQzlEO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsYUFBYSxFQUFFLFVBQVUsT0FBTyxFQUFFLEVBQUUsSUFBSSxLQUFLLHNJQUFzSTtTQUNwTDtRQUNELE1BQU0sRUFBRSxFQUFFO0tBQ1g7SUFDRCxjQUFjLEVBQUUsRUFBRTtJQUNsQixNQUFNLENBQUMsT0FBTztRQUNaLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBRTFELHlEQUF5RDtRQUN6RCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxDQUFBO1FBQ1gsQ0FBQztRQUVELE9BQU87WUFDTCxpQkFBaUIsQ0FBQyxJQUFJO2dCQUNwQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQWUsQ0FBQTtnQkFFOUMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDYixJQUFJO3dCQUNKLFNBQVMsRUFBRSxlQUFlO3FCQUMzQixDQUFDLENBQUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7U0FDRixDQUFBO0lBQ0gsQ0FBQztDQUNGLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVTTGludFV0aWxzIH0gZnJvbSAnQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzJ1xuaW1wb3J0IHsgZ2V0Q2Fub25VcmwsIGdldENhbm9uUGF0dGVybiB9IGZyb20gJy4uL3V0aWxzL2Nhbm9uLmpzJ1xuXG5jb25zdCBSVUxFX05BTUUgPSAnbm8tZGF0YS1pbXBvcnRzJ1xuY29uc3QgcGF0dGVybiA9IGdldENhbm9uUGF0dGVybihSVUxFX05BTUUpXG5cbmNvbnN0IGNyZWF0ZVJ1bGUgPSBFU0xpbnRVdGlscy5SdWxlQ3JlYXRvcigoKSA9PiBnZXRDYW5vblVybChSVUxFX05BTUUpKVxuXG50eXBlIE1lc3NhZ2VJZHMgPSAnbm9EYXRhSW1wb3J0cydcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBpbXBvcnQgdGFyZ2V0cyBfZGF0YVxuICovXG5mdW5jdGlvbiBpbXBvcnRzRGF0YShpbXBvcnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpbXBvcnRQYXRoLmluY2x1ZGVzKCdfZGF0YS8nKSB8fFxuICAgIGltcG9ydFBhdGguaW5jbHVkZXMoJ19kYXRhXFxcXCcpIHx8XG4gICAgaW1wb3J0UGF0aC5zdGFydHNXaXRoKCdAL19kYXRhLycpIHx8XG4gICAgaW1wb3J0UGF0aCA9PT0gJ19kYXRhJyB8fFxuICAgIGltcG9ydFBhdGggPT09ICdAL19kYXRhJ1xuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJ1bGU8W10sIE1lc3NhZ2VJZHM+KHtcbiAgbmFtZTogUlVMRV9OQU1FLFxuICBtZXRhOiB7XG4gICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBwYXR0ZXJuPy5zdW1tYXJ5IHx8XG4gICAgICAgICdQcmV2ZW50IHJ1bnRpbWUgY29kZSBmcm9tIGRpcmVjdGx5IGltcG9ydGluZyBfZGF0YS8gZmlsZXMnLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIG5vRGF0YUltcG9ydHM6IGBbQ2Fub24gJHtwYXR0ZXJuPy5pZCB8fCAnMDIyJ31dIERvIG5vdCBpbXBvcnQgZGlyZWN0bHkgZnJvbSBfZGF0YS8uIFVzZSB1dGlsaXR5IGZ1bmN0aW9ucyBvciBmZXRjaCBkYXRhIHRocm91Z2ggcHJvcGVyIEFQSXMuIF9kYXRhLyBpcyBmb3IgZ2VuZXJhdGVkIGNvbnRlbnQgb25seS5gLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcbiAgZGVmYXVsdE9wdGlvbnM6IFtdLFxuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gY29udGV4dC5maWxlbmFtZSB8fCBjb250ZXh0LmdldEZpbGVuYW1lKClcblxuICAgIC8vIEFsbG93IF9zY3JpcHRzIHRvIGltcG9ydCBmcm9tIF9kYXRhICh0aGV5IGdlbmVyYXRlIGl0KVxuICAgIGlmIChmaWxlbmFtZS5pbmNsdWRlcygnX3NjcmlwdHMvJykgfHwgZmlsZW5hbWUuaW5jbHVkZXMoJ19zY3JpcHRzXFxcXCcpKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbm9kZS5zb3VyY2UudmFsdWUgYXMgc3RyaW5nXG5cbiAgICAgICAgaWYgKGltcG9ydHNEYXRhKGltcG9ydFBhdGgpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogJ25vRGF0YUltcG9ydHMnLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufSlcbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gallop.software/canon",
3
- "version": "2.6.0",
3
+ "version": "2.7.1",
4
4
  "type": "module",
5
5
  "description": "Gallop Canon - Architecture patterns, ESLint plugin, and CLI for template governance",
6
6
  "main": "dist/index.js",
package/schema.json CHANGED
@@ -240,6 +240,36 @@
240
240
  "enforcement": "eslint",
241
241
  "rule": "gallop/no-arbitrary-colors",
242
242
  "summary": "Use defined color tokens, not arbitrary color values"
243
+ },
244
+ {
245
+ "id": "021",
246
+ "title": "Cross-Zone Import Boundaries",
247
+ "file": "patterns/021-cross-zone-imports.md",
248
+ "category": "structure",
249
+ "status": "stable",
250
+ "enforcement": "eslint",
251
+ "rule": "gallop/no-cross-zone-imports",
252
+ "summary": "Enforce import boundaries between Canon zones"
253
+ },
254
+ {
255
+ "id": "022",
256
+ "title": "No Data Direct Imports",
257
+ "file": "patterns/022-no-data-imports.md",
258
+ "category": "structure",
259
+ "status": "stable",
260
+ "enforcement": "eslint",
261
+ "rule": "gallop/no-data-imports",
262
+ "summary": "Prevent runtime code from importing _data/ directly"
263
+ },
264
+ {
265
+ "id": "023",
266
+ "title": "File Placement Authority",
267
+ "file": "patterns/023-file-placement.md",
268
+ "category": "structure",
269
+ "status": "stable",
270
+ "enforcement": "cli",
271
+ "rule": "gallop validate",
272
+ "summary": "All files must be in Canon-defined zones"
243
273
  }
244
274
  ],
245
275
  "guarantees": [
@@ -1,13 +0,0 @@
1
- /**
2
- * Speedwell template configuration for ESLint flat config
3
- * Enables all Gallop rules relevant to the Speedwell architecture
4
- */
5
- declare const speedwellRules: {
6
- readonly 'gallop/no-client-blocks': "warn";
7
- readonly 'gallop/no-container-in-section': "warn";
8
- readonly 'gallop/prefer-component-props': "warn";
9
- readonly 'gallop/prefer-typography-components': "warn";
10
- readonly 'gallop/prefer-layout-components': "warn";
11
- readonly 'gallop/background-image-rounded': "warn";
12
- };
13
- export default speedwellRules;
@@ -1,20 +0,0 @@
1
- /**
2
- * Speedwell template configuration for ESLint flat config
3
- * Enables all Gallop rules relevant to the Speedwell architecture
4
- */
5
- const speedwellRules = {
6
- // Blocks should be server components - extract client logic to components
7
- 'gallop/no-client-blocks': 'warn',
8
- // Section already provides containment
9
- 'gallop/no-container-in-section': 'warn',
10
- // Use component props instead of className for style values
11
- 'gallop/prefer-component-props': 'warn',
12
- // Use Typography components instead of raw p/span tags
13
- 'gallop/prefer-typography-components': 'warn',
14
- // Use Grid/Columns instead of raw div with grid classes
15
- 'gallop/prefer-layout-components': 'warn',
16
- // Background images must have rounded="rounded-none"
17
- 'gallop/background-image-rounded': 'warn',
18
- };
19
- export default speedwellRules;
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlZWR3ZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VzbGludC9jb25maWdzL3NwZWVkd2VsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLGNBQWMsR0FBRztJQUNyQiwwRUFBMEU7SUFDMUUseUJBQXlCLEVBQUUsTUFBTTtJQUVqQyx1Q0FBdUM7SUFDdkMsZ0NBQWdDLEVBQUUsTUFBTTtJQUV4Qyw0REFBNEQ7SUFDNUQsK0JBQStCLEVBQUUsTUFBTTtJQUV2Qyx1REFBdUQ7SUFDdkQscUNBQXFDLEVBQUUsTUFBTTtJQUU3Qyx3REFBd0Q7SUFDeEQsaUNBQWlDLEVBQUUsTUFBTTtJQUV6QyxxREFBcUQ7SUFDckQsaUNBQWlDLEVBQUUsTUFBTTtDQUNqQyxDQUFBO0FBRVYsZUFBZSxjQUFjLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNwZWVkd2VsbCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uIGZvciBFU0xpbnQgZmxhdCBjb25maWdcbiAqIEVuYWJsZXMgYWxsIEdhbGxvcCBydWxlcyByZWxldmFudCB0byB0aGUgU3BlZWR3ZWxsIGFyY2hpdGVjdHVyZVxuICovXG5jb25zdCBzcGVlZHdlbGxSdWxlcyA9IHtcbiAgLy8gQmxvY2tzIHNob3VsZCBiZSBzZXJ2ZXIgY29tcG9uZW50cyAtIGV4dHJhY3QgY2xpZW50IGxvZ2ljIHRvIGNvbXBvbmVudHNcbiAgJ2dhbGxvcC9uby1jbGllbnQtYmxvY2tzJzogJ3dhcm4nLFxuXG4gIC8vIFNlY3Rpb24gYWxyZWFkeSBwcm92aWRlcyBjb250YWlubWVudFxuICAnZ2FsbG9wL25vLWNvbnRhaW5lci1pbi1zZWN0aW9uJzogJ3dhcm4nLFxuXG4gIC8vIFVzZSBjb21wb25lbnQgcHJvcHMgaW5zdGVhZCBvZiBjbGFzc05hbWUgZm9yIHN0eWxlIHZhbHVlc1xuICAnZ2FsbG9wL3ByZWZlci1jb21wb25lbnQtcHJvcHMnOiAnd2FybicsXG5cbiAgLy8gVXNlIFR5cG9ncmFwaHkgY29tcG9uZW50cyBpbnN0ZWFkIG9mIHJhdyBwL3NwYW4gdGFnc1xuICAnZ2FsbG9wL3ByZWZlci10eXBvZ3JhcGh5LWNvbXBvbmVudHMnOiAnd2FybicsXG5cbiAgLy8gVXNlIEdyaWQvQ29sdW1ucyBpbnN0ZWFkIG9mIHJhdyBkaXYgd2l0aCBncmlkIGNsYXNzZXNcbiAgJ2dhbGxvcC9wcmVmZXItbGF5b3V0LWNvbXBvbmVudHMnOiAnd2FybicsXG5cbiAgLy8gQmFja2dyb3VuZCBpbWFnZXMgbXVzdCBoYXZlIHJvdW5kZWQ9XCJyb3VuZGVkLW5vbmVcIlxuICAnZ2FsbG9wL2JhY2tncm91bmQtaW1hZ2Utcm91bmRlZCc6ICd3YXJuJyxcbn0gYXMgY29uc3RcblxuZXhwb3J0IGRlZmF1bHQgc3BlZWR3ZWxsUnVsZXNcbiJdfQ==