@nordcraft/search 1.0.32 → 1.0.33

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.
@@ -0,0 +1,43 @@
1
+ export const getAllCustomPropertiesBySyntax = (memo, { files, }) => memo('allCustomPropertiesBySyntax', () => {
2
+ const store = {};
3
+ const add = (propName, syntax, fullPath) => {
4
+ if (syntax.type !== 'primitive')
5
+ return;
6
+ const sName = syntax.name;
7
+ store[propName] ??= {};
8
+ store[propName][sName] ??= [];
9
+ store[propName][sName].push({ syntax, path: fullPath });
10
+ };
11
+ for (const [componentKey, component] of Object.entries(files.components)) {
12
+ for (const [nodeKey, node] of Object.entries(component?.nodes ?? {})) {
13
+ if (node.type !== 'element' && node.type !== 'component')
14
+ continue;
15
+ for (const [propName, prop] of Object.entries(node.customProperties ?? {})) {
16
+ add(propName, prop.syntax, [
17
+ 'components',
18
+ componentKey,
19
+ 'nodes',
20
+ nodeKey,
21
+ 'customProperties',
22
+ propName,
23
+ ]);
24
+ }
25
+ node.variants?.forEach((variant, variantIndex) => {
26
+ for (const [propName, prop] of Object.entries(variant.customProperties ?? {})) {
27
+ add(propName, prop.syntax, [
28
+ 'components',
29
+ componentKey,
30
+ 'nodes',
31
+ nodeKey,
32
+ 'variants',
33
+ String(variantIndex),
34
+ 'customProperties',
35
+ propName,
36
+ ]);
37
+ }
38
+ });
39
+ }
40
+ }
41
+ return store;
42
+ });
43
+ //# sourceMappingURL=getAllCustomPropertiesBySyntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAllCustomPropertiesBySyntax.js","sourceRoot":"","sources":["../../src/memos/getAllCustomPropertiesBySyntax.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,IAAwC,EACxC,EACE,KAAK,GAGN,EACD,EAAE,CACF,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;IACvC,MAAM,KAAK,GAGP,EAAE,CAAA;IAEN,MAAM,GAAG,GAAG,CACV,QAAgB,EAChB,MAAqB,EACrB,QAAkB,EAClB,EAAE;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;YAAE,OAAM;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAA;QACzB,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QACtB,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAC7B,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;IACzD,CAAC,CAAA;IAED,KAAK,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACzE,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YACrE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAQ;YAElE,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAC3C,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAC5B,EAAE,CAAC;gBACF,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE;oBACzB,YAAY;oBACZ,YAAY;oBACZ,OAAO;oBACP,OAAO;oBACP,kBAAkB;oBAClB,QAAQ;iBACT,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE;gBAC/C,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAC3C,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAC/B,EAAE,CAAC;oBACF,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE;wBACzB,YAAY;wBACZ,YAAY;wBACZ,OAAO;wBACP,OAAO;wBACP,UAAU;wBACV,MAAM,CAAC,YAAY,CAAC;wBACpB,kBAAkB;wBAClB,QAAQ;qBACT,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAC,CAAA"}
@@ -37,6 +37,7 @@ import { noUnnecessaryConditionTruthy } from './rules/logic/noUnnecessaryConditi
37
37
  import { requireExtensionRule } from './rules/requireExtensionRule';
38
38
  import { unknownClassnameRule } from './rules/slots/unknownClassnameRule';
39
39
  import { unknownComponentSlotRule } from './rules/slots/unknownComponentSlotRule';
40
+ import { ambiguousStyleVariableSyntaxRule } from './rules/style-variables/ambiguousStyleVariableSyntaxRule';
40
41
  import { unknownCookieRule } from './rules/unknownCookieRule';
41
42
  import { duplicateUrlParameterRule } from './rules/urlParameters/duplicateUrlParameterRule';
42
43
  import { unknownSetUrlParameterRule } from './rules/urlParameters/unknownSetUrlParameterRule';
@@ -136,6 +137,7 @@ const RULES = [
136
137
  unknownVariableRule,
137
138
  unknownVariableSetterRule,
138
139
  unknownWorkflowParameterRule,
140
+ ambiguousStyleVariableSyntaxRule,
139
141
  ];
140
142
  /**
141
143
  * This function is a web worker that checks for problems in the files.
@@ -1 +1 @@
1
- {"version":3,"file":"problems.worker.js","sourceRoot":"","sources":["../src/problems.worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"problems.worker.js","sourceRoot":"","sources":["../src/problems.worker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8CAA8C,CAAA;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAA;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAA;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAA;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAA;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAA;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAA;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,mDAAmD,CAAA;AACrG,OAAO,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAA;AACvF,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAA;AACzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAA;AAC3F,OAAO,EAAE,kCAAkC,EAAE,MAAM,gDAAgD,CAAA;AACnG,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAA;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAA;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAA;AAClG,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAA;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAA;AACtF,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAA;AAC9F,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAA;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAA;AACvF,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAA;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,gCAAgC,EAAE,MAAM,0DAA0D,CAAA;AAC3G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAA;AAC3F,OAAO,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAA;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAA;AACvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAA;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAA;AACvF,OAAO,EAAE,8BAA8B,EAAE,MAAM,kDAAkD,CAAA;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC7E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oDAAoD,CAAA;AACrG,OAAO,EAAE,kCAAkC,EAAE,MAAM,sDAAsD,CAAA;AACzG,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAA;AACzF,OAAO,EAAE,mCAAmC,EAAE,MAAM,uDAAuD,CAAA;AAC3G,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAA;AACzF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAA;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AA6B/C,MAAM,KAAK,GAAG;IACZ,oBAAoB,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC1E,kCAAkC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACnE,kCAAkC,CAAC;QACjC,GAAG,EAAE,KAAK;QACV,SAAS,EAAE,KAAK;QAChB,gBAAgB,EAAE,IAAI;KACvB,CAAC;IACF,kCAAkC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpE,yBAAyB,CAAC,aAAa,CAAC;IACxC,yBAAyB,CAAC,OAAO,CAAC;IAClC,6BAA6B,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzE,8BAA8B,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACpD,oFAAoF;IACpF,6BAA6B,CAC3B,CAAC,OAAO,CAAC,EACT,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CACzD;IACD,oFAAoF;IACpF,oFAAoF;IACpF,oFAAoF;IACpF,8BAA8B,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtE,iFAAiF;IACjF,6BAA6B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzE,iFAAiF;IACjF,iFAAiF;IACjF,8BAA8B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpD,qFAAqF;IACrF,6BAA6B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACvE,uFAAuF;IACvF,6BAA6B,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACvD,qFAAqF;IACrF,8BAA8B,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACxD,iFAAiF;IACjF,6BAA6B,CAC3B,CAAC,IAAI,CAAC,EACN,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAC1C;IACD,yBAAyB;IACzB,kBAAkB;IAClB,yBAAyB;IACzB,8BAA8B;IAC9B,yBAAyB;IACzB,gBAAgB;IAChB,aAAa;IACb,iBAAiB;IACjB,sBAAsB;IACtB,uBAAuB;IACvB,oBAAoB;IACpB,kBAAkB;IAClB,wBAAwB;IACxB,+BAA+B;IAC/B,wBAAwB;IACxB,gCAAgC;IAChC,oBAAoB;IACpB,4BAA4B;IAC5B,6BAA6B;IAC7B,uBAAuB;IACvB,2BAA2B;IAC3B,4BAA4B;IAC5B,oBAAoB;IACpB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,oCAAoC;IACpC,oBAAoB;IACpB,wBAAwB;IACxB,yBAAyB;IACzB,iCAAiC;IACjC,0BAA0B;IAC1B,kCAAkC;IAClC,0BAA0B;IAC1B,iBAAiB;IACjB,gBAAgB;IAChB,kBAAkB;IAClB,wBAAwB;IACxB,kCAAkC;IAClC,yBAAyB;IACzB,6BAA6B;IAC7B,4BAA4B;IAC5B,0BAA0B;IAC1B,uBAAuB;IACvB,mCAAmC;IACnC,0BAA0B;IAC1B,uBAAuB;IACvB,mBAAmB;IACnB,yBAAyB;IACzB,4BAA4B;IAC5B,gCAAgC;CACjC,CAAA;AAED;;GAEG;AACH,SAAS,GAAG,CACV,KAA+D,EAC/D,EAAE;IACF,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAA;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CACxB,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnE,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/C,CAAA;IAED,IAAI,KAAK,GAAa,EAAE,CAAA;IACxB,IAAI,QAAqC,CAAA;IACzC,IAAI,QAAqC,CAAA;IACzC,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC;QAClC,KAAK;QACL,KAAK;QACL,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,EAAE,CAAC;QACH,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC;YAC1B,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACnB,MAAK;YACP,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,WAAW,CAAC,KAAK,CAAC,CAAA;oBACpB,CAAC;oBACD,KAAK,GAAG,EAAE,CAAA;oBACV,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBAC1B,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC5B,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACnB,MAAK;YACP,CAAC;YAED,OAAO,CAAC,CAAC,CAAC;gBACR,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACnB,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC7C,WAAW,CAAC,KAAK,CAAC,CAAA;oBAClB,KAAK,GAAG,EAAE,CAAA;gBACZ,CAAC;gBACD,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,WAAW,CAAC,KAAK,CAAC,CAAA;AACpB,CAAC,CAAA"}
@@ -0,0 +1,50 @@
1
+ import { getAllCustomPropertiesBySyntax } from '../../memos/getAllCustomPropertiesBySyntax';
2
+ export const ambiguousStyleVariableSyntaxRule = {
3
+ code: 'ambiguous style variable syntax',
4
+ level: 'error',
5
+ category: 'Other',
6
+ visit: (report, args) => {
7
+ const { nodeType, value, files, memo, path } = args;
8
+ if (nodeType !== 'component-node')
9
+ return;
10
+ if (value.type !== 'element' && value.type !== 'component')
11
+ return;
12
+ const check = (propName, syntax, basePath) => {
13
+ if (syntax.type !== 'primitive')
14
+ return;
15
+ const allCustomPropertiesBySyntax = getAllCustomPropertiesBySyntax(memo, {
16
+ files,
17
+ })[propName];
18
+ const conflicts = Object.entries(allCustomPropertiesBySyntax)
19
+ .filter(([name]) => name !== syntax.name)
20
+ .flatMap(([, entries]) => entries);
21
+ if (conflicts.length > 0) {
22
+ report(basePath, {
23
+ name: propName,
24
+ duplicates: conflicts,
25
+ });
26
+ }
27
+ };
28
+ for (const [propName, prop] of Object.entries(value.customProperties ?? {})) {
29
+ check(propName, prop.syntax, [
30
+ ...path,
31
+ 'customProperties',
32
+ propName,
33
+ 'name',
34
+ ]);
35
+ }
36
+ value.variants?.forEach((variant, variantIndex) => {
37
+ for (const [propName, prop] of Object.entries(variant.customProperties ?? {})) {
38
+ check(propName, prop.syntax, [
39
+ ...path,
40
+ 'variants',
41
+ String(variantIndex),
42
+ 'customProperties',
43
+ propName,
44
+ 'name',
45
+ ]);
46
+ }
47
+ });
48
+ },
49
+ };
50
+ //# sourceMappingURL=ambiguousStyleVariableSyntaxRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ambiguousStyleVariableSyntaxRule.js","sourceRoot":"","sources":["../../../src/rules/style-variables/ambiguousStyleVariableSyntaxRule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAA;AAG3F,MAAM,CAAC,MAAM,gCAAgC,GAGxC;IACH,IAAI,EAAE,iCAAiC;IACvC,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,OAAO;IACjB,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QACnD,IAAI,QAAQ,KAAK,gBAAgB;YAAE,OAAM;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,OAAM;QAElE,MAAM,KAAK,GAAG,CACZ,QAAgB,EAChB,MAAqB,EACrB,QAAgC,EAChC,EAAE;YACF,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAM;YACvC,MAAM,2BAA2B,GAAG,8BAA8B,CAAC,IAAI,EAAE;gBACvE,KAAK;aACN,CAAC,CAAC,QAAQ,CAAC,CAAA;YAEZ,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC;iBAC1D,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;iBACxC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAA;YAEpC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,QAAQ,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,SAAS;iBACtB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAC3C,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAC7B,EAAE,CAAC;YACF,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE;gBAC3B,GAAG,IAAI;gBACP,kBAAkB;gBAClB,QAAQ;gBACR,MAAM;aACP,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE;YAChD,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAC3C,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAC/B,EAAE,CAAC;gBACF,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE;oBAC3B,GAAG,IAAI;oBACP,UAAU;oBACV,MAAM,CAAC,YAAY,CAAC;oBACpB,kBAAkB;oBAClB,QAAQ;oBACR,MAAM;iBACP,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA"}
@@ -0,0 +1,265 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import { searchProject } from '../../searchProject';
3
+ import { ambiguousStyleVariableSyntaxRule } from './ambiguousStyleVariableSyntaxRule';
4
+ describe('ambiguousStyleVariableSyntaxRule', () => {
5
+ test('should report when there are style variables with the same name but different syntax', () => {
6
+ const problems = Array.from(searchProject({
7
+ files: {
8
+ components: {
9
+ component1: {
10
+ name: 'component1',
11
+ nodes: {
12
+ node1: {
13
+ type: 'element',
14
+ customProperties: {
15
+ '--my-variable': {
16
+ syntax: { type: 'primitive', name: 'length' },
17
+ formula: { type: 'value', value: '10px' },
18
+ },
19
+ },
20
+ attrs: {},
21
+ style: {},
22
+ children: [],
23
+ events: {},
24
+ classes: {},
25
+ tag: 'div',
26
+ },
27
+ },
28
+ apis: {},
29
+ attributes: {},
30
+ variables: {},
31
+ formulas: {},
32
+ },
33
+ component2: {
34
+ name: 'component2',
35
+ nodes: {
36
+ node2: {
37
+ type: 'element',
38
+ customProperties: {
39
+ '--my-variable': {
40
+ syntax: { type: 'primitive', name: 'color' },
41
+ formula: { type: 'value', value: '#ff0000' },
42
+ },
43
+ },
44
+ attrs: {},
45
+ style: {},
46
+ children: [],
47
+ events: {},
48
+ classes: {},
49
+ tag: 'div',
50
+ },
51
+ },
52
+ apis: {},
53
+ attributes: {},
54
+ variables: {},
55
+ formulas: {},
56
+ },
57
+ },
58
+ },
59
+ rules: [ambiguousStyleVariableSyntaxRule],
60
+ }));
61
+ expect(problems).toHaveLength(2);
62
+ expect(problems[0].code).toBe('ambiguous style variable syntax');
63
+ expect(problems[1].code).toBe('ambiguous style variable syntax');
64
+ expect(problems[0].details.name).toBe('--my-variable');
65
+ expect(problems[1].details.name).toBe('--my-variable');
66
+ expect(problems[0].details.duplicates).toEqual([
67
+ {
68
+ path: [
69
+ 'components',
70
+ 'component2',
71
+ 'nodes',
72
+ 'node2',
73
+ 'customProperties',
74
+ '--my-variable',
75
+ ],
76
+ syntax: { type: 'primitive', name: 'color' },
77
+ },
78
+ ]);
79
+ expect(problems[1].details.duplicates).toEqual([
80
+ {
81
+ path: [
82
+ 'components',
83
+ 'component1',
84
+ 'nodes',
85
+ 'node1',
86
+ 'customProperties',
87
+ '--my-variable',
88
+ ],
89
+ syntax: { type: 'primitive', name: 'length' },
90
+ },
91
+ ]);
92
+ });
93
+ test('should not report when style variables have same name and same syntax', () => {
94
+ const problems = Array.from(searchProject({
95
+ files: {
96
+ components: {
97
+ component1: {
98
+ name: 'component1',
99
+ nodes: {
100
+ node1: {
101
+ type: 'element',
102
+ customProperties: {
103
+ '--my-variable': {
104
+ syntax: { type: 'primitive', name: 'length' },
105
+ formula: { type: 'value', value: '10px' },
106
+ },
107
+ },
108
+ attrs: {},
109
+ style: {},
110
+ children: [],
111
+ events: {},
112
+ classes: {},
113
+ tag: 'div',
114
+ },
115
+ },
116
+ apis: {},
117
+ attributes: {},
118
+ variables: {},
119
+ formulas: {},
120
+ },
121
+ component2: {
122
+ name: 'component2',
123
+ nodes: {
124
+ node2: {
125
+ type: 'element',
126
+ customProperties: {
127
+ '--my-variable': {
128
+ syntax: { type: 'primitive', name: 'length' },
129
+ formula: { type: 'value', value: '20px' },
130
+ },
131
+ },
132
+ attrs: {},
133
+ style: {},
134
+ children: [],
135
+ events: {},
136
+ classes: {},
137
+ tag: 'div',
138
+ },
139
+ },
140
+ apis: {},
141
+ attributes: {},
142
+ variables: {},
143
+ formulas: {},
144
+ },
145
+ },
146
+ },
147
+ rules: [ambiguousStyleVariableSyntaxRule],
148
+ }));
149
+ expect(problems).toHaveLength(0);
150
+ });
151
+ test('should handle variant customProperties too', () => {
152
+ const problems = Array.from(searchProject({
153
+ files: {
154
+ components: {
155
+ component1: {
156
+ name: 'component1',
157
+ nodes: {
158
+ node1: {
159
+ type: 'element',
160
+ customProperties: {
161
+ '--my-variable': {
162
+ syntax: { type: 'primitive', name: 'length' },
163
+ formula: { type: 'value', value: '10px' },
164
+ },
165
+ },
166
+ variants: [
167
+ {
168
+ breakpoint: 'medium',
169
+ style: {},
170
+ customProperties: {
171
+ '--my-variable': {
172
+ syntax: { type: 'primitive', name: 'color' },
173
+ formula: { type: 'value', value: '#ff0000' },
174
+ },
175
+ },
176
+ },
177
+ ],
178
+ attrs: {},
179
+ style: {},
180
+ children: [],
181
+ events: {},
182
+ classes: {},
183
+ tag: 'div',
184
+ },
185
+ },
186
+ apis: {},
187
+ attributes: {},
188
+ variables: {},
189
+ formulas: {},
190
+ },
191
+ },
192
+ },
193
+ rules: [ambiguousStyleVariableSyntaxRule],
194
+ }));
195
+ // Should flag both the base and the variant for conflicting syntax
196
+ expect(problems).toHaveLength(2);
197
+ expect(problems.map((p) => p.details.name)).toEqual([
198
+ '--my-variable',
199
+ '--my-variable',
200
+ ]);
201
+ });
202
+ test('should ignore non-primitive syntax', () => {
203
+ const problems = Array.from(searchProject({
204
+ files: {
205
+ components: {
206
+ component1: {
207
+ name: 'component1',
208
+ nodes: {
209
+ node1: {
210
+ type: 'element',
211
+ customProperties: {
212
+ '--my-variable': {
213
+ syntax: {
214
+ type: 'keyword',
215
+ keywords: ['auto', 'inherit'],
216
+ },
217
+ formula: { type: 'value', value: '10px' },
218
+ },
219
+ },
220
+ attrs: {},
221
+ style: {},
222
+ children: [],
223
+ events: {},
224
+ classes: {},
225
+ tag: 'div',
226
+ },
227
+ },
228
+ apis: {},
229
+ attributes: {},
230
+ variables: {},
231
+ formulas: {},
232
+ },
233
+ component2: {
234
+ name: 'component2',
235
+ nodes: {
236
+ node2: {
237
+ type: 'element',
238
+ customProperties: {
239
+ '--my-variable': {
240
+ syntax: { type: 'primitive', name: 'color' },
241
+ formula: { type: 'value', value: '#ff0000' },
242
+ },
243
+ },
244
+ attrs: {},
245
+ style: {},
246
+ children: [],
247
+ events: {},
248
+ classes: {},
249
+ tag: 'div',
250
+ },
251
+ },
252
+ apis: {},
253
+ attributes: {},
254
+ variables: {},
255
+ formulas: {},
256
+ },
257
+ },
258
+ },
259
+ rules: [ambiguousStyleVariableSyntaxRule],
260
+ }));
261
+ // Should not report because non-primitive should be skipped
262
+ expect(problems).toHaveLength(0);
263
+ });
264
+ });
265
+ //# sourceMappingURL=ambiguousStyleVariableSyntaxRule.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ambiguousStyleVariableSyntaxRule.test.js","sourceRoot":"","sources":["../../../src/rules/style-variables/ambiguousStyleVariableSyntaxRule.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/nordcraftengine/nordcraft",
7
7
  "dependencies": {
8
- "@nordcraft/ssr": "1.0.32"
8
+ "@nordcraft/ssr": "1.0.33"
9
9
  },
10
10
  "scripts": {
11
11
  "build": "tsc",
@@ -17,5 +17,5 @@
17
17
  "test:watch:only": "bun test --watch --only"
18
18
  },
19
19
  "files": ["dist", "src"],
20
- "version": "1.0.32"
20
+ "version": "1.0.33"
21
21
  }
@@ -0,0 +1,67 @@
1
+ import type { CssSyntaxNode } from '@nordcraft/core/dist/styling/customProperty'
2
+ import type { ProjectFiles } from '@nordcraft/ssr/dist/ssr.types'
3
+
4
+ export const getAllCustomPropertiesBySyntax = (
5
+ memo: <T>(key: string, fn: () => T) => T,
6
+ {
7
+ files,
8
+ }: {
9
+ files: Omit<ProjectFiles, 'config'> & Partial<Pick<ProjectFiles, 'config'>>
10
+ },
11
+ ) =>
12
+ memo('allCustomPropertiesBySyntax', () => {
13
+ const store: Record<
14
+ string,
15
+ Record<string, Array<{ syntax: CssSyntaxNode; path: string[] }>>
16
+ > = {}
17
+
18
+ const add = (
19
+ propName: string,
20
+ syntax: CssSyntaxNode,
21
+ fullPath: string[],
22
+ ) => {
23
+ if (syntax.type !== 'primitive') return
24
+ const sName = syntax.name
25
+ store[propName] ??= {}
26
+ store[propName][sName] ??= []
27
+ store[propName][sName].push({ syntax, path: fullPath })
28
+ }
29
+
30
+ for (const [componentKey, component] of Object.entries(files.components)) {
31
+ for (const [nodeKey, node] of Object.entries(component?.nodes ?? {})) {
32
+ if (node.type !== 'element' && node.type !== 'component') continue
33
+
34
+ for (const [propName, prop] of Object.entries(
35
+ node.customProperties ?? {},
36
+ )) {
37
+ add(propName, prop.syntax, [
38
+ 'components',
39
+ componentKey,
40
+ 'nodes',
41
+ nodeKey,
42
+ 'customProperties',
43
+ propName,
44
+ ])
45
+ }
46
+
47
+ node.variants?.forEach((variant, variantIndex) => {
48
+ for (const [propName, prop] of Object.entries(
49
+ variant.customProperties ?? {},
50
+ )) {
51
+ add(propName, prop.syntax, [
52
+ 'components',
53
+ componentKey,
54
+ 'nodes',
55
+ nodeKey,
56
+ 'variants',
57
+ String(variantIndex),
58
+ 'customProperties',
59
+ propName,
60
+ ])
61
+ }
62
+ })
63
+ }
64
+ }
65
+
66
+ return store
67
+ })
@@ -38,6 +38,7 @@ import { noUnnecessaryConditionTruthy } from './rules/logic/noUnnecessaryConditi
38
38
  import { requireExtensionRule } from './rules/requireExtensionRule'
39
39
  import { unknownClassnameRule } from './rules/slots/unknownClassnameRule'
40
40
  import { unknownComponentSlotRule } from './rules/slots/unknownComponentSlotRule'
41
+ import { ambiguousStyleVariableSyntaxRule } from './rules/style-variables/ambiguousStyleVariableSyntaxRule'
41
42
  import { unknownCookieRule } from './rules/unknownCookieRule'
42
43
  import { duplicateUrlParameterRule } from './rules/urlParameters/duplicateUrlParameterRule'
43
44
  import { unknownSetUrlParameterRule } from './rules/urlParameters/unknownSetUrlParameterRule'
@@ -171,6 +172,7 @@ const RULES = [
171
172
  unknownVariableRule,
172
173
  unknownVariableSetterRule,
173
174
  unknownWorkflowParameterRule,
175
+ ambiguousStyleVariableSyntaxRule,
174
176
  ]
175
177
 
176
178
  /**
@@ -0,0 +1,278 @@
1
+ import { describe, expect, test } from 'bun:test'
2
+ import { searchProject } from '../../searchProject'
3
+ import { ambiguousStyleVariableSyntaxRule } from './ambiguousStyleVariableSyntaxRule'
4
+
5
+ describe('ambiguousStyleVariableSyntaxRule', () => {
6
+ test('should report when there are style variables with the same name but different syntax', () => {
7
+ const problems = Array.from(
8
+ searchProject({
9
+ files: {
10
+ components: {
11
+ component1: {
12
+ name: 'component1',
13
+ nodes: {
14
+ node1: {
15
+ type: 'element',
16
+ customProperties: {
17
+ '--my-variable': {
18
+ syntax: { type: 'primitive', name: 'length' },
19
+ formula: { type: 'value', value: '10px' },
20
+ },
21
+ },
22
+ attrs: {},
23
+ style: {},
24
+ children: [],
25
+ events: {},
26
+ classes: {},
27
+ tag: 'div',
28
+ },
29
+ },
30
+ apis: {},
31
+ attributes: {},
32
+ variables: {},
33
+ formulas: {},
34
+ },
35
+ component2: {
36
+ name: 'component2',
37
+ nodes: {
38
+ node2: {
39
+ type: 'element',
40
+ customProperties: {
41
+ '--my-variable': {
42
+ syntax: { type: 'primitive', name: 'color' },
43
+ formula: { type: 'value', value: '#ff0000' },
44
+ },
45
+ },
46
+ attrs: {},
47
+ style: {},
48
+ children: [],
49
+ events: {},
50
+ classes: {},
51
+ tag: 'div',
52
+ },
53
+ },
54
+ apis: {},
55
+ attributes: {},
56
+ variables: {},
57
+ formulas: {},
58
+ },
59
+ },
60
+ },
61
+ rules: [ambiguousStyleVariableSyntaxRule],
62
+ }),
63
+ )
64
+ expect(problems).toHaveLength(2)
65
+ expect(problems[0].code).toBe('ambiguous style variable syntax')
66
+ expect(problems[1].code).toBe('ambiguous style variable syntax')
67
+ expect(problems[0].details.name).toBe('--my-variable')
68
+ expect(problems[1].details.name).toBe('--my-variable')
69
+ expect(problems[0].details.duplicates).toEqual([
70
+ {
71
+ path: [
72
+ 'components',
73
+ 'component2',
74
+ 'nodes',
75
+ 'node2',
76
+ 'customProperties',
77
+ '--my-variable',
78
+ ],
79
+ syntax: { type: 'primitive', name: 'color' },
80
+ },
81
+ ])
82
+ expect(problems[1].details.duplicates).toEqual([
83
+ {
84
+ path: [
85
+ 'components',
86
+ 'component1',
87
+ 'nodes',
88
+ 'node1',
89
+ 'customProperties',
90
+ '--my-variable',
91
+ ],
92
+ syntax: { type: 'primitive', name: 'length' },
93
+ },
94
+ ])
95
+ })
96
+
97
+ test('should not report when style variables have same name and same syntax', () => {
98
+ const problems = Array.from(
99
+ searchProject({
100
+ files: {
101
+ components: {
102
+ component1: {
103
+ name: 'component1',
104
+ nodes: {
105
+ node1: {
106
+ type: 'element',
107
+ customProperties: {
108
+ '--my-variable': {
109
+ syntax: { type: 'primitive', name: 'length' },
110
+ formula: { type: 'value', value: '10px' },
111
+ },
112
+ },
113
+ attrs: {},
114
+ style: {},
115
+ children: [],
116
+ events: {},
117
+ classes: {},
118
+ tag: 'div',
119
+ },
120
+ },
121
+ apis: {},
122
+ attributes: {},
123
+ variables: {},
124
+ formulas: {},
125
+ },
126
+ component2: {
127
+ name: 'component2',
128
+ nodes: {
129
+ node2: {
130
+ type: 'element',
131
+ customProperties: {
132
+ '--my-variable': {
133
+ syntax: { type: 'primitive', name: 'length' },
134
+ formula: { type: 'value', value: '20px' },
135
+ },
136
+ },
137
+ attrs: {},
138
+ style: {},
139
+ children: [],
140
+ events: {},
141
+ classes: {},
142
+ tag: 'div',
143
+ },
144
+ },
145
+ apis: {},
146
+ attributes: {},
147
+ variables: {},
148
+ formulas: {},
149
+ },
150
+ },
151
+ },
152
+ rules: [ambiguousStyleVariableSyntaxRule],
153
+ }),
154
+ )
155
+ expect(problems).toHaveLength(0)
156
+ })
157
+
158
+ test('should handle variant customProperties too', () => {
159
+ const problems = Array.from(
160
+ searchProject({
161
+ files: {
162
+ components: {
163
+ component1: {
164
+ name: 'component1',
165
+ nodes: {
166
+ node1: {
167
+ type: 'element',
168
+ customProperties: {
169
+ '--my-variable': {
170
+ syntax: { type: 'primitive', name: 'length' },
171
+ formula: { type: 'value', value: '10px' },
172
+ },
173
+ },
174
+ variants: [
175
+ {
176
+ breakpoint: 'medium',
177
+ style: {},
178
+ customProperties: {
179
+ '--my-variable': {
180
+ syntax: { type: 'primitive', name: 'color' },
181
+ formula: { type: 'value', value: '#ff0000' },
182
+ },
183
+ },
184
+ },
185
+ ],
186
+ attrs: {},
187
+ style: {},
188
+ children: [],
189
+ events: {},
190
+ classes: {},
191
+ tag: 'div',
192
+ },
193
+ },
194
+ apis: {},
195
+ attributes: {},
196
+ variables: {},
197
+ formulas: {},
198
+ },
199
+ },
200
+ },
201
+ rules: [ambiguousStyleVariableSyntaxRule],
202
+ }),
203
+ )
204
+
205
+ // Should flag both the base and the variant for conflicting syntax
206
+ expect(problems).toHaveLength(2)
207
+ expect(problems.map((p) => p.details.name)).toEqual([
208
+ '--my-variable',
209
+ '--my-variable',
210
+ ])
211
+ })
212
+
213
+ test('should ignore non-primitive syntax', () => {
214
+ const problems = Array.from(
215
+ searchProject({
216
+ files: {
217
+ components: {
218
+ component1: {
219
+ name: 'component1',
220
+ nodes: {
221
+ node1: {
222
+ type: 'element',
223
+ customProperties: {
224
+ '--my-variable': {
225
+ syntax: {
226
+ type: 'keyword',
227
+ keywords: ['auto', 'inherit'],
228
+ },
229
+ formula: { type: 'value', value: '10px' },
230
+ },
231
+ },
232
+ attrs: {},
233
+ style: {},
234
+ children: [],
235
+ events: {},
236
+ classes: {},
237
+ tag: 'div',
238
+ },
239
+ },
240
+ apis: {},
241
+ attributes: {},
242
+ variables: {},
243
+ formulas: {},
244
+ },
245
+ component2: {
246
+ name: 'component2',
247
+ nodes: {
248
+ node2: {
249
+ type: 'element',
250
+ customProperties: {
251
+ '--my-variable': {
252
+ syntax: { type: 'primitive', name: 'color' },
253
+ formula: { type: 'value', value: '#ff0000' },
254
+ },
255
+ },
256
+ attrs: {},
257
+ style: {},
258
+ children: [],
259
+ events: {},
260
+ classes: {},
261
+ tag: 'div',
262
+ },
263
+ },
264
+ apis: {},
265
+ attributes: {},
266
+ variables: {},
267
+ formulas: {},
268
+ },
269
+ },
270
+ },
271
+ rules: [ambiguousStyleVariableSyntaxRule],
272
+ }),
273
+ )
274
+
275
+ // Should not report because non-primitive should be skipped
276
+ expect(problems).toHaveLength(0)
277
+ })
278
+ })
@@ -0,0 +1,65 @@
1
+ import type { CssSyntaxNode } from '@nordcraft/core/dist/styling/customProperty'
2
+ import { getAllCustomPropertiesBySyntax } from '../../memos/getAllCustomPropertiesBySyntax'
3
+ import type { Rule } from '../../types'
4
+
5
+ export const ambiguousStyleVariableSyntaxRule: Rule<{
6
+ name: string
7
+ duplicates: Array<{ path: string[]; syntax: CssSyntaxNode }>
8
+ }> = {
9
+ code: 'ambiguous style variable syntax',
10
+ level: 'error',
11
+ category: 'Other',
12
+ visit: (report, args) => {
13
+ const { nodeType, value, files, memo, path } = args
14
+ if (nodeType !== 'component-node') return
15
+ if (value.type !== 'element' && value.type !== 'component') return
16
+
17
+ const check = (
18
+ propName: string,
19
+ syntax: CssSyntaxNode,
20
+ basePath: Array<string | number>,
21
+ ) => {
22
+ if (syntax.type !== 'primitive') return
23
+ const allCustomPropertiesBySyntax = getAllCustomPropertiesBySyntax(memo, {
24
+ files,
25
+ })[propName]
26
+
27
+ const conflicts = Object.entries(allCustomPropertiesBySyntax)
28
+ .filter(([name]) => name !== syntax.name)
29
+ .flatMap(([, entries]) => entries)
30
+
31
+ if (conflicts.length > 0) {
32
+ report(basePath, {
33
+ name: propName,
34
+ duplicates: conflicts,
35
+ })
36
+ }
37
+ }
38
+
39
+ for (const [propName, prop] of Object.entries(
40
+ value.customProperties ?? {},
41
+ )) {
42
+ check(propName, prop.syntax, [
43
+ ...path,
44
+ 'customProperties',
45
+ propName,
46
+ 'name',
47
+ ])
48
+ }
49
+
50
+ value.variants?.forEach((variant, variantIndex) => {
51
+ for (const [propName, prop] of Object.entries(
52
+ variant.customProperties ?? {},
53
+ )) {
54
+ check(propName, prop.syntax, [
55
+ ...path,
56
+ 'variants',
57
+ String(variantIndex),
58
+ 'customProperties',
59
+ propName,
60
+ 'name',
61
+ ])
62
+ }
63
+ })
64
+ },
65
+ }
package/src/types.d.ts CHANGED
@@ -23,6 +23,7 @@ import type {
23
23
  } from '@nordcraft/ssr/dist/ssr.types'
24
24
 
25
25
  type Code =
26
+ | 'ambiguous style variable syntax'
26
27
  | 'duplicate event trigger'
27
28
  | 'duplicate url parameter'
28
29
  | 'duplicate workflow parameter'