@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.
- package/README.md +16 -8
- package/dist/check/config.d.ts +20 -0
- package/dist/check/config.d.ts.map +1 -0
- package/dist/check/config.js +151 -0
- package/dist/check/config.js.map +1 -0
- package/dist/check/fixer.d.ts +39 -0
- package/dist/check/fixer.d.ts.map +1 -0
- package/dist/check/fixer.js +119 -0
- package/dist/check/fixer.js.map +1 -0
- package/dist/check/index.d.ts +10 -0
- package/dist/check/index.d.ts.map +1 -0
- package/dist/check/index.js +21 -0
- package/dist/check/index.js.map +1 -0
- package/dist/check/rules/anti-patterns.d.ts +65 -0
- package/dist/check/rules/anti-patterns.d.ts.map +1 -0
- package/dist/check/rules/anti-patterns.js +427 -0
- package/dist/check/rules/anti-patterns.js.map +1 -0
- package/dist/check/rules/closures.d.ts +66 -0
- package/dist/check/rules/closures.d.ts.map +1 -0
- package/dist/check/rules/closures.js +373 -0
- package/dist/check/rules/closures.js.map +1 -0
- package/dist/check/rules/collections.d.ts +90 -0
- package/dist/check/rules/collections.d.ts.map +1 -0
- package/dist/check/rules/collections.js +373 -0
- package/dist/check/rules/collections.js.map +1 -0
- package/dist/check/rules/conditionals.d.ts +41 -0
- package/dist/check/rules/conditionals.d.ts.map +1 -0
- package/dist/check/rules/conditionals.js +106 -0
- package/dist/check/rules/conditionals.js.map +1 -0
- package/dist/check/rules/flow.d.ts +46 -0
- package/dist/check/rules/flow.d.ts.map +1 -0
- package/dist/check/rules/flow.js +206 -0
- package/dist/check/rules/flow.js.map +1 -0
- package/dist/check/rules/formatting.d.ts +133 -0
- package/dist/check/rules/formatting.d.ts.map +1 -0
- package/dist/check/rules/formatting.js +639 -0
- package/dist/check/rules/formatting.js.map +1 -0
- package/dist/check/rules/helpers.d.ts +26 -0
- package/dist/check/rules/helpers.d.ts.map +1 -0
- package/dist/check/rules/helpers.js +66 -0
- package/dist/check/rules/helpers.js.map +1 -0
- package/dist/check/rules/index.d.ts +21 -0
- package/dist/check/rules/index.d.ts.map +1 -0
- package/dist/check/rules/index.js +78 -0
- package/dist/check/rules/index.js.map +1 -0
- package/dist/check/rules/loops.d.ts +70 -0
- package/dist/check/rules/loops.d.ts.map +1 -0
- package/dist/check/rules/loops.js +227 -0
- package/dist/check/rules/loops.js.map +1 -0
- package/dist/check/rules/naming.d.ts +21 -0
- package/dist/check/rules/naming.d.ts.map +1 -0
- package/dist/check/rules/naming.js +167 -0
- package/dist/check/rules/naming.js.map +1 -0
- package/dist/check/rules/strings.d.ts +28 -0
- package/dist/check/rules/strings.d.ts.map +1 -0
- package/dist/check/rules/strings.js +80 -0
- package/dist/check/rules/strings.js.map +1 -0
- package/dist/check/rules/types.d.ts +41 -0
- package/dist/check/rules/types.d.ts.map +1 -0
- package/dist/check/rules/types.js +162 -0
- package/dist/check/rules/types.js.map +1 -0
- package/dist/check/types.d.ts +106 -0
- package/dist/check/types.d.ts.map +1 -0
- package/dist/check/types.js +6 -0
- package/dist/check/types.js.map +1 -0
- package/dist/check/validator.d.ts +18 -0
- package/dist/check/validator.d.ts.map +1 -0
- package/dist/check/validator.js +88 -0
- package/dist/check/validator.js.map +1 -0
- package/dist/check/visitor.d.ts +33 -0
- package/dist/check/visitor.d.ts.map +1 -0
- package/dist/check/visitor.js +243 -0
- package/dist/check/visitor.js.map +1 -0
- package/dist/cli-check.d.ts +43 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-check.js +356 -0
- package/dist/cli-check.js.map +1 -0
- package/dist/cli-eval.d.ts +15 -0
- package/dist/cli-eval.d.ts.map +1 -0
- package/dist/cli-eval.js +120 -0
- package/dist/cli-eval.js.map +1 -0
- package/dist/cli-exec.d.ts +49 -0
- package/dist/cli-exec.d.ts.map +1 -0
- package/dist/cli-exec.js +191 -0
- package/dist/cli-exec.js.map +1 -0
- package/dist/cli-module-loader.d.ts +19 -0
- package/dist/cli-module-loader.d.ts.map +1 -0
- package/dist/cli-module-loader.js +83 -0
- package/dist/cli-module-loader.js.map +1 -0
- package/dist/cli-shared.d.ts +36 -0
- package/dist/cli-shared.d.ts.map +1 -0
- package/dist/cli-shared.js +101 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -11
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lexer/readers.d.ts +1 -1
- package/dist/lexer/readers.d.ts.map +1 -1
- package/dist/lexer/readers.js +62 -32
- package/dist/lexer/readers.js.map +1 -1
- package/dist/lexer/tokenizer.d.ts.map +1 -1
- package/dist/lexer/tokenizer.js +5 -6
- package/dist/lexer/tokenizer.js.map +1 -1
- package/dist/parser/index.js +1 -1
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/parser-expr.js +23 -5
- package/dist/parser/parser-expr.js.map +1 -1
- package/dist/parser/parser-functions.d.ts +2 -2
- package/dist/parser/parser-functions.d.ts.map +1 -1
- package/dist/parser/parser-functions.js +2 -1
- package/dist/parser/parser-functions.js.map +1 -1
- package/dist/parser/parser-literals.js +2 -2
- package/dist/parser/parser-literals.js.map +1 -1
- package/dist/parser/parser-script.js +9 -7
- package/dist/parser/parser-script.js.map +1 -1
- package/dist/parser/parser-variables.js +4 -3
- package/dist/parser/parser-variables.js.map +1 -1
- package/dist/runtime/core/callable.d.ts +5 -6
- package/dist/runtime/core/callable.d.ts.map +1 -1
- package/dist/runtime/core/callable.js.map +1 -1
- package/dist/runtime/core/context.d.ts.map +1 -1
- package/dist/runtime/core/context.js +19 -32
- package/dist/runtime/core/context.js.map +1 -1
- package/dist/runtime/core/equals.js +1 -1
- package/dist/runtime/core/equals.js.map +1 -1
- package/dist/runtime/core/eval/evaluator.d.ts +78 -0
- package/dist/runtime/core/eval/evaluator.d.ts.map +1 -1
- package/dist/runtime/core/eval/evaluator.js +78 -0
- package/dist/runtime/core/eval/evaluator.js.map +1 -1
- package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -1
- package/dist/runtime/core/eval/mixins/closures.js +9 -1
- package/dist/runtime/core/eval/mixins/closures.js.map +1 -1
- package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -1
- package/dist/runtime/core/eval/mixins/variables.js +143 -2
- package/dist/runtime/core/eval/mixins/variables.js.map +1 -1
- package/dist/runtime/core/types.d.ts +15 -2
- package/dist/runtime/core/types.d.ts.map +1 -1
- package/dist/runtime/core/types.js.map +1 -1
- package/dist/runtime/ext/extensions.d.ts +51 -0
- package/dist/runtime/ext/extensions.d.ts.map +1 -0
- package/dist/runtime/ext/extensions.js +67 -0
- package/dist/runtime/ext/extensions.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/types.d.ts +8 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -4
- package/dist/types.js.map +1 -1
- package/docs/00_INDEX.md +1 -0
- package/docs/01_guide.md +3 -3
- package/docs/02_types.md +8 -10
- package/docs/03_variables.md +10 -0
- package/docs/04_operators.md +3 -3
- package/docs/05_control-flow.md +21 -0
- package/docs/07_collections.md +2 -0
- package/docs/10_parsing.md +9 -9
- package/docs/11_reference.md +1 -1
- package/docs/12_examples.md +36 -62
- package/docs/14_host-integration.md +116 -111
- package/docs/15_grammar.ebnf +1 -5
- package/docs/16_conventions.md +3 -4
- package/docs/17_cli-tools.md +184 -0
- package/docs/99_llm-reference.txt +46 -5
- package/package.json +13 -4
- package/dist/demo.d.ts +0 -6
- package/dist/demo.d.ts.map +0 -1
- package/dist/demo.js +0 -121
- package/dist/demo.js.map +0 -1
- package/dist/lexer.d.ts +0 -19
- package/dist/lexer.d.ts.map +0 -1
- package/dist/lexer.js +0 -344
- package/dist/lexer.js.map +0 -1
- package/dist/parser/arithmetic.d.ts +0 -16
- package/dist/parser/arithmetic.d.ts.map +0 -1
- package/dist/parser/arithmetic.js +0 -128
- package/dist/parser/arithmetic.js.map +0 -1
- package/dist/parser/boolean.d.ts +0 -15
- package/dist/parser/boolean.d.ts.map +0 -1
- package/dist/parser/boolean.js +0 -20
- package/dist/parser/boolean.js.map +0 -1
- package/dist/parser/control-flow.d.ts +0 -56
- package/dist/parser/control-flow.d.ts.map +0 -1
- package/dist/parser/control-flow.js +0 -167
- package/dist/parser/control-flow.js.map +0 -1
- package/dist/parser/expressions.d.ts +0 -23
- package/dist/parser/expressions.d.ts.map +0 -1
- package/dist/parser/expressions.js +0 -950
- package/dist/parser/expressions.js.map +0 -1
- package/dist/parser/extraction.d.ts +0 -48
- package/dist/parser/extraction.d.ts.map +0 -1
- package/dist/parser/extraction.js +0 -279
- package/dist/parser/extraction.js.map +0 -1
- package/dist/parser/functions.d.ts +0 -20
- package/dist/parser/functions.d.ts.map +0 -1
- package/dist/parser/functions.js +0 -96
- package/dist/parser/functions.js.map +0 -1
- package/dist/parser/literals.d.ts +0 -37
- package/dist/parser/literals.d.ts.map +0 -1
- package/dist/parser/literals.js +0 -373
- package/dist/parser/literals.js.map +0 -1
- package/dist/parser/script.d.ts +0 -14
- package/dist/parser/script.d.ts.map +0 -1
- package/dist/parser/script.js +0 -196
- package/dist/parser/script.js.map +0 -1
- package/dist/parser/variables.d.ts +0 -10
- package/dist/parser/variables.d.ts.map +0 -1
- package/dist/parser/variables.js +0 -215
- package/dist/parser/variables.js.map +0 -1
- package/dist/runtime/ast-equals.d.ts +0 -13
- package/dist/runtime/ast-equals.d.ts.map +0 -1
- package/dist/runtime/ast-equals.js +0 -447
- package/dist/runtime/ast-equals.js.map +0 -1
- package/dist/runtime/builtins.d.ts +0 -13
- package/dist/runtime/builtins.d.ts.map +0 -1
- package/dist/runtime/builtins.js +0 -180
- package/dist/runtime/builtins.js.map +0 -1
- package/dist/runtime/callable.d.ts +0 -88
- package/dist/runtime/callable.d.ts.map +0 -1
- package/dist/runtime/callable.js +0 -98
- package/dist/runtime/callable.js.map +0 -1
- package/dist/runtime/context.d.ts +0 -13
- package/dist/runtime/context.d.ts.map +0 -1
- package/dist/runtime/context.js +0 -73
- package/dist/runtime/context.js.map +0 -1
- package/dist/runtime/core/evaluate.d.ts +0 -42
- package/dist/runtime/core/evaluate.d.ts.map +0 -1
- package/dist/runtime/core/evaluate.debug.js +0 -1251
- package/dist/runtime/core/evaluate.js +0 -1913
- package/dist/runtime/core/evaluate.js.map +0 -1
- package/dist/runtime/evaluate.d.ts +0 -32
- package/dist/runtime/evaluate.d.ts.map +0 -1
- package/dist/runtime/evaluate.js +0 -1111
- package/dist/runtime/evaluate.js.map +0 -1
- package/dist/runtime/execute.d.ts +0 -26
- package/dist/runtime/execute.d.ts.map +0 -1
- package/dist/runtime/execute.js +0 -121
- package/dist/runtime/execute.js.map +0 -1
- package/dist/runtime/signals.d.ts +0 -19
- package/dist/runtime/signals.d.ts.map +0 -1
- package/dist/runtime/signals.js +0 -26
- package/dist/runtime/signals.js.map +0 -1
- package/dist/runtime/types.d.ts +0 -169
- package/dist/runtime/types.d.ts.map +0 -1
- package/dist/runtime/types.js +0 -50
- package/dist/runtime/types.js.map +0 -1
- package/dist/runtime/values.d.ts +0 -50
- package/dist/runtime/values.d.ts.map +0 -1
- package/dist/runtime/values.js +0 -209
- package/dist/runtime/values.js.map +0 -1
- package/dist/runtime.d.ts +0 -254
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js +0 -2014
- 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"}
|