@nordcraft/search 1.0.61 → 1.0.63

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.
Files changed (35) hide show
  1. package/dist/rules/issues/actions/actionRules.index.js +2 -0
  2. package/dist/rules/issues/actions/actionRules.index.js.map +1 -1
  3. package/dist/rules/issues/actions/duplicateActionArgumentNameRule.js +18 -0
  4. package/dist/rules/issues/actions/duplicateActionArgumentNameRule.js.map +1 -0
  5. package/dist/rules/issues/actions/duplicateActionArgumentNameRule.test.js +131 -0
  6. package/dist/rules/issues/actions/duplicateActionArgumentNameRule.test.js.map +1 -0
  7. package/dist/rules/issues/formulas/duplicateFormulaArgumentNameRule.js +18 -0
  8. package/dist/rules/issues/formulas/duplicateFormulaArgumentNameRule.js.map +1 -0
  9. package/dist/rules/issues/formulas/duplicateFormulaArgumentNameRule.test.js +163 -0
  10. package/dist/rules/issues/formulas/duplicateFormulaArgumentNameRule.test.js.map +1 -0
  11. package/dist/rules/issues/formulas/formulaRules.index.js +2 -0
  12. package/dist/rules/issues/formulas/formulaRules.index.js.map +1 -1
  13. package/dist/rules/issues/formulas/unknownRepeatIndexFormulaRule.js +5 -4
  14. package/dist/rules/issues/formulas/unknownRepeatIndexFormulaRule.js.map +1 -1
  15. package/dist/rules/issues/formulas/unknownRepeatIndexFormulaRule.test.js +121 -0
  16. package/dist/rules/issues/formulas/unknownRepeatIndexFormulaRule.test.js.map +1 -1
  17. package/dist/rules/issues/formulas/unknownRepeatItemFormulaRule.js +6 -4
  18. package/dist/rules/issues/formulas/unknownRepeatItemFormulaRule.js.map +1 -1
  19. package/dist/rules/issues/formulas/unknownRepeatItemFormulaRule.test.js +137 -0
  20. package/dist/rules/issues/formulas/unknownRepeatItemFormulaRule.test.js.map +1 -1
  21. package/dist/rules/issues/style/unknownClassnameRule.js +1 -1
  22. package/dist/rules/issues/style/unknownClassnameRule.js.map +1 -1
  23. package/package.json +3 -3
  24. package/src/rules/issues/actions/actionRules.index.ts +2 -0
  25. package/src/rules/issues/actions/duplicateActionArgumentNameRule.test.ts +146 -0
  26. package/src/rules/issues/actions/duplicateActionArgumentNameRule.ts +21 -0
  27. package/src/rules/issues/formulas/duplicateFormulaArgumentNameRule.test.ts +180 -0
  28. package/src/rules/issues/formulas/duplicateFormulaArgumentNameRule.ts +21 -0
  29. package/src/rules/issues/formulas/formulaRules.index.ts +2 -0
  30. package/src/rules/issues/formulas/unknownRepeatIndexFormulaRule.test.ts +128 -0
  31. package/src/rules/issues/formulas/unknownRepeatIndexFormulaRule.ts +5 -4
  32. package/src/rules/issues/formulas/unknownRepeatItemFormulaRule.test.ts +143 -0
  33. package/src/rules/issues/formulas/unknownRepeatItemFormulaRule.ts +6 -4
  34. package/src/rules/issues/style/unknownClassnameRule.ts +1 -1
  35. package/src/types.d.ts +2 -0
@@ -61,6 +61,143 @@ describe('unknownRepeatItemFormulaRule', () => {
61
61
  'value',
62
62
  ]);
63
63
  });
64
+ test('should find unknown repeat item outside of nodes', () => {
65
+ const problems = Array.from(searchProject({
66
+ files: {
67
+ formulas: {},
68
+ components: {
69
+ test: {
70
+ name: 'test',
71
+ nodes: {},
72
+ formulas: {},
73
+ apis: {},
74
+ attributes: {},
75
+ variables: {},
76
+ onLoad: {
77
+ trigger: 'load',
78
+ actions: [
79
+ {
80
+ name: '@toddle/logToConsole',
81
+ group: 'debugging',
82
+ label: 'Log to console',
83
+ arguments: [
84
+ {
85
+ name: 'Label',
86
+ formula: { type: 'value', value: '' },
87
+ description: 'A label for the message.',
88
+ },
89
+ {
90
+ name: 'Data',
91
+ type: { type: 'Any' },
92
+ formula: {
93
+ type: 'function',
94
+ name: '@toddle/concatenate',
95
+ arguments: [
96
+ {
97
+ name: '0',
98
+ formula: { type: 'value', value: 'Hello' },
99
+ type: { type: 'Array \\| String \\| Object' },
100
+ },
101
+ {
102
+ name: '0',
103
+ formula: {
104
+ type: 'path',
105
+ path: ['ListItem', 'Item'],
106
+ },
107
+ type: { type: 'Array \\| String \\| Object' },
108
+ },
109
+ ],
110
+ variableArguments: true,
111
+ display_name: 'Concatenate',
112
+ },
113
+ description: 'The data you want to log to the console.',
114
+ },
115
+ ],
116
+ description: 'Log a message to the browser console.',
117
+ },
118
+ ],
119
+ },
120
+ },
121
+ },
122
+ },
123
+ rules: [unknownRepeatItemFormulaRule],
124
+ }));
125
+ expect(problems).toHaveLength(1);
126
+ expect(problems[0].code).toBe('unknown repeat item formula');
127
+ expect(problems[0].path).toEqual([
128
+ 'components',
129
+ 'test',
130
+ 'onLoad',
131
+ 'actions',
132
+ '0',
133
+ 'arguments',
134
+ '1',
135
+ 'formula',
136
+ 'arguments',
137
+ 1,
138
+ 'formula',
139
+ ]);
140
+ });
141
+ test('should find unknown repeat item outside of a component', () => {
142
+ const problems = Array.from(searchProject({
143
+ files: {
144
+ formulas: {
145
+ myFormula: {
146
+ name: 'myFormula',
147
+ formula: {
148
+ name: '@toddle/concatenate',
149
+ type: 'function',
150
+ arguments: [
151
+ {
152
+ name: '0',
153
+ type: {
154
+ type: 'Array \\| String \\| Object',
155
+ },
156
+ formula: {
157
+ path: ['Args', 'First'],
158
+ type: 'path',
159
+ },
160
+ },
161
+ {
162
+ name: '0',
163
+ type: {
164
+ type: 'Array \\| String \\| Object',
165
+ },
166
+ formula: {
167
+ type: 'path',
168
+ path: ['ListItem', 'Item'],
169
+ },
170
+ },
171
+ ],
172
+ display_name: 'Concatenate',
173
+ variableArguments: true,
174
+ },
175
+ version: 2,
176
+ arguments: [
177
+ {
178
+ name: 'First',
179
+ formula: null,
180
+ testValue: 'sdfsdf',
181
+ },
182
+ ],
183
+ description: 'sdfsdfsdf',
184
+ },
185
+ },
186
+ components: {},
187
+ },
188
+ rules: [unknownRepeatItemFormulaRule],
189
+ }));
190
+ expect(problems).toHaveLength(1);
191
+ expect(problems[0].code).toBe('unknown repeat item formula');
192
+ expect(problems[0].path).toEqual([
193
+ 'formulas',
194
+ 'myFormula',
195
+ 'formula',
196
+ 'arguments',
197
+ 1,
198
+ 'formula',
199
+ ]);
200
+ });
64
201
  test('should ignore known repeat item formulas', () => {
65
202
  const problems = Array.from(searchProject({
66
203
  files: {
@@ -1 +1 @@
1
- {"version":3,"file":"unknownRepeatItemFormulaRule.test.js","sourceRoot":"","sources":["../../../../src/rules/issues/formulas/unknownRepeatItemFormulaRule.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unknownRepeatItemFormulaRule.test.js","sourceRoot":"","sources":["../../../../src/rules/issues/formulas/unknownRepeatItemFormulaRule.test.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ export const unknownClassnameRule = {
7
7
  if (nodeType !== 'style-variant' ||
8
8
  typeof value.variant.className !== 'string' ||
9
9
  value.element.type !== 'element' ||
10
- isDefined(value.element.classes[value.variant.className])) {
10
+ isDefined(value.element.classes?.[value.variant.className])) {
11
11
  return;
12
12
  }
13
13
  report(path, { name: value.variant.className });
@@ -1 +1 @@
1
- {"version":3,"file":"unknownClassnameRule.js","sourceRoot":"","sources":["../../../../src/rules/issues/style/unknownClassnameRule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAG3D,MAAM,CAAC,MAAM,oBAAoB,GAE5B;IACH,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3C,IACE,QAAQ,KAAK,eAAe;YAC5B,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ;YAC3C,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;YAChC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EACzD,CAAC;YACD,OAAM;QACR,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACjD,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"unknownClassnameRule.js","sourceRoot":"","sources":["../../../../src/rules/issues/style/unknownClassnameRule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAG3D,MAAM,CAAC,MAAM,oBAAoB,GAE5B;IACH,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3C,IACE,QAAQ,KAAK,eAAe;YAC5B,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ;YAC3C,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;YAChC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAC3D,CAAC;YACD,OAAM;QACR,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACjD,CAAC;CACF,CAAA"}
package/package.json CHANGED
@@ -5,8 +5,8 @@
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/nordcraftengine/nordcraft",
7
7
  "dependencies": {
8
- "@nordcraft/ssr": "1.0.61",
9
- "@nordcraft/core": "1.0.61",
8
+ "@nordcraft/ssr": "1.0.63",
9
+ "@nordcraft/core": "1.0.63",
10
10
  "jsondiffpatch": "0.7.3",
11
11
  "postcss": "8.5.6"
12
12
  },
@@ -20,5 +20,5 @@
20
20
  "test:watch:only": "bun test --watch --only"
21
21
  },
22
22
  "files": ["dist", "src"],
23
- "version": "1.0.61"
23
+ "version": "1.0.63"
24
24
  }
@@ -1,4 +1,5 @@
1
1
  import { createActionNameRule } from './createActionNameRule'
2
+ import { duplicateActionArgumentNameRule } from './duplicateActionArgumentNameRule'
2
3
  import { legacyActionRule } from './legacyActionRule'
3
4
  import { noReferenceProjectActionRule } from './noReferenceProjectActionRule'
4
5
  import { unknownProjectActionRule } from './unknownProjectActionRule'
@@ -8,6 +9,7 @@ export default [
8
9
  name: '@toddle/logToConsole',
9
10
  code: 'no-console',
10
11
  }),
12
+ duplicateActionArgumentNameRule,
11
13
  legacyActionRule,
12
14
  noReferenceProjectActionRule,
13
15
  unknownProjectActionRule,
@@ -0,0 +1,146 @@
1
+ import { valueFormula } from '@nordcraft/core/dist/formula/formulaUtils'
2
+ import type { ProjectFiles } from '@nordcraft/ssr/dist/ssr.types'
3
+ import { describe, expect, test } from 'bun:test'
4
+ import { searchProject } from '../../../searchProject'
5
+ import { duplicateActionArgumentNameRule } from './duplicateActionArgumentNameRule'
6
+
7
+ describe('duplicateActionArgumentNameRule', () => {
8
+ test('should detect duplicate argument names in actions', () => {
9
+ const files: ProjectFiles = {
10
+ actions: {
11
+ myAction: {
12
+ name: 'myAction',
13
+ variableArguments: false,
14
+ arguments: [
15
+ {
16
+ name: 'arg1',
17
+ formula: valueFormula(null),
18
+ },
19
+ {
20
+ name: 'arg2',
21
+ formula: valueFormula(null),
22
+ },
23
+ {
24
+ name: 'arg1', // Duplicate
25
+ formula: valueFormula(null),
26
+ },
27
+ ],
28
+ handler: '',
29
+ version: 2,
30
+ },
31
+ },
32
+ components: {},
33
+ }
34
+ const problems = Array.from(
35
+ searchProject({
36
+ files,
37
+ rules: [duplicateActionArgumentNameRule],
38
+ }),
39
+ )
40
+
41
+ expect(problems).toHaveLength(1)
42
+ expect(problems[0].code).toBe('duplicate action argument name')
43
+ expect(problems[0].details).toEqual({ name: 'arg1' })
44
+ expect(problems[0].path).toEqual(['actions', 'myAction'])
45
+ })
46
+ test('should not report when all argument names are unique', () => {
47
+ const files: ProjectFiles = {
48
+ actions: {
49
+ uniqueArgsAction: {
50
+ name: 'uniqueArgsAction',
51
+ variableArguments: false,
52
+ arguments: [
53
+ { name: 'arg1', formula: valueFormula(null) },
54
+ { name: 'arg2', formula: valueFormula(null) },
55
+ { name: 'arg3', formula: valueFormula(null) },
56
+ ],
57
+ handler: '',
58
+ version: 2,
59
+ },
60
+ },
61
+ components: {},
62
+ }
63
+ const problems = Array.from(
64
+ searchProject({
65
+ files,
66
+ rules: [duplicateActionArgumentNameRule],
67
+ }),
68
+ )
69
+ expect(problems).toHaveLength(0)
70
+ })
71
+
72
+ test('should not report when there are no arguments', () => {
73
+ const files: ProjectFiles = {
74
+ actions: {
75
+ noArgsAction: {
76
+ name: 'noArgsAction',
77
+ variableArguments: false,
78
+ arguments: [],
79
+ handler: '',
80
+ version: 2,
81
+ },
82
+ },
83
+ components: {},
84
+ }
85
+ const problems = Array.from(
86
+ searchProject({
87
+ files,
88
+ rules: [duplicateActionArgumentNameRule],
89
+ }),
90
+ )
91
+ expect(problems).toHaveLength(0)
92
+ })
93
+
94
+ test('should not report when arguments is undefined', () => {
95
+ const files: ProjectFiles = {
96
+ actions: {
97
+ undefinedArgsAction: {
98
+ name: 'undefinedArgsAction',
99
+ variableArguments: false,
100
+ handler: '',
101
+ version: 2,
102
+ } as any, // Force arguments to be undefined
103
+ },
104
+ components: {},
105
+ }
106
+ const problems = Array.from(
107
+ searchProject({
108
+ files,
109
+ rules: [duplicateActionArgumentNameRule],
110
+ }),
111
+ )
112
+ expect(problems).toHaveLength(0)
113
+ })
114
+
115
+ test('should report multiple duplicates', () => {
116
+ const files: ProjectFiles = {
117
+ actions: {
118
+ multiDupAction: {
119
+ name: 'multiDupAction',
120
+ variableArguments: false,
121
+ arguments: [
122
+ { name: 'arg1', formula: valueFormula(null) },
123
+ { name: 'arg2', formula: valueFormula(null) },
124
+ { name: 'arg1', formula: valueFormula(null) }, // Duplicate
125
+ { name: 'arg2', formula: valueFormula(null) }, // Duplicate
126
+ { name: 'arg3', formula: valueFormula(null) },
127
+ { name: 'arg1', formula: valueFormula(null) }, // Duplicate
128
+ ],
129
+ handler: '',
130
+ version: 2,
131
+ },
132
+ },
133
+ components: {},
134
+ }
135
+ const problems = Array.from(
136
+ searchProject({
137
+ files,
138
+ rules: [duplicateActionArgumentNameRule],
139
+ }),
140
+ )
141
+ expect(problems).toHaveLength(3)
142
+ expect(problems[0].details).toEqual({ name: 'arg1' })
143
+ expect(problems[1].details).toEqual({ name: 'arg2' })
144
+ expect(problems[2].details).toEqual({ name: 'arg1' })
145
+ })
146
+ })
@@ -0,0 +1,21 @@
1
+ import type { Rule } from '../../../types'
2
+
3
+ export const duplicateActionArgumentNameRule: Rule<{
4
+ name: string
5
+ }> = {
6
+ code: 'duplicate action argument name',
7
+ level: 'error',
8
+ category: 'Quality',
9
+ visit: (report, { path, value, nodeType }) => {
10
+ if (nodeType !== 'project-action') {
11
+ return
12
+ }
13
+ const argumentNames = new Set<string>()
14
+ value.arguments?.forEach((arg) => {
15
+ if (argumentNames.has(arg.name)) {
16
+ report(path, { name: arg.name })
17
+ }
18
+ argumentNames.add(arg.name)
19
+ })
20
+ },
21
+ }
@@ -0,0 +1,180 @@
1
+ import { describe, expect, test } from 'bun:test'
2
+ import { searchProject } from '../../../searchProject'
3
+ import { duplicateFormulaArgumentNameRule } from './duplicateFormulaArgumentNameRule'
4
+
5
+ describe('duplicateFormulaArgumentNameRule', () => {
6
+ test('should detect duplicate argument names in formulas', () => {
7
+ const problems = Array.from(
8
+ searchProject({
9
+ files: {
10
+ components: {
11
+ test: {
12
+ name: 'test',
13
+ nodes: {},
14
+ formulas: {
15
+ myFormula: {
16
+ name: 'myFormula',
17
+ arguments: [
18
+ { name: 'arg1', testValue: 'bla' },
19
+ { name: 'arg2', testValue: 'bla' },
20
+ { name: 'arg1', testValue: 'bla' }, // Duplicate
21
+ ],
22
+ formula: {
23
+ type: 'value',
24
+ value: null,
25
+ },
26
+ },
27
+ },
28
+ apis: {},
29
+ attributes: {},
30
+ variables: {},
31
+ },
32
+ },
33
+ },
34
+ rules: [duplicateFormulaArgumentNameRule],
35
+ }),
36
+ )
37
+
38
+ expect(problems).toHaveLength(1)
39
+ expect(problems[0].code).toBe('duplicate formula argument name')
40
+ expect(problems[0].details).toEqual({ name: 'arg1' })
41
+ expect(problems[0].path).toEqual([
42
+ 'components',
43
+ 'test',
44
+ 'formulas',
45
+ 'myFormula',
46
+ ])
47
+ })
48
+ test('should detect duplicate argument names in project formulas', () => {
49
+ const problems = Array.from(
50
+ searchProject({
51
+ files: {
52
+ formulas: {
53
+ myFormula: {
54
+ name: 'myFormula',
55
+ arguments: [
56
+ { name: 'arg1', testValue: 'bla' },
57
+ { name: 'arg2', testValue: 'bla' },
58
+ { name: 'arg1', testValue: 'bla' }, // Duplicate
59
+ ],
60
+ formula: {
61
+ type: 'value',
62
+ value: null,
63
+ },
64
+ },
65
+ },
66
+ components: {},
67
+ },
68
+ rules: [duplicateFormulaArgumentNameRule],
69
+ }),
70
+ )
71
+
72
+ expect(problems).toHaveLength(1)
73
+ expect(problems[0].code).toBe('duplicate formula argument name')
74
+ expect(problems[0].details).toEqual({ name: 'arg1' })
75
+ expect(problems[0].path).toEqual(['formulas', 'myFormula'])
76
+ })
77
+ test('should not report when there are no duplicate argument names', () => {
78
+ const problems = Array.from(
79
+ searchProject({
80
+ files: {
81
+ components: {
82
+ test: {
83
+ name: 'test',
84
+ nodes: {},
85
+ formulas: {
86
+ myFormula: {
87
+ name: 'myFormula',
88
+ arguments: [
89
+ { name: 'arg1', testValue: 'bla' },
90
+ { name: 'arg2', testValue: 'bla' },
91
+ { name: 'arg3', testValue: 'bla' },
92
+ ],
93
+ formula: {
94
+ type: 'value',
95
+ value: null,
96
+ },
97
+ },
98
+ },
99
+ apis: {},
100
+ attributes: {},
101
+ variables: {},
102
+ },
103
+ },
104
+ },
105
+ rules: [duplicateFormulaArgumentNameRule],
106
+ }),
107
+ )
108
+
109
+ expect(problems).toHaveLength(0)
110
+ })
111
+
112
+ test('should detect multiple duplicates', () => {
113
+ const problems = Array.from(
114
+ searchProject({
115
+ files: {
116
+ components: {
117
+ test: {
118
+ name: 'test',
119
+ nodes: {},
120
+ formulas: {
121
+ myFormula: {
122
+ name: 'myFormula',
123
+ arguments: [
124
+ { name: 'arg1', testValue: 'bla' },
125
+ { name: 'arg2', testValue: 'bla' },
126
+ { name: 'arg1', testValue: 'bla' }, // Duplicate
127
+ { name: 'arg2', testValue: 'bla' }, // Duplicate
128
+ ],
129
+ formula: {
130
+ type: 'value',
131
+ value: null,
132
+ },
133
+ },
134
+ },
135
+ apis: {},
136
+ attributes: {},
137
+ variables: {},
138
+ },
139
+ },
140
+ },
141
+ rules: [duplicateFormulaArgumentNameRule],
142
+ }),
143
+ )
144
+
145
+ expect(problems).toHaveLength(2)
146
+ expect(problems[0].details).toEqual({ name: 'arg1' })
147
+ expect(problems[1].details).toEqual({ name: 'arg2' })
148
+ })
149
+
150
+ test('should not report for formulas with no arguments', () => {
151
+ const problems = Array.from(
152
+ searchProject({
153
+ files: {
154
+ components: {
155
+ test: {
156
+ name: 'test',
157
+ nodes: {},
158
+ formulas: {
159
+ myFormula: {
160
+ name: 'myFormula',
161
+ arguments: [],
162
+ formula: {
163
+ type: 'value',
164
+ value: null,
165
+ },
166
+ },
167
+ },
168
+ apis: {},
169
+ attributes: {},
170
+ variables: {},
171
+ },
172
+ },
173
+ },
174
+ rules: [duplicateFormulaArgumentNameRule],
175
+ }),
176
+ )
177
+
178
+ expect(problems).toHaveLength(0)
179
+ })
180
+ })
@@ -0,0 +1,21 @@
1
+ import type { Rule } from '../../../types'
2
+
3
+ export const duplicateFormulaArgumentNameRule: Rule<{
4
+ name: string
5
+ }> = {
6
+ code: 'duplicate formula argument name',
7
+ level: 'error',
8
+ category: 'Quality',
9
+ visit: (report, { path, value, nodeType }) => {
10
+ if (nodeType !== 'project-formula' && nodeType !== 'component-formula') {
11
+ return
12
+ }
13
+ const argumentNames = new Set<string>()
14
+ value.arguments?.forEach((arg) => {
15
+ if (argumentNames.has(arg.name)) {
16
+ report(path, { name: arg.name })
17
+ }
18
+ argumentNames.add(arg.name)
19
+ })
20
+ },
21
+ }
@@ -1,9 +1,11 @@
1
+ import { duplicateFormulaArgumentNameRule } from './duplicateFormulaArgumentNameRule'
1
2
  import { legacyFormulaRule } from './legacyFormulaRule'
2
3
  import { noReferenceComponentFormulaRule } from './noReferenceComponentFormulaRule'
3
4
  import { noReferenceProjectFormulaRule } from './noReferenceProjectFormulaRule'
4
5
 
5
6
  export default [
6
7
  legacyFormulaRule,
8
+ duplicateFormulaArgumentNameRule,
7
9
  noReferenceComponentFormulaRule,
8
10
  noReferenceProjectFormulaRule,
9
11
  // unknownComponentFormulaInputRule,