@apptoolkit/harness 1.0.0 → 1.0.1

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 (240) hide show
  1. package/README.md +20 -45
  2. package/{dist/bun/npm/harness.js → harness.js} +3 -3
  3. package/package.json +9 -23
  4. package/{dist/bun/npm/payload → payload}/harness/runtime/harness.mjs +3 -3
  5. package/dist/apptoolkit-harness-1.0.0.tgz +0 -0
  6. package/dist/bun/apptoolkit-harness-1.0.0.tgz +0 -0
  7. package/dist/bun/native/README.md +0 -33
  8. package/dist/bun/native/harness +0 -4
  9. package/dist/bun/native/payload/harness/runtime/harness.mjs +0 -104
  10. package/dist/bun/npm/LICENSE +0 -21
  11. package/dist/bun/npm/README.md +0 -33
  12. package/dist/bun/npm/package.json +0 -23
  13. package/dist/bun/npm/payload/HARNESS.md +0 -21
  14. package/dist/bun/npm/payload/author-style/README.md +0 -56
  15. package/dist/bun/npm/payload/author-style/biome-core.json +0 -57
  16. package/dist/bun/npm/payload/author-style/biome-react.json +0 -9
  17. package/dist/bun/npm/payload/author-style/biome-sql.json +0 -9
  18. package/dist/bun/npm/payload/author-style/bun.lock +0 -37
  19. package/dist/bun/npm/payload/author-style/check.llm.md +0 -17
  20. package/dist/bun/npm/payload/author-style/check.test.llm.md +0 -17
  21. package/dist/bun/npm/payload/author-style/check.test.ts +0 -238
  22. package/dist/bun/npm/payload/author-style/check.ts +0 -181
  23. package/dist/bun/npm/payload/author-style/member-spacing.test.ts +0 -172
  24. package/dist/bun/npm/payload/author-style/member-spacing.ts +0 -106
  25. package/dist/bun/npm/payload/author-style/package.json +0 -18
  26. package/dist/bun/npm/payload/author-style/plugins/class-member-order.grit +0 -133
  27. package/dist/bun/npm/payload/author-style/plugins/event-handler-names.grit +0 -110
  28. package/dist/bun/npm/payload/author-style/plugins/explicit-arrow-body.grit +0 -15
  29. package/dist/bun/npm/payload/author-style/plugins/explicit-source-constructs.grit +0 -10
  30. package/dist/bun/npm/payload/author-style/plugins/react-arrow-body.grit +0 -85
  31. package/dist/bun/npm/payload/author-style/plugins/sql-style.grit +0 -125
  32. package/dist/bun/npm/payload/author-style/react-module.llm.md +0 -17
  33. package/dist/bun/npm/payload/author-style/react-module.test.ts +0 -150
  34. package/dist/bun/npm/payload/author-style/react-module.ts +0 -255
  35. package/dist/bun/npm/payload/author-style/source-policy.llm.md +0 -17
  36. package/dist/bun/npm/payload/author-style/source-policy.test.ts +0 -70
  37. package/dist/bun/npm/payload/author-style/source-policy.ts +0 -215
  38. package/dist/bun/npm/payload/author-style/spacing.llm.md +0 -17
  39. package/dist/bun/npm/payload/author-style/spacing.test.ts +0 -174
  40. package/dist/bun/npm/payload/author-style/spacing.ts +0 -211
  41. package/dist/bun/npm/payload/harness/POLICY.md +0 -33
  42. package/dist/bun/npm/payload/harness/PROJECT.md +0 -26
  43. package/dist/bun/npm/payload/harness/REVIEW.md +0 -17
  44. package/dist/bun/npm/payload/harness/TEMPLATES.md +0 -20
  45. package/dist/bun/npm/payload/harness/WORKFLOWS.md +0 -65
  46. package/dist/bun/npm/payload/harness/runtime/ZOD-LICENSE +0 -21
  47. package/dist/bun/npm/payload/harness/services/README.md +0 -26
  48. package/dist/bun/npm/payload/harness/services/penpot.json +0 -7
  49. package/dist/bun/npm/payload/harness/services/plane.json +0 -9
  50. package/dist/bun/npm/payload/harness/workflows/W01.md +0 -13
  51. package/dist/bun/npm/payload/harness/workflows/W02.md +0 -13
  52. package/dist/bun/npm/payload/harness/workflows/W03.md +0 -13
  53. package/dist/bun/npm/payload/harness/workflows/W04.md +0 -13
  54. package/dist/bun/npm/payload/harness/workflows/W05.md +0 -13
  55. package/dist/bun/npm/payload/harness/workflows/W06.md +0 -13
  56. package/dist/bun/npm/payload/harness/workflows/W07.md +0 -13
  57. package/dist/bun/npm/payload/harness/workflows/W08.md +0 -13
  58. package/dist/bun/npm/payload/harness/workflows/W09.md +0 -13
  59. package/dist/bun/npm/payload/harness/workflows/W10.md +0 -13
  60. package/dist/bun/npm/payload/harness/workflows/W11.md +0 -13
  61. package/dist/bun/npm/payload/harness/workflows/W12.md +0 -13
  62. package/dist/bun/npm/payload/harness/workflows/W13.md +0 -13
  63. package/dist/bun/npm/payload/harness/workflows/W14.md +0 -13
  64. package/dist/bun/npm/payload/harness/workflows/W15.md +0 -13
  65. package/dist/bun/npm/payload/harness/workflows/W16.md +0 -13
  66. package/dist/bun/npm/payload/harness/workflows/W17.md +0 -13
  67. package/dist/bun/npm/payload/harness/workflows/W18.md +0 -13
  68. package/dist/bun/npm/payload/harness/workflows/W19.md +0 -13
  69. package/dist/bun/npm/payload/harness/workflows/W20.md +0 -13
  70. package/dist/bun/npm/payload/harness/workflows/W21.md +0 -15
  71. package/dist/bun/npm/payload/harness/workflows/W22.md +0 -13
  72. package/dist/bun/npm/payload/harness/workflows/W23.md +0 -21
  73. package/dist/bun/npm/payload/harness/workflows/W24.md +0 -13
  74. package/dist/bun/npm/payload/harness/workflows/W25.md +0 -13
  75. package/dist/bun/npm/payload/harness/workflows/W26.md +0 -13
  76. package/dist/bun/npm/payload/harness/workflows/W27.md +0 -13
  77. package/dist/bun/npm/payload/harness/workflows/W28.md +0 -13
  78. package/dist/bun/npm/payload/harness/workflows/W29.md +0 -13
  79. package/dist/bun/npm/payload/harness/workflows/W30.md +0 -13
  80. package/dist/bun/npm/payload/harness/workflows/W31.md +0 -13
  81. package/dist/bun/npm/payload/harness/workflows/W32.md +0 -13
  82. package/dist/bun/npm/payload/harness/workflows/W33.md +0 -13
  83. package/dist/bun/npm/payload/harness/workflows/W34.md +0 -13
  84. package/dist/bun/npm/payload/harness/workflows/W35.md +0 -13
  85. package/dist/bun/npm/payload/harness/workflows/W36.md +0 -13
  86. package/dist/bun/npm/payload/harness/workflows/W37.md +0 -13
  87. package/dist/npm/LICENSE +0 -21
  88. package/dist/npm/README.md +0 -30
  89. package/dist/npm/harness.js +0 -104
  90. package/dist/npm/package.json +0 -25
  91. package/dist/npm/payload/HARNESS.md +0 -21
  92. package/dist/npm/payload/author-style/README.md +0 -56
  93. package/dist/npm/payload/author-style/biome-core.json +0 -57
  94. package/dist/npm/payload/author-style/biome-react.json +0 -9
  95. package/dist/npm/payload/author-style/biome-sql.json +0 -9
  96. package/dist/npm/payload/author-style/check.llm.md +0 -17
  97. package/dist/npm/payload/author-style/check.test.llm.md +0 -17
  98. package/dist/npm/payload/author-style/check.test.ts +0 -224
  99. package/dist/npm/payload/author-style/check.ts +0 -179
  100. package/dist/npm/payload/author-style/member-spacing.test.ts +0 -172
  101. package/dist/npm/payload/author-style/member-spacing.ts +0 -106
  102. package/dist/npm/payload/author-style/package-lock.json +0 -180
  103. package/dist/npm/payload/author-style/package.json +0 -17
  104. package/dist/npm/payload/author-style/plugins/class-member-order.grit +0 -133
  105. package/dist/npm/payload/author-style/plugins/event-handler-names.grit +0 -110
  106. package/dist/npm/payload/author-style/plugins/explicit-arrow-body.grit +0 -15
  107. package/dist/npm/payload/author-style/plugins/explicit-source-constructs.grit +0 -10
  108. package/dist/npm/payload/author-style/plugins/react-arrow-body.grit +0 -85
  109. package/dist/npm/payload/author-style/plugins/sql-style.grit +0 -125
  110. package/dist/npm/payload/author-style/react-module.llm.md +0 -17
  111. package/dist/npm/payload/author-style/react-module.test.ts +0 -150
  112. package/dist/npm/payload/author-style/react-module.ts +0 -255
  113. package/dist/npm/payload/author-style/source-policy.llm.md +0 -17
  114. package/dist/npm/payload/author-style/source-policy.test.ts +0 -70
  115. package/dist/npm/payload/author-style/source-policy.ts +0 -215
  116. package/dist/npm/payload/author-style/spacing.llm.md +0 -17
  117. package/dist/npm/payload/author-style/spacing.test.ts +0 -174
  118. package/dist/npm/payload/author-style/spacing.ts +0 -211
  119. package/dist/npm/payload/harness/POLICY.md +0 -33
  120. package/dist/npm/payload/harness/PROJECT.md +0 -26
  121. package/dist/npm/payload/harness/REVIEW.md +0 -17
  122. package/dist/npm/payload/harness/TEMPLATES.md +0 -20
  123. package/dist/npm/payload/harness/WORKFLOWS.md +0 -65
  124. package/dist/npm/payload/harness/runtime/ZOD-LICENSE +0 -21
  125. package/dist/npm/payload/harness/runtime/harness.mjs +0 -104
  126. package/dist/npm/payload/harness/services/README.md +0 -26
  127. package/dist/npm/payload/harness/services/penpot.json +0 -7
  128. package/dist/npm/payload/harness/services/plane.json +0 -9
  129. package/dist/npm/payload/harness/workflows/W01.md +0 -13
  130. package/dist/npm/payload/harness/workflows/W02.md +0 -13
  131. package/dist/npm/payload/harness/workflows/W03.md +0 -13
  132. package/dist/npm/payload/harness/workflows/W04.md +0 -13
  133. package/dist/npm/payload/harness/workflows/W05.md +0 -13
  134. package/dist/npm/payload/harness/workflows/W06.md +0 -13
  135. package/dist/npm/payload/harness/workflows/W07.md +0 -13
  136. package/dist/npm/payload/harness/workflows/W08.md +0 -13
  137. package/dist/npm/payload/harness/workflows/W09.md +0 -13
  138. package/dist/npm/payload/harness/workflows/W10.md +0 -13
  139. package/dist/npm/payload/harness/workflows/W11.md +0 -13
  140. package/dist/npm/payload/harness/workflows/W12.md +0 -13
  141. package/dist/npm/payload/harness/workflows/W13.md +0 -13
  142. package/dist/npm/payload/harness/workflows/W14.md +0 -13
  143. package/dist/npm/payload/harness/workflows/W15.md +0 -13
  144. package/dist/npm/payload/harness/workflows/W16.md +0 -13
  145. package/dist/npm/payload/harness/workflows/W17.md +0 -13
  146. package/dist/npm/payload/harness/workflows/W18.md +0 -13
  147. package/dist/npm/payload/harness/workflows/W19.md +0 -13
  148. package/dist/npm/payload/harness/workflows/W20.md +0 -13
  149. package/dist/npm/payload/harness/workflows/W21.md +0 -15
  150. package/dist/npm/payload/harness/workflows/W22.md +0 -13
  151. package/dist/npm/payload/harness/workflows/W23.md +0 -21
  152. package/dist/npm/payload/harness/workflows/W24.md +0 -13
  153. package/dist/npm/payload/harness/workflows/W25.md +0 -13
  154. package/dist/npm/payload/harness/workflows/W26.md +0 -13
  155. package/dist/npm/payload/harness/workflows/W27.md +0 -13
  156. package/dist/npm/payload/harness/workflows/W28.md +0 -13
  157. package/dist/npm/payload/harness/workflows/W29.md +0 -13
  158. package/dist/npm/payload/harness/workflows/W30.md +0 -13
  159. package/dist/npm/payload/harness/workflows/W31.md +0 -13
  160. package/dist/npm/payload/harness/workflows/W32.md +0 -13
  161. package/dist/npm/payload/harness/workflows/W33.md +0 -13
  162. package/dist/npm/payload/harness/workflows/W34.md +0 -13
  163. package/dist/npm/payload/harness/workflows/W35.md +0 -13
  164. package/dist/npm/payload/harness/workflows/W36.md +0 -13
  165. package/dist/npm/payload/harness/workflows/W37.md +0 -13
  166. /package/{dist/bun/native/LICENSE → LICENSE} +0 -0
  167. /package/{dist/bun/native/payload → payload}/HARNESS.md +0 -0
  168. /package/{dist/bun/native/payload → payload}/author-style/README.md +0 -0
  169. /package/{dist/bun/native/payload → payload}/author-style/biome-core.json +0 -0
  170. /package/{dist/bun/native/payload → payload}/author-style/biome-react.json +0 -0
  171. /package/{dist/bun/native/payload → payload}/author-style/biome-sql.json +0 -0
  172. /package/{dist/bun/native/payload → payload}/author-style/bun.lock +0 -0
  173. /package/{dist/bun/native/payload → payload}/author-style/check.llm.md +0 -0
  174. /package/{dist/bun/native/payload → payload}/author-style/check.test.llm.md +0 -0
  175. /package/{dist/bun/native/payload → payload}/author-style/check.test.ts +0 -0
  176. /package/{dist/bun/native/payload → payload}/author-style/check.ts +0 -0
  177. /package/{dist/bun/native/payload → payload}/author-style/member-spacing.test.ts +0 -0
  178. /package/{dist/bun/native/payload → payload}/author-style/member-spacing.ts +0 -0
  179. /package/{dist/bun/native/payload → payload}/author-style/package.json +0 -0
  180. /package/{dist/bun/native/payload → payload}/author-style/plugins/class-member-order.grit +0 -0
  181. /package/{dist/bun/native/payload → payload}/author-style/plugins/event-handler-names.grit +0 -0
  182. /package/{dist/bun/native/payload → payload}/author-style/plugins/explicit-arrow-body.grit +0 -0
  183. /package/{dist/bun/native/payload → payload}/author-style/plugins/explicit-source-constructs.grit +0 -0
  184. /package/{dist/bun/native/payload → payload}/author-style/plugins/react-arrow-body.grit +0 -0
  185. /package/{dist/bun/native/payload → payload}/author-style/plugins/sql-style.grit +0 -0
  186. /package/{dist/bun/native/payload → payload}/author-style/react-module.llm.md +0 -0
  187. /package/{dist/bun/native/payload → payload}/author-style/react-module.test.ts +0 -0
  188. /package/{dist/bun/native/payload → payload}/author-style/react-module.ts +0 -0
  189. /package/{dist/bun/native/payload → payload}/author-style/source-policy.llm.md +0 -0
  190. /package/{dist/bun/native/payload → payload}/author-style/source-policy.test.ts +0 -0
  191. /package/{dist/bun/native/payload → payload}/author-style/source-policy.ts +0 -0
  192. /package/{dist/bun/native/payload → payload}/author-style/spacing.llm.md +0 -0
  193. /package/{dist/bun/native/payload → payload}/author-style/spacing.test.ts +0 -0
  194. /package/{dist/bun/native/payload → payload}/author-style/spacing.ts +0 -0
  195. /package/{dist/bun/native/payload → payload}/harness/POLICY.md +0 -0
  196. /package/{dist/bun/native/payload → payload}/harness/PROJECT.md +0 -0
  197. /package/{dist/bun/native/payload → payload}/harness/REVIEW.md +0 -0
  198. /package/{dist/bun/native/payload → payload}/harness/TEMPLATES.md +0 -0
  199. /package/{dist/bun/native/payload → payload}/harness/WORKFLOWS.md +0 -0
  200. /package/{dist/bun/native/payload → payload}/harness/runtime/ZOD-LICENSE +0 -0
  201. /package/{dist/bun/native/payload → payload}/harness/services/README.md +0 -0
  202. /package/{dist/bun/native/payload → payload}/harness/services/penpot.json +0 -0
  203. /package/{dist/bun/native/payload → payload}/harness/services/plane.json +0 -0
  204. /package/{dist/bun/native/payload → payload}/harness/workflows/W01.md +0 -0
  205. /package/{dist/bun/native/payload → payload}/harness/workflows/W02.md +0 -0
  206. /package/{dist/bun/native/payload → payload}/harness/workflows/W03.md +0 -0
  207. /package/{dist/bun/native/payload → payload}/harness/workflows/W04.md +0 -0
  208. /package/{dist/bun/native/payload → payload}/harness/workflows/W05.md +0 -0
  209. /package/{dist/bun/native/payload → payload}/harness/workflows/W06.md +0 -0
  210. /package/{dist/bun/native/payload → payload}/harness/workflows/W07.md +0 -0
  211. /package/{dist/bun/native/payload → payload}/harness/workflows/W08.md +0 -0
  212. /package/{dist/bun/native/payload → payload}/harness/workflows/W09.md +0 -0
  213. /package/{dist/bun/native/payload → payload}/harness/workflows/W10.md +0 -0
  214. /package/{dist/bun/native/payload → payload}/harness/workflows/W11.md +0 -0
  215. /package/{dist/bun/native/payload → payload}/harness/workflows/W12.md +0 -0
  216. /package/{dist/bun/native/payload → payload}/harness/workflows/W13.md +0 -0
  217. /package/{dist/bun/native/payload → payload}/harness/workflows/W14.md +0 -0
  218. /package/{dist/bun/native/payload → payload}/harness/workflows/W15.md +0 -0
  219. /package/{dist/bun/native/payload → payload}/harness/workflows/W16.md +0 -0
  220. /package/{dist/bun/native/payload → payload}/harness/workflows/W17.md +0 -0
  221. /package/{dist/bun/native/payload → payload}/harness/workflows/W18.md +0 -0
  222. /package/{dist/bun/native/payload → payload}/harness/workflows/W19.md +0 -0
  223. /package/{dist/bun/native/payload → payload}/harness/workflows/W20.md +0 -0
  224. /package/{dist/bun/native/payload → payload}/harness/workflows/W21.md +0 -0
  225. /package/{dist/bun/native/payload → payload}/harness/workflows/W22.md +0 -0
  226. /package/{dist/bun/native/payload → payload}/harness/workflows/W23.md +0 -0
  227. /package/{dist/bun/native/payload → payload}/harness/workflows/W24.md +0 -0
  228. /package/{dist/bun/native/payload → payload}/harness/workflows/W25.md +0 -0
  229. /package/{dist/bun/native/payload → payload}/harness/workflows/W26.md +0 -0
  230. /package/{dist/bun/native/payload → payload}/harness/workflows/W27.md +0 -0
  231. /package/{dist/bun/native/payload → payload}/harness/workflows/W28.md +0 -0
  232. /package/{dist/bun/native/payload → payload}/harness/workflows/W29.md +0 -0
  233. /package/{dist/bun/native/payload → payload}/harness/workflows/W30.md +0 -0
  234. /package/{dist/bun/native/payload → payload}/harness/workflows/W31.md +0 -0
  235. /package/{dist/bun/native/payload → payload}/harness/workflows/W32.md +0 -0
  236. /package/{dist/bun/native/payload → payload}/harness/workflows/W33.md +0 -0
  237. /package/{dist/bun/native/payload → payload}/harness/workflows/W34.md +0 -0
  238. /package/{dist/bun/native/payload → payload}/harness/workflows/W35.md +0 -0
  239. /package/{dist/bun/native/payload → payload}/harness/workflows/W36.md +0 -0
  240. /package/{dist/bun/native/payload → payload}/harness/workflows/W37.md +0 -0
@@ -1,125 +0,0 @@
1
- language js(typescript, jsx)
2
-
3
- pattern sql_template($elements) {
4
- JsTemplateExpression(tag=$tag, elements=$elements) where {
5
- $tag <: r"sql",
6
- not $elements <: some bubble $part where {
7
- $part <: JsTemplateChunkElement(),
8
- or {
9
- not $part <: r"(?s)(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*",
10
- $part <: r"(?s).*(?:--|/\*).*"
11
- }
12
- }
13
- }
14
- }
15
-
16
- or {
17
- sql_template($elements) where {
18
- $elements <: some bubble $chunk where {
19
- $chunk <: JsTemplateChunkElement(),
20
- $chunk <: or {
21
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:a(?i:ll)|Al(?i:l)|ALl)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
22
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:a(?i:nd)|An(?i:d)|ANd)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
23
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:a(?i:ny)|An(?i:y)|ANy)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
24
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:a(?i:rray)|Ar(?i:ray)|ARr(?i:ay)|ARRa(?i:y)|ARRAy)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
25
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:a(?i:s)|As)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
26
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:a(?i:sc)|As(?i:c)|ASc)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
27
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:b(?i:etween)|Be(?i:tween)|BEt(?i:ween)|BETw(?i:een)|BETWe(?i:en)|BETWEe(?i:n)|BETWEEn)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
28
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:b(?i:y)|By)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
29
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:c(?i:ase)|Ca(?i:se)|CAs(?i:e)|CASe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
30
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:c(?i:onflict)|Co(?i:nflict)|COn(?i:flict)|CONf(?i:lict)|CONFl(?i:ict)|CONFLi(?i:ct)|CONFLIc(?i:t)|CONFLICt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
31
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:c(?i:ross)|Cr(?i:oss)|CRo(?i:ss)|CROs(?i:s)|CROSs)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
32
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:d(?i:elete)|De(?i:lete)|DEl(?i:ete)|DELe(?i:te)|DELEt(?i:e)|DELETe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
33
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:d(?i:esc)|De(?i:sc)|DEs(?i:c)|DESc)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
34
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:d(?i:istinct)|Di(?i:stinct)|DIs(?i:tinct)|DISt(?i:inct)|DISTi(?i:nct)|DISTIn(?i:ct)|DISTINc(?i:t)|DISTINCt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
35
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:d(?i:o)|Do)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
36
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:e(?i:lse)|El(?i:se)|ELs(?i:e)|ELSe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
37
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:e(?i:nd)|En(?i:d)|ENd)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
38
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:e(?i:scape)|Es(?i:cape)|ESc(?i:ape)|ESCa(?i:pe)|ESCAp(?i:e)|ESCAPe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
39
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:e(?i:xcept)|Ex(?i:cept)|EXc(?i:ept)|EXCe(?i:pt)|EXCEp(?i:t)|EXCEPt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
40
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:e(?i:xists)|Ex(?i:ists)|EXi(?i:sts)|EXIs(?i:ts)|EXISt(?i:s)|EXISTs)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
41
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:f(?i:alse)|Fa(?i:lse)|FAl(?i:se)|FALs(?i:e)|FALSe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
42
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:f(?i:or)|Fo(?i:r)|FOr)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
43
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:f(?i:rom)|Fr(?i:om)|FRo(?i:m)|FROm)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
44
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:f(?i:ull)|Fu(?i:ll)|FUl(?i:l)|FULl)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
45
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:g(?i:roup)|Gr(?i:oup)|GRo(?i:up)|GROu(?i:p)|GROUp)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
46
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:h(?i:aving)|Ha(?i:ving)|HAv(?i:ing)|HAVi(?i:ng)|HAVIn(?i:g)|HAVINg)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
47
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:i(?i:like)|Il(?i:ike)|ILi(?i:ke)|ILIk(?i:e)|ILIKe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
48
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:i(?i:n)|In)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
49
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:i(?i:nner)|In(?i:ner)|INn(?i:er)|INNe(?i:r)|INNEr)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
50
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:i(?i:nsert)|In(?i:sert)|INs(?i:ert)|INSe(?i:rt)|INSEr(?i:t)|INSERt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
51
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:i(?i:ntersect)|In(?i:tersect)|INt(?i:ersect)|INTe(?i:rsect)|INTEr(?i:sect)|INTERs(?i:ect)|INTERSe(?i:ct)|INTERSEc(?i:t)|INTERSECt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
52
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:i(?i:nto)|In(?i:to)|INt(?i:o)|INTo)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
53
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:i(?i:s)|Is)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
54
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:j(?i:oin)|Jo(?i:in)|JOi(?i:n)|JOIn)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
55
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:l(?i:eft)|Le(?i:ft)|LEf(?i:t)|LEFt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
56
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:l(?i:ike)|Li(?i:ke)|LIk(?i:e)|LIKe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
57
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:l(?i:imit)|Li(?i:mit)|LIm(?i:it)|LIMi(?i:t)|LIMIt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
58
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:n(?i:atural)|Na(?i:tural)|NAt(?i:ural)|NATu(?i:ral)|NATUr(?i:al)|NATURa(?i:l)|NATURAl)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
59
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:n(?i:ot)|No(?i:t)|NOt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
60
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:n(?i:othing)|No(?i:thing)|NOt(?i:hing)|NOTh(?i:ing)|NOTHi(?i:ng)|NOTHIn(?i:g)|NOTHINg)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
61
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:n(?i:ull)|Nu(?i:ll)|NUl(?i:l)|NULl)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
62
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:o(?i:ffset)|Of(?i:fset)|OFf(?i:set)|OFFs(?i:et)|OFFSe(?i:t)|OFFSEt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
63
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:o(?i:n)|On)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
64
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:o(?i:r)|Or)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
65
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:o(?i:rder)|Or(?i:der)|ORd(?i:er)|ORDe(?i:r)|ORDEr)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
66
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:o(?i:uter)|Ou(?i:ter)|OUt(?i:er)|OUTe(?i:r)|OUTEr)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
67
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:o(?i:ver)|Ov(?i:er)|OVe(?i:r)|OVEr)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
68
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:p(?i:artition)|Pa(?i:rtition)|PAr(?i:tition)|PARt(?i:ition)|PARTi(?i:tion)|PARTIt(?i:ion)|PARTITi(?i:on)|PARTITIo(?i:n)|PARTITIOn)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
69
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:r(?i:ecursive)|Re(?i:cursive)|REc(?i:ursive)|RECu(?i:rsive)|RECUr(?i:sive)|RECURs(?i:ive)|RECURSi(?i:ve)|RECURSIv(?i:e)|RECURSIVe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
70
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:r(?i:eturning)|Re(?i:turning)|REt(?i:urning)|RETu(?i:rning)|RETUr(?i:ning)|RETURn(?i:ing)|RETURNi(?i:ng)|RETURNIn(?i:g)|RETURNINg)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
71
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:r(?i:ight)|Ri(?i:ght)|RIg(?i:ht)|RIGh(?i:t)|RIGHt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
72
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:s(?i:elect)|Se(?i:lect)|SEl(?i:ect)|SELe(?i:ct)|SELEc(?i:t)|SELECt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
73
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:s(?i:et)|Se(?i:t)|SEt)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
74
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:s(?i:ome)|So(?i:me)|SOm(?i:e)|SOMe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
75
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:t(?i:hen)|Th(?i:en)|THe(?i:n)|THEn)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
76
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:t(?i:rue)|Tr(?i:ue)|TRu(?i:e)|TRUe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
77
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:u(?i:nion)|Un(?i:ion)|UNi(?i:on)|UNIo(?i:n)|UNIOn)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
78
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:u(?i:pdate)|Up(?i:date)|UPd(?i:ate)|UPDa(?i:te)|UPDAt(?i:e)|UPDATe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
79
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:u(?i:sing)|Us(?i:ing)|USi(?i:ng)|USIn(?i:g)|USINg)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
80
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:v(?i:alues)|Va(?i:lues)|VAl(?i:ues)|VALu(?i:es)|VALUe(?i:s)|VALUEs)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
81
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:w(?i:hen)|Wh(?i:en)|WHe(?i:n)|WHEn)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
82
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:w(?i:here)|Wh(?i:ere)|WHe(?i:re)|WHEr(?i:e)|WHERe)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*",
83
- r"(?s)(?:(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-])?(?:w(?i:ith)|Wi(?i:th)|WIt(?i:h)|WITh)(?:[ \t\r\n(),;+*/%<>=!~^|&?@#\[\]-]|$).*"
84
- },
85
- register_diagnostic(span=$chunk, message="Use uppercase SQL keywords in the selected tagged SQL.", severity="error")
86
- }
87
- },
88
- sql_template($elements) where {
89
- $elements <: some bubble $chunk where {
90
- $chunk <: JsTemplateChunkElement(),
91
- $chunk <: or {
92
- r"(?s)(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*,(?:[^ \t\r\n]|$).*",
93
- r"(?s)(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*=(?:[^ \t\r\n=>]|$).*",
94
- r"(?s)(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9)\]])=.*",
95
- r"(?s)=.*"
96
- },
97
- register_diagnostic(span=$chunk, message="Add SQL whitespace after commas and around equals signs.", severity="error")
98
- }
99
- },
100
- sql_template($elements) as $template where {
101
- $elements <: [$first, ...],
102
- $first <: r"(?s)\n( *)(SELECT|UPDATE|INSERT|DELETE) .*"($root_indent, $root_keyword),
103
- not $template <: r"(?s).*(?:\(\s*(?:SELECT|WITH)|\bUNION\b|\bINTERSECT\b|\bEXCEPT\b).*",
104
- not $elements <: some $quoted_chunk where {
105
- $quoted_chunk <: JsTemplateChunkElement(),
106
- $quoted_chunk <: r"(?s)(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*(?:'(?:[^'\\]|'')*\n(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\n(?:[^\x22\\]|\x22\x22)*\x22)(?:(?:'(?:[^'\\]|'')*'|\x22(?:[^\x22\\]|\x22\x22)*\x22)|[A-Za-z_\x{80}-\x{10ffff}][A-Za-z_0-9$\x{80}-\x{10ffff}]*|[0-9]+|[. :\t\r\n(),;+*/%<>=!~^|&?@#\[\]-])*"
107
- },
108
- $indent_size = length($root_indent),
109
- $keyword_size = length($root_keyword),
110
- $river = $indent_size + $keyword_size,
111
- $elements <: some $chunk where {
112
- $chunk <: JsTemplateChunkElement(),
113
- $lines = split($chunk, separator=`
114
- `),
115
- $lines <: some $line where {
116
- $line <: r"( *)(FROM|WHERE|SET|GROUP BY|ORDER BY|HAVING|LIMIT|OFFSET|RETURNING|VALUES)(?:[ \t].*|$)"($indent, $clause),
117
- $line_indent_size = length($indent),
118
- $clause_size = length($clause),
119
- $clause_end = $line_indent_size + $clause_size,
120
- not $clause_end <: $river,
121
- register_diagnostic(span=$chunk, message="Right-align SQL root clauses with the opening keyword to form a river.", severity="error")
122
- }
123
- }
124
- }
125
- }
@@ -1,17 +0,0 @@
1
- # React module check map
2
-
3
- - [Recognized bindings and render expressions](#recognized-bindings-and-render-expressions)
4
- - [Module checks](#module-checks)
5
- - [Fixtures and limits](#fixtures-and-limits)
6
-
7
- ## Recognized bindings and render expressions
8
-
9
- `reactBindings` discovers React imports, `hasReactType` identifies direct `FC` and `FunctionComponent` annotations, and `isReactWrapper` identifies direct `memo` and `forwardRef` calls tied to those imports. `isJsxResult` and `returnsJsx` recognize supported rendered shapes without treating nested callbacks as component returns.
10
-
11
- ## Module checks
12
-
13
- `findReactModuleIssues` inspects top-level TSX declarations and the export targets resolved by `defaultTargets`. It checks focused named components, direct component typing and default exports. Biome's separate React Grit plugins check inline event callbacks and local handler names.
14
-
15
- ## Fixtures and limits
16
-
17
- See `react-module.test.ts` for supported syntax and `check.test.ts` for integration with the isolated profile. The check does not follow arbitrary factories, re-exports or cross-file values. Use the React profile on applicable reusable component files. Keep framework entry points and class-based or library-owned components under the project's own review rules.
@@ -1,150 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
-
4
- import { findReactModuleIssues } from './react-module.ts';
5
-
6
- function issues(source: string, fileName = 'Panel.tsx'): string[] {
7
- return findReactModuleIssues(source, fileName).map((issue) => issue.message);
8
- }
9
-
10
- test('checks TSX modules only', () => {
11
- assert.deepEqual(issues('export default function Panel() { return <p />; }', 'Panel.ts'), []);
12
- });
13
-
14
- test('accepts a PascalCase const default and equivalent local export', () => {
15
- assert.deepEqual(issues("import type { FC } from 'react'; const Panel: FC = () => <p />; export default Panel;"), []);
16
- assert.deepEqual(
17
- issues(
18
- "import type { FC } from 'react'; const Panel: FC = function render() { return <p />; }; export { Panel as default };",
19
- ),
20
- [],
21
- );
22
- });
23
-
24
- test('requires a directly imported React FC annotation for visible JSX in a named const', () => {
25
- for (const source of [
26
- 'const Panel = () => <p />; export default Panel;',
27
- 'const Panel = function render() { return <p />; }; export default Panel;',
28
- "import type { FC } from './local'; const Panel: FC = () => <p />; export default Panel;",
29
- ]) {
30
- assert.equal(issues(source).length, 1);
31
- assert.match(issues(source).join('\n'), /Annotate React arrow components/);
32
- }
33
- });
34
-
35
- test('recognizes FC imports and React type namespaces even without visible JSX', () => {
36
- for (const source of [
37
- "import type { FC as View } from 'react'; const Panel: View = () => null;",
38
- "import type * as R from 'react'; const Panel: R.FunctionComponent = () => null;",
39
- "import { type FC } from 'react'; const Panel: FC = () => null;",
40
- "import { default as R } from 'react'; const Panel: R.FC = () => null;",
41
- ]) {
42
- assert.match(issues(source).join('\n'), /named React component as default/);
43
- assert.deepEqual(issues(`${source} export default Panel;`), []);
44
- }
45
- });
46
-
47
- test('recognizes real React wrapper imports and counts an inline render as one component', () => {
48
- for (const source of [
49
- "import React from 'react'; const Panel = React.memo(() => <p />);",
50
- "import * as R from 'react'; const Panel = R.forwardRef(function Render() { return <p />; });",
51
- "import { memo as wrap, forwardRef } from 'react'; const Panel = wrap(forwardRef(() => <p />));",
52
- ]) {
53
- assert.match(issues(source).join('\n'), /named React component as default/);
54
- assert.deepEqual(issues(`${source} export default Panel;`), []);
55
- }
56
- });
57
-
58
- test('does not infer React wrappers or annotations from other packages or type-only value imports', () => {
59
- const source = [
60
- "import { memo, FC } from './local';",
61
- "import { type forwardRef } from 'react';",
62
- "import type * as R from 'react';",
63
- 'const Helper = memo(() => <p />);',
64
- 'const Task: FC = () => null;',
65
- 'const External = forwardRef(() => <p />);',
66
- 'const Typed = R.memo(() => <p />);',
67
- 'const Item = Unknown.memo(() => <p />);',
68
- 'export default Helper;',
69
- ].join('\n');
70
-
71
- assert.deepEqual(issues(source), []);
72
- });
73
-
74
- test('requires one module component and a default targeting that component', () => {
75
- const source = [
76
- "import type { FC } from 'react';",
77
- 'const Panel: FC = () => <p />;',
78
- 'const Second: FC = () => <div />;',
79
- 'export default Panel;',
80
- ].join('\n');
81
- const findings = findReactModuleIssues(source, 'Panel.tsx');
82
-
83
- assert.deepEqual(
84
- findings.map(({ line, column }) => ({ line, column })),
85
- [
86
- { line: 3, column: 7 },
87
- { line: 3, column: 7 },
88
- ],
89
- );
90
- assert.match(findings[0]?.message ?? '', /one React component per file/);
91
- assert.match(findings[1]?.message ?? '', /named React component as default/);
92
- assert.match(issues('const Panel = () => <p />; export { default } from "./other";').join('\n'), /as default/);
93
- assert.match(issues('const Panel = () => <p />; export type { Panel as default };').join('\n'), /as default/);
94
- });
95
-
96
- test('requires a named PascalCase const for function declarations and inline defaults', () => {
97
- for (const source of [
98
- 'export default function Panel() { return <p />; }',
99
- 'export default function () { return <p />; }',
100
- 'function Panel() { return <p />; } export default Panel;',
101
- 'export default (() => <p />);',
102
- "import { memo } from 'react'; export default memo(() => <p />);",
103
- 'let Panel = () => <p />; export default Panel;',
104
- 'const panel = () => <p />; export default panel;',
105
- 'const Panel_Name = () => <p />; export default Panel_Name;',
106
- ]) {
107
- assert.equal(issues(source).length, 1);
108
- assert.match(issues(source).join('\n'), /named const component/);
109
- }
110
- });
111
-
112
- test('recognizes visible JSX in branching, array and wrapped expression returns', () => {
113
- for (const render of [
114
- '() => condition ? <p /> : null',
115
- '() => condition && <p />',
116
- '() => value || <p />',
117
- '() => value ?? <p />',
118
- '() => [<p />, <></>]',
119
- '() => (<p /> satisfies Value)',
120
- '() => { if (condition) { return <p />; } return null; }',
121
- ]) {
122
- assert.match(issues(`const Panel = ${render};`).join('\n'), /named React component as default/);
123
- }
124
- });
125
-
126
- test('ignores JSX values, unrelated return shapes, nested helpers and ambient declarations', () => {
127
- const source = [
128
- "import type { FC } from 'react';",
129
- 'declare const Ambient: FC;',
130
- 'const { Hidden } = components;',
131
- 'const Literal = <p />;',
132
- 'const State = () => ({ preview: <p /> });',
133
- 'const Truthy = () => <p /> && true;',
134
- 'const RenderedText = () => renderToString(<p />);',
135
- 'const Outer = () => { function Inner() { return <p />; } return Inner; };',
136
- 'const Collector = () => items.map(() => <p />);',
137
- 'class Boundary { render() { return <p />; } }',
138
- 'function renderLabel() { return <p />; }',
139
- 'function build() { const Nested = () => <p />; return Nested; }',
140
- 'const Panel: FC = () => <div />;',
141
- 'export default Panel;',
142
- ].join('\n');
143
-
144
- assert.deepEqual(issues(source), []);
145
- });
146
-
147
- test('does not classify default noncomponent functions or default re-exports', () => {
148
- assert.deepEqual(issues('export default function load() { return () => <p />; }'), []);
149
- assert.deepEqual(issues('export { default } from "./Panel";'), []);
150
- });
@@ -1,255 +0,0 @@
1
- import ts from 'typescript';
2
-
3
- import type { SourceIssue } from './source-policy.ts';
4
-
5
- type ReactBindings = { types: Set<string>; wrappers: Set<string>; namespaces: Map<string, boolean> };
6
-
7
- const componentTypes = new Set(['FC', 'FunctionComponent']);
8
- const componentWrappers = new Set(['memo', 'forwardRef']);
9
- const componentName = /^[A-Z][A-Za-z0-9]*$/;
10
- const { AmpersandAmpersandToken, BarBarToken, QuestionQuestionToken } = ts.SyntaxKind;
11
- const renderOperators = new Set([BarBarToken, QuestionQuestionToken]);
12
-
13
- function reactBindings(file: ts.SourceFile): ReactBindings {
14
- const bindings: ReactBindings = { types: new Set(), wrappers: new Set(), namespaces: new Map() };
15
-
16
- for (const statement of file.statements.filter(ts.isImportDeclaration)) {
17
- if (!ts.isStringLiteral(statement.moduleSpecifier) || statement.moduleSpecifier.text !== 'react') {
18
- continue;
19
- }
20
-
21
- const clause = statement.importClause;
22
-
23
- if (clause?.name) {
24
- bindings.namespaces.set(clause.name.text, !clause.isTypeOnly);
25
- }
26
-
27
- const named = clause?.namedBindings;
28
-
29
- if (!named) {
30
- continue;
31
- }
32
-
33
- if (ts.isNamespaceImport(named)) {
34
- bindings.namespaces.set(named.name.text, !clause.isTypeOnly);
35
- continue;
36
- }
37
-
38
- for (const specifier of named.elements) {
39
- const imported = (specifier.propertyName ?? specifier.name).text;
40
- const valueImport = !clause.isTypeOnly && !specifier.isTypeOnly;
41
-
42
- if (componentTypes.has(imported)) {
43
- bindings.types.add(specifier.name.text);
44
- }
45
-
46
- if (componentWrappers.has(imported) && valueImport) {
47
- bindings.wrappers.add(specifier.name.text);
48
- }
49
-
50
- if (imported === 'default') {
51
- bindings.namespaces.set(specifier.name.text, valueImport);
52
- }
53
- }
54
- }
55
-
56
- return bindings;
57
- }
58
-
59
- function unwrap(expression: ts.Expression): ts.Expression {
60
- while (
61
- ts.isParenthesizedExpression(expression) ||
62
- ts.isAsExpression(expression) ||
63
- ts.isSatisfiesExpression(expression) ||
64
- ts.isNonNullExpression(expression)
65
- ) {
66
- expression = expression.expression;
67
- }
68
-
69
- return expression;
70
- }
71
-
72
- function isJsxResult(expression: ts.Expression): boolean {
73
- const node = unwrap(expression);
74
-
75
- if (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node)) {
76
- return true;
77
- }
78
-
79
- if (ts.isConditionalExpression(node)) {
80
- return isJsxResult(node.whenTrue) || isJsxResult(node.whenFalse);
81
- }
82
-
83
- if (ts.isBinaryExpression(node)) {
84
- if (node.operatorToken.kind === AmpersandAmpersandToken) {
85
- return isJsxResult(node.right);
86
- }
87
-
88
- return renderOperators.has(node.operatorToken.kind) && (isJsxResult(node.left) || isJsxResult(node.right));
89
- }
90
-
91
- return ts.isArrayLiteralExpression(node) && node.elements.some(isJsxResult);
92
- }
93
-
94
- function returnsJsx(body: ts.ConciseBody): boolean {
95
- if (!ts.isBlock(body)) {
96
- return isJsxResult(body);
97
- }
98
-
99
- function visit(node: ts.Node): boolean {
100
- if (ts.isReturnStatement(node)) {
101
- return node.expression !== undefined && isJsxResult(node.expression);
102
- }
103
-
104
- if (ts.isFunctionLike(node) || ts.isClassLike(node)) {
105
- return false;
106
- }
107
-
108
- return ts.forEachChild(node, visit) === true;
109
- }
110
-
111
- return visit(body);
112
- }
113
-
114
- function hasReactType(type: ts.TypeNode | undefined, bindings: ReactBindings): boolean {
115
- if (!type || !ts.isTypeReferenceNode(type)) {
116
- return false;
117
- }
118
-
119
- const name = type.typeName;
120
-
121
- if (ts.isIdentifier(name)) {
122
- return bindings.types.has(name.text);
123
- }
124
-
125
- return ts.isIdentifier(name.left) && bindings.namespaces.has(name.left.text) && componentTypes.has(name.right.text);
126
- }
127
-
128
- function isReactWrapper(node: ts.Expression, bindings: ReactBindings): boolean {
129
- if (!ts.isCallExpression(node)) {
130
- return false;
131
- }
132
-
133
- const callee = unwrap(node.expression);
134
-
135
- if (ts.isIdentifier(callee)) {
136
- return bindings.wrappers.has(callee.text);
137
- }
138
-
139
- if (!ts.isPropertyAccessExpression(callee) || !ts.isIdentifier(callee.expression)) {
140
- return false;
141
- }
142
-
143
- return bindings.namespaces.get(callee.expression.text) === true && componentWrappers.has(callee.name.text);
144
- }
145
-
146
- function defaultTargets(file: ts.SourceFile): Set<string> {
147
- const names = new Set<string>();
148
-
149
- for (const statement of file.statements) {
150
- if (ts.isExportAssignment(statement) && !statement.isExportEquals) {
151
- const value = unwrap(statement.expression);
152
-
153
- if (ts.isIdentifier(value)) {
154
- names.add(value.text);
155
- }
156
- }
157
-
158
- if (ts.isExportDeclaration(statement) && !statement.isTypeOnly && !statement.moduleSpecifier) {
159
- const clause = statement.exportClause;
160
-
161
- for (const specifier of clause && ts.isNamedExports(clause) ? clause.elements : []) {
162
- if (!specifier.isTypeOnly && specifier.name.text === 'default') {
163
- names.add((specifier.propertyName ?? specifier.name).text);
164
- }
165
- }
166
- }
167
- }
168
-
169
- return names;
170
- }
171
-
172
- function isJsxFunction(node: ts.Expression): boolean {
173
- return (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) && returnsJsx(node.body);
174
- }
175
-
176
- export function findReactModuleIssues(source: string, fileName: string): SourceIssue[] {
177
- if (!fileName.endsWith('.tsx')) {
178
- return [];
179
- }
180
-
181
- const file = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
182
- const bindings = reactBindings(file);
183
- const defaults = defaultTargets(file);
184
- const issues: SourceIssue[] = [];
185
- let seenComponent = false;
186
-
187
- function checkComponent(node: ts.Node, name?: string, needsReactType = false): void {
188
- const position = file.getLineAndCharacterOfPosition(node.getStart(file));
189
- const location = { line: position.line + 1, column: position.character + 1 };
190
-
191
- if (seenComponent) {
192
- issues.push({ ...location, message: 'Keep one React component per file.' });
193
- }
194
-
195
- seenComponent = true;
196
-
197
- if (!name || !componentName.test(name)) {
198
- issues.push({ ...location, message: 'Declare a named const component in PascalCase and export it as default.' });
199
-
200
- return;
201
- }
202
-
203
- if (!defaults.has(name)) {
204
- issues.push({ ...location, message: "Export the file's named React component as default." });
205
- }
206
-
207
- if (needsReactType) {
208
- issues.push({
209
- ...location,
210
- message: 'Annotate React arrow components and function expressions with an imported React FC type.',
211
- });
212
- }
213
- }
214
-
215
- for (const statement of file.statements) {
216
- if (ts.isVariableStatement(statement)) {
217
- const constant = (statement.declarationList.flags & ts.NodeFlags.BlockScoped) === ts.NodeFlags.Const;
218
-
219
- for (const declaration of statement.declarationList.declarations) {
220
- if (!ts.isIdentifier(declaration.name) || !declaration.initializer) {
221
- continue;
222
- }
223
-
224
- const name = declaration.name.text;
225
- const value = unwrap(declaration.initializer);
226
- const namedRender = (componentName.test(name) || defaults.has(name)) && isJsxFunction(value);
227
- const hasType = hasReactType(declaration.type, bindings);
228
- const wrapped = isReactWrapper(value, bindings);
229
-
230
- if (hasType || wrapped || namedRender) {
231
- checkComponent(declaration, constant ? name : undefined, !hasType && !wrapped);
232
- }
233
- }
234
- }
235
-
236
- if (ts.isFunctionDeclaration(statement) && statement.body && returnsJsx(statement.body)) {
237
- const name = statement.name?.text ?? '';
238
- const isDefault = statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword);
239
-
240
- if (isDefault || defaults.has(name) || componentName.test(name)) {
241
- checkComponent(statement);
242
- }
243
- }
244
-
245
- if (ts.isExportAssignment(statement) && !statement.isExportEquals) {
246
- const value = unwrap(statement.expression);
247
-
248
- if (isJsxFunction(value) || isReactWrapper(value, bindings)) {
249
- checkComponent(statement);
250
- }
251
- }
252
- }
253
-
254
- return issues;
255
- }
@@ -1,17 +0,0 @@
1
- # Source policy map
2
-
3
- - [Comments and protected headers](#comments-and-protected-headers)
4
- - [Type patterns](#type-patterns)
5
- - [Tests](#tests)
6
-
7
- ## Comments and protected headers
8
-
9
- `hasGeneratedHeader` examines leading comment trivia. `collectComments` visits syntax tokens without mistaking JSX text and literals for comments. `sqlMarkers` identifies supported marker positions. Parsed TypeScript reference directives are handled by `findSourcePolicyIssues`.
10
-
11
- ## Type patterns
12
-
13
- `zodBindings` and `inferredLocalSchema` identify aliases bound to supported Zod imports. `findSourcePolicyIssues` verifies adjacency for local top-level declarations. `isDoubleAssertion` detects chained assertions, including parenthesized forms.
14
-
15
- ## Tests
16
-
17
- `source-policy.test.ts` covers comment boundaries, valid directives, inferred types, recognized Zod imports and double assertions. Native type checks remain separate.