@memberjunction/react-linter 0.0.1 → 5.38.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 (330) hide show
  1. package/dist/component-linter.d.ts +77 -0
  2. package/dist/component-linter.d.ts.map +1 -0
  3. package/dist/component-linter.js +1206 -0
  4. package/dist/component-linter.js.map +1 -0
  5. package/dist/control-flow-analyzer.d.ts +184 -0
  6. package/dist/control-flow-analyzer.d.ts.map +1 -0
  7. package/dist/control-flow-analyzer.js +798 -0
  8. package/dist/control-flow-analyzer.js.map +1 -0
  9. package/dist/index.d.ts +6 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +8 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/library-lint-cache.d.ts +50 -0
  14. package/dist/library-lint-cache.d.ts.map +1 -0
  15. package/dist/library-lint-cache.js +173 -0
  16. package/dist/library-lint-cache.js.map +1 -0
  17. package/dist/lint-rule.d.ts +70 -0
  18. package/dist/lint-rule.d.ts.map +1 -0
  19. package/dist/lint-rule.js +30 -0
  20. package/dist/lint-rule.js.map +1 -0
  21. package/dist/lint-utils.d.ts +131 -0
  22. package/dist/lint-utils.d.ts.map +1 -0
  23. package/dist/lint-utils.js +358 -0
  24. package/dist/lint-utils.js.map +1 -0
  25. package/dist/linter-options.d.ts +51 -0
  26. package/dist/linter-options.d.ts.map +1 -0
  27. package/dist/linter-options.js +2 -0
  28. package/dist/linter-options.js.map +1 -0
  29. package/dist/prop-value-extractor.d.ts +147 -0
  30. package/dist/prop-value-extractor.d.ts.map +1 -0
  31. package/dist/prop-value-extractor.js +472 -0
  32. package/dist/prop-value-extractor.js.map +1 -0
  33. package/dist/runtime-rules/ai-tools-availability-check.d.ts +9 -0
  34. package/dist/runtime-rules/ai-tools-availability-check.d.ts.map +1 -0
  35. package/dist/runtime-rules/ai-tools-availability-check.js +223 -0
  36. package/dist/runtime-rules/ai-tools-availability-check.js.map +1 -0
  37. package/dist/runtime-rules/callback-event-validation.d.ts +22 -0
  38. package/dist/runtime-rules/callback-event-validation.d.ts.map +1 -0
  39. package/dist/runtime-rules/callback-event-validation.js +561 -0
  40. package/dist/runtime-rules/callback-event-validation.js.map +1 -0
  41. package/dist/runtime-rules/chart-field-validation.d.ts +10 -0
  42. package/dist/runtime-rules/chart-field-validation.d.ts.map +1 -0
  43. package/dist/runtime-rules/chart-field-validation.js +270 -0
  44. package/dist/runtime-rules/chart-field-validation.js.map +1 -0
  45. package/dist/runtime-rules/child-component-prop-validation.d.ts +11 -0
  46. package/dist/runtime-rules/child-component-prop-validation.d.ts.map +1 -0
  47. package/dist/runtime-rules/child-component-prop-validation.js +443 -0
  48. package/dist/runtime-rules/child-component-prop-validation.js.map +1 -0
  49. package/dist/runtime-rules/component-name-mismatch.d.ts +19 -0
  50. package/dist/runtime-rules/component-name-mismatch.d.ts.map +1 -0
  51. package/dist/runtime-rules/component-name-mismatch.js +82 -0
  52. package/dist/runtime-rules/component-name-mismatch.js.map +1 -0
  53. package/dist/runtime-rules/component-not-in-dependencies.d.ts +20 -0
  54. package/dist/runtime-rules/component-not-in-dependencies.d.ts.map +1 -0
  55. package/dist/runtime-rules/component-not-in-dependencies.js +92 -0
  56. package/dist/runtime-rules/component-not-in-dependencies.js.map +1 -0
  57. package/dist/runtime-rules/component-props-validation.d.ts +25 -0
  58. package/dist/runtime-rules/component-props-validation.d.ts.map +1 -0
  59. package/dist/runtime-rules/component-props-validation.js +228 -0
  60. package/dist/runtime-rules/component-props-validation.js.map +1 -0
  61. package/dist/runtime-rules/component-usage-without-destructuring.d.ts +20 -0
  62. package/dist/runtime-rules/component-usage-without-destructuring.d.ts.map +1 -0
  63. package/dist/runtime-rules/component-usage-without-destructuring.js +124 -0
  64. package/dist/runtime-rules/component-usage-without-destructuring.js.map +1 -0
  65. package/dist/runtime-rules/data-result-validation.d.ts +9 -0
  66. package/dist/runtime-rules/data-result-validation.d.ts.map +1 -0
  67. package/dist/runtime-rules/data-result-validation.js +763 -0
  68. package/dist/runtime-rules/data-result-validation.js.map +1 -0
  69. package/dist/runtime-rules/datagrid-field-validation.d.ts +10 -0
  70. package/dist/runtime-rules/datagrid-field-validation.d.ts.map +1 -0
  71. package/dist/runtime-rules/datagrid-field-validation.js +249 -0
  72. package/dist/runtime-rules/datagrid-field-validation.js.map +1 -0
  73. package/dist/runtime-rules/dependency-shadowing.d.ts +20 -0
  74. package/dist/runtime-rules/dependency-shadowing.d.ts.map +1 -0
  75. package/dist/runtime-rules/dependency-shadowing.js +147 -0
  76. package/dist/runtime-rules/dependency-shadowing.js.map +1 -0
  77. package/dist/runtime-rules/entity-field-access-validation.d.ts +12 -0
  78. package/dist/runtime-rules/entity-field-access-validation.d.ts.map +1 -0
  79. package/dist/runtime-rules/entity-field-access-validation.js +304 -0
  80. package/dist/runtime-rules/entity-field-access-validation.js.map +1 -0
  81. package/dist/runtime-rules/event-parameter-validation.d.ts +22 -0
  82. package/dist/runtime-rules/event-parameter-validation.d.ts.map +1 -0
  83. package/dist/runtime-rules/event-parameter-validation.js +406 -0
  84. package/dist/runtime-rules/event-parameter-validation.js.map +1 -0
  85. package/dist/runtime-rules/index.d.ts +61 -0
  86. package/dist/runtime-rules/index.d.ts.map +1 -0
  87. package/dist/runtime-rules/index.js +62 -0
  88. package/dist/runtime-rules/index.js.map +1 -0
  89. package/dist/runtime-rules/library-variable-names.d.ts +24 -0
  90. package/dist/runtime-rules/library-variable-names.d.ts.map +1 -0
  91. package/dist/runtime-rules/library-variable-names.js +88 -0
  92. package/dist/runtime-rules/library-variable-names.js.map +1 -0
  93. package/dist/runtime-rules/no-child-implementation.d.ts +18 -0
  94. package/dist/runtime-rules/no-child-implementation.d.ts.map +1 -0
  95. package/dist/runtime-rules/no-child-implementation.js +57 -0
  96. package/dist/runtime-rules/no-child-implementation.js.map +1 -0
  97. package/dist/runtime-rules/no-data-prop.d.ts +22 -0
  98. package/dist/runtime-rules/no-data-prop.d.ts.map +1 -0
  99. package/dist/runtime-rules/no-data-prop.js +111 -0
  100. package/dist/runtime-rules/no-data-prop.js.map +1 -0
  101. package/dist/runtime-rules/no-export-statements.d.ts +18 -0
  102. package/dist/runtime-rules/no-export-statements.d.ts.map +1 -0
  103. package/dist/runtime-rules/no-export-statements.js +143 -0
  104. package/dist/runtime-rules/no-export-statements.js.map +1 -0
  105. package/dist/runtime-rules/no-iife-wrapper.d.ts +18 -0
  106. package/dist/runtime-rules/no-iife-wrapper.d.ts.map +1 -0
  107. package/dist/runtime-rules/no-iife-wrapper.js +217 -0
  108. package/dist/runtime-rules/no-iife-wrapper.js.map +1 -0
  109. package/dist/runtime-rules/no-import-statements.d.ts +18 -0
  110. package/dist/runtime-rules/no-import-statements.d.ts.map +1 -0
  111. package/dist/runtime-rules/no-import-statements.js +65 -0
  112. package/dist/runtime-rules/no-import-statements.js.map +1 -0
  113. package/dist/runtime-rules/no-react-destructuring.d.ts +18 -0
  114. package/dist/runtime-rules/no-react-destructuring.d.ts.map +1 -0
  115. package/dist/runtime-rules/no-react-destructuring.js +60 -0
  116. package/dist/runtime-rules/no-react-destructuring.js.map +1 -0
  117. package/dist/runtime-rules/no-require-statements.d.ts +18 -0
  118. package/dist/runtime-rules/no-require-statements.d.ts.map +1 -0
  119. package/dist/runtime-rules/no-require-statements.js +109 -0
  120. package/dist/runtime-rules/no-require-statements.js.map +1 -0
  121. package/dist/runtime-rules/no-return-component.d.ts +18 -0
  122. package/dist/runtime-rules/no-return-component.d.ts.map +1 -0
  123. package/dist/runtime-rules/no-return-component.js +106 -0
  124. package/dist/runtime-rules/no-return-component.js.map +1 -0
  125. package/dist/runtime-rules/no-unwrap-utility-libs.d.ts +20 -0
  126. package/dist/runtime-rules/no-unwrap-utility-libs.d.ts.map +1 -0
  127. package/dist/runtime-rules/no-unwrap-utility-libs.js +75 -0
  128. package/dist/runtime-rules/no-unwrap-utility-libs.js.map +1 -0
  129. package/dist/runtime-rules/no-use-reducer.d.ts +19 -0
  130. package/dist/runtime-rules/no-use-reducer.d.ts.map +1 -0
  131. package/dist/runtime-rules/no-use-reducer.js +78 -0
  132. package/dist/runtime-rules/no-use-reducer.js.map +1 -0
  133. package/dist/runtime-rules/no-window-access.d.ts +23 -0
  134. package/dist/runtime-rules/no-window-access.d.ts.map +1 -0
  135. package/dist/runtime-rules/no-window-access.js +136 -0
  136. package/dist/runtime-rules/no-window-access.js.map +1 -0
  137. package/dist/runtime-rules/noisy-settings-updates.d.ts +18 -0
  138. package/dist/runtime-rules/noisy-settings-updates.d.ts.map +1 -0
  139. package/dist/runtime-rules/noisy-settings-updates.js +110 -0
  140. package/dist/runtime-rules/noisy-settings-updates.js.map +1 -0
  141. package/dist/runtime-rules/overflow-hidden-on-layout-container.d.ts +30 -0
  142. package/dist/runtime-rules/overflow-hidden-on-layout-container.d.ts.map +1 -0
  143. package/dist/runtime-rules/overflow-hidden-on-layout-container.js +220 -0
  144. package/dist/runtime-rules/overflow-hidden-on-layout-container.js.map +1 -0
  145. package/dist/runtime-rules/pass-standard-props.d.ts +19 -0
  146. package/dist/runtime-rules/pass-standard-props.d.ts.map +1 -0
  147. package/dist/runtime-rules/pass-standard-props.js +82 -0
  148. package/dist/runtime-rules/pass-standard-props.js.map +1 -0
  149. package/dist/runtime-rules/prefer-async-await.d.ts +17 -0
  150. package/dist/runtime-rules/prefer-async-await.d.ts.map +1 -0
  151. package/dist/runtime-rules/prefer-async-await.js +52 -0
  152. package/dist/runtime-rules/prefer-async-await.js.map +1 -0
  153. package/dist/runtime-rules/prefer-jsx-syntax.d.ts +17 -0
  154. package/dist/runtime-rules/prefer-jsx-syntax.d.ts.map +1 -0
  155. package/dist/runtime-rules/prefer-jsx-syntax.js +51 -0
  156. package/dist/runtime-rules/prefer-jsx-syntax.js.map +1 -0
  157. package/dist/runtime-rules/prop-state-sync.d.ts +19 -0
  158. package/dist/runtime-rules/prop-state-sync.d.ts.map +1 -0
  159. package/dist/runtime-rules/prop-state-sync.js +76 -0
  160. package/dist/runtime-rules/prop-state-sync.js.map +1 -0
  161. package/dist/runtime-rules/property-name-consistency.d.ts +20 -0
  162. package/dist/runtime-rules/property-name-consistency.d.ts.map +1 -0
  163. package/dist/runtime-rules/property-name-consistency.js +172 -0
  164. package/dist/runtime-rules/property-name-consistency.js.map +1 -0
  165. package/dist/runtime-rules/query-result-field-access-validation.d.ts +10 -0
  166. package/dist/runtime-rules/query-result-field-access-validation.d.ts.map +1 -0
  167. package/dist/runtime-rules/query-result-field-access-validation.js +304 -0
  168. package/dist/runtime-rules/query-result-field-access-validation.js.map +1 -0
  169. package/dist/runtime-rules/react-component-naming.d.ts +19 -0
  170. package/dist/runtime-rules/react-component-naming.d.ts.map +1 -0
  171. package/dist/runtime-rules/react-component-naming.js +72 -0
  172. package/dist/runtime-rules/react-component-naming.js.map +1 -0
  173. package/dist/runtime-rules/react-hooks-rules.d.ts +27 -0
  174. package/dist/runtime-rules/react-hooks-rules.d.ts.map +1 -0
  175. package/dist/runtime-rules/react-hooks-rules.js +223 -0
  176. package/dist/runtime-rules/react-hooks-rules.js.map +1 -0
  177. package/dist/runtime-rules/required-queries-not-called.d.ts +19 -0
  178. package/dist/runtime-rules/required-queries-not-called.d.ts.map +1 -0
  179. package/dist/runtime-rules/required-queries-not-called.js +146 -0
  180. package/dist/runtime-rules/required-queries-not-called.js.map +1 -0
  181. package/dist/runtime-rules/runquery-call-validation.d.ts +11 -0
  182. package/dist/runtime-rules/runquery-call-validation.d.ts.map +1 -0
  183. package/dist/runtime-rules/runquery-call-validation.js +886 -0
  184. package/dist/runtime-rules/runquery-call-validation.js.map +1 -0
  185. package/dist/runtime-rules/runview-call-validation.d.ts +10 -0
  186. package/dist/runtime-rules/runview-call-validation.d.ts.map +1 -0
  187. package/dist/runtime-rules/runview-call-validation.js +336 -0
  188. package/dist/runtime-rules/runview-call-validation.js.map +1 -0
  189. package/dist/runtime-rules/saved-user-settings-pattern.d.ts +19 -0
  190. package/dist/runtime-rules/saved-user-settings-pattern.d.ts.map +1 -0
  191. package/dist/runtime-rules/saved-user-settings-pattern.js +90 -0
  192. package/dist/runtime-rules/saved-user-settings-pattern.js.map +1 -0
  193. package/dist/runtime-rules/search-availability-check.d.ts +9 -0
  194. package/dist/runtime-rules/search-availability-check.d.ts.map +1 -0
  195. package/dist/runtime-rules/search-availability-check.js +220 -0
  196. package/dist/runtime-rules/search-availability-check.js.map +1 -0
  197. package/dist/runtime-rules/search-call-validation.d.ts +9 -0
  198. package/dist/runtime-rules/search-call-validation.d.ts.map +1 -0
  199. package/dist/runtime-rules/search-call-validation.js +336 -0
  200. package/dist/runtime-rules/search-call-validation.js.map +1 -0
  201. package/dist/runtime-rules/server-reload-on-client-operation.d.ts +18 -0
  202. package/dist/runtime-rules/server-reload-on-client-operation.d.ts.map +1 -0
  203. package/dist/runtime-rules/server-reload-on-client-operation.js +107 -0
  204. package/dist/runtime-rules/server-reload-on-client-operation.js.map +1 -0
  205. package/dist/runtime-rules/single-function-only.d.ts +18 -0
  206. package/dist/runtime-rules/single-function-only.d.ts.map +1 -0
  207. package/dist/runtime-rules/single-function-only.js +103 -0
  208. package/dist/runtime-rules/single-function-only.js.map +1 -0
  209. package/dist/runtime-rules/string-replace-all-occurrences.d.ts +19 -0
  210. package/dist/runtime-rules/string-replace-all-occurrences.d.ts.map +1 -0
  211. package/dist/runtime-rules/string-replace-all-occurrences.js +109 -0
  212. package/dist/runtime-rules/string-replace-all-occurrences.js.map +1 -0
  213. package/dist/runtime-rules/string-template-validation.d.ts +22 -0
  214. package/dist/runtime-rules/string-template-validation.d.ts.map +1 -0
  215. package/dist/runtime-rules/string-template-validation.js +163 -0
  216. package/dist/runtime-rules/string-template-validation.js.map +1 -0
  217. package/dist/runtime-rules/styles-validation.d.ts +10 -0
  218. package/dist/runtime-rules/styles-validation.d.ts.map +1 -0
  219. package/dist/runtime-rules/styles-validation.js +153 -0
  220. package/dist/runtime-rules/styles-validation.js.map +1 -0
  221. package/dist/runtime-rules/type-inference-errors.d.ts +23 -0
  222. package/dist/runtime-rules/type-inference-errors.d.ts.map +1 -0
  223. package/dist/runtime-rules/type-inference-errors.js +53 -0
  224. package/dist/runtime-rules/type-inference-errors.js.map +1 -0
  225. package/dist/runtime-rules/type-mismatch-operation.d.ts +23 -0
  226. package/dist/runtime-rules/type-mismatch-operation.d.ts.map +1 -0
  227. package/dist/runtime-rules/type-mismatch-operation.js +145 -0
  228. package/dist/runtime-rules/type-mismatch-operation.js.map +1 -0
  229. package/dist/runtime-rules/undefined-component-usage.d.ts +20 -0
  230. package/dist/runtime-rules/undefined-component-usage.d.ts.map +1 -0
  231. package/dist/runtime-rules/undefined-component-usage.js +138 -0
  232. package/dist/runtime-rules/undefined-component-usage.js.map +1 -0
  233. package/dist/runtime-rules/undefined-jsx-component.d.ts +25 -0
  234. package/dist/runtime-rules/undefined-jsx-component.d.ts.map +1 -0
  235. package/dist/runtime-rules/undefined-jsx-component.js +269 -0
  236. package/dist/runtime-rules/undefined-jsx-component.js.map +1 -0
  237. package/dist/runtime-rules/unsafe-array-operations.d.ts +25 -0
  238. package/dist/runtime-rules/unsafe-array-operations.d.ts.map +1 -0
  239. package/dist/runtime-rules/unsafe-array-operations.js +347 -0
  240. package/dist/runtime-rules/unsafe-array-operations.js.map +1 -0
  241. package/dist/runtime-rules/unsafe-formatting-methods.d.ts +24 -0
  242. package/dist/runtime-rules/unsafe-formatting-methods.d.ts.map +1 -0
  243. package/dist/runtime-rules/unsafe-formatting-methods.js +277 -0
  244. package/dist/runtime-rules/unsafe-formatting-methods.js.map +1 -0
  245. package/dist/runtime-rules/unused-component-dependencies.d.ts +19 -0
  246. package/dist/runtime-rules/unused-component-dependencies.d.ts.map +1 -0
  247. package/dist/runtime-rules/unused-component-dependencies.js +90 -0
  248. package/dist/runtime-rules/unused-component-dependencies.js.map +1 -0
  249. package/dist/runtime-rules/unused-libraries.d.ts +19 -0
  250. package/dist/runtime-rules/unused-libraries.d.ts.map +1 -0
  251. package/dist/runtime-rules/unused-libraries.js +127 -0
  252. package/dist/runtime-rules/unused-libraries.js.map +1 -0
  253. package/dist/runtime-rules/use-function-declaration.d.ts +18 -0
  254. package/dist/runtime-rules/use-function-declaration.d.ts.map +1 -0
  255. package/dist/runtime-rules/use-function-declaration.js +127 -0
  256. package/dist/runtime-rules/use-function-declaration.js.map +1 -0
  257. package/dist/runtime-rules/use-unwrap-components.d.ts +19 -0
  258. package/dist/runtime-rules/use-unwrap-components.d.ts.map +1 -0
  259. package/dist/runtime-rules/use-unwrap-components.js +84 -0
  260. package/dist/runtime-rules/use-unwrap-components.js.map +1 -0
  261. package/dist/runtime-rules/useeffect-unstable-dependencies.d.ts +23 -0
  262. package/dist/runtime-rules/useeffect-unstable-dependencies.d.ts.map +1 -0
  263. package/dist/runtime-rules/useeffect-unstable-dependencies.js +215 -0
  264. package/dist/runtime-rules/useeffect-unstable-dependencies.js.map +1 -0
  265. package/dist/runtime-rules/utilities-api-validation.d.ts +24 -0
  266. package/dist/runtime-rules/utilities-api-validation.d.ts.map +1 -0
  267. package/dist/runtime-rules/utilities-api-validation.js +121 -0
  268. package/dist/runtime-rules/utilities-api-validation.js.map +1 -0
  269. package/dist/runtime-rules/utilities-no-direct-instantiation.d.ts +20 -0
  270. package/dist/runtime-rules/utilities-no-direct-instantiation.d.ts.map +1 -0
  271. package/dist/runtime-rules/utilities-no-direct-instantiation.js +58 -0
  272. package/dist/runtime-rules/utilities-no-direct-instantiation.js.map +1 -0
  273. package/dist/runtime-rules/validate-component-references.d.ts +19 -0
  274. package/dist/runtime-rules/validate-component-references.d.ts.map +1 -0
  275. package/dist/runtime-rules/validate-component-references.js +255 -0
  276. package/dist/runtime-rules/validate-component-references.js.map +1 -0
  277. package/dist/schema-validation/component-prop-rule.d.ts +131 -0
  278. package/dist/schema-validation/component-prop-rule.d.ts.map +1 -0
  279. package/dist/schema-validation/component-prop-rule.js +625 -0
  280. package/dist/schema-validation/component-prop-rule.js.map +1 -0
  281. package/dist/schema-validation/index.d.ts +26 -0
  282. package/dist/schema-validation/index.d.ts.map +1 -0
  283. package/dist/schema-validation/index.js +26 -0
  284. package/dist/schema-validation/index.js.map +1 -0
  285. package/dist/schema-validation/semantic-validators/index.d.ts +23 -0
  286. package/dist/schema-validation/semantic-validators/index.d.ts.map +1 -0
  287. package/dist/schema-validation/semantic-validators/index.js +23 -0
  288. package/dist/schema-validation/semantic-validators/index.js.map +1 -0
  289. package/dist/schema-validation/semantic-validators/required-when-validator.d.ts +43 -0
  290. package/dist/schema-validation/semantic-validators/required-when-validator.d.ts.map +1 -0
  291. package/dist/schema-validation/semantic-validators/required-when-validator.js +94 -0
  292. package/dist/schema-validation/semantic-validators/required-when-validator.js.map +1 -0
  293. package/dist/schema-validation/semantic-validators/semantic-validator-registry.d.ts +122 -0
  294. package/dist/schema-validation/semantic-validators/semantic-validator-registry.d.ts.map +1 -0
  295. package/dist/schema-validation/semantic-validators/semantic-validator-registry.js +166 -0
  296. package/dist/schema-validation/semantic-validators/semantic-validator-registry.js.map +1 -0
  297. package/dist/schema-validation/semantic-validators/semantic-validator.d.ts +260 -0
  298. package/dist/schema-validation/semantic-validators/semantic-validator.d.ts.map +1 -0
  299. package/dist/schema-validation/semantic-validators/semantic-validator.js +301 -0
  300. package/dist/schema-validation/semantic-validators/semantic-validator.js.map +1 -0
  301. package/dist/schema-validation/semantic-validators/sql-where-clause-validator.d.ts +115 -0
  302. package/dist/schema-validation/semantic-validators/sql-where-clause-validator.d.ts.map +1 -0
  303. package/dist/schema-validation/semantic-validators/sql-where-clause-validator.js +381 -0
  304. package/dist/schema-validation/semantic-validators/sql-where-clause-validator.js.map +1 -0
  305. package/dist/schema-validation/semantic-validators/subset-of-entity-fields-validator.d.ts +60 -0
  306. package/dist/schema-validation/semantic-validators/subset-of-entity-fields-validator.d.ts.map +1 -0
  307. package/dist/schema-validation/semantic-validators/subset-of-entity-fields-validator.js +195 -0
  308. package/dist/schema-validation/semantic-validators/subset-of-entity-fields-validator.js.map +1 -0
  309. package/dist/schema-validation/semantic-validators/validation-context.d.ts +335 -0
  310. package/dist/schema-validation/semantic-validators/validation-context.d.ts.map +1 -0
  311. package/dist/schema-validation/semantic-validators/validation-context.js +13 -0
  312. package/dist/schema-validation/semantic-validators/validation-context.js.map +1 -0
  313. package/dist/styles-type-analyzer.d.ts +64 -0
  314. package/dist/styles-type-analyzer.d.ts.map +1 -0
  315. package/dist/styles-type-analyzer.js +242 -0
  316. package/dist/styles-type-analyzer.js.map +1 -0
  317. package/dist/type-context.d.ts +184 -0
  318. package/dist/type-context.d.ts.map +1 -0
  319. package/dist/type-context.js +415 -0
  320. package/dist/type-context.js.map +1 -0
  321. package/dist/type-inference-engine.d.ts +181 -0
  322. package/dist/type-inference-engine.d.ts.map +1 -0
  323. package/dist/type-inference-engine.js +1151 -0
  324. package/dist/type-inference-engine.js.map +1 -0
  325. package/dist/type-rules/type-compatibility-rule.d.ts +85 -0
  326. package/dist/type-rules/type-compatibility-rule.d.ts.map +1 -0
  327. package/dist/type-rules/type-compatibility-rule.js +211 -0
  328. package/dist/type-rules/type-compatibility-rule.js.map +1 -0
  329. package/package.json +35 -7
  330. package/README.md +0 -45
@@ -0,0 +1,20 @@
1
+ import * as t from '@babel/types';
2
+ import { BaseLintRule } from '../lint-rule.js';
3
+ import { Violation } from '../component-linter.js';
4
+ /**
5
+ * Rule: property-name-consistency
6
+ *
7
+ * Detects property name mismatches when data is transformed (especially in map functions).
8
+ * Ensures that accessed property names match the transformed property names, catching
9
+ * common errors where properties are renamed during transformation but code still tries
10
+ * to access them by the original name.
11
+ *
12
+ * Severity: critical (causes runtime errors or undefined values)
13
+ * Applies to: all components
14
+ */
15
+ export declare class PropertyNameConsistencyRule extends BaseLintRule {
16
+ get Name(): string;
17
+ get AppliesTo(): 'all' | 'child' | 'root';
18
+ Test(ast: t.File, _componentName: string): Violation[];
19
+ }
20
+ //# sourceMappingURL=property-name-consistency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-name-consistency.d.ts","sourceRoot":"","sources":["../../src/runtime-rules/property-name-consistency.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,qBACa,2BAA4B,SAAQ,YAAY;IAC3D,IAAI,IAAI,WAA0C;IAClD,IAAI,SAAS,IAAI,KAAK,GAAG,OAAO,GAAG,MAAM,CAAkB;IAE3D,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE;CA8JvD"}
@@ -0,0 +1,172 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { traverse } from '../lint-utils.js';
8
+ import * as t from '@babel/types';
9
+ import { RegisterClass } from '@memberjunction/global';
10
+ import { BaseLintRule } from '../lint-rule.js';
11
+ /**
12
+ * Rule: property-name-consistency
13
+ *
14
+ * Detects property name mismatches when data is transformed (especially in map functions).
15
+ * Ensures that accessed property names match the transformed property names, catching
16
+ * common errors where properties are renamed during transformation but code still tries
17
+ * to access them by the original name.
18
+ *
19
+ * Severity: critical (causes runtime errors or undefined values)
20
+ * Applies to: all components
21
+ */
22
+ let PropertyNameConsistencyRule = class PropertyNameConsistencyRule extends BaseLintRule {
23
+ get Name() { return 'property-name-consistency'; }
24
+ get AppliesTo() { return 'all'; }
25
+ Test(ast, _componentName) {
26
+ const violations = [];
27
+ const dataTransformations = new Map();
28
+ const propertyAccesses = new Map(); // variable -> accessed properties
29
+ // Track data transformations (especially in map functions)
30
+ traverse(ast, {
31
+ CallExpression(path) {
32
+ // Look for array.map transformations
33
+ if (t.isMemberExpression(path.node.callee) && t.isIdentifier(path.node.callee.property) && path.node.callee.property.name === 'map') {
34
+ const mapArg = path.node.arguments[0];
35
+ if (mapArg && (t.isArrowFunctionExpression(mapArg) || t.isFunctionExpression(mapArg))) {
36
+ const param = mapArg.params[0];
37
+ if (t.isIdentifier(param)) {
38
+ const paramName = param.name;
39
+ const originalProps = new Set();
40
+ const transformedProps = new Set();
41
+ // Check the return value
42
+ let returnValue = null;
43
+ if (t.isArrowFunctionExpression(mapArg)) {
44
+ if (t.isObjectExpression(mapArg.body)) {
45
+ returnValue = mapArg.body;
46
+ }
47
+ else if (t.isBlockStatement(mapArg.body)) {
48
+ // Find return statement
49
+ for (const stmt of mapArg.body.body) {
50
+ if (t.isReturnStatement(stmt) && stmt.argument) {
51
+ returnValue = stmt.argument;
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ }
57
+ // Analyze object mapping
58
+ if (returnValue && t.isObjectExpression(returnValue)) {
59
+ for (const prop of returnValue.properties) {
60
+ if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {
61
+ transformedProps.add(prop.key.name);
62
+ // Check if value is a member expression from the parameter
63
+ if (t.isMemberExpression(prop.value) &&
64
+ t.isIdentifier(prop.value.object) &&
65
+ prop.value.object.name === paramName &&
66
+ t.isIdentifier(prop.value.property)) {
67
+ originalProps.add(prop.value.property.name);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ // Store the transformation if we found property mappings
73
+ if (transformedProps.size > 0) {
74
+ // Find the variable being assigned
75
+ let parentPath = path.parentPath;
76
+ while (parentPath && !t.isVariableDeclarator(parentPath.node) && !t.isCallExpression(parentPath.node)) {
77
+ parentPath = parentPath.parentPath;
78
+ }
79
+ if (parentPath && t.isCallExpression(parentPath.node)) {
80
+ // Check for setState calls
81
+ if (t.isIdentifier(parentPath.node.callee) && /^set[A-Z]/.test(parentPath.node.callee.name)) {
82
+ const stateName = parentPath.node.callee.name.replace(/^set/, '');
83
+ const varName = stateName.charAt(0).toLowerCase() + stateName.slice(1);
84
+ dataTransformations.set(varName, {
85
+ originalProps,
86
+ transformedProps,
87
+ location: {
88
+ line: path.node.loc?.start.line || 0,
89
+ column: path.node.loc?.start.column || 0,
90
+ },
91
+ });
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ },
99
+ // Track property accesses
100
+ MemberExpression(path) {
101
+ if (t.isIdentifier(path.node.object) && t.isIdentifier(path.node.property)) {
102
+ const objName = path.node.object.name;
103
+ const propName = path.node.property.name;
104
+ if (!propertyAccesses.has(objName)) {
105
+ propertyAccesses.set(objName, new Set());
106
+ }
107
+ propertyAccesses.get(objName).add(propName);
108
+ }
109
+ },
110
+ });
111
+ // Check for mismatches
112
+ for (const [varName, transformation] of dataTransformations) {
113
+ const accesses = propertyAccesses.get(varName);
114
+ if (accesses) {
115
+ for (const accessedProp of accesses) {
116
+ // Check if accessed property exists in transformed props
117
+ if (!transformation.transformedProps.has(accessedProp)) {
118
+ // Check if it's trying to use original prop name
119
+ const matchingOriginal = Array.from(transformation.originalProps).find((orig) => orig.toLowerCase() === accessedProp.toLowerCase());
120
+ if (matchingOriginal) {
121
+ // Find the transformed name
122
+ const transformedName = Array.from(transformation.transformedProps).find((t) => t.toLowerCase() === accessedProp.toLowerCase());
123
+ violations.push({
124
+ rule: 'property-name-consistency',
125
+ severity: 'critical',
126
+ line: transformation.location.line,
127
+ column: transformation.location.column,
128
+ message: `Property name mismatch: data transformed with different casing. Accessing '${accessedProp}' but property was transformed to '${transformedName || 'different name'}'`,
129
+ code: `Transform uses '${Array.from(transformation.transformedProps).join(', ')}' but code accesses '${accessedProp}'`,
130
+ suggestion: {
131
+ text: 'Maintain consistent property names when transforming data',
132
+ example: `// ❌ WRONG - Transform to camelCase but access as PascalCase:
133
+ setAccountData(results.map(item => ({
134
+ accountName: item.AccountName, // camelCase
135
+ annualRevenue: item.AnnualRevenue // camelCase
136
+ })));
137
+ // Later in render...
138
+ <td>{account.AccountName}</td> // PascalCase - UNDEFINED!
139
+ <td>{formatCurrency(account.AnnualRevenue)}</td> // Returns $NaN
140
+
141
+ // ✅ CORRECT Option 1 - Keep original casing:
142
+ setAccountData(results.map(item => ({
143
+ AccountName: item.AccountName, // Keep PascalCase
144
+ AnnualRevenue: item.AnnualRevenue // Keep PascalCase
145
+ })));
146
+ // Later in render...
147
+ <td>{account.AccountName}</td> // Matches!
148
+ <td>{formatCurrency(account.AnnualRevenue)}</td> // Works!
149
+
150
+ // ✅ CORRECT Option 2 - Transform and use consistently:
151
+ setAccountData(results.map(item => ({
152
+ accountName: item.AccountName, // Transform to camelCase
153
+ annualRevenue: item.AnnualRevenue // Transform to camelCase
154
+ })));
155
+ // Later in render...
156
+ <td>{account.accountName}</td> // Use camelCase consistently
157
+ <td>{formatCurrency(account.annualRevenue)}</td> // Works!`,
158
+ },
159
+ });
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ return violations;
166
+ }
167
+ };
168
+ PropertyNameConsistencyRule = __decorate([
169
+ RegisterClass(BaseLintRule, 'property-name-consistency')
170
+ ], PropertyNameConsistencyRule);
171
+ export { PropertyNameConsistencyRule };
172
+ //# sourceMappingURL=property-name-consistency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-name-consistency.js","sourceRoot":"","sources":["../../src/runtime-rules/property-name-consistency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import * as t from '@babel/types';
2
+ import { BaseLintRule } from '../lint-rule.js';
3
+ import { Violation } from '../component-linter.js';
4
+ import { ComponentSpec } from '@memberjunction/interactive-component-types';
5
+ export declare class QueryResultFieldAccessValidationRule extends BaseLintRule {
6
+ get Name(): string;
7
+ get AppliesTo(): 'all' | 'child' | 'root';
8
+ Test(ast: t.File, _componentName: string, componentSpec?: ComponentSpec): Violation[];
9
+ }
10
+ //# sourceMappingURL=query-result-field-access-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-result-field-access-validation.d.ts","sourceRoot":"","sources":["../../src/runtime-rules/query-result-field-access-validation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAsE5E,qBACa,oCAAqC,SAAQ,YAAY;IACpE,IAAI,IAAI,WAAqD;IAC7D,IAAI,SAAS,IAAI,KAAK,GAAG,OAAO,GAAG,MAAM,CAAkB;IAE3D,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,EAAE;CAuTtF"}
@@ -0,0 +1,304 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { traverse, createViolation, truncateCode, findClosestMatch, findCaseMismatch, NUMERIC_COERCION_FUNCTIONS } from '../lint-utils.js';
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import * as t from '@babel/types';
10
+ import { BaseLintRule } from '../lint-rule.js';
11
+ import { TypeContext } from '../type-context.js';
12
+ /**
13
+ * Rule: query-result-field-access-validation
14
+ *
15
+ * Enhanced validation of field access on RunQuery results against spec fieldMetadata.
16
+ * Catches:
17
+ * - Nonexistent fields (high severity, with closest-match suggestion)
18
+ * - Field name typos via Levenshtein distance (high severity)
19
+ * - Case mismatches like `r.productname` vs `r.ProductName` (medium severity)
20
+ * - Type coercion on GUID fields like `parseInt(r.ID)` (medium severity)
21
+ * - Optional chaining expressions like `r?.FieldName`
22
+ * - All array method callbacks: map, filter, reduce, sort, find, some, every, forEach
23
+ *
24
+ * Severity: high (nonexistent/typo), medium (case mismatch, type coercion)
25
+ * Applies to: all components
26
+ */
27
+ /** Array methods whose callbacks receive row items as the first parameter */
28
+ const ARRAY_METHODS = ['map', 'forEach', 'filter', 'find', 'some', 'every', 'reduce', 'sort', 'flatMap'];
29
+ /**
30
+ * Resolves the identifier being accessed through optional chaining or regular member access.
31
+ * Returns { objectName, propertyName } or null if the pattern doesn't match.
32
+ */
33
+ function resolveMemberAccess(node) {
34
+ if (node.computed)
35
+ return null;
36
+ if (!t.isIdentifier(node.property))
37
+ return null;
38
+ if (t.isIdentifier(node.object)) {
39
+ return {
40
+ objectName: node.object.name,
41
+ propertyName: node.property.name,
42
+ };
43
+ }
44
+ return null;
45
+ }
46
+ /**
47
+ * Extracts the callback parameter name(s) for array iteration methods.
48
+ * For `reduce`, the item is the second param. For `sort`, both are items.
49
+ */
50
+ function extractIterationParamNames(callback, methodName) {
51
+ const params = [];
52
+ if (methodName === 'reduce') {
53
+ if (callback.params.length >= 2 && t.isIdentifier(callback.params[1])) {
54
+ params.push(callback.params[1].name);
55
+ }
56
+ }
57
+ else if (methodName === 'sort') {
58
+ for (const param of callback.params) {
59
+ if (t.isIdentifier(param)) {
60
+ params.push(param.name);
61
+ }
62
+ }
63
+ }
64
+ else {
65
+ if (callback.params.length >= 1 && t.isIdentifier(callback.params[0])) {
66
+ params.push(callback.params[0].name);
67
+ }
68
+ }
69
+ return params;
70
+ }
71
+ let QueryResultFieldAccessValidationRule = class QueryResultFieldAccessValidationRule extends BaseLintRule {
72
+ get Name() { return 'query-result-field-access-validation'; }
73
+ get AppliesTo() { return 'all'; }
74
+ Test(ast, _componentName, componentSpec) {
75
+ const violations = [];
76
+ // Skip if no data requirements with queries
77
+ if (!componentSpec?.dataRequirements?.queries || componentSpec.dataRequirements.queries.length === 0) {
78
+ return violations;
79
+ }
80
+ // Build a map of query names to their valid field names and field types
81
+ const queryFieldsMap = new Map();
82
+ const queryFieldTypesMap = new Map(); // queryName -> fieldName -> sqlType
83
+ const typeContext = new TypeContext(componentSpec);
84
+ for (const queryReq of componentSpec.dataRequirements.queries) {
85
+ // Try TypeContext first (uses cached query.fields)
86
+ const fields = typeContext.getQueryFieldTypes(queryReq.name, queryReq.categoryPath);
87
+ if (fields && fields.size > 0) {
88
+ queryFieldsMap.set(queryReq.name, new Set(fields.keys()));
89
+ const typeMap = new Map();
90
+ for (const [name, info] of fields) {
91
+ if (info.sqlType) {
92
+ typeMap.set(name, info.sqlType);
93
+ }
94
+ }
95
+ queryFieldTypesMap.set(queryReq.name, typeMap);
96
+ }
97
+ else if (queryReq.fields && queryReq.fields.length > 0) {
98
+ // Fallback: use fields directly from spec
99
+ queryFieldsMap.set(queryReq.name, new Set(queryReq.fields.map(f => f.name)));
100
+ const typeMap = new Map();
101
+ for (const f of queryReq.fields) {
102
+ if (f.type) {
103
+ typeMap.set(f.name, f.type);
104
+ }
105
+ }
106
+ queryFieldTypesMap.set(queryReq.name, typeMap);
107
+ }
108
+ }
109
+ // Emit skip-with-warning for queries that were declared but have no field metadata
110
+ for (const queryReq of componentSpec.dataRequirements.queries) {
111
+ if (!queryFieldsMap.has(queryReq.name)) {
112
+ violations.push(createViolation('query-result-field-access-validation', 'low', null, `Unable to validate field access on query '${queryReq.name}' results — query field metadata not available. Add fields to dataRequirements.queries for accurate validation.`, queryReq.name));
113
+ }
114
+ }
115
+ // If we couldn't load any query field metadata, skip further validation
116
+ if (queryFieldsMap.size === 0) {
117
+ return violations;
118
+ }
119
+ // Track RunQuery result variables: varName -> queryName
120
+ const runQueryResultVars = new Map();
121
+ // Track .Results arrays: varName -> queryName
122
+ const queryArrayVars = new Map();
123
+ /**
124
+ * Validates a single field access on a query row variable.
125
+ */
126
+ function validateFieldAccess(node, paramName, queryName) {
127
+ const access = resolveMemberAccess(node);
128
+ if (!access || access.objectName !== paramName)
129
+ return;
130
+ const { propertyName } = access;
131
+ const validFields = queryFieldsMap.get(queryName);
132
+ if (!validFields)
133
+ return;
134
+ // Field exists — no violation
135
+ if (validFields.has(propertyName))
136
+ return;
137
+ // Check for case mismatch first (medium severity)
138
+ const caseFix = findCaseMismatch(propertyName, validFields);
139
+ if (caseFix) {
140
+ violations.push(createViolation('query-result-field-access-validation', 'medium', node, `Field "${propertyName}" on query "${queryName}" has incorrect casing. Did you mean "${caseFix}"?`, `${paramName}.${propertyName}`, {
141
+ text: `Use the correct casing: "${caseFix}".`,
142
+ example: `// Change:\n${paramName}.${propertyName}\n// To:\n${paramName}.${caseFix}`,
143
+ }));
144
+ return;
145
+ }
146
+ // Check for close typo via Levenshtein (high severity)
147
+ const closest = findClosestMatch(propertyName, validFields);
148
+ const availableFields = Array.from(validFields).slice(0, 10);
149
+ const moreText = validFields.size > 10 ? ` and ${validFields.size - 10} more` : '';
150
+ if (closest) {
151
+ violations.push(createViolation('query-result-field-access-validation', 'high', node, `Field "${propertyName}" does not exist on query "${queryName}". Did you mean "${closest}"? Available fields: ${availableFields.join(', ')}${moreText}`, `${paramName}.${propertyName}`, {
152
+ text: `Replace "${propertyName}" with "${closest}".`,
153
+ example: `// Change:\n${paramName}.${propertyName}\n// To:\n${paramName}.${closest}`,
154
+ }));
155
+ }
156
+ else {
157
+ violations.push(createViolation('query-result-field-access-validation', 'high', node, `Field "${propertyName}" does not exist on query "${queryName}". Available fields: ${availableFields.join(', ')}${moreText}`, `${paramName}.${propertyName}`, {
158
+ text: `Use one of the valid fields from the "${queryName}" query.`,
159
+ }));
160
+ }
161
+ }
162
+ /**
163
+ * Checks for numeric coercion on GUID fields from query results.
164
+ */
165
+ function checkTypeCoercion(callNode, queryRowParams) {
166
+ if (!t.isIdentifier(callNode.callee))
167
+ return;
168
+ if (!NUMERIC_COERCION_FUNCTIONS.has(callNode.callee.name))
169
+ return;
170
+ if (callNode.arguments.length === 0)
171
+ return;
172
+ const arg = callNode.arguments[0];
173
+ if (!t.isMemberExpression(arg) && !t.isOptionalMemberExpression(arg))
174
+ return;
175
+ const access = resolveMemberAccess(arg);
176
+ if (!access)
177
+ return;
178
+ const queryName = queryRowParams.get(access.objectName);
179
+ if (!queryName)
180
+ return;
181
+ const typeMap = queryFieldTypesMap.get(queryName);
182
+ const sqlType = typeMap?.get(access.propertyName);
183
+ if (typeof sqlType === 'string' && sqlType.toLowerCase() === 'uniqueidentifier') {
184
+ violations.push(createViolation('query-result-field-access-validation', 'medium', callNode, `${callNode.callee.name}(${access.objectName}.${access.propertyName}) coerces a uniqueidentifier (GUID) to a number. GUIDs are strings, not numeric values.`, truncateCode(`${callNode.callee.name}(${access.objectName}.${access.propertyName})`), {
185
+ text: `"${access.propertyName}" is a uniqueidentifier field. Use it as a string directly.`,
186
+ example: `// Instead of:\n${callNode.callee.name}(${access.objectName}.${access.propertyName})\n// Use:\n${access.objectName}.${access.propertyName} // Already a string`,
187
+ }));
188
+ }
189
+ }
190
+ /**
191
+ * Walks a callback body, validating all field accesses on known query row params.
192
+ */
193
+ function validateCallbackBody(body, paramNames, queryName) {
194
+ const queryRowParams = new Map();
195
+ for (const p of paramNames) {
196
+ queryRowParams.set(p, queryName);
197
+ }
198
+ traverse(body, {
199
+ MemberExpression(innerPath) {
200
+ const objName = t.isIdentifier(innerPath.node.object) ? innerPath.node.object.name : null;
201
+ if (objName && queryRowParams.has(objName)) {
202
+ validateFieldAccess(innerPath.node, objName, queryName);
203
+ }
204
+ },
205
+ OptionalMemberExpression(innerPath) {
206
+ const objName = t.isIdentifier(innerPath.node.object) ? innerPath.node.object.name : null;
207
+ if (objName && queryRowParams.has(objName)) {
208
+ validateFieldAccess(innerPath.node, objName, queryName);
209
+ }
210
+ },
211
+ CallExpression(innerPath) {
212
+ checkTypeCoercion(innerPath.node, queryRowParams);
213
+ },
214
+ noScope: true,
215
+ });
216
+ }
217
+ // Main traversal
218
+ traverse(ast, {
219
+ VariableDeclarator(path) {
220
+ if (!t.isIdentifier(path.node.id))
221
+ return;
222
+ const varName = path.node.id.name;
223
+ const init = path.node.init;
224
+ if (!init)
225
+ return;
226
+ // Detect: const result = await utilities.rq.RunQuery({ QueryName: '...' })
227
+ if (t.isAwaitExpression(init) && t.isCallExpression(init.argument)) {
228
+ const call = init.argument;
229
+ if (t.isMemberExpression(call.callee) &&
230
+ t.isMemberExpression(call.callee.object) &&
231
+ t.isIdentifier(call.callee.property) &&
232
+ call.callee.property.name === 'RunQuery') {
233
+ if (call.arguments.length > 0 && t.isObjectExpression(call.arguments[0])) {
234
+ for (const prop of call.arguments[0].properties) {
235
+ if (t.isObjectProperty(prop) &&
236
+ t.isIdentifier(prop.key) &&
237
+ prop.key.name === 'QueryName' &&
238
+ t.isStringLiteral(prop.value)) {
239
+ runQueryResultVars.set(varName, prop.value.value);
240
+ break;
241
+ }
242
+ }
243
+ }
244
+ }
245
+ }
246
+ // Detect: const rows = result.Results or const rows = result?.Results
247
+ if (t.isMemberExpression(init) || t.isOptionalMemberExpression(init)) {
248
+ if (t.isIdentifier(init.object) &&
249
+ t.isIdentifier(init.property) &&
250
+ init.property.name === 'Results') {
251
+ const sourceVar = init.object.name;
252
+ const queryName = runQueryResultVars.get(sourceVar);
253
+ if (queryName) {
254
+ queryArrayVars.set(varName, queryName);
255
+ }
256
+ }
257
+ }
258
+ },
259
+ CallExpression(path) {
260
+ if (!t.isMemberExpression(path.node.callee) &&
261
+ !t.isOptionalMemberExpression(path.node.callee)) {
262
+ return;
263
+ }
264
+ const callee = path.node.callee;
265
+ if (!t.isIdentifier(callee.property))
266
+ return;
267
+ const methodName = callee.property.name;
268
+ if (!ARRAY_METHODS.includes(methodName))
269
+ return;
270
+ let queryName;
271
+ // .map() etc. on a tracked array variable
272
+ if (t.isIdentifier(callee.object)) {
273
+ queryName = queryArrayVars.get(callee.object.name);
274
+ }
275
+ // .Results.map() — direct chaining on result.Results or result?.Results
276
+ if ((t.isMemberExpression(callee.object) || t.isOptionalMemberExpression(callee.object)) &&
277
+ t.isIdentifier(callee.object.object) &&
278
+ t.isIdentifier(callee.object.property) &&
279
+ callee.object.property.name === 'Results') {
280
+ queryName = runQueryResultVars.get(callee.object.object.name);
281
+ }
282
+ if (!queryName)
283
+ return;
284
+ if (path.node.arguments.length === 0)
285
+ return;
286
+ const callback = path.node.arguments[0];
287
+ if (!t.isArrowFunctionExpression(callback) &&
288
+ !t.isFunctionExpression(callback)) {
289
+ return;
290
+ }
291
+ const paramNames = extractIterationParamNames(callback, methodName);
292
+ if (paramNames.length === 0)
293
+ return;
294
+ validateCallbackBody(callback.body, paramNames, queryName);
295
+ },
296
+ });
297
+ return violations;
298
+ }
299
+ };
300
+ QueryResultFieldAccessValidationRule = __decorate([
301
+ RegisterClass(BaseLintRule, 'query-result-field-access-validation')
302
+ ], QueryResultFieldAccessValidationRule);
303
+ export { QueryResultFieldAccessValidationRule };
304
+ //# sourceMappingURL=query-result-field-access-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-result-field-access-validation.js","sourceRoot":"","sources":["../../src/runtime-rules/query-result-field-access-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import * as t from '@babel/types';
2
+ import { BaseLintRule } from '../lint-rule.js';
3
+ import { Violation } from '../component-linter.js';
4
+ /**
5
+ * Rule: react-component-naming
6
+ *
7
+ * Ensures that React components follow naming conventions:
8
+ * - Component names must start with an uppercase letter
9
+ * - JSX treats lowercase as HTML elements
10
+ *
11
+ * Severity: critical
12
+ * Applies to: all components
13
+ */
14
+ export declare class ReactComponentNamingRule extends BaseLintRule {
15
+ get Name(): string;
16
+ get AppliesTo(): 'all' | 'child' | 'root';
17
+ Test(ast: t.File, componentName: string): Violation[];
18
+ }
19
+ //# sourceMappingURL=react-component-naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-component-naming.d.ts","sourceRoot":"","sources":["../../src/runtime-rules/react-component-naming.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD;;;;;;;;;GASG;AACH,qBACa,wBAAyB,SAAQ,YAAY;IACxD,IAAI,IAAI,WAAuC;IAC/C,IAAI,SAAS,IAAI,KAAK,GAAG,OAAO,GAAG,MAAM,CAAkB;IAE3D,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE;CAwEtD"}