@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.
- package/LICENSE +21 -0
- 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 +481 -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 +370 -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 +134 -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 +143 -0
- package/dist/check/rules/formatting.d.ts.map +1 -0
- package/dist/check/rules/formatting.js +656 -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 +77 -0
- package/dist/check/rules/loops.d.ts.map +1 -0
- package/dist/check/rules/loops.js +310 -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 +174 -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 +79 -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 +167 -0
- package/dist/check/rules/types.js.map +1 -0
- package/dist/check/types.d.ts +112 -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 +110 -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 +259 -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 +366 -0
- package/dist/cli-check.js.map +1 -0
- package/dist/cli-error-enrichment.d.ts +73 -0
- package/dist/cli-error-enrichment.d.ts.map +1 -0
- package/dist/cli-error-enrichment.js +205 -0
- package/dist/cli-error-enrichment.js.map +1 -0
- package/dist/cli-error-formatter.d.ts +45 -0
- package/dist/cli-error-formatter.d.ts.map +1 -0
- package/dist/cli-error-formatter.js +218 -0
- package/dist/cli-error-formatter.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 +116 -0
- package/dist/cli-eval.js.map +1 -0
- package/dist/cli-exec.d.ts +58 -0
- package/dist/cli-exec.d.ts.map +1 -0
- package/dist/cli-exec.js +326 -0
- package/dist/cli-exec.js.map +1 -0
- package/dist/cli-explain.d.ts +24 -0
- package/dist/cli-explain.d.ts.map +1 -0
- package/dist/cli-explain.js +68 -0
- package/dist/cli-explain.js.map +1 -0
- package/dist/cli-lsp-diagnostic.d.ts +35 -0
- package/dist/cli-lsp-diagnostic.d.ts.map +1 -0
- package/dist/cli-lsp-diagnostic.js +98 -0
- package/dist/cli-lsp-diagnostic.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 +62 -0
- package/dist/cli-shared.d.ts.map +1 -0
- package/dist/cli-shared.js +158 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +62 -0
- package/dist/cli.js.map +1 -0
- package/dist/test-internal-import.d.ts +2 -0
- package/dist/test-internal-import.d.ts.map +1 -0
- package/dist/test-internal-import.js +7 -0
- package/dist/test-internal-import.js.map +1 -0
- package/package.json +24 -0
- package/src/check/config.ts +202 -0
- package/src/check/fixer.ts +174 -0
- package/src/check/index.ts +39 -0
- package/src/check/rules/anti-patterns.ts +585 -0
- package/src/check/rules/closures.ts +445 -0
- package/src/check/rules/collections.ts +437 -0
- package/src/check/rules/conditionals.ts +155 -0
- package/src/check/rules/flow.ts +262 -0
- package/src/check/rules/formatting.ts +811 -0
- package/src/check/rules/helpers.ts +89 -0
- package/src/check/rules/index.ts +140 -0
- package/src/check/rules/loops.ts +372 -0
- package/src/check/rules/naming.ts +242 -0
- package/src/check/rules/strings.ts +104 -0
- package/src/check/rules/types.ts +214 -0
- package/src/check/types.ts +163 -0
- package/src/check/validator.ts +136 -0
- package/src/check/visitor.ts +338 -0
- package/src/cli-check.ts +456 -0
- package/src/cli-error-enrichment.ts +274 -0
- package/src/cli-error-formatter.ts +313 -0
- package/src/cli-eval.ts +145 -0
- package/src/cli-exec.ts +408 -0
- package/src/cli-explain.ts +76 -0
- package/src/cli-lsp-diagnostic.ts +132 -0
- package/src/cli-module-loader.ts +101 -0
- package/src/cli-shared.ts +187 -0
- package/tests/check/cli-check.test.ts +189 -0
- package/tests/check/config.test.ts +350 -0
- package/tests/check/fixer.test.ts +373 -0
- package/tests/check/format-diagnostics.test.ts +327 -0
- package/tests/check/rules/anti-patterns.test.ts +467 -0
- package/tests/check/rules/closures.test.ts +192 -0
- package/tests/check/rules/collections.test.ts +380 -0
- package/tests/check/rules/conditionals.test.ts +185 -0
- package/tests/check/rules/flow.test.ts +250 -0
- package/tests/check/rules/formatting.test.ts +755 -0
- package/tests/check/rules/loops.test.ts +334 -0
- package/tests/check/rules/naming.test.ts +336 -0
- package/tests/check/rules/strings.test.ts +129 -0
- package/tests/check/rules/types.test.ts +257 -0
- package/tests/check/validator.test.ts +444 -0
- package/tests/check/visitor.test.ts +171 -0
- package/tests/cli/check.test.ts +801 -0
- package/tests/cli/error-enrichment.test.ts +510 -0
- package/tests/cli/error-formatter.test.ts +631 -0
- package/tests/cli/eval.test.ts +85 -0
- package/tests/cli/exec.test.ts +537 -0
- package/tests/cli-explain.test.ts +249 -0
- package/tests/cli-lsp-diagnostic.test.ts +202 -0
- package/tests/cli-shared.test.ts +439 -0
- package/tsconfig.json +9 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Error Formatter
|
|
3
|
+
* Format enriched errors for human-readable, JSON, or compact output
|
|
4
|
+
*/
|
|
5
|
+
import type { SourceSpan, CallFrame } from '@rcrsr/rill';
|
|
6
|
+
import type { EnrichedError } from './cli-error-enrichment.js';
|
|
7
|
+
export type { CallFrame, EnrichedError };
|
|
8
|
+
/**
|
|
9
|
+
* Format options for error output.
|
|
10
|
+
*/
|
|
11
|
+
export interface FormatOptions {
|
|
12
|
+
readonly format: 'human' | 'json' | 'compact';
|
|
13
|
+
readonly verbose: boolean;
|
|
14
|
+
readonly includeCallStack: boolean;
|
|
15
|
+
readonly maxCallStackDepth: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Format enriched error for output.
|
|
19
|
+
*
|
|
20
|
+
* Constraints:
|
|
21
|
+
* - Human format: multi-line with snippet and caret underline
|
|
22
|
+
* - JSON format: LSP Diagnostic compatible
|
|
23
|
+
* - Compact format: single line for CI output
|
|
24
|
+
*
|
|
25
|
+
* @param error - Enriched error with context
|
|
26
|
+
* @param options - Format options
|
|
27
|
+
* @returns Formatted error string
|
|
28
|
+
* @throws {TypeError} Unknown format
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatError(error: EnrichedError, options: FormatOptions): string;
|
|
31
|
+
/**
|
|
32
|
+
* Render caret underline for error span.
|
|
33
|
+
*
|
|
34
|
+
* Constraints:
|
|
35
|
+
* - Single-char: single ^
|
|
36
|
+
* - Multi-char same line: ^^^^^ (length = span width)
|
|
37
|
+
* - Multi-line: ^^^^^ (continues) on first line only
|
|
38
|
+
*
|
|
39
|
+
* @param span - Error span
|
|
40
|
+
* @param lineContent - Content of the line
|
|
41
|
+
* @returns Caret underline string
|
|
42
|
+
* @throws {RangeError} Invalid span (start after end)
|
|
43
|
+
*/
|
|
44
|
+
export declare function renderCaretUnderline(span: SourceSpan, lineContent: string): string;
|
|
45
|
+
//# sourceMappingURL=cli-error-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-error-formatter.d.ts","sourceRoot":"","sources":["../src/cli-error-formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM/D,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,aAAa,GACrB,MAAM,CAmBR;AA8MD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,CA2BR"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Error Formatter
|
|
3
|
+
* Format enriched errors for human-readable, JSON, or compact output
|
|
4
|
+
*/
|
|
5
|
+
// ============================================================
|
|
6
|
+
// ERROR FORMATTING
|
|
7
|
+
// ============================================================
|
|
8
|
+
/**
|
|
9
|
+
* Format enriched error for output.
|
|
10
|
+
*
|
|
11
|
+
* Constraints:
|
|
12
|
+
* - Human format: multi-line with snippet and caret underline
|
|
13
|
+
* - JSON format: LSP Diagnostic compatible
|
|
14
|
+
* - Compact format: single line for CI output
|
|
15
|
+
*
|
|
16
|
+
* @param error - Enriched error with context
|
|
17
|
+
* @param options - Format options
|
|
18
|
+
* @returns Formatted error string
|
|
19
|
+
* @throws {TypeError} Unknown format
|
|
20
|
+
*/
|
|
21
|
+
export function formatError(error, options) {
|
|
22
|
+
// EC-5: Unknown format throws TypeError
|
|
23
|
+
if (options.format !== 'human' &&
|
|
24
|
+
options.format !== 'json' &&
|
|
25
|
+
options.format !== 'compact') {
|
|
26
|
+
throw new TypeError(`Unknown format: ${options.format}`);
|
|
27
|
+
}
|
|
28
|
+
if (options.format === 'json') {
|
|
29
|
+
return formatErrorJson(error, options);
|
|
30
|
+
}
|
|
31
|
+
if (options.format === 'compact') {
|
|
32
|
+
return formatErrorCompact(error);
|
|
33
|
+
}
|
|
34
|
+
return formatErrorHuman(error, options);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Format error in human-readable format.
|
|
38
|
+
*
|
|
39
|
+
* Output format:
|
|
40
|
+
* ```
|
|
41
|
+
* error[RILL-R005]: Variable foo is not defined
|
|
42
|
+
* --> script.rill:5:10
|
|
43
|
+
* |
|
|
44
|
+
* 3 | "start" => $begin
|
|
45
|
+
* 4 | $begin -> .upper => $upper
|
|
46
|
+
* 5 | $foo -> .len
|
|
47
|
+
* | ^^^^ undefined variable
|
|
48
|
+
* |
|
|
49
|
+
* = help: Did you mean `$begin`?
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
function formatErrorHuman(error, options) {
|
|
53
|
+
const lines = [];
|
|
54
|
+
// Header: error[RILL-XXXX]: message
|
|
55
|
+
lines.push(`error[${error.errorId}]: ${error.message}`);
|
|
56
|
+
// Location: --> script.rill:5:10
|
|
57
|
+
if (error.span) {
|
|
58
|
+
const location = `${error.span.start.line}:${error.span.start.column}`;
|
|
59
|
+
lines.push(` --> ${location}`);
|
|
60
|
+
}
|
|
61
|
+
// Source snippet with caret underline
|
|
62
|
+
if (error.sourceSnippet && error.sourceSnippet.lines.length > 0) {
|
|
63
|
+
lines.push(' |');
|
|
64
|
+
// Calculate padding width for line numbers
|
|
65
|
+
const maxLineNumber = Math.max(...error.sourceSnippet.lines.map((l) => l.lineNumber));
|
|
66
|
+
const lineNumberWidth = String(maxLineNumber).length;
|
|
67
|
+
for (const line of error.sourceSnippet.lines) {
|
|
68
|
+
const lineNumStr = String(line.lineNumber).padStart(lineNumberWidth, ' ');
|
|
69
|
+
lines.push(` ${lineNumStr} | ${line.content}`);
|
|
70
|
+
// Add caret underline for error lines
|
|
71
|
+
if (line.isErrorLine && error.span) {
|
|
72
|
+
const caret = renderCaretUnderline(error.span, line.content);
|
|
73
|
+
const padding = ' '.repeat(lineNumberWidth);
|
|
74
|
+
lines.push(` ${padding} | ${caret}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
lines.push(' |');
|
|
78
|
+
}
|
|
79
|
+
// Suggestions: = help: Did you mean `$begin`?
|
|
80
|
+
if (error.suggestions && error.suggestions.length > 0) {
|
|
81
|
+
for (const suggestion of error.suggestions) {
|
|
82
|
+
lines.push(` = help: ${suggestion}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Help URL
|
|
86
|
+
if (options.verbose && error.helpUrl) {
|
|
87
|
+
lines.push(` = see: ${error.helpUrl}`);
|
|
88
|
+
}
|
|
89
|
+
// Call stack
|
|
90
|
+
if (options.includeCallStack &&
|
|
91
|
+
error.callStack &&
|
|
92
|
+
error.callStack.length > 0) {
|
|
93
|
+
lines.push('');
|
|
94
|
+
lines.push('Call stack:');
|
|
95
|
+
const depth = Math.min(error.callStack.length, options.maxCallStackDepth);
|
|
96
|
+
for (let i = 0; i < depth; i++) {
|
|
97
|
+
const frame = error.callStack[i];
|
|
98
|
+
const location = `${frame.location.start.line}:${frame.location.start.column}`;
|
|
99
|
+
const name = frame.functionName ?? '<anonymous>';
|
|
100
|
+
const context = frame.context ? ` (${frame.context})` : '';
|
|
101
|
+
lines.push(` ${i + 1}. ${name}${context} at ${location}`);
|
|
102
|
+
}
|
|
103
|
+
if (error.callStack.length > depth) {
|
|
104
|
+
lines.push(` ... ${error.callStack.length - depth} more frames`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return lines.join('\n');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Format error in JSON format (LSP Diagnostic compatible).
|
|
111
|
+
*/
|
|
112
|
+
function formatErrorJson(error, options) {
|
|
113
|
+
const diagnostic = {
|
|
114
|
+
errorId: error.errorId,
|
|
115
|
+
severity: 1, // Error severity in LSP (1 = Error, 2 = Warning, 3 = Information, 4 = Hint)
|
|
116
|
+
message: error.message,
|
|
117
|
+
source: 'rill',
|
|
118
|
+
code: error.errorId,
|
|
119
|
+
};
|
|
120
|
+
if (error.span) {
|
|
121
|
+
diagnostic.range = {
|
|
122
|
+
start: {
|
|
123
|
+
line: error.span.start.line - 1, // LSP uses 0-based line numbers
|
|
124
|
+
character: error.span.start.column,
|
|
125
|
+
},
|
|
126
|
+
end: {
|
|
127
|
+
line: error.span.end.line - 1, // LSP uses 0-based line numbers
|
|
128
|
+
character: error.span.end.column,
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (error.suggestions && error.suggestions.length > 0) {
|
|
133
|
+
diagnostic.suggestions = error.suggestions;
|
|
134
|
+
}
|
|
135
|
+
if (options.includeCallStack &&
|
|
136
|
+
error.callStack &&
|
|
137
|
+
error.callStack.length > 0) {
|
|
138
|
+
const depth = Math.min(error.callStack.length, options.maxCallStackDepth);
|
|
139
|
+
diagnostic.callStack = error.callStack.slice(0, depth).map((frame) => {
|
|
140
|
+
const callFrame = {
|
|
141
|
+
location: {
|
|
142
|
+
start: {
|
|
143
|
+
line: frame.location.start.line - 1,
|
|
144
|
+
character: frame.location.start.column,
|
|
145
|
+
},
|
|
146
|
+
end: {
|
|
147
|
+
line: frame.location.end.line - 1,
|
|
148
|
+
character: frame.location.end.column,
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
if (frame.functionName !== undefined) {
|
|
153
|
+
callFrame.functionName = frame.functionName;
|
|
154
|
+
}
|
|
155
|
+
if (frame.context !== undefined) {
|
|
156
|
+
callFrame.context = frame.context;
|
|
157
|
+
}
|
|
158
|
+
return callFrame;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (options.verbose && error.helpUrl) {
|
|
162
|
+
diagnostic.helpUrl = error.helpUrl;
|
|
163
|
+
}
|
|
164
|
+
return JSON.stringify(diagnostic, null, 2);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Format error in compact format (single line for CI).
|
|
168
|
+
*/
|
|
169
|
+
function formatErrorCompact(error) {
|
|
170
|
+
const parts = [`[${error.errorId}]`, error.message];
|
|
171
|
+
if (error.span) {
|
|
172
|
+
parts.push(`at ${error.span.start.line}:${error.span.start.column}`);
|
|
173
|
+
}
|
|
174
|
+
if (error.suggestions && error.suggestions.length > 0) {
|
|
175
|
+
parts.push(`(hint: ${error.suggestions[0]})`);
|
|
176
|
+
}
|
|
177
|
+
return parts.join(' ');
|
|
178
|
+
}
|
|
179
|
+
// ============================================================
|
|
180
|
+
// CARET UNDERLINE
|
|
181
|
+
// ============================================================
|
|
182
|
+
/**
|
|
183
|
+
* Render caret underline for error span.
|
|
184
|
+
*
|
|
185
|
+
* Constraints:
|
|
186
|
+
* - Single-char: single ^
|
|
187
|
+
* - Multi-char same line: ^^^^^ (length = span width)
|
|
188
|
+
* - Multi-line: ^^^^^ (continues) on first line only
|
|
189
|
+
*
|
|
190
|
+
* @param span - Error span
|
|
191
|
+
* @param lineContent - Content of the line
|
|
192
|
+
* @returns Caret underline string
|
|
193
|
+
* @throws {RangeError} Invalid span (start after end)
|
|
194
|
+
*/
|
|
195
|
+
export function renderCaretUnderline(span, lineContent) {
|
|
196
|
+
// EC-8: Invalid span throws RangeError
|
|
197
|
+
if (span.start.line > span.end.line ||
|
|
198
|
+
(span.start.line === span.end.line && span.start.column > span.end.column)) {
|
|
199
|
+
throw new RangeError('Span start must precede end');
|
|
200
|
+
}
|
|
201
|
+
// Calculate the width of the underline
|
|
202
|
+
const startColumn = span.start.column;
|
|
203
|
+
let endColumn;
|
|
204
|
+
if (span.start.line === span.end.line) {
|
|
205
|
+
// Single-line span: underline from start to end
|
|
206
|
+
endColumn = span.end.column;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Multi-line span: underline to end of first line
|
|
210
|
+
endColumn = lineContent.length;
|
|
211
|
+
}
|
|
212
|
+
// Build underline: spaces before, carets for the span
|
|
213
|
+
const padding = ' '.repeat(startColumn);
|
|
214
|
+
const caretCount = Math.max(1, endColumn - startColumn);
|
|
215
|
+
const carets = '^'.repeat(caretCount);
|
|
216
|
+
return padding + carets;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=cli-error-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-error-formatter.js","sourceRoot":"","sources":["../src/cli-error-formatter.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 '@rcrsr/rill';
|
|
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,aAAa,CAAC;AAuCrB;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAY1B"}
|
package/dist/cli-eval.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
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 '@rcrsr/rill';
|
|
11
|
+
import { formatOutput, determineExitCode, VERSION } from './cli-shared.js';
|
|
12
|
+
/**
|
|
13
|
+
* Parse command-line arguments into structured command
|
|
14
|
+
*/
|
|
15
|
+
function parseArgs(argv) {
|
|
16
|
+
// Check for --help and --version in any position
|
|
17
|
+
if (argv.includes('--help')) {
|
|
18
|
+
return { mode: 'help' };
|
|
19
|
+
}
|
|
20
|
+
if (argv.includes('--version')) {
|
|
21
|
+
return { mode: 'version' };
|
|
22
|
+
}
|
|
23
|
+
// Check for unknown flags (anything starting with -)
|
|
24
|
+
for (const arg of argv) {
|
|
25
|
+
if (arg.startsWith('-') && arg !== '-') {
|
|
26
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// If no arguments, default to help
|
|
30
|
+
if (argv.length === 0) {
|
|
31
|
+
return { mode: 'help' };
|
|
32
|
+
}
|
|
33
|
+
// First positional arg determines mode
|
|
34
|
+
const firstArg = argv[0];
|
|
35
|
+
// Eval mode: direct expression
|
|
36
|
+
return { mode: 'eval', expression: firstArg };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Evaluate a Rill expression without file context
|
|
40
|
+
*/
|
|
41
|
+
export async function evaluateExpression(expression) {
|
|
42
|
+
const ctx = createRuntimeContext({
|
|
43
|
+
callbacks: {
|
|
44
|
+
onLog: (value) => console.log(formatOutput(value)),
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
// Set pipeValue to empty list (Rill has no null concept per language spec)
|
|
48
|
+
ctx.pipeValue = [];
|
|
49
|
+
const ast = parse(expression);
|
|
50
|
+
return execute(ast, ctx);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Display help information
|
|
54
|
+
*/
|
|
55
|
+
function showHelp() {
|
|
56
|
+
console.log(`Rill Expression Evaluator
|
|
57
|
+
|
|
58
|
+
Usage:
|
|
59
|
+
rill-eval <expression> Evaluate a Rill expression
|
|
60
|
+
rill-eval --help Show this help message
|
|
61
|
+
rill-eval --version Show version information
|
|
62
|
+
|
|
63
|
+
Examples:
|
|
64
|
+
rill-eval '"hello".len'
|
|
65
|
+
rill-eval '5 + 3'
|
|
66
|
+
rill-eval '[1, 2, 3] -> map |x|($x * 2)'`);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Display version information
|
|
70
|
+
*/
|
|
71
|
+
function showVersion() {
|
|
72
|
+
console.log(`rill-eval ${VERSION}`);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Entry point for rill-eval binary
|
|
76
|
+
*/
|
|
77
|
+
async function main() {
|
|
78
|
+
try {
|
|
79
|
+
const args = process.argv.slice(2);
|
|
80
|
+
const command = parseArgs(args);
|
|
81
|
+
if (command.mode === 'help') {
|
|
82
|
+
showHelp();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (command.mode === 'version') {
|
|
86
|
+
showVersion();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (command.mode === 'eval') {
|
|
90
|
+
const result = await evaluateExpression(command.expression);
|
|
91
|
+
const { code, message } = determineExitCode(result.value);
|
|
92
|
+
if (message !== undefined) {
|
|
93
|
+
console.log(message);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log(formatOutput(result.value));
|
|
97
|
+
}
|
|
98
|
+
process.exit(code);
|
|
99
|
+
}
|
|
100
|
+
// Unreachable - exec mode not supported in rill-eval
|
|
101
|
+
console.error('Unexpected command mode');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Only run main if this is the entry point (not imported)
|
|
110
|
+
const shouldRunMain = process.env['NODE_ENV'] !== 'test' &&
|
|
111
|
+
!process.env['VITEST'] &&
|
|
112
|
+
!process.env['VITEST_WORKER_ID'];
|
|
113
|
+
if (shouldRunMain) {
|
|
114
|
+
main();
|
|
115
|
+
}
|
|
116
|
+
//# 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,58 @@
|
|
|
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 '@rcrsr/rill';
|
|
9
|
+
/**
|
|
10
|
+
* Parsed command-line arguments
|
|
11
|
+
*/
|
|
12
|
+
export type ParsedArgs = {
|
|
13
|
+
mode: 'exec';
|
|
14
|
+
file: string;
|
|
15
|
+
args: string[];
|
|
16
|
+
format: 'human' | 'json' | 'compact';
|
|
17
|
+
verbose: boolean;
|
|
18
|
+
maxStackDepth: number;
|
|
19
|
+
} | {
|
|
20
|
+
mode: 'eval';
|
|
21
|
+
expression: string;
|
|
22
|
+
} | {
|
|
23
|
+
mode: 'help' | 'version';
|
|
24
|
+
} | {
|
|
25
|
+
mode: 'explain';
|
|
26
|
+
errorId: string;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Parse command-line arguments into structured command
|
|
30
|
+
*
|
|
31
|
+
* @param argv - Raw command-line arguments (typically process.argv.slice(2))
|
|
32
|
+
* @returns Parsed command object
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
35
|
+
/**
|
|
36
|
+
* Execute a Rill script file with arguments and module support
|
|
37
|
+
*
|
|
38
|
+
* @param file - File path or '-' for stdin
|
|
39
|
+
* @param args - Command-line arguments to pass as $ pipe value
|
|
40
|
+
* @param options - Execution options
|
|
41
|
+
* @returns Execution result with value, variables, and source text
|
|
42
|
+
* @throws Error if file not found or execution fails
|
|
43
|
+
*/
|
|
44
|
+
export declare function executeScript(file: string, args: string[], options?: {
|
|
45
|
+
stdin?: boolean;
|
|
46
|
+
source?: string;
|
|
47
|
+
}): Promise<ExecutionResult & {
|
|
48
|
+
source: string;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Entry point for rill-exec and rill-eval binaries
|
|
52
|
+
*
|
|
53
|
+
* Parses command-line arguments, executes scripts, and handles errors.
|
|
54
|
+
* Writes results to stdout and errors to stderr.
|
|
55
|
+
* Sets process.exit(1) on any error.
|
|
56
|
+
*/
|
|
57
|
+
export declare function main(): Promise<void>;
|
|
58
|
+
//# 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,aAAa,CAAC;AAW9D;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAsIpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,eAAe,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiE/C;AAED;;;;;;GAMG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgI1C"}
|