@nordcraft/search 1.0.85 → 1.0.86

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 (248) hide show
  1. package/dist/rules/issues/actions/actionRules.index.js +4 -0
  2. package/dist/rules/issues/actions/actionRules.index.js.map +1 -1
  3. package/dist/rules/issues/actions/createActionNameRule.d.ts +5 -1
  4. package/dist/rules/issues/actions/createActionNameRule.js +6 -2
  5. package/dist/rules/issues/actions/createActionNameRule.js.map +1 -1
  6. package/dist/rules/issues/actions/duplicateActionArgumentNameRule.js +8 -1
  7. package/dist/rules/issues/actions/duplicateActionArgumentNameRule.js.map +1 -1
  8. package/dist/rules/issues/actions/legacyActionRule.js +18 -8
  9. package/dist/rules/issues/actions/legacyActionRule.js.map +1 -1
  10. package/dist/rules/issues/actions/noReferenceProjectActionRule.js +8 -1
  11. package/dist/rules/issues/actions/noReferenceProjectActionRule.js.map +1 -1
  12. package/dist/rules/issues/actions/unknownActionArgumentRule.js +23 -6
  13. package/dist/rules/issues/actions/unknownActionArgumentRule.js.map +1 -1
  14. package/dist/rules/issues/actions/unknownActionEventRule.js +11 -3
  15. package/dist/rules/issues/actions/unknownActionEventRule.js.map +1 -1
  16. package/dist/rules/issues/actions/unknownProjectActionRule.js +8 -1
  17. package/dist/rules/issues/actions/unknownProjectActionRule.js.map +1 -1
  18. package/dist/rules/issues/apis/invalidApiParserModeRule.js +8 -1
  19. package/dist/rules/issues/apis/invalidApiParserModeRule.js.map +1 -1
  20. package/dist/rules/issues/apis/invalidApiProxyBodySettingRule.js +8 -1
  21. package/dist/rules/issues/apis/invalidApiProxyBodySettingRule.js.map +1 -1
  22. package/dist/rules/issues/apis/invalidApiProxyCookieSettingRule.js +8 -1
  23. package/dist/rules/issues/apis/invalidApiProxyCookieSettingRule.js.map +1 -1
  24. package/dist/rules/issues/apis/legacyApiRule.js +8 -1
  25. package/dist/rules/issues/apis/legacyApiRule.js.map +1 -1
  26. package/dist/rules/issues/apis/noReferenceApiInputRule.js +8 -1
  27. package/dist/rules/issues/apis/noReferenceApiInputRule.js.map +1 -1
  28. package/dist/rules/issues/apis/noReferenceApiRule.js +8 -1
  29. package/dist/rules/issues/apis/noReferenceApiRule.js.map +1 -1
  30. package/dist/rules/issues/apis/noReferenceApiServiceRule.js +9 -1
  31. package/dist/rules/issues/apis/noReferenceApiServiceRule.js.map +1 -1
  32. package/dist/rules/issues/apis/unknownApiInputRule.js +8 -1
  33. package/dist/rules/issues/apis/unknownApiInputRule.js.map +1 -1
  34. package/dist/rules/issues/apis/unknownApiRule.js +16 -2
  35. package/dist/rules/issues/apis/unknownApiRule.js.map +1 -1
  36. package/dist/rules/issues/apis/unknownApiServiceRule.js +9 -1
  37. package/dist/rules/issues/apis/unknownApiServiceRule.js.map +1 -1
  38. package/dist/rules/issues/apis/unknownFetchInputRule.js +9 -1
  39. package/dist/rules/issues/apis/unknownFetchInputRule.js.map +1 -1
  40. package/dist/rules/issues/attributes/noReferenceAttributeInInstanceRule.js +9 -2
  41. package/dist/rules/issues/attributes/noReferenceAttributeInInstanceRule.js.map +1 -1
  42. package/dist/rules/issues/attributes/noReferenceAttributeRule.js +8 -1
  43. package/dist/rules/issues/attributes/noReferenceAttributeRule.js.map +1 -1
  44. package/dist/rules/issues/attributes/unknownAttributeRule.js +8 -1
  45. package/dist/rules/issues/attributes/unknownAttributeRule.js.map +1 -1
  46. package/dist/rules/issues/attributes/unknownComponentAttributeRule.js +9 -3
  47. package/dist/rules/issues/attributes/unknownComponentAttributeRule.js.map +1 -1
  48. package/dist/rules/issues/components/invalidComponentStructureRule.js +12 -4
  49. package/dist/rules/issues/components/invalidComponentStructureRule.js.map +1 -1
  50. package/dist/rules/issues/components/noReferenceComponentRule.js +8 -1
  51. package/dist/rules/issues/components/noReferenceComponentRule.js.map +1 -1
  52. package/dist/rules/issues/components/unknownComponentRule.js +8 -1
  53. package/dist/rules/issues/components/unknownComponentRule.js.map +1 -1
  54. package/dist/rules/issues/context/noContextConsumersRule.js +7 -1
  55. package/dist/rules/issues/context/noContextConsumersRule.js.map +1 -1
  56. package/dist/rules/issues/context/unknownContextFormulaRule.js +10 -3
  57. package/dist/rules/issues/context/unknownContextFormulaRule.js.map +1 -1
  58. package/dist/rules/issues/context/unknownContextProviderFormulaRule.js +10 -3
  59. package/dist/rules/issues/context/unknownContextProviderFormulaRule.js.map +1 -1
  60. package/dist/rules/issues/context/unknownContextProviderRule.js +8 -1
  61. package/dist/rules/issues/context/unknownContextProviderRule.js.map +1 -1
  62. package/dist/rules/issues/dom/createRequiredDirectChildRule.js +11 -4
  63. package/dist/rules/issues/dom/createRequiredDirectChildRule.js.map +1 -1
  64. package/dist/rules/issues/dom/createRequiredDirectParentRule.js +11 -4
  65. package/dist/rules/issues/dom/createRequiredDirectParentRule.js.map +1 -1
  66. package/dist/rules/issues/dom/createRequiredElementAttributeRule.js +8 -1
  67. package/dist/rules/issues/dom/createRequiredElementAttributeRule.js.map +1 -1
  68. package/dist/rules/issues/dom/createRequiredMetaTagRule.js +10 -1
  69. package/dist/rules/issues/dom/createRequiredMetaTagRule.js.map +1 -1
  70. package/dist/rules/issues/dom/elementWithoutInteractiveContentRule.js +16 -3
  71. package/dist/rules/issues/dom/elementWithoutInteractiveContentRule.js.map +1 -1
  72. package/dist/rules/issues/dom/imageWithoutDimensionRule.js +7 -1
  73. package/dist/rules/issues/dom/imageWithoutDimensionRule.js.map +1 -1
  74. package/dist/rules/issues/dom/nonEmptyVoidElementRule.js +8 -1
  75. package/dist/rules/issues/dom/nonEmptyVoidElementRule.js.map +1 -1
  76. package/dist/rules/issues/events/duplicateEventTriggerRule.js +8 -1
  77. package/dist/rules/issues/events/duplicateEventTriggerRule.js.map +1 -1
  78. package/dist/rules/issues/events/noReferenceEventRule.js +9 -1
  79. package/dist/rules/issues/events/noReferenceEventRule.js.map +1 -1
  80. package/dist/rules/issues/events/unknownEventRule.js +8 -1
  81. package/dist/rules/issues/events/unknownEventRule.js.map +1 -1
  82. package/dist/rules/issues/events/unknownTriggerEventRule.js +8 -1
  83. package/dist/rules/issues/events/unknownTriggerEventRule.js.map +1 -1
  84. package/dist/rules/issues/formulas/duplicateFormulaArgumentNameRule.js +8 -1
  85. package/dist/rules/issues/formulas/duplicateFormulaArgumentNameRule.js.map +1 -1
  86. package/dist/rules/issues/formulas/legacyFormulaRule.js +12 -5
  87. package/dist/rules/issues/formulas/legacyFormulaRule.js.map +1 -1
  88. package/dist/rules/issues/formulas/noReferenceComponentFormulaRule.js +14 -4
  89. package/dist/rules/issues/formulas/noReferenceComponentFormulaRule.js.map +1 -1
  90. package/dist/rules/issues/formulas/noReferenceProjectFormulaRule.js +8 -1
  91. package/dist/rules/issues/formulas/noReferenceProjectFormulaRule.js.map +1 -1
  92. package/dist/rules/issues/formulas/unknownComponentFormulaInputRule.js +8 -1
  93. package/dist/rules/issues/formulas/unknownComponentFormulaInputRule.js.map +1 -1
  94. package/dist/rules/issues/formulas/unknownFormulaRule.js +8 -1
  95. package/dist/rules/issues/formulas/unknownFormulaRule.js.map +1 -1
  96. package/dist/rules/issues/formulas/unknownProjectFormulaInputRule.js +8 -1
  97. package/dist/rules/issues/formulas/unknownProjectFormulaInputRule.js.map +1 -1
  98. package/dist/rules/issues/formulas/unknownProjectFormulaRule.js +8 -1
  99. package/dist/rules/issues/formulas/unknownProjectFormulaRule.js.map +1 -1
  100. package/dist/rules/issues/formulas/unknownRepeatIndexFormulaRule.js +14 -2
  101. package/dist/rules/issues/formulas/unknownRepeatIndexFormulaRule.js.map +1 -1
  102. package/dist/rules/issues/formulas/unknownRepeatItemFormulaRule.js +14 -2
  103. package/dist/rules/issues/formulas/unknownRepeatItemFormulaRule.js.map +1 -1
  104. package/dist/rules/issues/logic/noStaticNodeCondition.js +15 -3
  105. package/dist/rules/issues/logic/noStaticNodeCondition.js.map +1 -1
  106. package/dist/rules/issues/logic/noUnnecessaryConditionFalsy.js +7 -1
  107. package/dist/rules/issues/logic/noUnnecessaryConditionFalsy.js.map +1 -1
  108. package/dist/rules/issues/logic/noUnnecessaryConditionTruthy.js +7 -1
  109. package/dist/rules/issues/logic/noUnnecessaryConditionTruthy.js.map +1 -1
  110. package/dist/rules/issues/miscellaneous/noReferenceNodeRule.js +9 -1
  111. package/dist/rules/issues/miscellaneous/noReferenceNodeRule.js.map +1 -1
  112. package/dist/rules/issues/miscellaneous/requireExtensionRule.js +7 -1
  113. package/dist/rules/issues/miscellaneous/requireExtensionRule.js.map +1 -1
  114. package/dist/rules/issues/miscellaneous/unknownCookieRule.js +8 -1
  115. package/dist/rules/issues/miscellaneous/unknownCookieRule.js.map +1 -1
  116. package/dist/rules/issues/routing/duplicateRouteRule.js +16 -6
  117. package/dist/rules/issues/routing/duplicateRouteRule.js.map +1 -1
  118. package/dist/rules/issues/routing/duplicateUrlParameterRule.js +16 -2
  119. package/dist/rules/issues/routing/duplicateUrlParameterRule.js.map +1 -1
  120. package/dist/rules/issues/routing/unknownSetUrlParameterRule.js +8 -1
  121. package/dist/rules/issues/routing/unknownSetUrlParameterRule.js.map +1 -1
  122. package/dist/rules/issues/routing/unknownSetUrlParametersRule.js +8 -1
  123. package/dist/rules/issues/routing/unknownSetUrlParametersRule.js.map +1 -1
  124. package/dist/rules/issues/routing/unknownUrlParameterRule.js +8 -1
  125. package/dist/rules/issues/routing/unknownUrlParameterRule.js.map +1 -1
  126. package/dist/rules/issues/slots/unknownComponentSlotRule.js +8 -1
  127. package/dist/rules/issues/slots/unknownComponentSlotRule.js.map +1 -1
  128. package/dist/rules/issues/style/invalidStyleSyntaxRule.js +9 -1
  129. package/dist/rules/issues/style/invalidStyleSyntaxRule.js.map +1 -1
  130. package/dist/rules/issues/style/legacyStyleVariableRule.js +9 -3
  131. package/dist/rules/issues/style/legacyStyleVariableRule.js.map +1 -1
  132. package/dist/rules/issues/style/legacyThemeRule.js +7 -1
  133. package/dist/rules/issues/style/legacyThemeRule.js.map +1 -1
  134. package/dist/rules/issues/style/noReferenceGlobalCSSVariable.js +8 -1
  135. package/dist/rules/issues/style/noReferenceGlobalCSSVariable.js.map +1 -1
  136. package/dist/rules/issues/style/unknownCSSVariable.js +43 -45
  137. package/dist/rules/issues/style/unknownCSSVariable.js.map +1 -1
  138. package/dist/rules/issues/style/unknownClassnameRule.js +8 -1
  139. package/dist/rules/issues/style/unknownClassnameRule.js.map +1 -1
  140. package/dist/rules/issues/variables/noReferenceVariableRule.js +8 -1
  141. package/dist/rules/issues/variables/noReferenceVariableRule.js.map +1 -1
  142. package/dist/rules/issues/variables/unknownVariableRule.js +8 -1
  143. package/dist/rules/issues/variables/unknownVariableRule.js.map +1 -1
  144. package/dist/rules/issues/variables/unknownVariableSetterRule.js +8 -1
  145. package/dist/rules/issues/variables/unknownVariableSetterRule.js.map +1 -1
  146. package/dist/rules/issues/workflows/duplicateWorkflowParameterRule.js +8 -1
  147. package/dist/rules/issues/workflows/duplicateWorkflowParameterRule.js.map +1 -1
  148. package/dist/rules/issues/workflows/noPostNavigateAction.js +8 -1
  149. package/dist/rules/issues/workflows/noPostNavigateAction.js.map +1 -1
  150. package/dist/rules/issues/workflows/noReferenceComponentWorkflowRule.js +8 -1
  151. package/dist/rules/issues/workflows/noReferenceComponentWorkflowRule.js.map +1 -1
  152. package/dist/rules/issues/workflows/unknownContextProviderWorkflowRule.js +10 -3
  153. package/dist/rules/issues/workflows/unknownContextProviderWorkflowRule.js.map +1 -1
  154. package/dist/rules/issues/workflows/unknownContextWorkflowRule.js +10 -3
  155. package/dist/rules/issues/workflows/unknownContextWorkflowRule.js.map +1 -1
  156. package/dist/rules/issues/workflows/unknownTriggerWorkflowParameterRule.js +9 -2
  157. package/dist/rules/issues/workflows/unknownTriggerWorkflowParameterRule.js.map +1 -1
  158. package/dist/rules/issues/workflows/unknownTriggerWorkflowRule.js +7 -1
  159. package/dist/rules/issues/workflows/unknownTriggerWorkflowRule.js.map +1 -1
  160. package/dist/rules/issues/workflows/unknownWorkflowParameterRule.js +9 -2
  161. package/dist/rules/issues/workflows/unknownWorkflowParameterRule.js.map +1 -1
  162. package/dist/searchProject.js +2 -1
  163. package/dist/searchProject.js.map +1 -1
  164. package/dist/types.d.ts +12 -1
  165. package/package.json +3 -3
  166. package/src/rules/issues/actions/actionRules.index.ts +5 -0
  167. package/src/rules/issues/actions/createActionNameRule.ts +10 -1
  168. package/src/rules/issues/actions/duplicateActionArgumentNameRule.ts +8 -1
  169. package/src/rules/issues/actions/legacyActionRule.ts +10 -3
  170. package/src/rules/issues/actions/noReferenceProjectActionRule.ts +8 -1
  171. package/src/rules/issues/actions/unknownActionArgumentRule.ts +18 -9
  172. package/src/rules/issues/actions/unknownActionEventRule.ts +8 -4
  173. package/src/rules/issues/actions/unknownProjectActionRule.ts +8 -1
  174. package/src/rules/issues/apis/invalidApiParserModeRule.ts +8 -1
  175. package/src/rules/issues/apis/invalidApiProxyBodySettingRule.ts +8 -1
  176. package/src/rules/issues/apis/invalidApiProxyCookieSettingRule.ts +8 -1
  177. package/src/rules/issues/apis/legacyApiRule.ts +8 -1
  178. package/src/rules/issues/apis/noReferenceApiInputRule.ts +8 -1
  179. package/src/rules/issues/apis/noReferenceApiRule.ts +8 -1
  180. package/src/rules/issues/apis/noReferenceApiServiceRule.ts +9 -1
  181. package/src/rules/issues/apis/unknownApiInputRule.ts +8 -1
  182. package/src/rules/issues/apis/unknownApiRule.ts +16 -2
  183. package/src/rules/issues/apis/unknownApiServiceRule.ts +9 -5
  184. package/src/rules/issues/apis/unknownFetchInputRule.ts +9 -1
  185. package/src/rules/issues/attributes/noReferenceAttributeInInstanceRule.ts +9 -2
  186. package/src/rules/issues/attributes/noReferenceAttributeRule.ts +8 -1
  187. package/src/rules/issues/attributes/unknownAttributeRule.ts +8 -1
  188. package/src/rules/issues/attributes/unknownComponentAttributeRule.ts +9 -3
  189. package/src/rules/issues/components/invalidComponentStructureRule.ts +9 -5
  190. package/src/rules/issues/components/noReferenceComponentRule.ts +9 -1
  191. package/src/rules/issues/components/unknownComponentRule.ts +8 -1
  192. package/src/rules/issues/context/noContextConsumersRule.ts +8 -1
  193. package/src/rules/issues/context/unknownContextFormulaRule.ts +10 -3
  194. package/src/rules/issues/context/unknownContextProviderFormulaRule.ts +10 -3
  195. package/src/rules/issues/context/unknownContextProviderRule.ts +8 -1
  196. package/src/rules/issues/dom/createRequiredDirectChildRule.ts +11 -4
  197. package/src/rules/issues/dom/createRequiredDirectParentRule.ts +11 -4
  198. package/src/rules/issues/dom/createRequiredElementAttributeRule.ts +8 -1
  199. package/src/rules/issues/dom/createRequiredMetaTagRule.ts +14 -1
  200. package/src/rules/issues/dom/elementWithoutInteractiveContentRule.ts +26 -3
  201. package/src/rules/issues/dom/imageWithoutDimensionRule.ts +8 -1
  202. package/src/rules/issues/dom/nonEmptyVoidElementRule.ts +8 -1
  203. package/src/rules/issues/events/duplicateEventTriggerRule.ts +8 -1
  204. package/src/rules/issues/events/noReferenceEventRule.ts +9 -1
  205. package/src/rules/issues/events/unknownEventRule.ts +8 -1
  206. package/src/rules/issues/events/unknownTriggerEventRule.ts +8 -1
  207. package/src/rules/issues/formulas/duplicateFormulaArgumentNameRule.ts +8 -1
  208. package/src/rules/issues/formulas/legacyFormulaRule.ts +12 -7
  209. package/src/rules/issues/formulas/noReferenceComponentFormulaRule.ts +12 -5
  210. package/src/rules/issues/formulas/noReferenceProjectFormulaRule.ts +8 -1
  211. package/src/rules/issues/formulas/unknownComponentFormulaInputRule.ts +8 -1
  212. package/src/rules/issues/formulas/unknownFormulaRule.ts +8 -1
  213. package/src/rules/issues/formulas/unknownProjectFormulaInputRule.ts +8 -1
  214. package/src/rules/issues/formulas/unknownProjectFormulaRule.ts +8 -1
  215. package/src/rules/issues/formulas/unknownRepeatIndexFormulaRule.ts +14 -2
  216. package/src/rules/issues/formulas/unknownRepeatItemFormulaRule.ts +14 -2
  217. package/src/rules/issues/logic/noStaticNodeCondition.ts +15 -4
  218. package/src/rules/issues/logic/noUnnecessaryConditionFalsy.ts +8 -1
  219. package/src/rules/issues/logic/noUnnecessaryConditionTruthy.ts +8 -1
  220. package/src/rules/issues/miscellaneous/noReferenceNodeRule.ts +9 -1
  221. package/src/rules/issues/miscellaneous/requireExtensionRule.ts +8 -1
  222. package/src/rules/issues/miscellaneous/unknownCookieRule.ts +8 -1
  223. package/src/rules/issues/routing/duplicateRouteRule.ts +18 -6
  224. package/src/rules/issues/routing/duplicateUrlParameterRule.ts +16 -2
  225. package/src/rules/issues/routing/unknownSetUrlParameterRule.ts +8 -1
  226. package/src/rules/issues/routing/unknownSetUrlParametersRule.ts +8 -1
  227. package/src/rules/issues/routing/unknownUrlParameterRule.ts +8 -1
  228. package/src/rules/issues/slots/unknownComponentSlotRule.ts +8 -1
  229. package/src/rules/issues/style/invalidStyleSyntaxRule.ts +9 -1
  230. package/src/rules/issues/style/legacyStyleVariableRule.ts +9 -3
  231. package/src/rules/issues/style/legacyThemeRule.ts +7 -1
  232. package/src/rules/issues/style/noReferenceGlobalCSSVariable.ts +8 -1
  233. package/src/rules/issues/style/unknownCSSVariable.test.ts +45 -37
  234. package/src/rules/issues/style/unknownCSSVariable.ts +49 -52
  235. package/src/rules/issues/style/unknownClassnameRule.ts +8 -1
  236. package/src/rules/issues/variables/noReferenceVariableRule.ts +8 -1
  237. package/src/rules/issues/variables/unknownVariableRule.ts +8 -1
  238. package/src/rules/issues/variables/unknownVariableSetterRule.ts +8 -1
  239. package/src/rules/issues/workflows/duplicateWorkflowParameterRule.ts +8 -1
  240. package/src/rules/issues/workflows/noPostNavigateAction.ts +8 -1
  241. package/src/rules/issues/workflows/noReferenceComponentWorkflowRule.ts +8 -1
  242. package/src/rules/issues/workflows/unknownContextProviderWorkflowRule.ts +10 -3
  243. package/src/rules/issues/workflows/unknownContextWorkflowRule.ts +10 -3
  244. package/src/rules/issues/workflows/unknownTriggerWorkflowParameterRule.ts +9 -2
  245. package/src/rules/issues/workflows/unknownTriggerWorkflowRule.ts +7 -1
  246. package/src/rules/issues/workflows/unknownWorkflowParameterRule.ts +9 -2
  247. package/src/searchProject.ts +2 -1
  248. package/src/types.ts +12 -1
@@ -28,13 +28,24 @@ export const noStaticNodeCondition: Rule<{
28
28
  if (isStatic) {
29
29
  // - if truthy: "Condition is always true, you can safely remove the condition as it will always be rendered."
30
30
  // - if falsy: "Condition is always false, you can safely remove the entire node as it will never be rendered."
31
- report(
31
+ report({
32
32
  path,
33
- {
33
+ info: {
34
+ title:
35
+ Boolean(result) === true
36
+ ? `Unnecessary show/hide, value is always truthy`
37
+ : `Unnecessary show/hide, value is always falsy`,
38
+ description:
39
+ Boolean(result) === true
40
+ ? `Condition always evaluates to **show** the element. Consider removing the show/hide formula.`
41
+ : `Condition always evaluates to **hide** the element. Consider removing the element node.`,
42
+ },
43
+ details: {
34
44
  result,
35
45
  },
36
- Boolean(result) === true ? ['remove-condition'] : ['remove-node'],
37
- )
46
+ fixes:
47
+ Boolean(result) === true ? ['remove-condition'] : ['remove-node'],
48
+ })
38
49
  }
39
50
  },
40
51
  fixes: {
@@ -16,7 +16,14 @@ export const noUnnecessaryConditionFalsy: Rule = {
16
16
  return isStatic && Boolean(result) === false
17
17
  })
18
18
  ) {
19
- report(path)
19
+ report({
20
+ path,
21
+ info: {
22
+ title: 'Unnecessary condition',
23
+ description:
24
+ '**And condition** is always falsy. Consider replacing it with a single *false* node.',
25
+ },
26
+ })
20
27
  }
21
28
  },
22
29
  }
@@ -21,7 +21,14 @@ export const noUnnecessaryConditionTruthy: Rule = {
21
21
  return isStatic && Boolean(result) === true
22
22
  })
23
23
  ) {
24
- report(path)
24
+ report({
25
+ path,
26
+ info: {
27
+ title: 'Unnecessary condition',
28
+ description:
29
+ '**Or condition** is always truthy. Consider replacing it with a single *true* node.',
30
+ },
31
+ })
25
32
  }
26
33
  },
27
34
  }
@@ -25,7 +25,15 @@ export const noReferenceNodeRule: Rule<{ node: string }> = {
25
25
  )
26
26
 
27
27
  if (nodeId !== 'root' && !referencedNodesInComponent.has(nodeId)) {
28
- report(path, { node: nodeId }, ['delete-orphan-node'])
28
+ report({
29
+ path,
30
+ info: {
31
+ title: `Orphan node/element was found`,
32
+ description: `A node is declared, but it is not included in any other element, including the root element. This node can safely be removed.`,
33
+ },
34
+ details: { node: nodeId },
35
+ fixes: ['delete-orphan-node'],
36
+ })
29
37
  }
30
38
  },
31
39
  fixes: {
@@ -16,6 +16,13 @@ export const requireExtensionRule: Rule<{
16
16
  ) {
17
17
  return
18
18
  }
19
- report(path)
19
+ report({
20
+ path,
21
+ info: {
22
+ title: 'Browser plugin recommended',
23
+ description:
24
+ '**Toddle browser plugin** is recommended for working with cookies. [Install extension](https://chromewebstore.google.com/detail/toddle/hfhgjncckomifajhndceigiaiojhlllp?hl=en)',
25
+ },
26
+ })
20
27
  },
21
28
  }
@@ -27,7 +27,14 @@ export const unknownCookieRule: Rule<{
27
27
  }
28
28
  const cookie = state.cookiesAvailable?.find((c) => c.name === formula.value)
29
29
  if (!cookie) {
30
- report(path, { name: formula.value })
30
+ report({
31
+ path,
32
+ info: {
33
+ title: 'Unknown cookie',
34
+ description: `**${formula.value}** is not found in the browser extension cookies.`,
35
+ },
36
+ details: { name: formula.value },
37
+ })
31
38
  }
32
39
  },
33
40
  }
@@ -40,12 +40,24 @@ export const duplicateRouteRule: Rule<{
40
40
  })
41
41
  const match = allRoutes.get(getRouteKey(value.route?.path))
42
42
  if (match && match.length > 1) {
43
- report([...path, 'route', 'path'], {
44
- name: value.name,
45
- type: 'page',
46
- duplicates: match
47
- .filter((m) => m !== value.name)
48
- .map((name) => ({ name, type: 'page' })),
43
+ const duplicates = match
44
+ .filter((m) => m !== value.name)
45
+ .map((name) => ({ name, type: 'page' as const }))
46
+ report({
47
+ path: [...path, 'route', 'path'],
48
+ info: {
49
+ title: 'Duplicate route declaration',
50
+ description: `The page **${
51
+ value.name
52
+ }** has the same route/path declared as the pages/routes below. Route declarations must be unique.${duplicates
53
+ .map((d) => `\n- ${d.name} (${d.type})`)
54
+ .join('')}`,
55
+ },
56
+ details: {
57
+ name: value.name,
58
+ type: 'page',
59
+ duplicates,
60
+ },
49
61
  })
50
62
  }
51
63
  },
@@ -17,13 +17,27 @@ export const duplicateUrlParameterRule: Rule<{ name: string }> = {
17
17
  const pathNames = new Set<string>()
18
18
  value.route.path.forEach((p, i) => {
19
19
  if (pathNames.has(p.name)) {
20
- report([...path, 'route', 'path', i], { name: p.name })
20
+ report({
21
+ path: [...path, 'route', 'path', i],
22
+ info: {
23
+ title: 'Duplicate URL parameter',
24
+ description: `**${p.name}** appears multiple times in the path/query parameters. This may lead to unexpected behavior. Consider consolidating them into a single parameter or renaming them.`,
25
+ },
26
+ details: { name: p.name },
27
+ })
21
28
  }
22
29
  pathNames.add(p.name)
23
30
  })
24
31
  Object.keys(value.route.query).forEach((key) => {
25
32
  if (pathNames.has(key)) {
26
- report([...path, 'route', 'query', key], { name: key })
33
+ report({
34
+ path: [...path, 'route', 'query', key],
35
+ info: {
36
+ title: 'Duplicate URL parameter',
37
+ description: `**${key}** appears multiple times in the path/query parameters. This may lead to unexpected behavior. Consider consolidating them into a single parameter or renaming them.`,
38
+ },
39
+ details: { name: key },
40
+ })
27
41
  }
28
42
  })
29
43
  },
@@ -27,7 +27,14 @@ export const unknownSetUrlParameterRule: Rule<{
27
27
  )
28
28
  const parameterName = args.value.parameter
29
29
  if (!isValidParameter(parameterName)) {
30
- report(args.path, { name: parameterName })
30
+ report({
31
+ path: args.path,
32
+ info: {
33
+ title: 'Unknown URL parameter update',
34
+ description: `**${parameterName}** does not exist as a path- or query-parameter and cannot be set/updated.`,
35
+ },
36
+ details: { name: parameterName },
37
+ })
31
38
  }
32
39
  },
33
40
  }
@@ -27,7 +27,14 @@ export const unknownSetUrlParametersRule: Rule<{
27
27
  )
28
28
  for (const key of Object.keys(args.value.parameters ?? {})) {
29
29
  if (!isValidParameter(key)) {
30
- report([...args.path, 'parameters', key], { name: key })
30
+ report({
31
+ path: [...args.path, 'parameters', key],
32
+ info: {
33
+ title: 'Unknown URL parameter update',
34
+ description: `**${key}** does not exist as a path- or query-parameter and cannot be set/updated.`,
35
+ },
36
+ details: { name: key },
37
+ })
31
38
  }
32
39
  }
33
40
  },
@@ -22,7 +22,14 @@ export const unknownUrlParameterRule: Rule<{
22
22
  !component?.route?.query?.[parameterKey] &&
23
23
  !component?.route?.path?.some((p) => p.name === parameterKey)
24
24
  ) {
25
- report(path, { name: parameterKey })
25
+ report({
26
+ path,
27
+ info: {
28
+ title: 'Unknown URL parameter',
29
+ description: `**${parameterKey}** does not exist as a path- or query-parameter. Using an unknown URL parameter will always return *Null*.`,
30
+ },
31
+ details: { name: parameterKey },
32
+ })
26
33
  }
27
34
  },
28
35
  }
@@ -43,7 +43,14 @@ export const unknownComponentSlotRule: Rule<{ slotName: string }> = {
43
43
  const usedSlot = childNode?.slot ?? 'default'
44
44
 
45
45
  if (!usableSlots.includes(usedSlot)) {
46
- report([path[0], path[1], path[2], child], { slotName: usedSlot })
46
+ report({
47
+ path: [path[0], path[1], path[2], child],
48
+ info: {
49
+ title: 'Unknown component slot',
50
+ description: `**${usedSlot}** slot name does not exist as a slot on the parent component.`,
51
+ },
52
+ details: { slotName: usedSlot },
53
+ })
47
54
  }
48
55
  })
49
56
  },
@@ -24,7 +24,15 @@ export const invalidStyleSyntaxRule: Rule<{
24
24
  },
25
25
  )
26
26
  if (!valid) {
27
- report(path, { property: value.styleProperty }, ['delete-style-property'])
27
+ report({
28
+ path,
29
+ info: {
30
+ title: `Invalid style declaration`,
31
+ description: `The style declaration for the property "${value.styleProperty}" is invalid. This can lead to unforeseen styling behavior across other elements. Please fix the style declaration or remove it.`,
32
+ },
33
+ details: { property: value.styleProperty },
34
+ fixes: ['delete-style-property'],
35
+ })
28
36
  }
29
37
  },
30
38
  fixes: {
@@ -29,9 +29,15 @@ export const legacyStyleVariableRule: Rule<
29
29
  return
30
30
  }
31
31
 
32
- report(data.path, { name: data.value.styleVariable.name }, [
33
- 'replace-legacy-style-variable',
34
- ])
32
+ report({
33
+ path: data.path,
34
+ info: {
35
+ title: `Legacy style variable`,
36
+ description: `Style variable **--${data.value.styleVariable.name}** can be replaced with the newer CSS variable system. Consider removing the style variable and create a new CSS variable with the same name.`,
37
+ },
38
+ details: { name: data.value.styleVariable.name },
39
+ fixes: ['replace-legacy-style-variable'],
40
+ })
35
41
  },
36
42
  fixes: {
37
43
  'replace-legacy-style-variable': replaceLegacyStyleVariable,
@@ -14,6 +14,12 @@ export const legacyThemeRule: Rule = {
14
14
  return
15
15
  }
16
16
 
17
- report(data.path, undefined, [])
17
+ report({
18
+ path: data.path,
19
+ info: {
20
+ title: `Legacy theme`,
21
+ description: `You are using an older Nordcraft theme system. Migrate your theme to the newest version to enable multi-theme support and more.`,
22
+ },
23
+ })
18
24
  },
19
25
  }
@@ -99,6 +99,13 @@ export const noReferenceGlobalCSSVariableRule: Rule<{
99
99
  ) {
100
100
  return
101
101
  }
102
- report(path, { name: value.key })
102
+ report({
103
+ path,
104
+ info: {
105
+ title: `Unused CSS variable`,
106
+ description: `**${value.key}** is never used in any style or other CSS variable. Consider removing it.`,
107
+ },
108
+ details: { name: value.key },
109
+ })
103
110
  },
104
111
  }
@@ -171,7 +171,7 @@ describe('unknownCSSVariableRule', () => {
171
171
  expect(problems[1].details).toEqual({ name: '--undefined-local' })
172
172
  })
173
173
 
174
- test('should report problem if local variable is used in parent but only defined in child', () => {
174
+ test('should not report when legacy style variables are used', () => {
175
175
  const problems = Array.from(
176
176
  searchProject({
177
177
  files: {
@@ -190,26 +190,19 @@ describe('unknownCSSVariableRule', () => {
190
190
  tag: 'div',
191
191
  type: 'element',
192
192
  attrs: {},
193
- style: {
194
- color: 'var(--child-only-variable)',
195
- },
196
- events: {},
197
- classes: {},
198
- children: ['child'],
199
- },
200
- child: {
201
- tag: 'div',
202
- type: 'element',
203
- attrs: {},
204
- customProperties: {
205
- '--child-only-variable': {
193
+ 'style-variables': [
194
+ {
195
+ name: 'legacy-variable',
206
196
  formula: {
207
197
  type: 'value',
208
- value: 'red',
198
+ value: '10px',
209
199
  },
200
+ category: 'spacing',
210
201
  },
202
+ ],
203
+ style: {
204
+ margin: 'var(--legacy-variable)',
211
205
  },
212
- style: {},
213
206
  events: {},
214
207
  classes: {},
215
208
  children: [],
@@ -226,10 +219,10 @@ describe('unknownCSSVariableRule', () => {
226
219
  }),
227
220
  )
228
221
 
229
- expect(problems).toHaveLength(1)
222
+ expect(problems).toBeEmpty()
230
223
  })
231
224
 
232
- test('should not report when legacy style variables are used', () => {
225
+ test('should not report when declared in a style', () => {
233
226
  const problems = Array.from(
234
227
  searchProject({
235
228
  files: {
@@ -248,18 +241,9 @@ describe('unknownCSSVariableRule', () => {
248
241
  tag: 'div',
249
242
  type: 'element',
250
243
  attrs: {},
251
- 'style-variables': [
252
- {
253
- name: 'legacy-variable',
254
- formula: {
255
- type: 'value',
256
- value: '10px',
257
- },
258
- category: 'spacing',
259
- },
260
- ],
261
244
  style: {
262
- margin: 'var(--legacy-variable)',
245
+ '--declared-in-style': '10px',
246
+ margin: 'var(--declared-in-style)',
263
247
  },
264
248
  events: {},
265
249
  classes: {},
@@ -280,14 +264,13 @@ describe('unknownCSSVariableRule', () => {
280
264
  expect(problems).toBeEmpty()
281
265
  })
282
266
 
283
- test('should not report when declared in a style', () => {
267
+ test('should not report when a legacy theme exists (no propertyDefinitions)', () => {
284
268
  const problems = Array.from(
285
269
  searchProject({
286
270
  files: {
287
271
  themes: {
288
272
  Default: {
289
273
  fonts: [],
290
- propertyDefinitions: {},
291
274
  },
292
275
  },
293
276
  formulas: {},
@@ -300,8 +283,7 @@ describe('unknownCSSVariableRule', () => {
300
283
  type: 'element',
301
284
  attrs: {},
302
285
  style: {
303
- '--declared-in-style': '10px',
304
- margin: 'var(--declared-in-style)',
286
+ color: 'var(--legacy-theme-variable)',
305
287
  },
306
288
  events: {},
307
289
  classes: {},
@@ -322,26 +304,52 @@ describe('unknownCSSVariableRule', () => {
322
304
  expect(problems).toBeEmpty()
323
305
  })
324
306
 
325
- test('should not report when a legacy theme exists (no propertyDefinitions)', () => {
307
+ test('should not report if CSS variable is defined in any other component or self', () => {
326
308
  const problems = Array.from(
327
309
  searchProject({
328
310
  files: {
329
311
  themes: {
330
312
  Default: {
331
313
  fonts: [],
314
+ propertyDefinitions: {},
332
315
  },
333
316
  },
334
317
  formulas: {},
335
318
  components: {
336
- test: {
337
- name: 'test',
319
+ componentA: {
320
+ name: 'componentA',
338
321
  nodes: {
339
322
  root: {
340
323
  tag: 'div',
341
324
  type: 'element',
325
+ customProperties: {
326
+ '--variable-in-a': {
327
+ formula: { type: 'value', value: 'red' },
328
+ },
329
+ },
342
330
  attrs: {},
343
331
  style: {
344
- color: 'var(--legacy-theme-variable)',
332
+ color: 'var(--variable-in-a)',
333
+ },
334
+ events: {},
335
+ classes: {},
336
+ children: [],
337
+ },
338
+ },
339
+ formulas: {},
340
+ apis: {},
341
+ attributes: {},
342
+ variables: {},
343
+ },
344
+ componentB: {
345
+ name: 'componentB',
346
+ nodes: {
347
+ root: {
348
+ tag: 'div',
349
+ type: 'element',
350
+ attrs: {},
351
+ style: {
352
+ color: 'var(--variable-in-a)',
345
353
  },
346
354
  events: {},
347
355
  classes: {},
@@ -30,71 +30,68 @@ export const unknownCSSVariableRule: Rule<{
30
30
  return
31
31
  }
32
32
 
33
- const themeCssVariables = theme.propertyDefinitions
34
- const [_fileType, componentName, _nodes, nodeName] = path
35
- const localCssVariables = memo(
36
- `component-css-variables-${componentName}-${nodeName}`,
33
+ const allCssVariableDeclarations = memo(
34
+ `all-css-variables-declarations`,
37
35
  () => {
38
- const vars = new Set<string>()
39
- const component = files.components[componentName]
40
- if (!component) {
41
- return vars
42
- }
43
-
44
- const visitVars = (nodeName: string) => {
45
- const node = component?.nodes?.[nodeName]
46
- if (!node) {
47
- return
48
- }
36
+ const cssVariableKeys = new Set(
37
+ Object.keys(theme.propertyDefinitions ?? {}),
38
+ )
39
+ Object.values(files.components ?? {}).forEach((component) => {
40
+ Object.keys(component?.nodes ?? {}).forEach((nodeKey) => {
41
+ const node = component?.nodes?.[nodeKey]
42
+ if (!node) {
43
+ return
44
+ }
49
45
 
50
- if (node.type === 'component' || node.type === 'element') {
51
- Object.keys(node.customProperties ?? {}).forEach((varName) => {
52
- vars.add(varName)
53
- })
54
- Object.values(node.variants ?? {}).forEach((variant) => {
55
- Object.keys(variant.customProperties ?? {}).forEach((varName) => {
56
- vars.add(varName)
46
+ if (node.type === 'component' || node.type === 'element') {
47
+ Object.keys(node.customProperties ?? {}).forEach((varName) => {
48
+ cssVariableKeys.add(varName)
57
49
  })
58
- })
59
-
60
- // Also add legacy style variables
61
- if (node.type === 'element' && node['style-variables']) {
62
- node['style-variables'].forEach((styleVar) => {
63
- vars.add(`--${styleVar.name}`)
50
+ Object.values(node.variants ?? {}).forEach((variant) => {
51
+ Object.keys(variant.customProperties ?? {}).forEach(
52
+ (varName) => {
53
+ cssVariableKeys.add(varName)
54
+ },
55
+ )
64
56
  })
65
- }
66
57
 
67
- // Add if declared in any parent styles object
68
- Object.keys(node.style ?? {}).forEach((styleKey) => {
69
- if (styleKey.startsWith('--')) {
70
- vars.add(styleKey)
58
+ // Also add legacy style variables
59
+ if (node.type === 'element' && node['style-variables']) {
60
+ node['style-variables'].forEach((styleVar) => {
61
+ cssVariableKeys.add(`--${styleVar.name}`)
62
+ })
71
63
  }
72
- })
73
- Object.values(node.variants ?? {}).forEach((variant) => {
74
- Object.keys(variant.style ?? {}).forEach((styleKey) => {
64
+
65
+ // Add if declared in any parent styles object
66
+ Object.keys(node.style ?? {}).forEach((styleKey) => {
75
67
  if (styleKey.startsWith('--')) {
76
- vars.add(styleKey)
68
+ cssVariableKeys.add(styleKey)
77
69
  }
78
70
  })
79
- })
80
- }
81
-
82
- const parent = Object.entries(component.nodes ?? {}).find(([_, n]) =>
83
- n.children?.includes(nodeName),
84
- )
85
- if (parent) {
86
- visitVars(parent[0])
87
- }
88
- }
89
-
90
- visitVars(nodeName.toString())
91
- return vars
71
+ Object.values(node.variants ?? {}).forEach((variant) => {
72
+ Object.keys(variant.style ?? {}).forEach((styleKey) => {
73
+ if (styleKey.startsWith('--')) {
74
+ cssVariableKeys.add(styleKey)
75
+ }
76
+ })
77
+ })
78
+ }
79
+ })
80
+ })
81
+ return cssVariableKeys
92
82
  },
93
83
  )
94
84
 
95
85
  for (const varName of vars) {
96
- if (!(varName in themeCssVariables) && !localCssVariables.has(varName)) {
97
- report(path, { name: varName })
86
+ if (allCssVariableDeclarations.has(varName) === false) {
87
+ report({
88
+ path,
89
+ info: {
90
+ title: `Unknown CSS variable`,
91
+ description: `The CSS variable **${varName}** is not declared in any parent element or in your theme. The CSS variable must be declared in an ancestor element in its component or in your global theme.`,
92
+ },
93
+ details: { name: varName },
94
+ })
98
95
  }
99
96
  }
100
97
  },
@@ -16,6 +16,13 @@ export const unknownClassnameRule: Rule<{
16
16
  ) {
17
17
  return
18
18
  }
19
- report(path, { name: value.variant.className })
19
+ report({
20
+ path,
21
+ info: {
22
+ title: 'Unknown classname',
23
+ description: `**${value.variant.className}** is not defined. Using an unknown classname will have no effect.`,
24
+ },
25
+ details: { name: value.variant.className },
26
+ })
20
27
  },
21
28
  }
@@ -32,7 +32,14 @@ export const noReferenceVariableRule: Rule<void> = {
32
32
  return
33
33
  }
34
34
 
35
- report(path, undefined, ['delete-variable'])
35
+ report({
36
+ path,
37
+ info: {
38
+ title: 'Unused variable',
39
+ description: `**${variableKey}** is set but never used by any formula. Consider removing it.`,
40
+ },
41
+ fixes: ['delete-variable'],
42
+ })
36
43
  },
37
44
  fixes: {
38
45
  'delete-variable': removeFromPathFix,
@@ -19,7 +19,14 @@ export const unknownVariableRule: Rule<{
19
19
  const [, variableKey] = value.path
20
20
  const component = files.components[componentName]
21
21
  if (!component?.variables?.[variableKey]) {
22
- report(path, { name: variableKey })
22
+ report({
23
+ path,
24
+ info: {
25
+ title: 'Unknown variable',
26
+ description: `**${variableKey}** does not exist. Make sure to define it before usage.`,
27
+ },
28
+ details: { name: variableKey },
29
+ })
23
30
  }
24
31
  },
25
32
  }
@@ -14,7 +14,14 @@ export const unknownVariableSetterRule: Rule<{
14
14
  const [, componentName] = path
15
15
  const component = files.components[componentName]
16
16
  if (!component?.variables?.[value.variable]) {
17
- report(path, { name: value.variable })
17
+ report({
18
+ path,
19
+ info: {
20
+ title: 'Unknown variable setter',
21
+ description: `**${value.variable}** does not exist. Make sure to define it before setting.`,
22
+ },
23
+ details: { name: value.variable },
24
+ })
18
25
  }
19
26
  },
20
27
  }