@gallop.software/canon 2.3.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,7 @@ const rule = {
12
12
  messages: {
13
13
  useParagraph: `[Canon ${pattern?.id || '003'}] Use the Paragraph component instead of <p>. Import: import { Paragraph } from "@/components"`,
14
14
  useSpan: `[Canon ${pattern?.id || '003'}] Use the Span component instead of <span> for text content. Import: import { Span } from "@/components"`,
15
+ useTypographyForDiv: `[Canon ${pattern?.id || '003'}] Use a typography component (Heading, Paragraph, Label, etc.) instead of <div> with text content.`,
15
16
  },
16
17
  schema: [],
17
18
  },
@@ -21,70 +22,109 @@ const rule = {
21
22
  if (!filename.includes('/blocks/')) {
22
23
  return {};
23
24
  }
25
+ const typographyComponents = ['Heading', 'Paragraph', 'Label', 'Span', 'Quote', 'Subheading', 'Accent'];
26
+ /**
27
+ * Check if element is inside a typography component
28
+ */
29
+ function isInsideTypographyComponent(node) {
30
+ let parent = node.parent;
31
+ while (parent) {
32
+ if (parent.type === 'JSXElement' &&
33
+ parent.openingElement?.name?.name &&
34
+ typographyComponents.includes(parent.openingElement.name.name)) {
35
+ return true;
36
+ }
37
+ parent = parent.parent;
38
+ }
39
+ return false;
40
+ }
41
+ /**
42
+ * Check if element has direct text content
43
+ */
44
+ function hasDirectTextContent(node) {
45
+ const jsxElement = node.parent;
46
+ if (jsxElement?.type !== 'JSXElement')
47
+ return false;
48
+ const children = jsxElement.children || [];
49
+ return children.some((child) => {
50
+ // Check for direct text content
51
+ if (child.type === 'JSXText') {
52
+ return child.value.trim().length > 0;
53
+ }
54
+ // Check for expression with literal string
55
+ if (child.type === 'JSXExpressionContainer' && child.expression?.type === 'Literal') {
56
+ return typeof child.expression.value === 'string' && child.expression.value.trim().length > 0;
57
+ }
58
+ return false;
59
+ });
60
+ }
61
+ /**
62
+ * Check className for specific patterns
63
+ */
64
+ function getClassNameInfo(node) {
65
+ let isGradientText = false;
66
+ let isVisualElement = false;
67
+ let hasTextClasses = false;
68
+ node.attributes?.forEach((attr) => {
69
+ if (attr.type === 'JSXAttribute' && attr.name?.name === 'className') {
70
+ const value = attr.value?.value || '';
71
+ // Skip gradient text (bg-clip-text is used for gradient text effects)
72
+ if (/\bbg-clip-text\b/.test(value)) {
73
+ isGradientText = true;
74
+ }
75
+ // Visual elements (dots, decorative elements with w-/h- but no text classes)
76
+ if (/\b(w-\d|h-\d|rounded-full)\b/.test(value) && !/\btext-/.test(value)) {
77
+ isVisualElement = true;
78
+ }
79
+ // Has text-related classes
80
+ if (/\b(text-|font-|leading-|tracking-)/.test(value)) {
81
+ hasTextClasses = true;
82
+ }
83
+ }
84
+ });
85
+ return { isGradientText, isVisualElement, hasTextClasses };
86
+ }
24
87
  return {
25
88
  JSXOpeningElement(node) {
26
89
  const elementName = node.name?.name;
90
+ // Check <p> tags
27
91
  if (elementName === 'p') {
28
92
  context.report({
29
93
  node,
30
94
  messageId: 'useParagraph',
31
95
  });
96
+ return;
32
97
  }
98
+ // Check <span> tags
33
99
  if (elementName === 'span') {
34
- // Skip spans that are inside typography components (Heading, Paragraph, Label, etc.)
35
- // These are used for inline styling effects like gradient text, emphasis, etc.
36
- const typographyComponents = ['Heading', 'Paragraph', 'Label', 'Span', 'Quote', 'Subheading', 'Accent'];
37
- let parent = node.parent;
38
- while (parent) {
39
- if (parent.type === 'JSXElement' &&
40
- parent.openingElement?.name?.name &&
41
- typographyComponents.includes(parent.openingElement.name.name)) {
42
- // Span is inside a typography component, skip warning
43
- return;
44
- }
45
- parent = parent.parent;
100
+ if (isInsideTypographyComponent(node)) {
101
+ return;
46
102
  }
47
- // Check className for gradient text (skip these)
48
- let isGradientText = false;
49
- let isVisualElement = false;
50
- node.attributes?.forEach((attr) => {
51
- if (attr.type === 'JSXAttribute' && attr.name?.name === 'className') {
52
- const value = attr.value?.value || '';
53
- // Skip gradient text spans (bg-clip-text is used for gradient text effects)
54
- if (/\bbg-clip-text\b/.test(value)) {
55
- isGradientText = true;
56
- }
57
- // Skip visual elements (dots, decorative elements with w-/h- but no text)
58
- if (/\b(w-\d|h-\d|rounded-full)\b/.test(value) && !/\btext-/.test(value)) {
59
- isVisualElement = true;
60
- }
61
- }
62
- });
63
- if (isGradientText) {
103
+ const { isGradientText, isVisualElement } = getClassNameInfo(node);
104
+ if (isGradientText || isVisualElement) {
105
+ return;
106
+ }
107
+ if (hasDirectTextContent(node)) {
108
+ context.report({
109
+ node,
110
+ messageId: 'useSpan',
111
+ });
112
+ }
113
+ return;
114
+ }
115
+ // Check <div> tags with text content and text styling
116
+ if (elementName === 'div') {
117
+ if (isInsideTypographyComponent(node)) {
64
118
  return;
65
119
  }
66
- // Check if span contains text content
67
- const jsxElement = node.parent;
68
- if (jsxElement?.type === 'JSXElement') {
69
- const children = jsxElement.children || [];
70
- const hasTextContent = children.some((child) => {
71
- // Check for direct text content
72
- if (child.type === 'JSXText') {
73
- return child.value.trim().length > 0;
74
- }
75
- // Check for expression with literal string
76
- if (child.type === 'JSXExpressionContainer' && child.expression?.type === 'Literal') {
77
- return typeof child.expression.value === 'string' && child.expression.value.trim().length > 0;
78
- }
79
- return false;
120
+ const { hasTextClasses } = getClassNameInfo(node);
121
+ // Only flag divs that have both text content AND text-related classes
122
+ // This indicates it's being used for typography rather than layout
123
+ if (hasTextClasses && hasDirectTextContent(node)) {
124
+ context.report({
125
+ node,
126
+ messageId: 'useTypographyForDiv',
80
127
  });
81
- // Warn if span has text content and is not a visual element
82
- if (hasTextContent && !isVisualElement) {
83
- context.report({
84
- node,
85
- messageId: 'useSpan',
86
- });
87
- }
88
128
  }
89
129
  }
90
130
  },
@@ -92,4 +132,4 @@ const rule = {
92
132
  },
93
133
  };
94
134
  export default rule;
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lc2xpbnQvcnVsZXMvcHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWhFLE1BQU0sU0FBUyxHQUFHLDhCQUE4QixDQUFBO0FBQ2hELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUUxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLFlBQVk7UUFDbEIsSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksa0NBQWtDO1lBQ25FLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLEdBQUcsRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDO1NBQzVCO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsWUFBWSxFQUFFLFVBQVUsT0FBTyxFQUFFLEVBQUUsSUFBSSxLQUFLLGdHQUFnRztZQUM1SSxPQUFPLEVBQUUsVUFBVSxPQUFPLEVBQUUsRUFBRSxJQUFJLEtBQUssMEdBQTBHO1NBQ2xKO1FBQ0QsTUFBTSxFQUFFLEVBQUU7S0FDWDtJQUVELE1BQU0sQ0FBQyxPQUFPO1FBQ1osTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFMUQsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxFQUFFLENBQUE7UUFDWCxDQUFDO1FBRUQsT0FBTztZQUNMLGlCQUFpQixDQUFDLElBQVM7Z0JBQ3pCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFBO2dCQUVu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RixDQUFDOzRCQUNELE9BQU8sS0FBSyxDQUFBO3dCQUNkLENBQUMsQ0FBQyxDQUFBO3dCQUVGLDREQUE0RDt3QkFDNUQsSUFBSSxjQUFjLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0QkFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQ0FDYixJQUFJO2dDQUNKLFNBQVMsRUFBRSxTQUFTOzZCQUNyQixDQUFDLENBQUE7d0JBQ0osQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFBO0FBRUQsZUFBZSxJQUFJLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tICdlc2xpbnQnXG5pbXBvcnQgeyBnZXRDYW5vblVybCwgZ2V0Q2Fub25QYXR0ZXJuIH0gZnJvbSAnLi4vdXRpbHMvY2Fub24uanMnXG5cbmNvbnN0IFJVTEVfTkFNRSA9ICdwcmVmZXItdHlwb2dyYXBoeS1jb21wb25lbnRzJ1xuY29uc3QgcGF0dGVybiA9IGdldENhbm9uUGF0dGVybihSVUxFX05BTUUpXG5cbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogcGF0dGVybj8uc3VtbWFyeSB8fCAnVXNlIFBhcmFncmFwaC9TcGFuLCBub3QgcmF3IHRhZ3MnLFxuICAgICAgcmVjb21tZW5kZWQ6IHRydWUsXG4gICAgICB1cmw6IGdldENhbm9uVXJsKFJVTEVfTkFNRSksXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgdXNlUGFyYWdyYXBoOiBgW0Nhbm9uICR7cGF0dGVybj8uaWQgfHwgJzAwMyd9XSBVc2UgdGhlIFBhcmFncmFwaCBjb21wb25lbnQgaW5zdGVhZCBvZiA8cD4uIEltcG9ydDogaW1wb3J0IHsgUGFyYWdyYXBoIH0gZnJvbSBcIkAvY29tcG9uZW50c1wiYCxcbiAgICAgIHVzZVNwYW46IGBbQ2Fub24gJHtwYXR0ZXJuPy5pZCB8fCAnMDAzJ31dIFVzZSB0aGUgU3BhbiBjb21wb25lbnQgaW5zdGVhZCBvZiA8c3Bhbj4gZm9yIHRleHQgY29udGVudC4gSW1wb3J0OiBpbXBvcnQgeyBTcGFuIH0gZnJvbSBcIkAvY29tcG9uZW50c1wiYCxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGNvbnRleHQuZmlsZW5hbWUgfHwgY29udGV4dC5nZXRGaWxlbmFtZSgpXG5cbiAgICAvLyBPbmx5IGFwcGx5IHRvIGJsb2NrIGZpbGVzXG4gICAgaWYgKCFmaWxlbmFtZS5pbmNsdWRlcygnL2Jsb2Nrcy8nKSkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEpTWE9wZW5pbmdFbGVtZW50KG5vZGU6IGFueSkge1xuICAgICAgICBjb25zdCBlbGVtZW50TmFtZSA9IG5vZGUubmFtZT8ubmFtZVxuXG4gICAgICAgIGlmIChlbGVtZW50TmFtZSA9PT0gJ3AnKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogJ3VzZVBhcmFncmFwaCcsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50TmFtZSA9PT0gJ3NwYW4nKSB7XG4gICAgICAgICAgLy8gU2tpcCBzcGFucyB0aGF0IGFyZSBpbnNpZGUgdHlwb2dyYXBoeSBjb21wb25lbnRzIChIZWFkaW5nLCBQYXJhZ3JhcGgsIExhYmVsLCBldGMuKVxuICAgICAgICAgIC8vIFRoZXNlIGFyZSB1c2VkIGZvciBpbmxpbmUgc3R5bGluZyBlZmZlY3RzIGxpa2UgZ3JhZGllbnQgdGV4dCwgZW1waGFzaXMsIGV0Yy5cbiAgICAgICAgICBjb25zdCB0eXBvZ3JhcGh5Q29tcG9uZW50cyA9IFsnSGVhZGluZycsICdQYXJhZ3JhcGgnLCAnTGFiZWwnLCAnU3BhbicsICdRdW90ZScsICdTdWJoZWFkaW5nJywgJ0FjY2VudCddXG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50XG4gICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwYXJlbnQudHlwZSA9PT0gJ0pTWEVsZW1lbnQnICYmXG4gICAgICAgICAgICAgIHBhcmVudC5vcGVuaW5nRWxlbWVudD8ubmFtZT8ubmFtZSAmJlxuICAgICAgICAgICAgICB0eXBvZ3JhcGh5Q29tcG9uZW50cy5pbmNsdWRlcyhwYXJlbnQub3BlbmluZ0VsZW1lbnQubmFtZS5uYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIFNwYW4gaXMgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb21wb25lbnQsIHNraXAgd2FybmluZ1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBjbGFzc05hbWUgZm9yIGdyYWRpZW50IHRleHQgKHNraXAgdGhlc2UpXG4gICAgICAgICAgbGV0IGlzR3JhZGllbnRUZXh0ID0gZmFsc2VcbiAgICAgICAgICBsZXQgaXNWaXN1YWxFbGVtZW50ID0gZmFsc2VcblxuICAgICAgICAgIG5vZGUuYXR0cmlidXRlcz8uZm9yRWFjaCgoYXR0cjogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoYXR0ci50eXBlID09PSAnSlNYQXR0cmlidXRlJyAmJiBhdHRyLm5hbWU/Lm5hbWUgPT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXR0ci52YWx1ZT8udmFsdWUgfHwgJydcbiAgICAgICAgICAgICAgLy8gU2tpcCBncmFkaWVudCB0ZXh0IHNwYW5zIChiZy1jbGlwLXRleHQgaXMgdXNlZCBmb3IgZ3JhZGllbnQgdGV4dCBlZmZlY3RzKVxuICAgICAgICAgICAgICBpZiAoL1xcYmJnLWNsaXAtdGV4dFxcYi8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpc0dyYWRpZW50VGV4dCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTa2lwIHZpc3VhbCBlbGVtZW50cyAoZG90cywgZGVjb3JhdGl2ZSBlbGVtZW50cyB3aXRoIHctL2gtIGJ1dCBubyB0ZXh0KVxuICAgICAgICAgICAgICBpZiAoL1xcYih3LVxcZHxoLVxcZHxyb3VuZGVkLWZ1bGwpXFxiLy50ZXN0KHZhbHVlKSAmJiAhL1xcYnRleHQtLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlzVmlzdWFsRWxlbWVudCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoaXNHcmFkaWVudFRleHQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHNwYW4gY29udGFpbnMgdGV4dCBjb250ZW50XG4gICAgICAgICAgY29uc3QganN4RWxlbWVudCA9IG5vZGUucGFyZW50XG4gICAgICAgICAgaWYgKGpzeEVsZW1lbnQ/LnR5cGUgPT09ICdKU1hFbGVtZW50Jykge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBqc3hFbGVtZW50LmNoaWxkcmVuIHx8IFtdXG4gICAgICAgICAgICBjb25zdCBoYXNUZXh0Q29udGVudCA9IGNoaWxkcmVuLnNvbWUoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGRpcmVjdCB0ZXh0IGNvbnRlbnRcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdKU1hUZXh0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC52YWx1ZS50cmltKCkubGVuZ3RoID4gMFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHByZXNzaW9uIHdpdGggbGl0ZXJhbCBzdHJpbmdcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdKU1hFeHByZXNzaW9uQ29udGFpbmVyJyAmJiBjaGlsZC5leHByZXNzaW9uPy50eXBlID09PSAnTGl0ZXJhbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGNoaWxkLmV4cHJlc3Npb24udmFsdWUgPT09ICdzdHJpbmcnICYmIGNoaWxkLmV4cHJlc3Npb24udmFsdWUudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIC8vIFdhcm4gaWYgc3BhbiBoYXMgdGV4dCBjb250ZW50IGFuZCBpcyBub3QgYSB2aXN1YWwgZWxlbWVudFxuICAgICAgICAgICAgaWYgKGhhc1RleHRDb250ZW50ICYmICFpc1Zpc3VhbEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiAndXNlU3BhbicsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcnVsZVxuIl19
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lc2xpbnQvcnVsZXMvcHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWhFLE1BQU0sU0FBUyxHQUFHLDhCQUE4QixDQUFBO0FBQ2hELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUUxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLFlBQVk7UUFDbEIsSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksa0NBQWtDO1lBQ25FLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLEdBQUcsRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDO1NBQzVCO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsWUFBWSxFQUFFLFVBQVUsT0FBTyxFQUFFLEVBQUUsSUFBSSxLQUFLLGdHQUFnRztZQUM1SSxPQUFPLEVBQUUsVUFBVSxPQUFPLEVBQUUsRUFBRSxJQUFJLEtBQUssMEdBQTBHO1lBQ2pKLG1CQUFtQixFQUFFLFVBQVUsT0FBTyxFQUFFLEVBQUUsSUFBSSxLQUFLLG9HQUFvRztTQUN4SjtRQUNELE1BQU0sRUFBRSxFQUFFO0tBQ1g7SUFFRCxNQUFNLENBQUMsT0FBTztRQUNaLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBRTFELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sRUFBRSxDQUFBO1FBQ1gsQ0FBQztRQUVELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFTLEVB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QUVqRCxzRUFBc0U7b0JBQ3RFLG1FQUFtRTtvQkFDbkUsSUFBSSxjQUFjLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDakQsT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDYixJQUFJOzRCQUNKLFNBQVMsRUFBRSxxQkFBcUI7eUJBQ2pDLENBQUMsQ0FBQTtvQkFDSixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFBO0FBRUQsZUFBZSxJQUFJLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tICdlc2xpbnQnXG5pbXBvcnQgeyBnZXRDYW5vblVybCwgZ2V0Q2Fub25QYXR0ZXJuIH0gZnJvbSAnLi4vdXRpbHMvY2Fub24uanMnXG5cbmNvbnN0IFJVTEVfTkFNRSA9ICdwcmVmZXItdHlwb2dyYXBoeS1jb21wb25lbnRzJ1xuY29uc3QgcGF0dGVybiA9IGdldENhbm9uUGF0dGVybihSVUxFX05BTUUpXG5cbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogcGF0dGVybj8uc3VtbWFyeSB8fCAnVXNlIFBhcmFncmFwaC9TcGFuLCBub3QgcmF3IHRhZ3MnLFxuICAgICAgcmVjb21tZW5kZWQ6IHRydWUsXG4gICAgICB1cmw6IGdldENhbm9uVXJsKFJVTEVfTkFNRSksXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgdXNlUGFyYWdyYXBoOiBgW0Nhbm9uICR7cGF0dGVybj8uaWQgfHwgJzAwMyd9XSBVc2UgdGhlIFBhcmFncmFwaCBjb21wb25lbnQgaW5zdGVhZCBvZiA8cD4uIEltcG9ydDogaW1wb3J0IHsgUGFyYWdyYXBoIH0gZnJvbSBcIkAvY29tcG9uZW50c1wiYCxcbiAgICAgIHVzZVNwYW46IGBbQ2Fub24gJHtwYXR0ZXJuPy5pZCB8fCAnMDAzJ31dIFVzZSB0aGUgU3BhbiBjb21wb25lbnQgaW5zdGVhZCBvZiA8c3Bhbj4gZm9yIHRleHQgY29udGVudC4gSW1wb3J0OiBpbXBvcnQgeyBTcGFuIH0gZnJvbSBcIkAvY29tcG9uZW50c1wiYCxcbiAgICAgIHVzZVR5cG9ncmFwaHlGb3JEaXY6IGBbQ2Fub24gJHtwYXR0ZXJuPy5pZCB8fCAnMDAzJ31dIFVzZSBhIHR5cG9ncmFwaHkgY29tcG9uZW50IChIZWFkaW5nLCBQYXJhZ3JhcGgsIExhYmVsLCBldGMuKSBpbnN0ZWFkIG9mIDxkaXY+IHdpdGggdGV4dCBjb250ZW50LmAsXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBjb250ZXh0LmZpbGVuYW1lIHx8IGNvbnRleHQuZ2V0RmlsZW5hbWUoKVxuXG4gICAgLy8gT25seSBhcHBseSB0byBibG9jayBmaWxlc1xuICAgIGlmICghZmlsZW5hbWUuaW5jbHVkZXMoJy9ibG9ja3MvJykpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIGNvbnN0IHR5cG9ncmFwaHlDb21wb25lbnRzID0gWydIZWFkaW5nJywgJ1BhcmFncmFwaCcsICdMYWJlbCcsICdTcGFuJywgJ1F1b3RlJywgJ1N1YmhlYWRpbmcnLCAnQWNjZW50J11cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGVsZW1lbnQgaXMgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0luc2lkZVR5cG9ncmFwaHlDb21wb25lbnQobm9kZTogYW55KTogYm9vbGVhbiB7XG4gICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnRcbiAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhcmVudC50eXBlID09PSAnSlNYRWxlbWVudCcgJiZcbiAgICAgICAgICBwYXJlbnQub3BlbmluZ0VsZW1lbnQ/Lm5hbWU/Lm5hbWUgJiZcbiAgICAgICAgICB0eXBvZ3JhcGh5Q29tcG9uZW50cy5pbmNsdWRlcyhwYXJlbnQub3BlbmluZ0VsZW1lbnQubmFtZS5uYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGVsZW1lbnQgaGFzIGRpcmVjdCB0ZXh0IGNvbnRlbnRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNEaXJlY3RUZXh0Q29udGVudChub2RlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IGpzeEVsZW1lbnQgPSBub2RlLnBhcmVudFxuICAgICAgaWYgKGpzeEVsZW1lbnQ/LnR5cGUgIT09ICdKU1hFbGVtZW50JykgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0ganN4RWxlbWVudC5jaGlsZHJlbiB8fCBbXVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvbWUoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGRpcmVjdCB0ZXh0IGNvbnRlbnRcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdKU1hUZXh0Jykge1xuICAgICAgICAgIHJldHVybiBjaGlsZC52YWx1ZS50cmltKCkubGVuZ3RoID4gMFxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBleHByZXNzaW9uIHdpdGggbGl0ZXJhbCBzdHJpbmdcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdKU1hFeHByZXNzaW9uQ29udGFpbmVyJyAmJiBjaGlsZC5leHByZXNzaW9uPy50eXBlID09PSAnTGl0ZXJhbCcpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGNoaWxkLmV4cHJlc3Npb24udmFsdWUgPT09ICdzdHJpbmcnICYmIGNoaWxkLmV4cHJlc3Npb24udmFsdWUudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgY2xhc3NOYW1lIGZvciBzcGVjaWZpYyBwYXR0ZXJuc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldENsYXNzTmFtZUluZm8obm9kZTogYW55KTogeyBpc0dyYWRpZW50VGV4dDogYm9vbGVhbjsgaXNWaXN1YWxFbGVtZW50OiBib29sZWFuOyBoYXNUZXh0Q2xhc3NlczogYm9vbGVhbiB9IHtcbiAgICAgIGxldCBpc0dyYWRpZW50VGV4dCA9IGZhbHNlXG4gICAgICBsZXQgaXNWaXN1YWxFbGVtZW50ID0gZmFsc2VcbiAgICAgIGxldCBoYXNUZXh0Q2xhc3NlcyA9IGZhbHNlXG5cbiAgICAgIG5vZGUuYXR0cmlidXRlcz8uZm9yRWFjaCgoYXR0cjogYW55KSA9PiB7XG4gICAgICAgIGlmIChhdHRyLnR5cGUgPT09ICdKU1hBdHRyaWJ1dGUnICYmIGF0dHIubmFtZT8ubmFtZSA9PT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF0dHIudmFsdWU/LnZhbHVlIHx8ICcnXG4gICAgICAgICAgLy8gU2tpcCBncmFkaWVudCB0ZXh0IChiZy1jbGlwLXRleHQgaXMgdXNlZCBmb3IgZ3JhZGllbnQgdGV4dCBlZmZlY3RzKVxuICAgICAgICAgIGlmICgvXFxiYmctY2xpcC10ZXh0XFxiLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgaXNHcmFkaWVudFRleHQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFZpc3VhbCBlbGVtZW50cyAoZG90cywgZGVjb3JhdGl2ZSBlbGVtZW50cyB3aXRoIHctL2gtIGJ1dCBubyB0ZXh0IGNsYXNzZXMpXG4gICAgICAgICAgaWYgKC9cXGIody1cXGR8aC1cXGR8cm91bmRlZC1mdWxsKVxcYi8udGVzdCh2YWx1ZSkgJiYgIS9cXGJ0ZXh0LS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlzVmlzdWFsRWxlbWVudCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSGFzIHRleHQtcmVsYXRlZCBjbGFzc2VzXG4gICAgICAgICAgaWYgKC9cXGIodGV4dC18Zm9udC18bGVhZGluZy18dHJhY2tpbmctKS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGhhc1RleHRDbGFzc2VzID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHsgaXNHcmFkaWVudFRleHQsIGlzVmlzdWFsRWxlbWVudCwgaGFzVGV4dENsYXNzZXMgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBKU1hPcGVuaW5nRWxlbWVudChub2RlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBub2RlLm5hbWU/Lm5hbWVcblxuICAgICAgICAvLyBDaGVjayA8cD4gdGFnc1xuICAgICAgICBpZiAoZWxlbWVudE5hbWUgPT09ICdwJykge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlSWQ6ICd1c2VQYXJhZ3JhcGgnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayA8c3Bhbj4gdGFnc1xuICAgICAgICBpZiAoZWxlbWVudE5hbWUgPT09ICdzcGFuJykge1xuICAgICAgICAgIGlmIChpc0luc2lkZVR5cG9ncmFwaHlDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgaXNHcmFkaWVudFRleHQsIGlzVmlzdWFsRWxlbWVudCB9ID0gZ2V0Q2xhc3NOYW1lSW5mbyhub2RlKVxuXG4gICAgICAgICAgaWYgKGlzR3JhZGllbnRUZXh0IHx8IGlzVmlzdWFsRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc0RpcmVjdFRleHRDb250ZW50KG5vZGUpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIG1lc3NhZ2VJZDogJ3VzZVNwYW4nLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayA8ZGl2PiB0YWdzIHdpdGggdGV4dCBjb250ZW50IGFuZCB0ZXh0IHN0eWxpbmdcbiAgICAgICAgaWYgKGVsZW1lbnROYW1lID09PSAnZGl2Jykge1xuICAgICAgICAgIGlmIChpc0luc2lkZVR5cG9ncmFwaHlDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgaGFzVGV4dENsYXNzZXMgfSA9IGdldENsYXNzTmFtZUluZm8obm9kZSlcblxuICAgICAgICAgIC8vIE9ubHkgZmxhZyBkaXZzIHRoYXQgaGF2ZSBib3RoIHRleHQgY29udGVudCBBTkQgdGV4dC1yZWxhdGVkIGNsYXNzZXNcbiAgICAgICAgICAvLyBUaGlzIGluZGljYXRlcyBpdCdzIGJlaW5nIHVzZWQgZm9yIHR5cG9ncmFwaHkgcmF0aGVyIHRoYW4gbGF5b3V0XG4gICAgICAgICAgaWYgKGhhc1RleHRDbGFzc2VzICYmIGhhc0RpcmVjdFRleHRDb250ZW50KG5vZGUpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIG1lc3NhZ2VJZDogJ3VzZVR5cG9ncmFwaHlGb3JEaXYnLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBydWxlXG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gallop.software/canon",
3
- "version": "2.3.1",
3
+ "version": "2.4.0",
4
4
  "type": "module",
5
5
  "description": "Gallop Canon - Architecture patterns, ESLint plugin, and CLI for template governance",
6
6
  "main": "dist/index.js",