@rcrsr/rill-cli 0.6.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 (171) hide show
  1. package/LICENSE +21 -0
  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 +481 -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 +370 -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 +134 -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 +143 -0
  35. package/dist/check/rules/formatting.d.ts.map +1 -0
  36. package/dist/check/rules/formatting.js +656 -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 +77 -0
  47. package/dist/check/rules/loops.d.ts.map +1 -0
  48. package/dist/check/rules/loops.js +310 -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 +174 -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 +79 -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 +167 -0
  61. package/dist/check/rules/types.js.map +1 -0
  62. package/dist/check/types.d.ts +112 -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 +110 -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 +259 -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 +366 -0
  77. package/dist/cli-check.js.map +1 -0
  78. package/dist/cli-error-enrichment.d.ts +73 -0
  79. package/dist/cli-error-enrichment.d.ts.map +1 -0
  80. package/dist/cli-error-enrichment.js +205 -0
  81. package/dist/cli-error-enrichment.js.map +1 -0
  82. package/dist/cli-error-formatter.d.ts +45 -0
  83. package/dist/cli-error-formatter.d.ts.map +1 -0
  84. package/dist/cli-error-formatter.js +218 -0
  85. package/dist/cli-error-formatter.js.map +1 -0
  86. package/dist/cli-eval.d.ts +15 -0
  87. package/dist/cli-eval.d.ts.map +1 -0
  88. package/dist/cli-eval.js +116 -0
  89. package/dist/cli-eval.js.map +1 -0
  90. package/dist/cli-exec.d.ts +58 -0
  91. package/dist/cli-exec.d.ts.map +1 -0
  92. package/dist/cli-exec.js +326 -0
  93. package/dist/cli-exec.js.map +1 -0
  94. package/dist/cli-explain.d.ts +24 -0
  95. package/dist/cli-explain.d.ts.map +1 -0
  96. package/dist/cli-explain.js +68 -0
  97. package/dist/cli-explain.js.map +1 -0
  98. package/dist/cli-lsp-diagnostic.d.ts +35 -0
  99. package/dist/cli-lsp-diagnostic.d.ts.map +1 -0
  100. package/dist/cli-lsp-diagnostic.js +98 -0
  101. package/dist/cli-lsp-diagnostic.js.map +1 -0
  102. package/dist/cli-module-loader.d.ts +19 -0
  103. package/dist/cli-module-loader.d.ts.map +1 -0
  104. package/dist/cli-module-loader.js +83 -0
  105. package/dist/cli-module-loader.js.map +1 -0
  106. package/dist/cli-shared.d.ts +62 -0
  107. package/dist/cli-shared.d.ts.map +1 -0
  108. package/dist/cli-shared.js +158 -0
  109. package/dist/cli-shared.js.map +1 -0
  110. package/dist/cli.d.ts +13 -0
  111. package/dist/cli.d.ts.map +1 -0
  112. package/dist/cli.js +62 -0
  113. package/dist/cli.js.map +1 -0
  114. package/dist/test-internal-import.d.ts +2 -0
  115. package/dist/test-internal-import.d.ts.map +1 -0
  116. package/dist/test-internal-import.js +7 -0
  117. package/dist/test-internal-import.js.map +1 -0
  118. package/package.json +24 -0
  119. package/src/check/config.ts +202 -0
  120. package/src/check/fixer.ts +174 -0
  121. package/src/check/index.ts +39 -0
  122. package/src/check/rules/anti-patterns.ts +585 -0
  123. package/src/check/rules/closures.ts +445 -0
  124. package/src/check/rules/collections.ts +437 -0
  125. package/src/check/rules/conditionals.ts +155 -0
  126. package/src/check/rules/flow.ts +262 -0
  127. package/src/check/rules/formatting.ts +811 -0
  128. package/src/check/rules/helpers.ts +89 -0
  129. package/src/check/rules/index.ts +140 -0
  130. package/src/check/rules/loops.ts +372 -0
  131. package/src/check/rules/naming.ts +242 -0
  132. package/src/check/rules/strings.ts +104 -0
  133. package/src/check/rules/types.ts +214 -0
  134. package/src/check/types.ts +163 -0
  135. package/src/check/validator.ts +136 -0
  136. package/src/check/visitor.ts +338 -0
  137. package/src/cli-check.ts +456 -0
  138. package/src/cli-error-enrichment.ts +274 -0
  139. package/src/cli-error-formatter.ts +313 -0
  140. package/src/cli-eval.ts +145 -0
  141. package/src/cli-exec.ts +408 -0
  142. package/src/cli-explain.ts +76 -0
  143. package/src/cli-lsp-diagnostic.ts +132 -0
  144. package/src/cli-module-loader.ts +101 -0
  145. package/src/cli-shared.ts +187 -0
  146. package/tests/check/cli-check.test.ts +189 -0
  147. package/tests/check/config.test.ts +350 -0
  148. package/tests/check/fixer.test.ts +373 -0
  149. package/tests/check/format-diagnostics.test.ts +327 -0
  150. package/tests/check/rules/anti-patterns.test.ts +467 -0
  151. package/tests/check/rules/closures.test.ts +192 -0
  152. package/tests/check/rules/collections.test.ts +380 -0
  153. package/tests/check/rules/conditionals.test.ts +185 -0
  154. package/tests/check/rules/flow.test.ts +250 -0
  155. package/tests/check/rules/formatting.test.ts +755 -0
  156. package/tests/check/rules/loops.test.ts +334 -0
  157. package/tests/check/rules/naming.test.ts +336 -0
  158. package/tests/check/rules/strings.test.ts +129 -0
  159. package/tests/check/rules/types.test.ts +257 -0
  160. package/tests/check/validator.test.ts +444 -0
  161. package/tests/check/visitor.test.ts +171 -0
  162. package/tests/cli/check.test.ts +801 -0
  163. package/tests/cli/error-enrichment.test.ts +510 -0
  164. package/tests/cli/error-formatter.test.ts +631 -0
  165. package/tests/cli/eval.test.ts +85 -0
  166. package/tests/cli/exec.test.ts +537 -0
  167. package/tests/cli-explain.test.ts +249 -0
  168. package/tests/cli-lsp-diagnostic.test.ts +202 -0
  169. package/tests/cli-shared.test.ts +439 -0
  170. package/tsconfig.json +9 -0
  171. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/check/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,UAAU,EAIX,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAC;AAQ7E;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAClB,UAAU,EAAE,CA0Ed"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Script Validator
3
+ * Orchestrates validation by traversing AST and invoking enabled rules.
4
+ */
5
+ import { visitNode } from './visitor.js';
6
+ import { VALIDATION_RULES } from './rules/index.js';
7
+ // ============================================================
8
+ // VALIDATION ORCHESTRATOR
9
+ // ============================================================
10
+ /**
11
+ * Validate script AST against all enabled rules.
12
+ * Traverses AST using visitor pattern, invoking enabled rules for matching nodes.
13
+ * Returns diagnostics sorted by line number, then column.
14
+ *
15
+ * @param ast - Parsed script AST to validate
16
+ * @param source - Original source text for context extraction
17
+ * @param config - Configuration determining which rules are active
18
+ * @returns Array of diagnostics sorted by location
19
+ */
20
+ export function validateScript(ast, source, config) {
21
+ // Create validation context
22
+ const context = {
23
+ source,
24
+ ast,
25
+ config,
26
+ diagnostics: [],
27
+ variables: new Map(),
28
+ assertedHostCalls: new Set(),
29
+ variableScopes: new Map(),
30
+ scopeStack: [],
31
+ };
32
+ // Create visitor that invokes enabled rules
33
+ const visitor = {
34
+ enter(node, ctx) {
35
+ // Track closure scope entry
36
+ if (node.type === 'Closure') {
37
+ ctx.scopeStack.push(node);
38
+ }
39
+ // Track HostCall nodes wrapped in TypeAssertion BEFORE rules check
40
+ if (node.type === 'TypeAssertion') {
41
+ const operand = node.operand;
42
+ if (operand?.primary.type === 'HostCall') {
43
+ ctx.assertedHostCalls.add(operand.primary);
44
+ }
45
+ }
46
+ // For each enabled rule that applies to this node type
47
+ for (const rule of VALIDATION_RULES) {
48
+ // Skip if rule not enabled
49
+ if (!isRuleEnabled(rule.code, ctx.config)) {
50
+ continue;
51
+ }
52
+ // Skip if rule doesn't apply to this node type
53
+ if (!rule.nodeTypes.includes(node.type)) {
54
+ continue;
55
+ }
56
+ // Invoke rule validation and accumulate diagnostics
57
+ const ruleDiagnostics = rule.validate(node, ctx);
58
+ ctx.diagnostics.push(...ruleDiagnostics);
59
+ }
60
+ // Track variable captures AFTER rules check (for reassignment detection)
61
+ if (node.type === 'Capture') {
62
+ const captureNode = node;
63
+ if (!ctx.variables.has(captureNode.name)) {
64
+ ctx.variables.set(captureNode.name, node.span.start);
65
+ // Track which closure scope this variable belongs to
66
+ const currentScope = ctx.scopeStack.length > 0
67
+ ? ctx.scopeStack[ctx.scopeStack.length - 1]
68
+ : null;
69
+ ctx.variableScopes.set(captureNode.name, currentScope ?? null);
70
+ }
71
+ }
72
+ },
73
+ exit(node, ctx) {
74
+ // Track closure scope exit
75
+ if (node.type === 'Closure') {
76
+ ctx.scopeStack.pop();
77
+ }
78
+ },
79
+ };
80
+ // Traverse AST with visitor
81
+ visitNode(ast, context, visitor);
82
+ // Sort diagnostics by location (line first, then column)
83
+ return sortDiagnostics(context.diagnostics);
84
+ }
85
+ // ============================================================
86
+ // HELPERS
87
+ // ============================================================
88
+ /**
89
+ * Check if a rule is enabled based on configuration.
90
+ * Rules are enabled if state is 'on' or 'warn'.
91
+ */
92
+ function isRuleEnabled(ruleCode, config) {
93
+ const state = config.rules[ruleCode];
94
+ return state === 'on' || state === 'warn';
95
+ }
96
+ /**
97
+ * Sort diagnostics by line number first, then column number.
98
+ * Stable sort preserves original order for diagnostics at same location.
99
+ */
100
+ function sortDiagnostics(diagnostics) {
101
+ return [...diagnostics].sort((a, b) => {
102
+ // Sort by line first
103
+ if (a.location.line !== b.location.line) {
104
+ return a.location.line - b.location.line;
105
+ }
106
+ // Then by column
107
+ return a.location.column - b.location.column;
108
+ });
109
+ }
110
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/check/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * AST Visitor
3
+ * Recursive traversal with enter/exit callbacks for validation rules.
4
+ */
5
+ import type { ASTNode } from '@rcrsr/rill';
6
+ import type { ValidationContext } from './types.js';
7
+ /**
8
+ * Visitor pattern interface for AST traversal.
9
+ * Provides enter/exit callbacks invoked before and after visiting children.
10
+ */
11
+ export interface RuleVisitor {
12
+ /**
13
+ * Called before visiting node's children.
14
+ * Use for pre-order traversal validation.
15
+ */
16
+ enter(node: ASTNode, context: ValidationContext): void;
17
+ /**
18
+ * Called after visiting node's children.
19
+ * Use for post-order traversal validation.
20
+ */
21
+ exit(node: ASTNode, context: ValidationContext): void;
22
+ }
23
+ /**
24
+ * Recursively visit AST nodes with enter/exit callbacks.
25
+ * Handles all 46 node types from ASTNode union.
26
+ *
27
+ * Traversal order:
28
+ * 1. visitor.enter(node)
29
+ * 2. Recurse into children
30
+ * 3. visitor.exit(node)
31
+ */
32
+ export declare function visitNode(node: ASTNode, context: ValidationContext, visitor: RuleVisitor): void;
33
+ //# sourceMappingURL=visitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.d.ts","sourceRoot":"","sources":["../../src/check/visitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAEvD;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvD;AAMD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,WAAW,GACnB,IAAI,CAkSN"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * AST Visitor
3
+ * Recursive traversal with enter/exit callbacks for validation rules.
4
+ */
5
+ // ============================================================
6
+ // VISITOR FUNCTION
7
+ // ============================================================
8
+ /**
9
+ * Recursively visit AST nodes with enter/exit callbacks.
10
+ * Handles all 46 node types from ASTNode union.
11
+ *
12
+ * Traversal order:
13
+ * 1. visitor.enter(node)
14
+ * 2. Recurse into children
15
+ * 3. visitor.exit(node)
16
+ */
17
+ export function visitNode(node, context, visitor) {
18
+ // Enter callback before children
19
+ visitor.enter(node, context);
20
+ // Recurse based on node type
21
+ switch (node.type) {
22
+ case 'Script':
23
+ if (node.frontmatter) {
24
+ visitNode(node.frontmatter, context, visitor);
25
+ }
26
+ for (const stmt of node.statements) {
27
+ visitNode(stmt, context, visitor);
28
+ }
29
+ break;
30
+ case 'Frontmatter':
31
+ // Leaf node - no children
32
+ break;
33
+ case 'Statement':
34
+ visitNode(node.expression, context, visitor);
35
+ break;
36
+ case 'AnnotatedStatement':
37
+ for (const arg of node.annotations) {
38
+ visitNode(arg, context, visitor);
39
+ }
40
+ visitNode(node.statement, context, visitor);
41
+ break;
42
+ case 'NamedArg':
43
+ visitNode(node.value, context, visitor);
44
+ break;
45
+ case 'SpreadArg':
46
+ visitNode(node.expression, context, visitor);
47
+ break;
48
+ case 'PipeChain':
49
+ visitNode(node.head, context, visitor);
50
+ for (const pipe of node.pipes) {
51
+ visitNode(pipe, context, visitor);
52
+ }
53
+ if (node.terminator) {
54
+ visitNode(node.terminator, context, visitor);
55
+ }
56
+ break;
57
+ case 'PostfixExpr':
58
+ visitNode(node.primary, context, visitor);
59
+ for (const method of node.methods) {
60
+ visitNode(method, context, visitor);
61
+ }
62
+ break;
63
+ case 'BinaryExpr':
64
+ visitNode(node.left, context, visitor);
65
+ visitNode(node.right, context, visitor);
66
+ break;
67
+ case 'UnaryExpr':
68
+ visitNode(node.operand, context, visitor);
69
+ break;
70
+ case 'GroupedExpr':
71
+ visitNode(node.expression, context, visitor);
72
+ break;
73
+ case 'StringLiteral':
74
+ for (const part of node.parts) {
75
+ if (typeof part !== 'string') {
76
+ visitNode(part, context, visitor);
77
+ }
78
+ }
79
+ break;
80
+ case 'Interpolation':
81
+ visitNode(node.expression, context, visitor);
82
+ break;
83
+ case 'NumberLiteral':
84
+ case 'BoolLiteral':
85
+ // Leaf nodes - no children
86
+ break;
87
+ case 'Tuple':
88
+ for (const element of node.elements) {
89
+ visitNode(element, context, visitor);
90
+ }
91
+ break;
92
+ case 'ListSpread':
93
+ visitNode(node.expression, context, visitor);
94
+ break;
95
+ case 'Dict':
96
+ for (const entry of node.entries) {
97
+ visitNode(entry, context, visitor);
98
+ }
99
+ break;
100
+ case 'DictEntry':
101
+ visitNode(node.value, context, visitor);
102
+ break;
103
+ case 'Closure':
104
+ for (const param of node.params) {
105
+ visitNode(param, context, visitor);
106
+ }
107
+ visitNode(node.body, context, visitor);
108
+ break;
109
+ case 'ClosureParam':
110
+ if (node.defaultValue) {
111
+ visitNode(node.defaultValue, context, visitor);
112
+ }
113
+ break;
114
+ case 'Variable':
115
+ if (node.defaultValue) {
116
+ visitNode(node.defaultValue, context, visitor);
117
+ }
118
+ break;
119
+ case 'HostCall':
120
+ for (const arg of node.args) {
121
+ visitNode(arg, context, visitor);
122
+ }
123
+ break;
124
+ case 'ClosureCall':
125
+ for (const arg of node.args) {
126
+ visitNode(arg, context, visitor);
127
+ }
128
+ break;
129
+ case 'MethodCall':
130
+ for (const arg of node.args) {
131
+ visitNode(arg, context, visitor);
132
+ }
133
+ break;
134
+ case 'Invoke':
135
+ for (const arg of node.args) {
136
+ visitNode(arg, context, visitor);
137
+ }
138
+ break;
139
+ case 'PipeInvoke':
140
+ for (const arg of node.args) {
141
+ visitNode(arg, context, visitor);
142
+ }
143
+ break;
144
+ case 'Conditional':
145
+ if (node.input) {
146
+ visitNode(node.input, context, visitor);
147
+ }
148
+ if (node.condition) {
149
+ visitNode(node.condition, context, visitor);
150
+ }
151
+ visitNode(node.thenBranch, context, visitor);
152
+ if (node.elseBranch) {
153
+ visitNode(node.elseBranch, context, visitor);
154
+ }
155
+ break;
156
+ case 'WhileLoop':
157
+ visitNode(node.condition, context, visitor);
158
+ visitNode(node.body, context, visitor);
159
+ break;
160
+ case 'DoWhileLoop':
161
+ if (node.input) {
162
+ visitNode(node.input, context, visitor);
163
+ }
164
+ visitNode(node.body, context, visitor);
165
+ visitNode(node.condition, context, visitor);
166
+ break;
167
+ case 'Block':
168
+ for (const stmt of node.statements) {
169
+ visitNode(stmt, context, visitor);
170
+ }
171
+ break;
172
+ case 'EachExpr':
173
+ visitNode(node.body, context, visitor);
174
+ if (node.accumulator) {
175
+ visitNode(node.accumulator, context, visitor);
176
+ }
177
+ break;
178
+ case 'MapExpr':
179
+ visitNode(node.body, context, visitor);
180
+ break;
181
+ case 'FoldExpr':
182
+ visitNode(node.body, context, visitor);
183
+ if (node.accumulator) {
184
+ visitNode(node.accumulator, context, visitor);
185
+ }
186
+ break;
187
+ case 'FilterExpr':
188
+ visitNode(node.body, context, visitor);
189
+ break;
190
+ case 'ClosureChain':
191
+ visitNode(node.target, context, visitor);
192
+ break;
193
+ case 'Destructure':
194
+ for (const element of node.elements) {
195
+ visitNode(element, context, visitor);
196
+ }
197
+ break;
198
+ case 'DestructPattern':
199
+ if (node.nested) {
200
+ visitNode(node.nested, context, visitor);
201
+ }
202
+ break;
203
+ case 'Slice':
204
+ if (node.start) {
205
+ visitNode(node.start, context, visitor);
206
+ }
207
+ if (node.stop) {
208
+ visitNode(node.stop, context, visitor);
209
+ }
210
+ if (node.step) {
211
+ visitNode(node.step, context, visitor);
212
+ }
213
+ break;
214
+ case 'Spread':
215
+ if (node.operand) {
216
+ visitNode(node.operand, context, visitor);
217
+ }
218
+ break;
219
+ case 'TypeAssertion':
220
+ if (node.operand) {
221
+ visitNode(node.operand, context, visitor);
222
+ }
223
+ break;
224
+ case 'TypeCheck':
225
+ if (node.operand) {
226
+ visitNode(node.operand, context, visitor);
227
+ }
228
+ break;
229
+ case 'Assert':
230
+ visitNode(node.condition, context, visitor);
231
+ if (node.message) {
232
+ visitNode(node.message, context, visitor);
233
+ }
234
+ break;
235
+ case 'Capture':
236
+ case 'Break':
237
+ case 'Return':
238
+ case 'Pass':
239
+ // Leaf nodes - no children
240
+ break;
241
+ case 'RecoveryError':
242
+ // Recovery error node - no children to visit
243
+ break;
244
+ case 'Error':
245
+ // Error statement node - visit message if present
246
+ if (node.message) {
247
+ visitNode(node.message, context, visitor);
248
+ }
249
+ break;
250
+ default: {
251
+ // Exhaustive check: if we reach here, a node type is missing
252
+ const _exhaustive = node;
253
+ throw new Error(`Unhandled node type in visitor: ${_exhaustive.type}`);
254
+ }
255
+ }
256
+ // Exit callback after children
257
+ visitor.exit(node, context);
258
+ }
259
+ //# sourceMappingURL=visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../../src/check/visitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Check Entry Point
4
+ *
5
+ * Implements argument parsing for rill-check.
6
+ * Validates Rill source files against linting rules.
7
+ */
8
+ import type { Diagnostic } from './check/index.js';
9
+ /**
10
+ * Parsed command-line arguments for rill-check
11
+ */
12
+ export type ParsedCheckArgs = {
13
+ mode: 'check';
14
+ file: string;
15
+ fix: boolean;
16
+ verbose: boolean;
17
+ format: 'text' | 'json';
18
+ } | {
19
+ mode: 'help' | 'version';
20
+ };
21
+ /**
22
+ * Parse command-line arguments for rill-check
23
+ *
24
+ * @param argv - Raw command-line arguments (typically process.argv.slice(2))
25
+ * @returns Parsed command object
26
+ */
27
+ export declare function parseCheckArgs(argv: string[]): ParsedCheckArgs;
28
+ /**
29
+ * Format diagnostics for output
30
+ *
31
+ * Adapts pattern from cli-shared.ts formatError function.
32
+ * Text format: file:line:col: severity: message (code)
33
+ * JSON format: complete schema with errors array and summary
34
+ * Verbose mode: adds category field to diagnostics
35
+ *
36
+ * @param file - File path being checked
37
+ * @param diagnostics - Array of diagnostics to format
38
+ * @param format - Output format ('text' or 'json')
39
+ * @param verbose - Whether to include category and doc references
40
+ * @returns Formatted output string
41
+ */
42
+ export declare function formatDiagnostics(file: string, diagnostics: Diagnostic[], format: 'text' | 'json', verbose: boolean): string;
43
+ //# sourceMappingURL=cli-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-check.d.ts","sourceRoot":"","sources":["../src/cli-check.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAWnD;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB,GACD;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAiF9D;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,UAAU,EAAE,EACzB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,OAAO,EAAE,OAAO,GACf,MAAM,CAKR"}