@nordcraft/search 1.0.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.
Files changed (357) hide show
  1. package/README.md +5 -0
  2. package/dist/problems.worker.js +181 -0
  3. package/dist/problems.worker.js.map +1 -0
  4. package/dist/rules/actions/createActionNameRule.js +22 -0
  5. package/dist/rules/actions/createActionNameRule.js.map +1 -0
  6. package/dist/rules/actions/createActionNameRule.test.js +97 -0
  7. package/dist/rules/actions/createActionNameRule.test.js.map +1 -0
  8. package/dist/rules/actions/legacyActionRule.js +21 -0
  9. package/dist/rules/actions/legacyActionRule.js.map +1 -0
  10. package/dist/rules/actions/legacyActionRule.test.js +87 -0
  11. package/dist/rules/actions/legacyActionRule.test.js.map +1 -0
  12. package/dist/rules/actions/noReferenceProjectActionRule.js +40 -0
  13. package/dist/rules/actions/noReferenceProjectActionRule.js.map +1 -0
  14. package/dist/rules/actions/noReferenceProjectActionRule.test.js +119 -0
  15. package/dist/rules/actions/noReferenceProjectActionRule.test.js.map +1 -0
  16. package/dist/rules/actions/unknownProjectActionRule.js +18 -0
  17. package/dist/rules/actions/unknownProjectActionRule.js.map +1 -0
  18. package/dist/rules/actions/unknownProjectActionRule.test.js +111 -0
  19. package/dist/rules/actions/unknownProjectActionRule.test.js.map +1 -0
  20. package/dist/rules/apis/invalidApiParserModeRule.js +22 -0
  21. package/dist/rules/apis/invalidApiParserModeRule.js.map +1 -0
  22. package/dist/rules/apis/invalidApiParserModeRule.test.js +82 -0
  23. package/dist/rules/apis/invalidApiParserModeRule.test.js.map +1 -0
  24. package/dist/rules/apis/legacyApiRule.js +13 -0
  25. package/dist/rules/apis/legacyApiRule.js.map +1 -0
  26. package/dist/rules/apis/legacyApiRule.test.js +89 -0
  27. package/dist/rules/apis/legacyApiRule.test.js.map +1 -0
  28. package/dist/rules/apis/noReferenceApiInputRule.js +38 -0
  29. package/dist/rules/apis/noReferenceApiInputRule.js.map +1 -0
  30. package/dist/rules/apis/noReferenceApiInputRule.test.js +146 -0
  31. package/dist/rules/apis/noReferenceApiInputRule.test.js.map +1 -0
  32. package/dist/rules/apis/noReferenceApiRule.js +35 -0
  33. package/dist/rules/apis/noReferenceApiRule.js.map +1 -0
  34. package/dist/rules/apis/noReferenceApiRule.test.js +151 -0
  35. package/dist/rules/apis/noReferenceApiRule.test.js.map +1 -0
  36. package/dist/rules/apis/unknownApiInputRule.js +23 -0
  37. package/dist/rules/apis/unknownApiInputRule.js.map +1 -0
  38. package/dist/rules/apis/unknownApiInputRule.test.js +78 -0
  39. package/dist/rules/apis/unknownApiInputRule.test.js.map +1 -0
  40. package/dist/rules/apis/unknownApiRule.js +28 -0
  41. package/dist/rules/apis/unknownApiRule.js.map +1 -0
  42. package/dist/rules/apis/unknownApiRule.test.js +148 -0
  43. package/dist/rules/apis/unknownApiRule.test.js.map +1 -0
  44. package/dist/rules/attributes/noReferenceAttributeRule.js +29 -0
  45. package/dist/rules/attributes/noReferenceAttributeRule.js.map +1 -0
  46. package/dist/rules/attributes/noReferenceAttributeRule.test.js +127 -0
  47. package/dist/rules/attributes/noReferenceAttributeRule.test.js.map +1 -0
  48. package/dist/rules/attributes/unknownAttributeRule.js +19 -0
  49. package/dist/rules/attributes/unknownAttributeRule.js.map +1 -0
  50. package/dist/rules/attributes/unknownAttributeRule.test.js +85 -0
  51. package/dist/rules/attributes/unknownAttributeRule.test.js.map +1 -0
  52. package/dist/rules/components/noReferenceComponentRule.js +27 -0
  53. package/dist/rules/components/noReferenceComponentRule.js.map +1 -0
  54. package/dist/rules/components/noReferenceComponentRule.test.js +130 -0
  55. package/dist/rules/components/noReferenceComponentRule.test.js.map +1 -0
  56. package/dist/rules/components/unknownComponentRule.js +19 -0
  57. package/dist/rules/components/unknownComponentRule.js.map +1 -0
  58. package/dist/rules/components/unknownComponentRule.test.js +107 -0
  59. package/dist/rules/components/unknownComponentRule.test.js.map +1 -0
  60. package/dist/rules/context/noContextConsumersRule.js +29 -0
  61. package/dist/rules/context/noContextConsumersRule.js.map +1 -0
  62. package/dist/rules/context/noContextConsumersRule.test.js +224 -0
  63. package/dist/rules/context/noContextConsumersRule.test.js.map +1 -0
  64. package/dist/rules/context/unknownContextFormulaRule.js +22 -0
  65. package/dist/rules/context/unknownContextFormulaRule.js.map +1 -0
  66. package/dist/rules/context/unknownContextFormulaRule.test.js +86 -0
  67. package/dist/rules/context/unknownContextFormulaRule.test.js.map +1 -0
  68. package/dist/rules/context/unknownContextProviderFormulaRule.js +28 -0
  69. package/dist/rules/context/unknownContextProviderFormulaRule.js.map +1 -0
  70. package/dist/rules/context/unknownContextProviderFormulaRule.test.js +165 -0
  71. package/dist/rules/context/unknownContextProviderFormulaRule.test.js.map +1 -0
  72. package/dist/rules/context/unknownContextProviderRule.js +27 -0
  73. package/dist/rules/context/unknownContextProviderRule.js.map +1 -0
  74. package/dist/rules/context/unknownContextProviderRule.test.js +72 -0
  75. package/dist/rules/context/unknownContextProviderRule.test.js.map +1 -0
  76. package/dist/rules/dom/createRequiredDirectChildRule.js +30 -0
  77. package/dist/rules/dom/createRequiredDirectChildRule.js.map +1 -0
  78. package/dist/rules/dom/createRequiredDirectChildRule.test.js +113 -0
  79. package/dist/rules/dom/createRequiredDirectChildRule.test.js.map +1 -0
  80. package/dist/rules/dom/createRequiredDirectParentRule.js +28 -0
  81. package/dist/rules/dom/createRequiredDirectParentRule.js.map +1 -0
  82. package/dist/rules/dom/createRequiredDirectParentRule.test.js +115 -0
  83. package/dist/rules/dom/createRequiredDirectParentRule.test.js.map +1 -0
  84. package/dist/rules/dom/createRequiredElementAttributeRule.js +17 -0
  85. package/dist/rules/dom/createRequiredElementAttributeRule.js.map +1 -0
  86. package/dist/rules/dom/createRequiredElementAttributeRule.test.js +36 -0
  87. package/dist/rules/dom/createRequiredElementAttributeRule.test.js.map +1 -0
  88. package/dist/rules/dom/createRequiredMetaTagRule.js +23 -0
  89. package/dist/rules/dom/createRequiredMetaTagRule.js.map +1 -0
  90. package/dist/rules/dom/createRequiredMetaTagRule.test.js +70 -0
  91. package/dist/rules/dom/createRequiredMetaTagRule.test.js.map +1 -0
  92. package/dist/rules/dom/imageWithoutDimensionRule.js +40 -0
  93. package/dist/rules/dom/imageWithoutDimensionRule.js.map +1 -0
  94. package/dist/rules/dom/imageWithoutDimensionRule.test.js +146 -0
  95. package/dist/rules/dom/imageWithoutDimensionRule.test.js.map +1 -0
  96. package/dist/rules/dom/nonEmptyVoidElementRule.js +20 -0
  97. package/dist/rules/dom/nonEmptyVoidElementRule.js.map +1 -0
  98. package/dist/rules/dom/nonEmptyVoidElementRule.test.js +75 -0
  99. package/dist/rules/dom/nonEmptyVoidElementRule.test.js.map +1 -0
  100. package/dist/rules/duplicateRouteRule.js +65 -0
  101. package/dist/rules/duplicateRouteRule.js.map +1 -0
  102. package/dist/rules/duplicateRouteRule.test.js +200 -0
  103. package/dist/rules/duplicateRouteRule.test.js.map +1 -0
  104. package/dist/rules/events/duplicateEventTriggerRule.js +21 -0
  105. package/dist/rules/events/duplicateEventTriggerRule.js.map +1 -0
  106. package/dist/rules/events/duplicateEventTriggerRule.test.js +91 -0
  107. package/dist/rules/events/duplicateEventTriggerRule.test.js.map +1 -0
  108. package/dist/rules/events/noReferenceEventRule.js +39 -0
  109. package/dist/rules/events/noReferenceEventRule.js.map +1 -0
  110. package/dist/rules/events/noReferenceEventRule.test.js +141 -0
  111. package/dist/rules/events/noReferenceEventRule.test.js.map +1 -0
  112. package/dist/rules/events/unknownEventRule.js +24 -0
  113. package/dist/rules/events/unknownEventRule.js.map +1 -0
  114. package/dist/rules/events/unknownEventRule.test.js +230 -0
  115. package/dist/rules/events/unknownEventRule.test.js.map +1 -0
  116. package/dist/rules/events/unknownTriggerEventRule.js +16 -0
  117. package/dist/rules/events/unknownTriggerEventRule.js.map +1 -0
  118. package/dist/rules/events/unknownTriggerEventRule.test.js +110 -0
  119. package/dist/rules/events/unknownTriggerEventRule.test.js.map +1 -0
  120. package/dist/rules/formulas/legacyFormulaRule.js +142 -0
  121. package/dist/rules/formulas/legacyFormulaRule.js.map +1 -0
  122. package/dist/rules/formulas/legacyFormulaRule.test.js +310 -0
  123. package/dist/rules/formulas/legacyFormulaRule.test.js.map +1 -0
  124. package/dist/rules/formulas/noReferenceComponentFormulaRule.js +57 -0
  125. package/dist/rules/formulas/noReferenceComponentFormulaRule.js.map +1 -0
  126. package/dist/rules/formulas/noReferenceComponentFormulaRule.test.js +322 -0
  127. package/dist/rules/formulas/noReferenceComponentFormulaRule.test.js.map +1 -0
  128. package/dist/rules/formulas/noReferenceProjectFormulaRule.js +99 -0
  129. package/dist/rules/formulas/noReferenceProjectFormulaRule.js.map +1 -0
  130. package/dist/rules/formulas/noReferenceProjectFormulaRule.test.js +269 -0
  131. package/dist/rules/formulas/noReferenceProjectFormulaRule.test.js.map +1 -0
  132. package/dist/rules/formulas/unknownComponentFormulaInputRule.js +32 -0
  133. package/dist/rules/formulas/unknownComponentFormulaInputRule.js.map +1 -0
  134. package/dist/rules/formulas/unknownComponentFormulaInputRule.test.js +131 -0
  135. package/dist/rules/formulas/unknownComponentFormulaInputRule.test.js.map +1 -0
  136. package/dist/rules/formulas/unknownFormulaRule.js +17 -0
  137. package/dist/rules/formulas/unknownFormulaRule.js.map +1 -0
  138. package/dist/rules/formulas/unknownFormulaRule.test.js +91 -0
  139. package/dist/rules/formulas/unknownFormulaRule.test.js.map +1 -0
  140. package/dist/rules/formulas/unknownProjectFormulaInputRule.js +26 -0
  141. package/dist/rules/formulas/unknownProjectFormulaInputRule.js.map +1 -0
  142. package/dist/rules/formulas/unknownProjectFormulaInputRule.test.js +102 -0
  143. package/dist/rules/formulas/unknownProjectFormulaInputRule.test.js.map +1 -0
  144. package/dist/rules/formulas/unknownProjectFormulaRule.js +18 -0
  145. package/dist/rules/formulas/unknownProjectFormulaRule.js.map +1 -0
  146. package/dist/rules/formulas/unknownProjectFormulaRule.test.js +116 -0
  147. package/dist/rules/formulas/unknownProjectFormulaRule.test.js.map +1 -0
  148. package/dist/rules/formulas/unknownRepeatIndexFormulaRule.js +38 -0
  149. package/dist/rules/formulas/unknownRepeatIndexFormulaRule.js.map +1 -0
  150. package/dist/rules/formulas/unknownRepeatIndexFormulaRule.test.js +132 -0
  151. package/dist/rules/formulas/unknownRepeatIndexFormulaRule.test.js.map +1 -0
  152. package/dist/rules/formulas/unknownRepeatItemFormulaRule.js +38 -0
  153. package/dist/rules/formulas/unknownRepeatItemFormulaRule.js.map +1 -0
  154. package/dist/rules/formulas/unknownRepeatItemFormulaRule.test.js +132 -0
  155. package/dist/rules/formulas/unknownRepeatItemFormulaRule.test.js.map +1 -0
  156. package/dist/rules/logic/noUnnecessaryConditionFalsy.js +14 -0
  157. package/dist/rules/logic/noUnnecessaryConditionFalsy.js.map +1 -0
  158. package/dist/rules/logic/noUnnecessaryConditionFalsy.test.js +94 -0
  159. package/dist/rules/logic/noUnnecessaryConditionFalsy.test.js.map +1 -0
  160. package/dist/rules/logic/noUnnecessaryConditionTruthy.js +18 -0
  161. package/dist/rules/logic/noUnnecessaryConditionTruthy.js.map +1 -0
  162. package/dist/rules/logic/noUnnecessaryConditionTruthy.test.js +118 -0
  163. package/dist/rules/logic/noUnnecessaryConditionTruthy.test.js.map +1 -0
  164. package/dist/rules/requireExtensionRule.js +16 -0
  165. package/dist/rules/requireExtensionRule.js.map +1 -0
  166. package/dist/rules/requireExtensionRule.test.js +67 -0
  167. package/dist/rules/requireExtensionRule.test.js.map +1 -0
  168. package/dist/rules/slots/unknownClassnameRule.js +15 -0
  169. package/dist/rules/slots/unknownClassnameRule.js.map +1 -0
  170. package/dist/rules/slots/unknownClassnameRule.test.js +86 -0
  171. package/dist/rules/slots/unknownClassnameRule.test.js.map +1 -0
  172. package/dist/rules/slots/unknownComponentSlotRule.js +42 -0
  173. package/dist/rules/slots/unknownComponentSlotRule.js.map +1 -0
  174. package/dist/rules/slots/unknownComponentSlotRule.test.js +162 -0
  175. package/dist/rules/slots/unknownComponentSlotRule.test.js.map +1 -0
  176. package/dist/rules/unknownCookieRule.js +27 -0
  177. package/dist/rules/unknownCookieRule.js.map +1 -0
  178. package/dist/rules/unknownCookieRule.test.js +105 -0
  179. package/dist/rules/unknownCookieRule.test.js.map +1 -0
  180. package/dist/rules/urlParameters/duplicateUrlParameterRule.js +27 -0
  181. package/dist/rules/urlParameters/duplicateUrlParameterRule.js.map +1 -0
  182. package/dist/rules/urlParameters/duplicateUrlParameterRule.test.js +126 -0
  183. package/dist/rules/urlParameters/duplicateUrlParameterRule.test.js.map +1 -0
  184. package/dist/rules/urlParameters/unknownSetUrlParameterRule.js +23 -0
  185. package/dist/rules/urlParameters/unknownSetUrlParameterRule.js.map +1 -0
  186. package/dist/rules/urlParameters/unknownSetUrlParameterRule.test.js +151 -0
  187. package/dist/rules/urlParameters/unknownSetUrlParameterRule.test.js.map +1 -0
  188. package/dist/rules/urlParameters/unknownUrlParameterRule.js +20 -0
  189. package/dist/rules/urlParameters/unknownUrlParameterRule.js.map +1 -0
  190. package/dist/rules/urlParameters/unknownUrlParameterRule.test.js +92 -0
  191. package/dist/rules/urlParameters/unknownUrlParameterRule.test.js.map +1 -0
  192. package/dist/rules/variables/noReferenceVariableRule.js +22 -0
  193. package/dist/rules/variables/noReferenceVariableRule.js.map +1 -0
  194. package/dist/rules/variables/noReferenceVariableRule.test.js +87 -0
  195. package/dist/rules/variables/noReferenceVariableRule.test.js.map +1 -0
  196. package/dist/rules/variables/unknownVariableRule.js +19 -0
  197. package/dist/rules/variables/unknownVariableRule.js.map +1 -0
  198. package/dist/rules/variables/unknownVariableRule.test.js +84 -0
  199. package/dist/rules/variables/unknownVariableRule.test.js.map +1 -0
  200. package/dist/rules/variables/unknownVariableSetterRule.js +16 -0
  201. package/dist/rules/variables/unknownVariableSetterRule.js.map +1 -0
  202. package/dist/rules/variables/unknownVariableSetterRule.test.js +98 -0
  203. package/dist/rules/variables/unknownVariableSetterRule.test.js.map +1 -0
  204. package/dist/rules/workflows/duplicateWorkflowParameterRule.js +20 -0
  205. package/dist/rules/workflows/duplicateWorkflowParameterRule.js.map +1 -0
  206. package/dist/rules/workflows/duplicateWorkflowParameterRule.test.js +99 -0
  207. package/dist/rules/workflows/duplicateWorkflowParameterRule.test.js.map +1 -0
  208. package/dist/rules/workflows/noReferenceComponentWorkflowRule.js +57 -0
  209. package/dist/rules/workflows/noReferenceComponentWorkflowRule.js.map +1 -0
  210. package/dist/rules/workflows/noReferenceComponentWorkflowRule.test.js +261 -0
  211. package/dist/rules/workflows/noReferenceComponentWorkflowRule.test.js.map +1 -0
  212. package/dist/rules/workflows/unknownContextProviderWorkflowRule.js +28 -0
  213. package/dist/rules/workflows/unknownContextProviderWorkflowRule.js.map +1 -0
  214. package/dist/rules/workflows/unknownContextProviderWorkflowRule.test.js +137 -0
  215. package/dist/rules/workflows/unknownContextProviderWorkflowRule.test.js.map +1 -0
  216. package/dist/rules/workflows/unknownContextWorkflowRule.js +22 -0
  217. package/dist/rules/workflows/unknownContextWorkflowRule.js.map +1 -0
  218. package/dist/rules/workflows/unknownContextWorkflowRule.test.js +85 -0
  219. package/dist/rules/workflows/unknownContextWorkflowRule.test.js.map +1 -0
  220. package/dist/rules/workflows/unknownTriggerWorkflowParameterRule.js +43 -0
  221. package/dist/rules/workflows/unknownTriggerWorkflowParameterRule.js.map +1 -0
  222. package/dist/rules/workflows/unknownTriggerWorkflowParameterRule.test.js +466 -0
  223. package/dist/rules/workflows/unknownTriggerWorkflowParameterRule.test.js.map +1 -0
  224. package/dist/rules/workflows/unknownTriggerWorkflowRule.js +18 -0
  225. package/dist/rules/workflows/unknownTriggerWorkflowRule.js.map +1 -0
  226. package/dist/rules/workflows/unknownTriggerWorkflowRule.test.js +98 -0
  227. package/dist/rules/workflows/unknownTriggerWorkflowRule.test.js.map +1 -0
  228. package/dist/rules/workflows/unknownWorkflowParameterRule.js +31 -0
  229. package/dist/rules/workflows/unknownWorkflowParameterRule.js.map +1 -0
  230. package/dist/rules/workflows/unknownWorkflowParameterRule.test.js +109 -0
  231. package/dist/rules/workflows/unknownWorkflowParameterRule.test.js.map +1 -0
  232. package/dist/search.worker.js +10 -0
  233. package/dist/search.worker.js.map +1 -0
  234. package/dist/searchProject.js +368 -0
  235. package/dist/searchProject.js.map +1 -0
  236. package/dist/util/helpers.js +34 -0
  237. package/dist/util/helpers.js.map +1 -0
  238. package/package.json +21 -0
  239. package/src/problems.worker.ts +225 -0
  240. package/src/rules/actions/createActionNameRule.test.ts +100 -0
  241. package/src/rules/actions/createActionNameRule.ts +38 -0
  242. package/src/rules/actions/legacyActionRule.test.ts +91 -0
  243. package/src/rules/actions/legacyActionRule.ts +26 -0
  244. package/src/rules/actions/noReferenceProjectActionRule.test.ts +130 -0
  245. package/src/rules/actions/noReferenceProjectActionRule.ts +47 -0
  246. package/src/rules/actions/unknownProjectActionRule.test.ts +117 -0
  247. package/src/rules/actions/unknownProjectActionRule.ts +23 -0
  248. package/src/rules/apis/invalidApiParserModeRule.test.ts +89 -0
  249. package/src/rules/apis/invalidApiParserModeRule.ts +26 -0
  250. package/src/rules/apis/legacyApiRule.test.ts +96 -0
  251. package/src/rules/apis/legacyApiRule.ts +16 -0
  252. package/src/rules/apis/noReferenceApiInputRule.test.ts +159 -0
  253. package/src/rules/apis/noReferenceApiInputRule.ts +42 -0
  254. package/src/rules/apis/noReferenceApiRule.test.ts +164 -0
  255. package/src/rules/apis/noReferenceApiRule.ts +42 -0
  256. package/src/rules/apis/unknownApiInputRule.test.ts +85 -0
  257. package/src/rules/apis/unknownApiInputRule.ts +33 -0
  258. package/src/rules/apis/unknownApiRule.test.ts +159 -0
  259. package/src/rules/apis/unknownApiRule.ts +31 -0
  260. package/src/rules/attributes/noReferenceAttributeRule.test.ts +138 -0
  261. package/src/rules/attributes/noReferenceAttributeRule.ts +32 -0
  262. package/src/rules/attributes/unknownAttributeRule.test.ts +92 -0
  263. package/src/rules/attributes/unknownAttributeRule.ts +25 -0
  264. package/src/rules/components/noReferenceComponentRule.test.ts +140 -0
  265. package/src/rules/components/noReferenceComponentRule.ts +37 -0
  266. package/src/rules/components/unknownComponentRule.test.ts +114 -0
  267. package/src/rules/components/unknownComponentRule.ts +24 -0
  268. package/src/rules/context/noContextConsumersRule.test.ts +239 -0
  269. package/src/rules/context/noContextConsumersRule.ts +39 -0
  270. package/src/rules/context/unknownContextFormulaRule.test.ts +93 -0
  271. package/src/rules/context/unknownContextFormulaRule.ts +30 -0
  272. package/src/rules/context/unknownContextProviderFormulaRule.test.ts +174 -0
  273. package/src/rules/context/unknownContextProviderFormulaRule.ts +35 -0
  274. package/src/rules/context/unknownContextProviderRule.test.ts +79 -0
  275. package/src/rules/context/unknownContextProviderRule.ts +30 -0
  276. package/src/rules/dom/createRequiredDirectChildRule.test.ts +119 -0
  277. package/src/rules/dom/createRequiredDirectChildRule.ts +43 -0
  278. package/src/rules/dom/createRequiredDirectParentRule.test.ts +124 -0
  279. package/src/rules/dom/createRequiredDirectParentRule.ts +41 -0
  280. package/src/rules/dom/createRequiredElementAttributeRule.test.ts +39 -0
  281. package/src/rules/dom/createRequiredElementAttributeRule.ts +27 -0
  282. package/src/rules/dom/createRequiredMetaTagRule.test.ts +76 -0
  283. package/src/rules/dom/createRequiredMetaTagRule.ts +33 -0
  284. package/src/rules/dom/imageWithoutDimensionRule.test.ts +161 -0
  285. package/src/rules/dom/imageWithoutDimensionRule.ts +50 -0
  286. package/src/rules/dom/nonEmptyVoidElementRule.test.ts +82 -0
  287. package/src/rules/dom/nonEmptyVoidElementRule.ts +23 -0
  288. package/src/rules/duplicateRouteRule.test.ts +209 -0
  289. package/src/rules/duplicateRouteRule.ts +83 -0
  290. package/src/rules/events/duplicateEventTriggerRule.test.ts +97 -0
  291. package/src/rules/events/duplicateEventTriggerRule.ts +23 -0
  292. package/src/rules/events/noReferenceEventRule.test.ts +147 -0
  293. package/src/rules/events/noReferenceEventRule.ts +46 -0
  294. package/src/rules/events/unknownEventRule.test.ts +237 -0
  295. package/src/rules/events/unknownEventRule.ts +32 -0
  296. package/src/rules/events/unknownTriggerEventRule.test.ts +117 -0
  297. package/src/rules/events/unknownTriggerEventRule.ts +20 -0
  298. package/src/rules/formulas/legacyFormulaRule.test.ts +329 -0
  299. package/src/rules/formulas/legacyFormulaRule.ts +158 -0
  300. package/src/rules/formulas/noReferenceComponentFormulaRule.test.ts +343 -0
  301. package/src/rules/formulas/noReferenceComponentFormulaRule.ts +72 -0
  302. package/src/rules/formulas/noReferenceProjectFormulaRule.test.ts +290 -0
  303. package/src/rules/formulas/noReferenceProjectFormulaRule.ts +120 -0
  304. package/src/rules/formulas/unknownComponentFormulaInputRule.test.ts +140 -0
  305. package/src/rules/formulas/unknownComponentFormulaInputRule.ts +38 -0
  306. package/src/rules/formulas/unknownFormulaRule.test.ts +98 -0
  307. package/src/rules/formulas/unknownFormulaRule.ts +21 -0
  308. package/src/rules/formulas/unknownProjectFormulaInputRule.test.ts +111 -0
  309. package/src/rules/formulas/unknownProjectFormulaInputRule.ts +32 -0
  310. package/src/rules/formulas/unknownProjectFormulaRule.test.ts +125 -0
  311. package/src/rules/formulas/unknownProjectFormulaRule.ts +23 -0
  312. package/src/rules/formulas/unknownRepeatIndexFormulaRule.test.ts +138 -0
  313. package/src/rules/formulas/unknownRepeatIndexFormulaRule.ts +46 -0
  314. package/src/rules/formulas/unknownRepeatItemFormulaRule.test.ts +138 -0
  315. package/src/rules/formulas/unknownRepeatItemFormulaRule.ts +46 -0
  316. package/src/rules/logic/noUnnecessaryConditionFalsy.test.ts +101 -0
  317. package/src/rules/logic/noUnnecessaryConditionFalsy.ts +21 -0
  318. package/src/rules/logic/noUnnecessaryConditionTruthy.test.ts +125 -0
  319. package/src/rules/logic/noUnnecessaryConditionTruthy.ts +25 -0
  320. package/src/rules/requireExtensionRule.test.ts +73 -0
  321. package/src/rules/requireExtensionRule.ts +21 -0
  322. package/src/rules/slots/unknownClassnameRule.test.ts +93 -0
  323. package/src/rules/slots/unknownClassnameRule.ts +20 -0
  324. package/src/rules/slots/unknownComponentSlotRule.test.ts +169 -0
  325. package/src/rules/slots/unknownComponentSlotRule.ts +50 -0
  326. package/src/rules/unknownCookieRule.test.ts +111 -0
  327. package/src/rules/unknownCookieRule.ts +34 -0
  328. package/src/rules/urlParameters/duplicateUrlParameterRule.test.ts +134 -0
  329. package/src/rules/urlParameters/duplicateUrlParameterRule.ts +30 -0
  330. package/src/rules/urlParameters/unknownSetUrlParameterRule.test.ts +162 -0
  331. package/src/rules/urlParameters/unknownSetUrlParameterRule.ts +34 -0
  332. package/src/rules/urlParameters/unknownUrlParameterRule.test.ts +99 -0
  333. package/src/rules/urlParameters/unknownUrlParameterRule.ts +28 -0
  334. package/src/rules/variables/noReferenceVariableRule.test.ts +94 -0
  335. package/src/rules/variables/noReferenceVariableRule.ts +36 -0
  336. package/src/rules/variables/unknownVariableRule.test.ts +91 -0
  337. package/src/rules/variables/unknownVariableRule.ts +25 -0
  338. package/src/rules/variables/unknownVariableSetterRule.test.ts +105 -0
  339. package/src/rules/variables/unknownVariableSetterRule.ts +20 -0
  340. package/src/rules/workflows/duplicateWorkflowParameterRule.test.ts +105 -0
  341. package/src/rules/workflows/duplicateWorkflowParameterRule.ts +23 -0
  342. package/src/rules/workflows/noReferenceComponentWorkflowRule.test.ts +279 -0
  343. package/src/rules/workflows/noReferenceComponentWorkflowRule.ts +77 -0
  344. package/src/rules/workflows/unknownContextProviderWorkflowRule.test.ts +146 -0
  345. package/src/rules/workflows/unknownContextProviderWorkflowRule.ts +35 -0
  346. package/src/rules/workflows/unknownContextWorkflowRule.test.ts +92 -0
  347. package/src/rules/workflows/unknownContextWorkflowRule.ts +30 -0
  348. package/src/rules/workflows/unknownTriggerWorkflowParameterRule.test.ts +484 -0
  349. package/src/rules/workflows/unknownTriggerWorkflowParameterRule.ts +54 -0
  350. package/src/rules/workflows/unknownTriggerWorkflowRule.test.ts +104 -0
  351. package/src/rules/workflows/unknownTriggerWorkflowRule.ts +22 -0
  352. package/src/rules/workflows/unknownWorkflowParameterRule.test.ts +115 -0
  353. package/src/rules/workflows/unknownWorkflowParameterRule.ts +38 -0
  354. package/src/search.worker.ts +49 -0
  355. package/src/searchProject.ts +484 -0
  356. package/src/types.d.ts +312 -0
  357. package/src/util/helpers.ts +44 -0
@@ -0,0 +1,115 @@
1
+ import { searchProject } from '../../searchProject'
2
+ import { unknownWorkflowParameterRule } from './unknownWorkflowParameterRule'
3
+
4
+ describe('unknownWorkflowParameterRule', () => {
5
+ test('should detect unknown workflow parameters', () => {
6
+ const problems = Array.from(
7
+ searchProject({
8
+ files: {
9
+ components: {
10
+ myComponent: {
11
+ name: 'myComponent',
12
+ nodes: {},
13
+ formulas: {},
14
+ apis: {},
15
+ attributes: {},
16
+ variables: {},
17
+ workflows: {
18
+ ['my-workflow']: {
19
+ name: 'my-workflow',
20
+ parameters: [
21
+ {
22
+ name: 'parameter',
23
+ testValue: 4,
24
+ },
25
+ ],
26
+ actions: [
27
+ {
28
+ name: '@toddle/logToConsole',
29
+ label: 'Log to console',
30
+ arguments: [
31
+ {
32
+ name: 'Label',
33
+ formula: { type: 'value', value: 'first p' },
34
+ },
35
+ {
36
+ name: 'Data',
37
+ formula: {
38
+ path: ['Parameters', 'unknownParameter'],
39
+ type: 'path',
40
+ },
41
+ },
42
+ ],
43
+ },
44
+ ],
45
+ '@toddle/metadata': {
46
+ comments: null,
47
+ },
48
+ },
49
+ },
50
+ },
51
+ },
52
+ },
53
+ rules: [unknownWorkflowParameterRule],
54
+ }),
55
+ )
56
+
57
+ expect(problems).toHaveLength(1)
58
+ expect(problems[0].code).toBe('unknown workflow parameter')
59
+ expect(problems[0].details).toEqual({ parameter: 'unknownParameter' })
60
+ })
61
+ test('should not detect known workflow parameters', () => {
62
+ const problems = Array.from(
63
+ searchProject({
64
+ files: {
65
+ components: {
66
+ myComponent: {
67
+ name: 'myComponent',
68
+ nodes: {},
69
+ formulas: {},
70
+ apis: {},
71
+ attributes: {},
72
+ variables: {},
73
+ workflows: {
74
+ ['my-workflow']: {
75
+ name: 'my-workflow',
76
+ parameters: [
77
+ {
78
+ name: 'parameter',
79
+ testValue: 4,
80
+ },
81
+ ],
82
+ actions: [
83
+ {
84
+ name: '@toddle/logToConsole',
85
+ label: 'Log to console',
86
+ arguments: [
87
+ {
88
+ name: 'Label',
89
+ formula: { type: 'value', value: 'first p' },
90
+ },
91
+ {
92
+ name: 'Data',
93
+ formula: {
94
+ path: ['Parameters', 'parameter'],
95
+ type: 'path',
96
+ },
97
+ },
98
+ ],
99
+ },
100
+ ],
101
+ '@toddle/metadata': {
102
+ comments: null,
103
+ },
104
+ },
105
+ },
106
+ },
107
+ },
108
+ },
109
+ rules: [unknownWorkflowParameterRule],
110
+ }),
111
+ )
112
+
113
+ expect(problems).toHaveLength(0)
114
+ })
115
+ })
@@ -0,0 +1,38 @@
1
+ import type { Rule } from '../../types'
2
+
3
+ export const unknownWorkflowParameterRule: Rule<{ parameter: string }> = {
4
+ code: 'unknown workflow parameter',
5
+ level: 'error',
6
+ category: 'Unknown Reference',
7
+ visit: (report, args) => {
8
+ const { path, value, nodeType } = args
9
+ if (
10
+ nodeType !== 'formula' ||
11
+ value.type !== 'path' ||
12
+ // We want a path that looks like ['components', 'componentName', 'workflows', 'workflowName', ...]
13
+ path.length < 4 ||
14
+ path[2] !== 'workflows' ||
15
+ // The path formula would usually look like ['Parameters', 'parameterName']
16
+ value.path[0] !== 'Parameters' ||
17
+ value.path.length < 2
18
+ ) {
19
+ return
20
+ }
21
+ const component = args.component
22
+ if (!component) {
23
+ return
24
+ }
25
+ const [_components, _componentName, _workflows, workflowName] = path
26
+ const [_Parameters, parameterName] = value.path
27
+ const workflowParameters = new Set(
28
+ Object.values(component.workflows?.[workflowName]?.parameters ?? {}).map(
29
+ (p) => p.name,
30
+ ),
31
+ )
32
+ if (!workflowParameters.has(parameterName)) {
33
+ report(path, {
34
+ parameter: parameterName,
35
+ })
36
+ }
37
+ },
38
+ }
@@ -0,0 +1,49 @@
1
+ import type { ProjectFiles } from '@nordcraft/ssr/dist/ssr.types'
2
+
3
+ type Query =
4
+ | {
5
+ type: 'freeform'
6
+ value: string
7
+ }
8
+ | {
9
+ type: 'component'
10
+ name: string
11
+ references?: boolean
12
+ }
13
+ | {
14
+ type: 'formula'
15
+ name: string
16
+ references?: boolean
17
+ }
18
+ | {
19
+ type: 'action'
20
+ name: string
21
+ references?: boolean
22
+ }
23
+
24
+ export type Options = {
25
+ /**
26
+ * Useful for running search on a subset or a single file.
27
+ */
28
+ pathsToVisit?: string[][]
29
+ /**
30
+ * The number of reports to send per message.
31
+ * @default 1
32
+ */
33
+ batchSize?: number | 'all' | 'per-file'
34
+ }
35
+
36
+ /**
37
+ * Similar to problems with using rules and returning paths, but for searching the toddle file format instead of searching for problems.
38
+ *
39
+ * Great for finding freeform text anywhere in a project, or references, dependencies etc.
40
+ */
41
+ onmessage = (
42
+ _event: MessageEvent<{
43
+ files: ProjectFiles
44
+ query: Query
45
+ options?: unknown
46
+ }>,
47
+ ) => {
48
+ throw new Error('Not yet implemented')
49
+ }
@@ -0,0 +1,484 @@
1
+ import { isLegacyApi } from '@nordcraft/core/dist/api/api'
2
+ import { ToddleComponent } from '@nordcraft/core/dist/component/ToddleComponent'
3
+ import { isToddleFormula } from '@nordcraft/core/dist/formula/formulaTypes'
4
+ import { ToddleFormula } from '@nordcraft/core/dist/formula/ToddleFormula'
5
+ import type { ProjectFiles } from '@nordcraft/ssr/dist/ssr.types'
6
+ import { ToddleApiService } from '@nordcraft/ssr/dist/ToddleApiService'
7
+ import { ToddleRoute } from '@nordcraft/ssr/dist/ToddleRoute'
8
+ import type { ApplicationState, NodeType, Result, Rule } from './types'
9
+ import { shouldSearchPath } from './util/helpers'
10
+
11
+ /**
12
+ * Search a project by applying rules to all nodes in the project and returning reported results.
13
+ *
14
+ * @param files All files to check against
15
+ * @param rules All rules to check against
16
+ * @param pathsToVisit Only visit specific paths. All subpaths are visited as well. For example, ['components', 'test'] would visit everything under the test component. Defaults is `[]` which means all paths are visited.
17
+ * @returns A generator that yields results as they are found
18
+ */
19
+ export function* searchProject({
20
+ files,
21
+ rules,
22
+ pathsToVisit = [],
23
+ state,
24
+ }: {
25
+ files: Omit<ProjectFiles, 'config'> & Partial<Pick<ProjectFiles, 'config'>>
26
+ rules: Rule[]
27
+ pathsToVisit?: string[][]
28
+ state?: ApplicationState
29
+ }): Generator<Result> {
30
+ const memos = new Map<string, any>()
31
+ const memo = (key: string | string[], fn: () => any) => {
32
+ const stringKey = Array.isArray(key) ? key.join('/') : key
33
+ if (memos.has(stringKey)) {
34
+ return memos.get(stringKey)
35
+ }
36
+
37
+ const result = fn()
38
+ memos.set(stringKey, result)
39
+ return result
40
+ }
41
+
42
+ for (const key in files.components) {
43
+ const component = files.components[key]
44
+ if (component) {
45
+ yield* visitNode(
46
+ {
47
+ nodeType: 'component',
48
+ value: component,
49
+ path: ['components', key],
50
+ rules,
51
+ files,
52
+ pathsToVisit,
53
+ memo,
54
+ },
55
+ state,
56
+ )
57
+ }
58
+ }
59
+
60
+ for (const key in files.formulas) {
61
+ yield* visitNode(
62
+ {
63
+ nodeType: 'project-formula',
64
+ value: files.formulas[key],
65
+ path: ['formulas', key],
66
+ rules,
67
+ files,
68
+ pathsToVisit,
69
+ memo,
70
+ },
71
+ state,
72
+ )
73
+ }
74
+
75
+ for (const key in files.actions) {
76
+ yield* visitNode(
77
+ {
78
+ nodeType: 'project-action',
79
+ value: files.actions[key],
80
+ path: ['actions', key],
81
+ rules,
82
+ files,
83
+ pathsToVisit,
84
+ memo,
85
+ },
86
+ state,
87
+ )
88
+ }
89
+
90
+ for (const key in files.themes) {
91
+ yield* visitNode(
92
+ {
93
+ nodeType: 'project-theme',
94
+ value: files.themes[key],
95
+ path: ['themes', key],
96
+ rules,
97
+ files,
98
+ pathsToVisit,
99
+ memo,
100
+ },
101
+ state,
102
+ )
103
+ }
104
+
105
+ if (files.services) {
106
+ for (const key in files.services) {
107
+ yield* visitNode(
108
+ {
109
+ nodeType: 'api-service',
110
+ value: files.services[key],
111
+ path: ['services', key],
112
+ rules,
113
+ files,
114
+ pathsToVisit,
115
+ memo,
116
+ },
117
+ state,
118
+ )
119
+ }
120
+ }
121
+
122
+ if (files.routes) {
123
+ for (const key in files.routes) {
124
+ yield* visitNode(
125
+ {
126
+ nodeType: 'project-route',
127
+ value: files.routes[key],
128
+ routeName: key,
129
+ path: ['routes', key],
130
+ rules,
131
+ files,
132
+ pathsToVisit,
133
+ memo,
134
+ },
135
+ state,
136
+ )
137
+ }
138
+ }
139
+
140
+ yield* visitNode(
141
+ {
142
+ nodeType: 'project-config',
143
+ value: files.config,
144
+ path: ['config'],
145
+ rules,
146
+ files,
147
+ pathsToVisit,
148
+ memo,
149
+ },
150
+ state,
151
+ )
152
+ }
153
+
154
+ function* visitNode(
155
+ args: {
156
+ path: (string | number)[]
157
+ rules: Rule[]
158
+ files: Omit<ProjectFiles, 'config'> & Partial<Pick<ProjectFiles, 'config'>>
159
+ pathsToVisit: string[][]
160
+ } & NodeType,
161
+ state: ApplicationState | undefined,
162
+ ): Generator<Result> {
163
+ const { rules, pathsToVisit, ...data } = args
164
+ const { files, value, path, memo, nodeType } = data
165
+ if (!shouldSearchPath(data.path, pathsToVisit)) {
166
+ return
167
+ }
168
+
169
+ const results: Result[] = []
170
+ for (const rule of rules) {
171
+ rule.visit(
172
+ (path, details) => {
173
+ results.push({
174
+ code: rule.code,
175
+ category: rule.category,
176
+ level: rule.level,
177
+ path,
178
+ details,
179
+ })
180
+ },
181
+ data,
182
+ state,
183
+ )
184
+ }
185
+
186
+ for (const result of results) {
187
+ yield result
188
+ }
189
+
190
+ switch (nodeType) {
191
+ case 'component': {
192
+ const component = new ToddleComponent<string>({
193
+ component: value,
194
+ packageName: undefined,
195
+ getComponent: (name) => files.components[name],
196
+ globalFormulas: {
197
+ formulas: files.formulas,
198
+ packages: files.packages,
199
+ },
200
+ })
201
+
202
+ for (const key in value.attributes) {
203
+ yield* visitNode(
204
+ {
205
+ nodeType: 'component-attribute',
206
+ value: value.attributes[key],
207
+ path: [...path, 'attributes', key],
208
+ rules,
209
+ files,
210
+ pathsToVisit,
211
+ memo,
212
+ component,
213
+ },
214
+ state,
215
+ )
216
+ }
217
+
218
+ for (const key in value.variables) {
219
+ yield* visitNode(
220
+ {
221
+ nodeType: 'component-variable',
222
+ value: value.variables[key],
223
+ path: [...path, 'variables', key],
224
+ rules,
225
+ files,
226
+ pathsToVisit,
227
+ memo,
228
+ component,
229
+ },
230
+ state,
231
+ )
232
+ }
233
+
234
+ for (const key in value.apis) {
235
+ const api = value.apis[key]
236
+ yield* visitNode(
237
+ {
238
+ nodeType: 'component-api',
239
+ value: api,
240
+ component,
241
+ path: [...path, 'apis', key],
242
+ rules,
243
+ files,
244
+ pathsToVisit,
245
+ memo,
246
+ },
247
+ state,
248
+ )
249
+ if (!isLegacyApi(api)) {
250
+ for (const [inputKey, input] of Object.entries(api.inputs)) {
251
+ yield* visitNode(
252
+ {
253
+ nodeType: 'component-api-input',
254
+ value: input,
255
+ api,
256
+ component,
257
+ path: [...path, 'apis', key, 'inputs', inputKey],
258
+ rules,
259
+ files,
260
+ pathsToVisit,
261
+ memo,
262
+ },
263
+ state,
264
+ )
265
+ }
266
+ }
267
+ }
268
+
269
+ for (const key in value.formulas) {
270
+ yield* visitNode(
271
+ {
272
+ nodeType: 'component-formula',
273
+ value: value.formulas[key],
274
+ path: [...path, 'formulas', key],
275
+ rules,
276
+ files,
277
+ pathsToVisit,
278
+ memo,
279
+ component,
280
+ },
281
+ state,
282
+ )
283
+ }
284
+
285
+ for (const key in value.workflows) {
286
+ yield* visitNode(
287
+ {
288
+ nodeType: 'component-workflow',
289
+ value: value.workflows[key],
290
+ path: [...path, 'workflows', key],
291
+ rules,
292
+ files,
293
+ pathsToVisit,
294
+ memo,
295
+ component,
296
+ },
297
+ state,
298
+ )
299
+ }
300
+
301
+ for (let i = 0; i < (value.events ?? []).length; i++) {
302
+ const event = value.events?.[i]
303
+ if (event) {
304
+ yield* visitNode(
305
+ {
306
+ nodeType: 'component-event',
307
+ path: [...path, 'events', i],
308
+ rules,
309
+ files,
310
+ pathsToVisit,
311
+ memo,
312
+ value: { component, event },
313
+ },
314
+ state,
315
+ )
316
+ }
317
+ }
318
+
319
+ for (const key in value.contexts) {
320
+ yield* visitNode(
321
+ {
322
+ nodeType: 'component-context',
323
+ value: value.contexts[key],
324
+ path: [...path, 'contexts', key],
325
+ rules,
326
+ files,
327
+ pathsToVisit,
328
+ memo,
329
+ },
330
+ state,
331
+ )
332
+ }
333
+
334
+ for (const key in value.nodes) {
335
+ yield* visitNode(
336
+ {
337
+ nodeType: 'component-node',
338
+ value: value.nodes[key],
339
+ path: [...path, 'nodes', key],
340
+ rules,
341
+ files,
342
+ pathsToVisit,
343
+ memo,
344
+ component,
345
+ },
346
+ state,
347
+ )
348
+ }
349
+
350
+ for (const [formulaPath, formula] of component.formulasInComponent()) {
351
+ yield* visitNode(
352
+ {
353
+ nodeType: 'formula',
354
+ value: formula,
355
+ path: [...path, ...formulaPath],
356
+ rules,
357
+ files,
358
+ pathsToVisit,
359
+ memo,
360
+ component,
361
+ },
362
+ state,
363
+ )
364
+ }
365
+
366
+ for (const [actionPath, action] of component.actionModelsInComponent()) {
367
+ yield* visitNode(
368
+ {
369
+ nodeType: 'action-model',
370
+ value: action,
371
+ path: [...path, ...actionPath],
372
+ rules,
373
+ files,
374
+ pathsToVisit,
375
+ memo,
376
+ component,
377
+ },
378
+ state,
379
+ )
380
+ }
381
+ break
382
+ }
383
+
384
+ case 'project-formula':
385
+ if (isToddleFormula(value)) {
386
+ const formula = new ToddleFormula({
387
+ formula: value.formula,
388
+ globalFormulas: {
389
+ formulas: files.formulas,
390
+ packages: files.packages,
391
+ },
392
+ })
393
+ formula.formulasInFormula()
394
+ for (const [formulaPath, f] of formula.formulasInFormula()) {
395
+ yield* visitNode(
396
+ {
397
+ nodeType: 'formula',
398
+ value: f,
399
+ path: [...path, ...formulaPath],
400
+ rules,
401
+ files,
402
+ pathsToVisit,
403
+ memo,
404
+ },
405
+ state,
406
+ )
407
+ }
408
+ }
409
+ break
410
+
411
+ case 'component-node':
412
+ if (value.type === 'element') {
413
+ const variants = value.variants
414
+ if (variants) {
415
+ for (let i = 0; i < variants.length; i++) {
416
+ const variant = variants[i]
417
+ yield* visitNode(
418
+ {
419
+ nodeType: 'style-variant',
420
+ value: { variant, element: value },
421
+ path: [...path, 'variants', i],
422
+ rules,
423
+ files,
424
+ pathsToVisit,
425
+ memo,
426
+ },
427
+ state,
428
+ )
429
+ }
430
+ }
431
+ }
432
+ break
433
+
434
+ case 'api-service': {
435
+ const apiService = new ToddleApiService<string>({
436
+ service: value,
437
+ globalFormulas: {
438
+ formulas: files.formulas,
439
+ packages: files.packages,
440
+ },
441
+ })
442
+ for (const [formulaPath, formula] of apiService.formulasInService()) {
443
+ yield* visitNode(
444
+ {
445
+ nodeType: 'formula',
446
+ value: formula,
447
+ path: [...path, ...formulaPath],
448
+ rules,
449
+ files,
450
+ pathsToVisit,
451
+ memo,
452
+ },
453
+ state,
454
+ )
455
+ }
456
+ break
457
+ }
458
+
459
+ case 'project-route': {
460
+ const projectRoute = new ToddleRoute<string>({
461
+ route: value,
462
+ globalFormulas: {
463
+ formulas: files.formulas,
464
+ packages: files.packages,
465
+ },
466
+ })
467
+ for (const [formulaPath, formula] of projectRoute.formulasInRoute()) {
468
+ yield* visitNode(
469
+ {
470
+ nodeType: 'formula',
471
+ value: formula,
472
+ path: [...path, ...formulaPath],
473
+ rules,
474
+ files,
475
+ pathsToVisit,
476
+ memo,
477
+ },
478
+ state,
479
+ )
480
+ }
481
+ break
482
+ }
483
+ }
484
+ }