@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,356 @@
|
|
|
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 { VALIDATION_RULES, loadConfig, createDefaultConfig, validateScript, applyFixes, } from './check/index.js';
|
|
9
|
+
import { parse } from './parser/index.js';
|
|
10
|
+
import { ParseError } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Parse command-line arguments for rill-check
|
|
13
|
+
*
|
|
14
|
+
* @param argv - Raw command-line arguments (typically process.argv.slice(2))
|
|
15
|
+
* @returns Parsed command object
|
|
16
|
+
*/
|
|
17
|
+
export function parseCheckArgs(argv) {
|
|
18
|
+
// Check for --help or --version flags in any position
|
|
19
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
20
|
+
return { mode: 'help' };
|
|
21
|
+
}
|
|
22
|
+
if (argv.includes('--version') || argv.includes('-v')) {
|
|
23
|
+
return { mode: 'version' };
|
|
24
|
+
}
|
|
25
|
+
// Extract flags
|
|
26
|
+
const fix = argv.includes('--fix');
|
|
27
|
+
const verbose = argv.includes('--verbose');
|
|
28
|
+
// Extract format flag
|
|
29
|
+
let format = 'text';
|
|
30
|
+
const formatIndex = argv.indexOf('--format');
|
|
31
|
+
if (formatIndex !== -1) {
|
|
32
|
+
const formatValue = argv[formatIndex + 1];
|
|
33
|
+
if (formatValue === 'text' || formatValue === 'json') {
|
|
34
|
+
format = formatValue;
|
|
35
|
+
}
|
|
36
|
+
else if (!formatValue || formatValue.startsWith('-')) {
|
|
37
|
+
throw new Error('--format requires argument: text or json');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw new Error(`Invalid format: ${formatValue}. Expected text or json`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Check for unknown flags
|
|
44
|
+
const knownFlags = new Set([
|
|
45
|
+
'--help',
|
|
46
|
+
'-h',
|
|
47
|
+
'--version',
|
|
48
|
+
'-v',
|
|
49
|
+
'--fix',
|
|
50
|
+
'--verbose',
|
|
51
|
+
'--format',
|
|
52
|
+
]);
|
|
53
|
+
for (let i = 0; i < argv.length; i++) {
|
|
54
|
+
const arg = argv[i];
|
|
55
|
+
if (!arg)
|
|
56
|
+
continue;
|
|
57
|
+
// Skip non-flag arguments
|
|
58
|
+
if (!arg.startsWith('-')) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Skip format value argument
|
|
62
|
+
if (i > 0 && argv[i - 1] === '--format') {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
// Check if unknown flag
|
|
66
|
+
if (!knownFlags.has(arg)) {
|
|
67
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Extract file path (first non-flag argument)
|
|
71
|
+
let file;
|
|
72
|
+
for (let i = 0; i < argv.length; i++) {
|
|
73
|
+
const arg = argv[i];
|
|
74
|
+
if (!arg)
|
|
75
|
+
continue;
|
|
76
|
+
// Skip flags
|
|
77
|
+
if (arg.startsWith('-')) {
|
|
78
|
+
// Skip --format and its value
|
|
79
|
+
if (arg === '--format') {
|
|
80
|
+
i++; // Skip next argument (the format value)
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// First non-flag argument is the file
|
|
85
|
+
file = arg;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (!file) {
|
|
89
|
+
throw new Error('Missing file argument');
|
|
90
|
+
}
|
|
91
|
+
return { mode: 'check', file, fix, verbose, format };
|
|
92
|
+
}
|
|
93
|
+
// ============================================================
|
|
94
|
+
// DIAGNOSTIC FORMATTING
|
|
95
|
+
// ============================================================
|
|
96
|
+
/**
|
|
97
|
+
* Format diagnostics for output
|
|
98
|
+
*
|
|
99
|
+
* Adapts pattern from cli-shared.ts formatError function.
|
|
100
|
+
* Text format: file:line:col: severity: message (code)
|
|
101
|
+
* JSON format: complete schema with errors array and summary
|
|
102
|
+
* Verbose mode: adds category field to diagnostics
|
|
103
|
+
*
|
|
104
|
+
* @param file - File path being checked
|
|
105
|
+
* @param diagnostics - Array of diagnostics to format
|
|
106
|
+
* @param format - Output format ('text' or 'json')
|
|
107
|
+
* @param verbose - Whether to include category and doc references
|
|
108
|
+
* @returns Formatted output string
|
|
109
|
+
*/
|
|
110
|
+
export function formatDiagnostics(file, diagnostics, format, verbose) {
|
|
111
|
+
if (format === 'json') {
|
|
112
|
+
return formatDiagnosticsJSON(file, diagnostics, verbose);
|
|
113
|
+
}
|
|
114
|
+
return formatDiagnosticsText(file, diagnostics);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format diagnostics as text
|
|
118
|
+
* Pattern: file:line:col: severity: message (code)
|
|
119
|
+
*/
|
|
120
|
+
function formatDiagnosticsText(file, diagnostics) {
|
|
121
|
+
return diagnostics
|
|
122
|
+
.map((d) => {
|
|
123
|
+
const { line, column } = d.location;
|
|
124
|
+
return `${file}:${line}:${column}: ${d.severity}: ${d.message} (${d.code})`;
|
|
125
|
+
})
|
|
126
|
+
.join('\n');
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Format diagnostics as JSON
|
|
130
|
+
* Includes file, errors array, and summary
|
|
131
|
+
*/
|
|
132
|
+
function formatDiagnosticsJSON(file, diagnostics, verbose) {
|
|
133
|
+
// Build category lookup map from validation rules
|
|
134
|
+
const categoryMap = new Map();
|
|
135
|
+
for (const rule of VALIDATION_RULES) {
|
|
136
|
+
categoryMap.set(rule.code, rule.category);
|
|
137
|
+
}
|
|
138
|
+
// Format each diagnostic
|
|
139
|
+
const errors = diagnostics.map((d) => {
|
|
140
|
+
const error = {
|
|
141
|
+
location: {
|
|
142
|
+
line: d.location.line,
|
|
143
|
+
column: d.location.column,
|
|
144
|
+
offset: d.location.offset,
|
|
145
|
+
},
|
|
146
|
+
severity: d.severity,
|
|
147
|
+
code: d.code,
|
|
148
|
+
message: d.message,
|
|
149
|
+
context: d.context,
|
|
150
|
+
};
|
|
151
|
+
// Add category if verbose mode
|
|
152
|
+
if (verbose) {
|
|
153
|
+
const category = categoryMap.get(d.code);
|
|
154
|
+
if (category) {
|
|
155
|
+
error['category'] = category;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Add fix if present
|
|
159
|
+
if (d.fix) {
|
|
160
|
+
error['fix'] = {
|
|
161
|
+
description: d.fix.description,
|
|
162
|
+
applicable: d.fix.applicable,
|
|
163
|
+
range: {
|
|
164
|
+
start: {
|
|
165
|
+
line: d.fix.range.start.line,
|
|
166
|
+
column: d.fix.range.start.column,
|
|
167
|
+
offset: d.fix.range.start.offset,
|
|
168
|
+
},
|
|
169
|
+
end: {
|
|
170
|
+
line: d.fix.range.end.line,
|
|
171
|
+
column: d.fix.range.end.column,
|
|
172
|
+
offset: d.fix.range.end.offset,
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
replacement: d.fix.replacement,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return error;
|
|
179
|
+
});
|
|
180
|
+
// Count diagnostics by severity
|
|
181
|
+
const summary = {
|
|
182
|
+
total: diagnostics.length,
|
|
183
|
+
errors: diagnostics.filter((d) => d.severity === 'error').length,
|
|
184
|
+
warnings: diagnostics.filter((d) => d.severity === 'warning').length,
|
|
185
|
+
info: diagnostics.filter((d) => d.severity === 'info').length,
|
|
186
|
+
};
|
|
187
|
+
const output = {
|
|
188
|
+
file,
|
|
189
|
+
errors,
|
|
190
|
+
summary,
|
|
191
|
+
};
|
|
192
|
+
return JSON.stringify(output, null, 2);
|
|
193
|
+
}
|
|
194
|
+
// ============================================================
|
|
195
|
+
// MAIN ENTRY POINT
|
|
196
|
+
// ============================================================
|
|
197
|
+
/**
|
|
198
|
+
* Main entry point for rill-check CLI.
|
|
199
|
+
* Orchestrates argument parsing, file reading, validation, fixing, and output.
|
|
200
|
+
*/
|
|
201
|
+
async function main() {
|
|
202
|
+
try {
|
|
203
|
+
// Parse command-line arguments
|
|
204
|
+
const args = parseCheckArgs(process.argv.slice(2));
|
|
205
|
+
// Handle help mode
|
|
206
|
+
if (args.mode === 'help') {
|
|
207
|
+
console.log(`rill-check - Validate Rill scripts
|
|
208
|
+
|
|
209
|
+
Usage: rill-check [options] <file>
|
|
210
|
+
|
|
211
|
+
Options:
|
|
212
|
+
--fix Apply automatic fixes
|
|
213
|
+
--format <fmt> Output format: text (default) or json
|
|
214
|
+
--verbose Include category and documentation references
|
|
215
|
+
-h, --help Show this help message
|
|
216
|
+
-v, --version Show version number`);
|
|
217
|
+
process.exit(0);
|
|
218
|
+
}
|
|
219
|
+
// Handle version mode
|
|
220
|
+
if (args.mode === 'version') {
|
|
221
|
+
console.log('0.1.0');
|
|
222
|
+
process.exit(0);
|
|
223
|
+
}
|
|
224
|
+
// At this point, args.mode must be 'check'
|
|
225
|
+
// TypeScript needs explicit assertion after early returns
|
|
226
|
+
if (args.mode !== 'check') {
|
|
227
|
+
throw new Error('Unexpected mode');
|
|
228
|
+
}
|
|
229
|
+
// Load configuration from cwd (null if not present)
|
|
230
|
+
const config = loadConfig(process.cwd()) ?? createDefaultConfig();
|
|
231
|
+
// Read source file
|
|
232
|
+
let source;
|
|
233
|
+
try {
|
|
234
|
+
const fs = await import('node:fs');
|
|
235
|
+
// Check if file exists
|
|
236
|
+
if (!fs.existsSync(args.file)) {
|
|
237
|
+
console.error(`Error: File not found: ${args.file}`);
|
|
238
|
+
process.exit(2);
|
|
239
|
+
}
|
|
240
|
+
// Check if path is a directory
|
|
241
|
+
const stats = fs.statSync(args.file);
|
|
242
|
+
if (stats.isDirectory()) {
|
|
243
|
+
console.error(`Error: Path is a directory: ${args.file}`);
|
|
244
|
+
process.exit(2);
|
|
245
|
+
}
|
|
246
|
+
// Read file contents
|
|
247
|
+
source = fs.readFileSync(args.file, 'utf-8');
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
// Handle read errors (permissions, etc.)
|
|
251
|
+
if (err instanceof Error &&
|
|
252
|
+
'code' in err &&
|
|
253
|
+
typeof err.code === 'string') {
|
|
254
|
+
const code = err.code;
|
|
255
|
+
if (code === 'ENOENT') {
|
|
256
|
+
console.error(`Error: File not found: ${args.file}`);
|
|
257
|
+
}
|
|
258
|
+
else if (code === 'EISDIR') {
|
|
259
|
+
console.error(`Error: Path is a directory: ${args.file}`);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
console.error(`Error: Cannot read file: ${args.file}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
console.error(`Error: Cannot read file: ${args.file}`);
|
|
267
|
+
}
|
|
268
|
+
process.exit(2);
|
|
269
|
+
}
|
|
270
|
+
// Parse AST
|
|
271
|
+
let ast;
|
|
272
|
+
try {
|
|
273
|
+
ast = parse(source);
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
// Handle parse errors
|
|
277
|
+
if (err instanceof ParseError) {
|
|
278
|
+
const location = err.location;
|
|
279
|
+
if (location) {
|
|
280
|
+
console.error(`${args.file}:${location.line}:${location.column}: parse error: ${err.message}`);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
console.error(`${args.file}: parse error: ${err.message}`);
|
|
284
|
+
}
|
|
285
|
+
// If --fix was requested, report that fixes cannot be applied
|
|
286
|
+
if (args.fix) {
|
|
287
|
+
console.error('Cannot apply fixes: file has parse errors');
|
|
288
|
+
}
|
|
289
|
+
process.exit(3);
|
|
290
|
+
}
|
|
291
|
+
throw err; // Re-throw unexpected errors
|
|
292
|
+
}
|
|
293
|
+
// Run validation
|
|
294
|
+
const diagnostics = validateScript(ast, source, config);
|
|
295
|
+
// Apply fixes if requested
|
|
296
|
+
if (args.fix && diagnostics.length > 0) {
|
|
297
|
+
const result = applyFixes(source, diagnostics, {
|
|
298
|
+
source,
|
|
299
|
+
ast,
|
|
300
|
+
config,
|
|
301
|
+
diagnostics: [],
|
|
302
|
+
variables: new Map(),
|
|
303
|
+
});
|
|
304
|
+
// Write fixed source back to file
|
|
305
|
+
if (result.applied > 0) {
|
|
306
|
+
const fs = await import('node:fs');
|
|
307
|
+
fs.writeFileSync(args.file, result.modified, 'utf-8');
|
|
308
|
+
}
|
|
309
|
+
// Report fix results to stderr
|
|
310
|
+
if (result.applied > 0 || result.skipped > 0) {
|
|
311
|
+
if (result.applied > 0) {
|
|
312
|
+
console.error(`Applied ${result.applied} fix${result.applied === 1 ? '' : 'es'}`);
|
|
313
|
+
}
|
|
314
|
+
if (result.skipped > 0) {
|
|
315
|
+
console.error(`Skipped ${result.skipped} fix${result.skipped === 1 ? '' : 'es'}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Format and output diagnostics
|
|
320
|
+
if (diagnostics.length === 0) {
|
|
321
|
+
// No errors - success
|
|
322
|
+
if (args.format === 'json') {
|
|
323
|
+
console.log(JSON.stringify({
|
|
324
|
+
file: args.file,
|
|
325
|
+
errors: [],
|
|
326
|
+
summary: { total: 0, errors: 0, warnings: 0, info: 0 },
|
|
327
|
+
}, null, 2));
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
console.log('No issues found');
|
|
331
|
+
}
|
|
332
|
+
process.exit(0);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
// Output diagnostics
|
|
336
|
+
const output = formatDiagnostics(args.file, diagnostics, args.format, args.verbose);
|
|
337
|
+
console.log(output);
|
|
338
|
+
process.exit(1);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
// Handle unexpected errors
|
|
343
|
+
if (err instanceof Error) {
|
|
344
|
+
console.error(`Error: ${err.message}`);
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
console.error(`Error: ${String(err)}`);
|
|
348
|
+
}
|
|
349
|
+
process.exit(1);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// Only run main if this is the entry point (not imported)
|
|
353
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
354
|
+
main();
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=cli-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-check.js","sourceRoot":"","sources":["../src/cli-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Rill CLI - Evaluate rill expressions
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* rill-eval '"hello".len'
|
|
7
|
+
* rill-eval --help
|
|
8
|
+
* rill-eval --version
|
|
9
|
+
*/
|
|
10
|
+
import { type ExecutionResult } from './index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Evaluate a Rill expression without file context
|
|
13
|
+
*/
|
|
14
|
+
export declare function evaluateExpression(expression: string): Promise<ExecutionResult>;
|
|
15
|
+
//# sourceMappingURL=cli-eval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-eval.d.ts","sourceRoot":"","sources":["../src/cli-eval.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAwCpB;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAY1B"}
|
package/dist/cli-eval.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Rill CLI - Evaluate rill expressions
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* rill-eval '"hello".len'
|
|
7
|
+
* rill-eval --help
|
|
8
|
+
* rill-eval --version
|
|
9
|
+
*/
|
|
10
|
+
import { createRuntimeContext, execute, parse, } from './index.js';
|
|
11
|
+
import { formatOutput, determineExitCode } from './cli-shared.js';
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
/**
|
|
14
|
+
* Parse command-line arguments into structured command
|
|
15
|
+
*/
|
|
16
|
+
function parseArgs(argv) {
|
|
17
|
+
// Check for --help and --version in any position
|
|
18
|
+
if (argv.includes('--help')) {
|
|
19
|
+
return { mode: 'help' };
|
|
20
|
+
}
|
|
21
|
+
if (argv.includes('--version')) {
|
|
22
|
+
return { mode: 'version' };
|
|
23
|
+
}
|
|
24
|
+
// Check for unknown flags (anything starting with -)
|
|
25
|
+
for (const arg of argv) {
|
|
26
|
+
if (arg.startsWith('-') && arg !== '-') {
|
|
27
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// If no arguments, default to help
|
|
31
|
+
if (argv.length === 0) {
|
|
32
|
+
return { mode: 'help' };
|
|
33
|
+
}
|
|
34
|
+
// First positional arg determines mode
|
|
35
|
+
const firstArg = argv[0];
|
|
36
|
+
// Eval mode: direct expression
|
|
37
|
+
return { mode: 'eval', expression: firstArg };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Evaluate a Rill expression without file context
|
|
41
|
+
*/
|
|
42
|
+
export async function evaluateExpression(expression) {
|
|
43
|
+
const ctx = createRuntimeContext({
|
|
44
|
+
callbacks: {
|
|
45
|
+
onLog: (value) => console.log(formatOutput(value)),
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
// Set pipeValue to empty list (Rill has no null concept per language spec)
|
|
49
|
+
ctx.pipeValue = [];
|
|
50
|
+
const ast = parse(expression);
|
|
51
|
+
return execute(ast, ctx);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Display help information
|
|
55
|
+
*/
|
|
56
|
+
function showHelp() {
|
|
57
|
+
console.log(`Rill Expression Evaluator
|
|
58
|
+
|
|
59
|
+
Usage:
|
|
60
|
+
rill-eval <expression> Evaluate a Rill expression
|
|
61
|
+
rill-eval --help Show this help message
|
|
62
|
+
rill-eval --version Show version information
|
|
63
|
+
|
|
64
|
+
Examples:
|
|
65
|
+
rill-eval '"hello".len'
|
|
66
|
+
rill-eval '5 + 3'
|
|
67
|
+
rill-eval '[1, 2, 3] -> map |x|($x * 2)'`);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Display version information
|
|
71
|
+
*/
|
|
72
|
+
function showVersion() {
|
|
73
|
+
// Read version from package.json
|
|
74
|
+
const packageJsonPath = new URL('../package.json', import.meta.url);
|
|
75
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
76
|
+
console.log(`rill-eval ${packageJson.version}`);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Entry point for rill-eval binary
|
|
80
|
+
*/
|
|
81
|
+
async function main() {
|
|
82
|
+
try {
|
|
83
|
+
const args = process.argv.slice(2);
|
|
84
|
+
const command = parseArgs(args);
|
|
85
|
+
if (command.mode === 'help') {
|
|
86
|
+
showHelp();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (command.mode === 'version') {
|
|
90
|
+
showVersion();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (command.mode === 'eval') {
|
|
94
|
+
const result = await evaluateExpression(command.expression);
|
|
95
|
+
const { code, message } = determineExitCode(result.value);
|
|
96
|
+
if (message !== undefined) {
|
|
97
|
+
console.log(message);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log(formatOutput(result.value));
|
|
101
|
+
}
|
|
102
|
+
process.exit(code);
|
|
103
|
+
}
|
|
104
|
+
// Unreachable - exec mode not supported in rill-eval
|
|
105
|
+
console.error('Unexpected command mode');
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Only run main if this is the entry point (not imported)
|
|
114
|
+
const shouldRunMain = process.env['NODE_ENV'] !== 'test' &&
|
|
115
|
+
!process.env['VITEST'] &&
|
|
116
|
+
!process.env['VITEST_WORKER_ID'];
|
|
117
|
+
if (shouldRunMain) {
|
|
118
|
+
main();
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=cli-eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-eval.js","sourceRoot":"","sources":["../src/cli-eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI Execution Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Implements main(), parseArgs(), and executeScript() for rill-exec and rill-eval binaries.
|
|
6
|
+
* Handles file execution, stdin input, and module loading.
|
|
7
|
+
*/
|
|
8
|
+
import type { ExecutionResult } from './index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parsed command-line arguments
|
|
11
|
+
*/
|
|
12
|
+
export type ParsedArgs = {
|
|
13
|
+
mode: 'exec';
|
|
14
|
+
file: string;
|
|
15
|
+
args: string[];
|
|
16
|
+
} | {
|
|
17
|
+
mode: 'eval';
|
|
18
|
+
expression: string;
|
|
19
|
+
} | {
|
|
20
|
+
mode: 'help' | 'version';
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Parse command-line arguments into structured command
|
|
24
|
+
*
|
|
25
|
+
* @param argv - Raw command-line arguments (typically process.argv.slice(2))
|
|
26
|
+
* @returns Parsed command object
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
29
|
+
/**
|
|
30
|
+
* Execute a Rill script file with arguments and module support
|
|
31
|
+
*
|
|
32
|
+
* @param file - File path or '-' for stdin
|
|
33
|
+
* @param args - Command-line arguments to pass as $ pipe value
|
|
34
|
+
* @param options - Execution options
|
|
35
|
+
* @returns Execution result with value and variables
|
|
36
|
+
* @throws Error if file not found or execution fails
|
|
37
|
+
*/
|
|
38
|
+
export declare function executeScript(file: string, args: string[], options?: {
|
|
39
|
+
stdin?: boolean;
|
|
40
|
+
}): Promise<ExecutionResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Entry point for rill-exec and rill-eval binaries
|
|
43
|
+
*
|
|
44
|
+
* Parses command-line arguments, executes scripts, and handles errors.
|
|
45
|
+
* Writes results to stdout and errors to stderr.
|
|
46
|
+
* Sets process.exit(1) on any error.
|
|
47
|
+
*/
|
|
48
|
+
export declare function main(): Promise<void>;
|
|
49
|
+
//# sourceMappingURL=cli-exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-exec.d.ts","sourceRoot":"","sources":["../src/cli-exec.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAOH,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,YAAY,CAAC;AAI7D;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAuCpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,eAAe,CAAC,CA0D1B;AAED;;;;;;GAMG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAsE1C"}
|