@rcrsr/rill 0.1.0 → 0.2.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 (260) hide show
  1. package/README.md +16 -8
  2. package/dist/check/config.d.ts +20 -0
  3. package/dist/check/config.d.ts.map +1 -0
  4. package/dist/check/config.js +151 -0
  5. package/dist/check/config.js.map +1 -0
  6. package/dist/check/fixer.d.ts +39 -0
  7. package/dist/check/fixer.d.ts.map +1 -0
  8. package/dist/check/fixer.js +119 -0
  9. package/dist/check/fixer.js.map +1 -0
  10. package/dist/check/index.d.ts +10 -0
  11. package/dist/check/index.d.ts.map +1 -0
  12. package/dist/check/index.js +21 -0
  13. package/dist/check/index.js.map +1 -0
  14. package/dist/check/rules/anti-patterns.d.ts +65 -0
  15. package/dist/check/rules/anti-patterns.d.ts.map +1 -0
  16. package/dist/check/rules/anti-patterns.js +427 -0
  17. package/dist/check/rules/anti-patterns.js.map +1 -0
  18. package/dist/check/rules/closures.d.ts +66 -0
  19. package/dist/check/rules/closures.d.ts.map +1 -0
  20. package/dist/check/rules/closures.js +373 -0
  21. package/dist/check/rules/closures.js.map +1 -0
  22. package/dist/check/rules/collections.d.ts +90 -0
  23. package/dist/check/rules/collections.d.ts.map +1 -0
  24. package/dist/check/rules/collections.js +373 -0
  25. package/dist/check/rules/collections.js.map +1 -0
  26. package/dist/check/rules/conditionals.d.ts +41 -0
  27. package/dist/check/rules/conditionals.d.ts.map +1 -0
  28. package/dist/check/rules/conditionals.js +106 -0
  29. package/dist/check/rules/conditionals.js.map +1 -0
  30. package/dist/check/rules/flow.d.ts +46 -0
  31. package/dist/check/rules/flow.d.ts.map +1 -0
  32. package/dist/check/rules/flow.js +206 -0
  33. package/dist/check/rules/flow.js.map +1 -0
  34. package/dist/check/rules/formatting.d.ts +133 -0
  35. package/dist/check/rules/formatting.d.ts.map +1 -0
  36. package/dist/check/rules/formatting.js +639 -0
  37. package/dist/check/rules/formatting.js.map +1 -0
  38. package/dist/check/rules/helpers.d.ts +26 -0
  39. package/dist/check/rules/helpers.d.ts.map +1 -0
  40. package/dist/check/rules/helpers.js +66 -0
  41. package/dist/check/rules/helpers.js.map +1 -0
  42. package/dist/check/rules/index.d.ts +21 -0
  43. package/dist/check/rules/index.d.ts.map +1 -0
  44. package/dist/check/rules/index.js +78 -0
  45. package/dist/check/rules/index.js.map +1 -0
  46. package/dist/check/rules/loops.d.ts +70 -0
  47. package/dist/check/rules/loops.d.ts.map +1 -0
  48. package/dist/check/rules/loops.js +227 -0
  49. package/dist/check/rules/loops.js.map +1 -0
  50. package/dist/check/rules/naming.d.ts +21 -0
  51. package/dist/check/rules/naming.d.ts.map +1 -0
  52. package/dist/check/rules/naming.js +167 -0
  53. package/dist/check/rules/naming.js.map +1 -0
  54. package/dist/check/rules/strings.d.ts +28 -0
  55. package/dist/check/rules/strings.d.ts.map +1 -0
  56. package/dist/check/rules/strings.js +80 -0
  57. package/dist/check/rules/strings.js.map +1 -0
  58. package/dist/check/rules/types.d.ts +41 -0
  59. package/dist/check/rules/types.d.ts.map +1 -0
  60. package/dist/check/rules/types.js +162 -0
  61. package/dist/check/rules/types.js.map +1 -0
  62. package/dist/check/types.d.ts +106 -0
  63. package/dist/check/types.d.ts.map +1 -0
  64. package/dist/check/types.js +6 -0
  65. package/dist/check/types.js.map +1 -0
  66. package/dist/check/validator.d.ts +18 -0
  67. package/dist/check/validator.d.ts.map +1 -0
  68. package/dist/check/validator.js +88 -0
  69. package/dist/check/validator.js.map +1 -0
  70. package/dist/check/visitor.d.ts +33 -0
  71. package/dist/check/visitor.d.ts.map +1 -0
  72. package/dist/check/visitor.js +243 -0
  73. package/dist/check/visitor.js.map +1 -0
  74. package/dist/cli-check.d.ts +43 -0
  75. package/dist/cli-check.d.ts.map +1 -0
  76. package/dist/cli-check.js +356 -0
  77. package/dist/cli-check.js.map +1 -0
  78. package/dist/cli-eval.d.ts +15 -0
  79. package/dist/cli-eval.d.ts.map +1 -0
  80. package/dist/cli-eval.js +120 -0
  81. package/dist/cli-eval.js.map +1 -0
  82. package/dist/cli-exec.d.ts +49 -0
  83. package/dist/cli-exec.d.ts.map +1 -0
  84. package/dist/cli-exec.js +191 -0
  85. package/dist/cli-exec.js.map +1 -0
  86. package/dist/cli-module-loader.d.ts +19 -0
  87. package/dist/cli-module-loader.d.ts.map +1 -0
  88. package/dist/cli-module-loader.js +83 -0
  89. package/dist/cli-module-loader.js.map +1 -0
  90. package/dist/cli-shared.d.ts +36 -0
  91. package/dist/cli-shared.d.ts.map +1 -0
  92. package/dist/cli-shared.js +101 -0
  93. package/dist/cli-shared.js.map +1 -0
  94. package/dist/cli.d.ts +2 -0
  95. package/dist/cli.d.ts.map +1 -1
  96. package/dist/cli.js +4 -11
  97. package/dist/cli.js.map +1 -1
  98. package/dist/index.d.ts +1 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +1 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/lexer/readers.d.ts +1 -1
  103. package/dist/lexer/readers.d.ts.map +1 -1
  104. package/dist/lexer/readers.js +62 -32
  105. package/dist/lexer/readers.js.map +1 -1
  106. package/dist/lexer/tokenizer.d.ts.map +1 -1
  107. package/dist/lexer/tokenizer.js +5 -6
  108. package/dist/lexer/tokenizer.js.map +1 -1
  109. package/dist/parser/index.js +1 -1
  110. package/dist/parser/index.js.map +1 -1
  111. package/dist/parser/parser-expr.js +23 -5
  112. package/dist/parser/parser-expr.js.map +1 -1
  113. package/dist/parser/parser-functions.d.ts +2 -2
  114. package/dist/parser/parser-functions.d.ts.map +1 -1
  115. package/dist/parser/parser-functions.js +2 -1
  116. package/dist/parser/parser-functions.js.map +1 -1
  117. package/dist/parser/parser-literals.js +2 -2
  118. package/dist/parser/parser-literals.js.map +1 -1
  119. package/dist/parser/parser-script.js +9 -7
  120. package/dist/parser/parser-script.js.map +1 -1
  121. package/dist/parser/parser-variables.js +4 -3
  122. package/dist/parser/parser-variables.js.map +1 -1
  123. package/dist/runtime/core/callable.d.ts +5 -6
  124. package/dist/runtime/core/callable.d.ts.map +1 -1
  125. package/dist/runtime/core/callable.js.map +1 -1
  126. package/dist/runtime/core/context.d.ts.map +1 -1
  127. package/dist/runtime/core/context.js +19 -32
  128. package/dist/runtime/core/context.js.map +1 -1
  129. package/dist/runtime/core/equals.js +1 -1
  130. package/dist/runtime/core/equals.js.map +1 -1
  131. package/dist/runtime/core/eval/evaluator.d.ts +78 -0
  132. package/dist/runtime/core/eval/evaluator.d.ts.map +1 -1
  133. package/dist/runtime/core/eval/evaluator.js +78 -0
  134. package/dist/runtime/core/eval/evaluator.js.map +1 -1
  135. package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -1
  136. package/dist/runtime/core/eval/mixins/closures.js +9 -1
  137. package/dist/runtime/core/eval/mixins/closures.js.map +1 -1
  138. package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -1
  139. package/dist/runtime/core/eval/mixins/variables.js +143 -2
  140. package/dist/runtime/core/eval/mixins/variables.js.map +1 -1
  141. package/dist/runtime/core/types.d.ts +15 -2
  142. package/dist/runtime/core/types.d.ts.map +1 -1
  143. package/dist/runtime/core/types.js.map +1 -1
  144. package/dist/runtime/ext/extensions.d.ts +51 -0
  145. package/dist/runtime/ext/extensions.d.ts.map +1 -0
  146. package/dist/runtime/ext/extensions.js +67 -0
  147. package/dist/runtime/ext/extensions.js.map +1 -0
  148. package/dist/runtime/index.d.ts +3 -0
  149. package/dist/runtime/index.d.ts.map +1 -1
  150. package/dist/runtime/index.js +1 -0
  151. package/dist/runtime/index.js.map +1 -1
  152. package/dist/types.d.ts +8 -4
  153. package/dist/types.d.ts.map +1 -1
  154. package/dist/types.js +5 -4
  155. package/dist/types.js.map +1 -1
  156. package/docs/00_INDEX.md +1 -0
  157. package/docs/01_guide.md +3 -3
  158. package/docs/02_types.md +8 -10
  159. package/docs/03_variables.md +10 -0
  160. package/docs/04_operators.md +3 -3
  161. package/docs/05_control-flow.md +21 -0
  162. package/docs/07_collections.md +2 -0
  163. package/docs/10_parsing.md +9 -9
  164. package/docs/11_reference.md +1 -1
  165. package/docs/12_examples.md +36 -62
  166. package/docs/14_host-integration.md +116 -111
  167. package/docs/15_grammar.ebnf +1 -5
  168. package/docs/16_conventions.md +3 -4
  169. package/docs/17_cli-tools.md +184 -0
  170. package/docs/99_llm-reference.txt +46 -5
  171. package/package.json +13 -4
  172. package/dist/demo.d.ts +0 -6
  173. package/dist/demo.d.ts.map +0 -1
  174. package/dist/demo.js +0 -121
  175. package/dist/demo.js.map +0 -1
  176. package/dist/lexer.d.ts +0 -19
  177. package/dist/lexer.d.ts.map +0 -1
  178. package/dist/lexer.js +0 -344
  179. package/dist/lexer.js.map +0 -1
  180. package/dist/parser/arithmetic.d.ts +0 -16
  181. package/dist/parser/arithmetic.d.ts.map +0 -1
  182. package/dist/parser/arithmetic.js +0 -128
  183. package/dist/parser/arithmetic.js.map +0 -1
  184. package/dist/parser/boolean.d.ts +0 -15
  185. package/dist/parser/boolean.d.ts.map +0 -1
  186. package/dist/parser/boolean.js +0 -20
  187. package/dist/parser/boolean.js.map +0 -1
  188. package/dist/parser/control-flow.d.ts +0 -56
  189. package/dist/parser/control-flow.d.ts.map +0 -1
  190. package/dist/parser/control-flow.js +0 -167
  191. package/dist/parser/control-flow.js.map +0 -1
  192. package/dist/parser/expressions.d.ts +0 -23
  193. package/dist/parser/expressions.d.ts.map +0 -1
  194. package/dist/parser/expressions.js +0 -950
  195. package/dist/parser/expressions.js.map +0 -1
  196. package/dist/parser/extraction.d.ts +0 -48
  197. package/dist/parser/extraction.d.ts.map +0 -1
  198. package/dist/parser/extraction.js +0 -279
  199. package/dist/parser/extraction.js.map +0 -1
  200. package/dist/parser/functions.d.ts +0 -20
  201. package/dist/parser/functions.d.ts.map +0 -1
  202. package/dist/parser/functions.js +0 -96
  203. package/dist/parser/functions.js.map +0 -1
  204. package/dist/parser/literals.d.ts +0 -37
  205. package/dist/parser/literals.d.ts.map +0 -1
  206. package/dist/parser/literals.js +0 -373
  207. package/dist/parser/literals.js.map +0 -1
  208. package/dist/parser/script.d.ts +0 -14
  209. package/dist/parser/script.d.ts.map +0 -1
  210. package/dist/parser/script.js +0 -196
  211. package/dist/parser/script.js.map +0 -1
  212. package/dist/parser/variables.d.ts +0 -10
  213. package/dist/parser/variables.d.ts.map +0 -1
  214. package/dist/parser/variables.js +0 -215
  215. package/dist/parser/variables.js.map +0 -1
  216. package/dist/runtime/ast-equals.d.ts +0 -13
  217. package/dist/runtime/ast-equals.d.ts.map +0 -1
  218. package/dist/runtime/ast-equals.js +0 -447
  219. package/dist/runtime/ast-equals.js.map +0 -1
  220. package/dist/runtime/builtins.d.ts +0 -13
  221. package/dist/runtime/builtins.d.ts.map +0 -1
  222. package/dist/runtime/builtins.js +0 -180
  223. package/dist/runtime/builtins.js.map +0 -1
  224. package/dist/runtime/callable.d.ts +0 -88
  225. package/dist/runtime/callable.d.ts.map +0 -1
  226. package/dist/runtime/callable.js +0 -98
  227. package/dist/runtime/callable.js.map +0 -1
  228. package/dist/runtime/context.d.ts +0 -13
  229. package/dist/runtime/context.d.ts.map +0 -1
  230. package/dist/runtime/context.js +0 -73
  231. package/dist/runtime/context.js.map +0 -1
  232. package/dist/runtime/core/evaluate.d.ts +0 -42
  233. package/dist/runtime/core/evaluate.d.ts.map +0 -1
  234. package/dist/runtime/core/evaluate.debug.js +0 -1251
  235. package/dist/runtime/core/evaluate.js +0 -1913
  236. package/dist/runtime/core/evaluate.js.map +0 -1
  237. package/dist/runtime/evaluate.d.ts +0 -32
  238. package/dist/runtime/evaluate.d.ts.map +0 -1
  239. package/dist/runtime/evaluate.js +0 -1111
  240. package/dist/runtime/evaluate.js.map +0 -1
  241. package/dist/runtime/execute.d.ts +0 -26
  242. package/dist/runtime/execute.d.ts.map +0 -1
  243. package/dist/runtime/execute.js +0 -121
  244. package/dist/runtime/execute.js.map +0 -1
  245. package/dist/runtime/signals.d.ts +0 -19
  246. package/dist/runtime/signals.d.ts.map +0 -1
  247. package/dist/runtime/signals.js +0 -26
  248. package/dist/runtime/signals.js.map +0 -1
  249. package/dist/runtime/types.d.ts +0 -169
  250. package/dist/runtime/types.d.ts.map +0 -1
  251. package/dist/runtime/types.js +0 -50
  252. package/dist/runtime/types.js.map +0 -1
  253. package/dist/runtime/values.d.ts +0 -50
  254. package/dist/runtime/values.d.ts.map +0 -1
  255. package/dist/runtime/values.js +0 -209
  256. package/dist/runtime/values.js.map +0 -1
  257. package/dist/runtime.d.ts +0 -254
  258. package/dist/runtime.d.ts.map +0 -1
  259. package/dist/runtime.js +0 -2014
  260. package/dist/runtime.js.map +0 -1
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Flow and Capture Rules
3
+ * Enforces conventions for capture placement and flow patterns.
4
+ */
5
+ import { extractContextLine } from './helpers.js';
6
+ // ============================================================
7
+ // HELPER FUNCTIONS
8
+ // ============================================================
9
+ /**
10
+ * Check if a node is a capture node.
11
+ */
12
+ function isCaptureNode(node) {
13
+ return (typeof node === 'object' &&
14
+ node !== null &&
15
+ 'type' in node &&
16
+ node.type === 'Capture');
17
+ }
18
+ /**
19
+ * Check if a node contains a variable reference.
20
+ * For $ (pipe variable), checks for isPipeVar: true.
21
+ * For named variables, checks for the variable name.
22
+ * This is a simplified check - a full implementation would traverse the AST.
23
+ */
24
+ function referencesVariable(node, varName) {
25
+ if (!node)
26
+ return false;
27
+ // Convert node to string representation and check for variable usage
28
+ // This is a heuristic - proper implementation would need AST traversal
29
+ const nodeStr = JSON.stringify(node);
30
+ if (varName === '$') {
31
+ // Pipe variable has isPipeVar: true
32
+ return nodeStr.includes('"isPipeVar":true');
33
+ }
34
+ else {
35
+ // Named variable
36
+ return nodeStr.includes(`"name":"${varName}"`);
37
+ }
38
+ }
39
+ /**
40
+ * Get the primary expression from a PipeChain's head.
41
+ * ArithHead can be BinaryExprNode, UnaryExprNode, or PostfixExprNode.
42
+ */
43
+ function getPrimaryFromHead(chain) {
44
+ const head = chain.head;
45
+ // If head is PostfixExprNode, get its primary
46
+ if (head.type === 'PostfixExpr') {
47
+ return head.primary;
48
+ }
49
+ // For BinaryExprNode or UnaryExprNode, we can't easily get a single primary
50
+ return null;
51
+ }
52
+ // ============================================================
53
+ // CAPTURE_INLINE_CHAIN RULE
54
+ // ============================================================
55
+ /**
56
+ * Validates that captures use inline syntax when continuing the chain.
57
+ *
58
+ * Detects separate capture followed by variable usage:
59
+ * prompt("Read file") :> $raw
60
+ * $raw -> log
61
+ *
62
+ * Suggests inline capture:
63
+ * prompt("Read file") :> $raw -> log
64
+ *
65
+ * This is an informational rule - both patterns work, but inline is clearer.
66
+ *
67
+ * References:
68
+ * - docs/16_conventions.md:56-74
69
+ */
70
+ export const CAPTURE_INLINE_CHAIN = {
71
+ code: 'CAPTURE_INLINE_CHAIN',
72
+ category: 'flow',
73
+ severity: 'info',
74
+ nodeTypes: ['Statement'],
75
+ validate(node, context) {
76
+ const statement = node;
77
+ const chain = statement.expression;
78
+ // Check if this chain ends with a capture
79
+ // Captures can be in terminator OR as the last pipe element
80
+ let captureNode = null;
81
+ if (chain.terminator && isCaptureNode(chain.terminator)) {
82
+ captureNode = chain.terminator;
83
+ }
84
+ else if (chain.pipes.length > 0) {
85
+ const lastPipe = chain.pipes[chain.pipes.length - 1];
86
+ if (lastPipe && isCaptureNode(lastPipe)) {
87
+ captureNode = lastPipe;
88
+ }
89
+ }
90
+ if (!captureNode) {
91
+ return [];
92
+ }
93
+ const capturedVarName = captureNode.name;
94
+ // Get all statements from the script
95
+ const statements = context.ast.statements;
96
+ const currentIndex = statements.indexOf(statement);
97
+ if (currentIndex === -1 || currentIndex === statements.length - 1) {
98
+ return [];
99
+ }
100
+ const nextStatement = statements[currentIndex + 1];
101
+ if (!nextStatement)
102
+ return [];
103
+ // Check if next statement is a Statement wrapping a PipeChain
104
+ if (nextStatement.type !== 'Statement') {
105
+ return [];
106
+ }
107
+ const nextStmt = nextStatement;
108
+ const nextChain = nextStmt.expression;
109
+ // Check if the head of the next chain is the captured variable
110
+ const headPrimary = getPrimaryFromHead(nextChain);
111
+ if (headPrimary &&
112
+ headPrimary.type === 'Variable' &&
113
+ 'name' in headPrimary &&
114
+ headPrimary.name === capturedVarName) {
115
+ // Found pattern: capture on one line, immediate usage on next line
116
+ return [
117
+ {
118
+ location: captureNode.span.start,
119
+ severity: 'info',
120
+ code: 'CAPTURE_INLINE_CHAIN',
121
+ message: `Consider inline capture: ':> $${capturedVarName} -> ...' instead of separate statements`,
122
+ context: extractContextLine(captureNode.span.start.line, context.source),
123
+ fix: null, // Complex fix - requires merging statements
124
+ },
125
+ ];
126
+ }
127
+ return [];
128
+ },
129
+ };
130
+ // ============================================================
131
+ // CAPTURE_BEFORE_BRANCH RULE
132
+ // ============================================================
133
+ /**
134
+ * Validates that values used in multiple branches are captured before the conditional.
135
+ *
136
+ * Detects conditionals where a function call or expression appears in multiple branches:
137
+ * checkStatus() -> .contains("OK") ? {
138
+ * "Success: {checkStatus()}"
139
+ * } ! {
140
+ * "Failed: {checkStatus()}"
141
+ * }
142
+ *
143
+ * Suggests capturing before branching:
144
+ * checkStatus() :> $result
145
+ * $result -> .contains("OK") ? {
146
+ * "Success: {$result}"
147
+ * } ! {
148
+ * "Failed: {$result}"
149
+ * }
150
+ *
151
+ * This is an informational rule - detects potential inefficiency and clarity issues.
152
+ *
153
+ * References:
154
+ * - docs/16_conventions.md:76-88
155
+ */
156
+ export const CAPTURE_BEFORE_BRANCH = {
157
+ code: 'CAPTURE_BEFORE_BRANCH',
158
+ category: 'flow',
159
+ severity: 'info',
160
+ nodeTypes: ['Conditional'],
161
+ validate(node, context) {
162
+ const conditional = node;
163
+ // Check if both branches exist
164
+ if (!conditional.elseBranch) {
165
+ return [];
166
+ }
167
+ // For piped conditionals (input is null), we can still suggest capturing
168
+ // For explicit conditionals, check if input is complex
169
+ const inputExpr = conditional.input;
170
+ // If input exists and is already a simple variable, no need to capture
171
+ if (inputExpr && inputExpr.type === 'PipeChain') {
172
+ const headPrimary = getPrimaryFromHead(inputExpr);
173
+ if (headPrimary &&
174
+ headPrimary.type === 'Variable' &&
175
+ inputExpr.pipes.length === 0 &&
176
+ !inputExpr.terminator) {
177
+ return [];
178
+ }
179
+ }
180
+ // Look for patterns where the input value might be used in both branches
181
+ // This is heuristic-based: we check if there's a $ reference in both branches
182
+ // which would be the piped value from the conditional input
183
+ const thenReferences = referencesVariable(conditional.thenBranch, '$');
184
+ // elseBranch can be BodyNode or ConditionalNode (for else-if chains)
185
+ const elseBranch = conditional.elseBranch;
186
+ const elseReferences = elseBranch && elseBranch.type !== 'Conditional'
187
+ ? referencesVariable(elseBranch, '$')
188
+ : false;
189
+ // If $ is used in both branches, suggest capturing the input value
190
+ // This makes it available in both branches with a clear name
191
+ if (thenReferences && elseReferences) {
192
+ return [
193
+ {
194
+ location: conditional.span.start,
195
+ severity: 'info',
196
+ code: 'CAPTURE_BEFORE_BRANCH',
197
+ message: 'Consider capturing value before conditional when used in multiple branches',
198
+ context: extractContextLine(conditional.span.start.line, context.source),
199
+ fix: null, // Complex fix - requires AST restructuring
200
+ },
201
+ ];
202
+ }
203
+ return [];
204
+ },
205
+ };
206
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/check/rules/flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Formatting Rules
3
+ * Enforces style conventions from docs/16_conventions.md:465-662.
4
+ */
5
+ import type { ValidationRule } from '../types.js';
6
+ /**
7
+ * Enforces space on both sides of operators.
8
+ * Operators like +, -, ->, :>, ==, etc. should have spaces on both sides.
9
+ *
10
+ * Detection:
11
+ * - Extract operator text from source using source spans
12
+ * - Check if space exists before/after operator
13
+ *
14
+ * References:
15
+ * - docs/16_conventions.md:467-482
16
+ */
17
+ export declare const SPACING_OPERATOR: ValidationRule;
18
+ /**
19
+ * Enforces space after { and before } in blocks.
20
+ * Braces for blocks, closures, etc. should have internal spacing.
21
+ *
22
+ * Detection:
23
+ * - Extract brace content from source
24
+ * - Check if opening { has space after, closing } has space before
25
+ *
26
+ * References:
27
+ * - docs/16_conventions.md:497-508
28
+ */
29
+ export declare const SPACING_BRACES: ValidationRule;
30
+ /**
31
+ * Enforces no inner spaces for indexing brackets.
32
+ * Array/dict indexing should use $list[0] not $list[ 0 ].
33
+ *
34
+ * Detection:
35
+ * - PostfixExpr nodes with index access
36
+ * - Check for spaces inside brackets
37
+ *
38
+ * References:
39
+ * - docs/16_conventions.md:526-535
40
+ */
41
+ export declare const SPACING_BRACKETS: ValidationRule;
42
+ /**
43
+ * Enforces no space before pipe, space after in closures.
44
+ * Closure parameters: |x| not | x |.
45
+ *
46
+ * Detection:
47
+ * - Extract closure parameter section from source
48
+ * - Check spacing around pipes
49
+ *
50
+ * References:
51
+ * - docs/16_conventions.md:549-560
52
+ */
53
+ export declare const SPACING_CLOSURE: ValidationRule;
54
+ /**
55
+ * Enforces 2-space indent for continued lines.
56
+ * Pipe chains should indent continuation lines by 2 spaces.
57
+ *
58
+ * Detection:
59
+ * - Multi-line pipe chains
60
+ * - Check indentation of continuation lines
61
+ *
62
+ * References:
63
+ * - docs/16_conventions.md:636-662
64
+ */
65
+ export declare const INDENT_CONTINUATION: ValidationRule;
66
+ /**
67
+ * Detect explicit $.method() patterns replaceable with .method.
68
+ *
69
+ * Flags method calls where the receiver is a bare $ (pipe variable).
70
+ * The implicit form .method is preferred when $ represents the current
71
+ * piped value (e.g., in blocks, closures, conditionals).
72
+ *
73
+ * Detection:
74
+ * - MethodCallNode with non-null receiverSpan
75
+ * - Receiver is bare $ (zero-width or single-char span)
76
+ * - Method call is first in chain (receiverSpan.end.offset <= 1)
77
+ *
78
+ * Note: Cannot use isBareReference() helper here because MethodCallNode.receiverSpan
79
+ * is a SourceSpan (position range), not an ExpressionNode. The helper requires
80
+ * an AST node to traverse. Instead, we detect bare $ by checking:
81
+ * 1. receiverSpan is zero-width (start == end) or single-char
82
+ * 2. Character at offset is '$'
83
+ * 3. Next character is '.' (not a variable name continuation)
84
+ *
85
+ * Examples:
86
+ * - $.upper() -> .upper
87
+ * - $.len -> .len
88
+ * - $.trim().upper() -> First method flagged, second is chained (not bare $)
89
+ *
90
+ * Not flagged:
91
+ * - .upper (receiverSpan is null)
92
+ * - $var.method() (receiverSpan is not bare $)
93
+ * - $.trim().upper() second method (receiverSpan covers $.trim())
94
+ *
95
+ * References:
96
+ * - docs/16_conventions.md:587-598
97
+ */
98
+ export declare const IMPLICIT_DOLLAR_METHOD: ValidationRule;
99
+ /**
100
+ * Prefer foo over foo($) for global function calls.
101
+ * When single argument is bare $, prefer implicit form.
102
+ *
103
+ * Detection:
104
+ * - HostCall with single argument that is bare $
105
+ *
106
+ * References:
107
+ * - docs/16_conventions.md:599-607
108
+ */
109
+ export declare const IMPLICIT_DOLLAR_FUNCTION: ValidationRule;
110
+ /**
111
+ * Prefer $fn over $fn($) for closure invocation.
112
+ * When single argument is bare $, prefer implicit form.
113
+ *
114
+ * Detection:
115
+ * - ClosureCall with single argument that is bare $
116
+ *
117
+ * References:
118
+ * - docs/16_conventions.md:608-615
119
+ */
120
+ export declare const IMPLICIT_DOLLAR_CLOSURE: ValidationRule;
121
+ /**
122
+ * Warns on capture-only-to-continue patterns.
123
+ * Capturing a value just to use it immediately in the next line is unnecessary.
124
+ *
125
+ * Detection:
126
+ * - Capture node followed by immediate use of that variable only
127
+ * - Variable not referenced later in the script
128
+ *
129
+ * References:
130
+ * - docs/16_conventions.md:617-634
131
+ */
132
+ export declare const THROWAWAY_CAPTURE: ValidationRule;
133
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../../src/check/rules/formatting.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,aAAa,CAAC;AAqBrB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,cA0E9B,CAAC;AA6CF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,EAAE,cAuC5B,CAAC;AAMF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAiI9B,CAAC;AAMF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,cAgD7B,CAAC;AAMF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EAAE,cAuDjC,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,sBAAsB,EAAE,cA4DpC,CAAC;AAMF;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB,EAAE,cA4CtC,CAAC;AAMF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAkDrC,CAAC;AAMF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAW/B,CAAC"}