@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
package/dist/cli-exec.js
ADDED
|
@@ -0,0 +1,326 @@
|
|
|
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 * as fs from 'fs/promises';
|
|
9
|
+
import * as fsSync from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import * as yaml from 'yaml';
|
|
12
|
+
import { parse, execute, createRuntimeContext } from '@rcrsr/rill';
|
|
13
|
+
import { formatOutput, formatError, determineExitCode, VERSION, detectHelpVersionFlag, } from './cli-shared.js';
|
|
14
|
+
import { loadModule } from './cli-module-loader.js';
|
|
15
|
+
import { explainError } from './cli-explain.js';
|
|
16
|
+
/**
|
|
17
|
+
* Parse command-line arguments into structured command
|
|
18
|
+
*
|
|
19
|
+
* @param argv - Raw command-line arguments (typically process.argv.slice(2))
|
|
20
|
+
* @returns Parsed command object
|
|
21
|
+
*/
|
|
22
|
+
export function parseArgs(argv) {
|
|
23
|
+
// Check for --help or --version flags in any position
|
|
24
|
+
const helpVersionFlag = detectHelpVersionFlag(argv);
|
|
25
|
+
if (helpVersionFlag !== null) {
|
|
26
|
+
return helpVersionFlag;
|
|
27
|
+
}
|
|
28
|
+
// Check for --explain flag (IC-11)
|
|
29
|
+
const explainIndex = argv.findIndex((arg) => arg === '--explain');
|
|
30
|
+
if (explainIndex !== -1) {
|
|
31
|
+
const errorId = argv[explainIndex + 1];
|
|
32
|
+
if (!errorId) {
|
|
33
|
+
throw new Error('Missing error ID after --explain');
|
|
34
|
+
}
|
|
35
|
+
return { mode: 'explain', errorId };
|
|
36
|
+
}
|
|
37
|
+
// Parse format, verbose, and max-stack-depth flags (IC-11)
|
|
38
|
+
let format = 'human';
|
|
39
|
+
let verbose = false;
|
|
40
|
+
let maxStackDepth = 10;
|
|
41
|
+
const formatIndex = argv.findIndex((arg) => arg === '--format');
|
|
42
|
+
if (formatIndex !== -1) {
|
|
43
|
+
const formatValue = argv[formatIndex + 1];
|
|
44
|
+
// AC-15: Unknown --format value
|
|
45
|
+
if (formatValue !== 'human' &&
|
|
46
|
+
formatValue !== 'json' &&
|
|
47
|
+
formatValue !== 'compact') {
|
|
48
|
+
throw new Error(`Invalid --format value: ${formatValue}. Must be one of: human, json, compact`);
|
|
49
|
+
}
|
|
50
|
+
format = formatValue;
|
|
51
|
+
}
|
|
52
|
+
if (argv.includes('--verbose')) {
|
|
53
|
+
verbose = true;
|
|
54
|
+
}
|
|
55
|
+
const maxStackDepthIndex = argv.findIndex((arg) => arg === '--max-stack-depth');
|
|
56
|
+
if (maxStackDepthIndex !== -1) {
|
|
57
|
+
const depthValue = argv[maxStackDepthIndex + 1];
|
|
58
|
+
if (!depthValue) {
|
|
59
|
+
throw new Error('Missing value after --max-stack-depth');
|
|
60
|
+
}
|
|
61
|
+
const depth = parseInt(depthValue, 10);
|
|
62
|
+
if (isNaN(depth) || depth < 1 || depth > 100) {
|
|
63
|
+
throw new Error('--max-stack-depth must be a number between 1 and 100');
|
|
64
|
+
}
|
|
65
|
+
maxStackDepth = depth;
|
|
66
|
+
}
|
|
67
|
+
// Check for unknown flags
|
|
68
|
+
const knownFlags = [
|
|
69
|
+
'--help',
|
|
70
|
+
'-h',
|
|
71
|
+
'--version',
|
|
72
|
+
'-v',
|
|
73
|
+
'--explain',
|
|
74
|
+
'--format',
|
|
75
|
+
'--verbose',
|
|
76
|
+
'--max-stack-depth',
|
|
77
|
+
];
|
|
78
|
+
for (let i = 0; i < argv.length; i++) {
|
|
79
|
+
const arg = argv[i];
|
|
80
|
+
if (arg && arg.startsWith('--')) {
|
|
81
|
+
if (!knownFlags.includes(arg)) {
|
|
82
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
83
|
+
}
|
|
84
|
+
// Skip next argument if this is a flag that takes a value
|
|
85
|
+
if (arg === '--format' ||
|
|
86
|
+
arg === '--max-stack-depth' ||
|
|
87
|
+
arg === '--explain') {
|
|
88
|
+
i++;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (arg && arg.startsWith('-') && arg !== '-') {
|
|
92
|
+
if (!knownFlags.includes(arg)) {
|
|
93
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Determine mode from first positional argument (skip flags and their values)
|
|
98
|
+
let firstArg;
|
|
99
|
+
const positionalArgs = [];
|
|
100
|
+
for (let i = 0; i < argv.length; i++) {
|
|
101
|
+
const arg = argv[i];
|
|
102
|
+
if (!arg)
|
|
103
|
+
continue;
|
|
104
|
+
// Skip flags
|
|
105
|
+
if (knownFlags.includes(arg)) {
|
|
106
|
+
// Skip the flag's value if it takes one
|
|
107
|
+
if (arg === '--format' ||
|
|
108
|
+
arg === '--max-stack-depth' ||
|
|
109
|
+
arg === '--explain') {
|
|
110
|
+
i++;
|
|
111
|
+
}
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
// This is a positional argument
|
|
115
|
+
if (!firstArg) {
|
|
116
|
+
firstArg = arg;
|
|
117
|
+
}
|
|
118
|
+
positionalArgs.push(arg);
|
|
119
|
+
}
|
|
120
|
+
if (!firstArg) {
|
|
121
|
+
throw new Error('Missing file argument');
|
|
122
|
+
}
|
|
123
|
+
// Eval mode is not supported in rill-exec (only rill-eval)
|
|
124
|
+
// This function is shared but context determines valid modes
|
|
125
|
+
if (firstArg === '-e') {
|
|
126
|
+
if (positionalArgs.length < 2) {
|
|
127
|
+
throw new Error('Missing expression after -e');
|
|
128
|
+
}
|
|
129
|
+
return { mode: 'eval', expression: positionalArgs[1] };
|
|
130
|
+
}
|
|
131
|
+
// Exec mode (file or stdin)
|
|
132
|
+
const file = firstArg;
|
|
133
|
+
const args = positionalArgs.slice(1);
|
|
134
|
+
return { mode: 'exec', file, args, format, verbose, maxStackDepth };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Execute a Rill script file with arguments and module support
|
|
138
|
+
*
|
|
139
|
+
* @param file - File path or '-' for stdin
|
|
140
|
+
* @param args - Command-line arguments to pass as $ pipe value
|
|
141
|
+
* @param options - Execution options
|
|
142
|
+
* @returns Execution result with value, variables, and source text
|
|
143
|
+
* @throws Error if file not found or execution fails
|
|
144
|
+
*/
|
|
145
|
+
export async function executeScript(file, args, options) {
|
|
146
|
+
// Use pre-read source if provided, otherwise read from file or stdin
|
|
147
|
+
let source;
|
|
148
|
+
let scriptPath;
|
|
149
|
+
if (options?.source !== undefined) {
|
|
150
|
+
source = options.source;
|
|
151
|
+
scriptPath =
|
|
152
|
+
file === '-'
|
|
153
|
+
? path.resolve(process.cwd(), '<stdin>')
|
|
154
|
+
: path.resolve(file);
|
|
155
|
+
}
|
|
156
|
+
else if (file === '-' || options?.stdin) {
|
|
157
|
+
// Read from stdin (must use sync API for stdin)
|
|
158
|
+
source = fsSync.readFileSync(0, 'utf-8');
|
|
159
|
+
scriptPath = path.resolve(process.cwd(), '<stdin>');
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// Check if file exists
|
|
163
|
+
try {
|
|
164
|
+
await fs.access(file);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
throw new Error(`File not found: ${file}`);
|
|
168
|
+
}
|
|
169
|
+
// Read from file
|
|
170
|
+
source = await fs.readFile(file, 'utf-8');
|
|
171
|
+
scriptPath = path.resolve(file);
|
|
172
|
+
}
|
|
173
|
+
// Parse the script
|
|
174
|
+
const ast = parse(source);
|
|
175
|
+
// Extract frontmatter for use: declarations
|
|
176
|
+
const frontmatter = ast.frontmatter
|
|
177
|
+
? (yaml.parse(ast.frontmatter.content) ?? {})
|
|
178
|
+
: {};
|
|
179
|
+
// Load modules if use: declarations exist
|
|
180
|
+
const variables = {};
|
|
181
|
+
if (frontmatter['use'] && Array.isArray(frontmatter['use'])) {
|
|
182
|
+
const cache = new Map();
|
|
183
|
+
for (const entry of frontmatter['use']) {
|
|
184
|
+
if (typeof entry === 'object' && entry !== null) {
|
|
185
|
+
const [name, modulePath] = Object.entries(entry)[0];
|
|
186
|
+
variables[name] = await loadModule(modulePath, scriptPath, cache);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Create runtime context with modules
|
|
191
|
+
const ctx = createRuntimeContext({
|
|
192
|
+
variables,
|
|
193
|
+
callbacks: {
|
|
194
|
+
onLog: (value) => console.log(formatOutput(value)),
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
// Set pipe value to arguments (string array)
|
|
198
|
+
ctx.pipeValue = args;
|
|
199
|
+
// Execute the script and return with source
|
|
200
|
+
const result = await execute(ast, ctx);
|
|
201
|
+
return { ...result, source };
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Entry point for rill-exec and rill-eval binaries
|
|
205
|
+
*
|
|
206
|
+
* Parses command-line arguments, executes scripts, and handles errors.
|
|
207
|
+
* Writes results to stdout and errors to stderr.
|
|
208
|
+
* Sets process.exit(1) on any error.
|
|
209
|
+
*/
|
|
210
|
+
export async function main() {
|
|
211
|
+
let source;
|
|
212
|
+
let formatOptions;
|
|
213
|
+
try {
|
|
214
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
215
|
+
switch (parsed.mode) {
|
|
216
|
+
case 'help':
|
|
217
|
+
console.log(`Usage:
|
|
218
|
+
rill-exec <script.rill> [args...] Execute a Rill script file
|
|
219
|
+
rill-exec - Read script from stdin
|
|
220
|
+
rill-exec --help Show this help message
|
|
221
|
+
rill-exec --version Show version information
|
|
222
|
+
rill-exec --explain RILL-XXXX Show error documentation
|
|
223
|
+
|
|
224
|
+
Options:
|
|
225
|
+
--format <format> Output format: human, json, compact (default: human)
|
|
226
|
+
--verbose Include additional error details
|
|
227
|
+
--max-stack-depth <n> Maximum call stack depth to display (default: 10, range: 1-100)
|
|
228
|
+
|
|
229
|
+
Arguments:
|
|
230
|
+
args are passed to the script as a list of strings in $ (pipe value)
|
|
231
|
+
|
|
232
|
+
Examples:
|
|
233
|
+
rill-exec script.rill
|
|
234
|
+
rill-exec script.rill arg1 arg2
|
|
235
|
+
rill-exec --format json script.rill
|
|
236
|
+
rill-exec --verbose --max-stack-depth 20 script.rill
|
|
237
|
+
rill-exec --explain RILL-R009
|
|
238
|
+
echo "log(\\"hello\\")" | rill-exec -`);
|
|
239
|
+
return;
|
|
240
|
+
case 'version': {
|
|
241
|
+
console.log(VERSION);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
case 'explain': {
|
|
245
|
+
// AC-16: Handle --explain command
|
|
246
|
+
const documentation = explainError(parsed.errorId);
|
|
247
|
+
if (documentation === null) {
|
|
248
|
+
// AC-16: Malformed errorId shows usage help
|
|
249
|
+
console.error(`Invalid error ID: ${parsed.errorId}`);
|
|
250
|
+
console.error('Error ID must be in format RILL-{L|P|R|C}{3-digit}, e.g., RILL-R009');
|
|
251
|
+
process.exit(1);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
console.log(documentation);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
case 'eval':
|
|
258
|
+
// This shouldn't happen in rill-exec, but handle it anyway
|
|
259
|
+
console.error('Eval mode not supported in rill-exec. Use rill-eval instead.');
|
|
260
|
+
process.exit(1);
|
|
261
|
+
return;
|
|
262
|
+
case 'exec': {
|
|
263
|
+
// Store format options for error handling
|
|
264
|
+
formatOptions = {
|
|
265
|
+
format: parsed.format,
|
|
266
|
+
verbose: parsed.verbose,
|
|
267
|
+
maxStackDepth: parsed.maxStackDepth,
|
|
268
|
+
};
|
|
269
|
+
// Read source early so it's available for error enrichment even if parsing fails
|
|
270
|
+
if (parsed.file === '-') {
|
|
271
|
+
source = fsSync.readFileSync(0, 'utf-8');
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
try {
|
|
275
|
+
source = await fs.readFile(parsed.file, 'utf-8');
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
throw new Error(`File not found: ${parsed.file}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Execute mode
|
|
282
|
+
const result = await executeScript(parsed.file, parsed.args, {
|
|
283
|
+
source,
|
|
284
|
+
});
|
|
285
|
+
const { code, message } = determineExitCode(result.value);
|
|
286
|
+
// Output message if present, otherwise output the result value
|
|
287
|
+
if (message !== undefined) {
|
|
288
|
+
console.log(message);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
console.log(formatOutput(result.value));
|
|
292
|
+
}
|
|
293
|
+
// Exit with computed code
|
|
294
|
+
process.exit(code);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
if (err instanceof Error) {
|
|
300
|
+
// IC-11: Pass source text and format options to formatError
|
|
301
|
+
console.error(formatError(err, source, {
|
|
302
|
+
format: formatOptions?.format ?? 'human',
|
|
303
|
+
verbose: formatOptions?.verbose ?? false,
|
|
304
|
+
includeCallStack: true,
|
|
305
|
+
maxCallStackDepth: formatOptions?.maxStackDepth ?? 10,
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
console.error(formatError(new Error(String(err)), source, {
|
|
310
|
+
format: formatOptions?.format ?? 'human',
|
|
311
|
+
verbose: formatOptions?.verbose ?? false,
|
|
312
|
+
includeCallStack: true,
|
|
313
|
+
maxCallStackDepth: formatOptions?.maxStackDepth ?? 10,
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
process.exit(1);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Only run main if not in test environment
|
|
320
|
+
const shouldRunMain = process.env['NODE_ENV'] !== 'test' &&
|
|
321
|
+
!process.env['VITEST'] &&
|
|
322
|
+
!process.env['VITEST_WORKER_ID'];
|
|
323
|
+
if (shouldRunMain) {
|
|
324
|
+
main();
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=cli-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-exec.js","sourceRoot":"","sources":["../src/cli-exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Error Explanation
|
|
3
|
+
* Function for rendering full error documentation
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Render full error documentation for --explain command.
|
|
7
|
+
*
|
|
8
|
+
* Constraints:
|
|
9
|
+
* - Lookup from ERROR_REGISTRY
|
|
10
|
+
* - Renders cause, resolution, examples sections
|
|
11
|
+
*
|
|
12
|
+
* @param errorId - Error identifier (format: RILL-{category}{3-digit})
|
|
13
|
+
* @returns Formatted documentation string, or null if errorId is invalid/unknown
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* explainError("RILL-R009")
|
|
17
|
+
* // Returns: formatted documentation with cause, resolution, examples
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* explainError("invalid")
|
|
21
|
+
* // Returns: null
|
|
22
|
+
*/
|
|
23
|
+
export declare function explainError(errorId: string): string | null;
|
|
24
|
+
//# sourceMappingURL=cli-explain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-explain.d.ts","sourceRoot":"","sources":["../src/cli-explain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkD3D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Error Explanation
|
|
3
|
+
* Function for rendering full error documentation
|
|
4
|
+
*/
|
|
5
|
+
import { ERROR_REGISTRY } from '@rcrsr/rill';
|
|
6
|
+
/**
|
|
7
|
+
* Render full error documentation for --explain command.
|
|
8
|
+
*
|
|
9
|
+
* Constraints:
|
|
10
|
+
* - Lookup from ERROR_REGISTRY
|
|
11
|
+
* - Renders cause, resolution, examples sections
|
|
12
|
+
*
|
|
13
|
+
* @param errorId - Error identifier (format: RILL-{category}{3-digit})
|
|
14
|
+
* @returns Formatted documentation string, or null if errorId is invalid/unknown
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* explainError("RILL-R009")
|
|
18
|
+
* // Returns: formatted documentation with cause, resolution, examples
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* explainError("invalid")
|
|
22
|
+
* // Returns: null
|
|
23
|
+
*/
|
|
24
|
+
export function explainError(errorId) {
|
|
25
|
+
// EC-12: Invalid errorId format returns null
|
|
26
|
+
const errorIdPattern = /^RILL-[LPRC]\d{3}$/;
|
|
27
|
+
if (!errorIdPattern.test(errorId)) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
// EC-13: Unknown errorId returns null
|
|
31
|
+
const definition = ERROR_REGISTRY.get(errorId);
|
|
32
|
+
if (!definition) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
// Build documentation sections
|
|
36
|
+
const sections = [];
|
|
37
|
+
// Header: errorId and description
|
|
38
|
+
sections.push(`${definition.errorId}: ${definition.description}`);
|
|
39
|
+
sections.push('');
|
|
40
|
+
// Cause section (if present)
|
|
41
|
+
if (definition.cause) {
|
|
42
|
+
sections.push('Cause:');
|
|
43
|
+
sections.push(` ${definition.cause}`);
|
|
44
|
+
sections.push('');
|
|
45
|
+
}
|
|
46
|
+
// Resolution section (if present)
|
|
47
|
+
if (definition.resolution) {
|
|
48
|
+
sections.push('Resolution:');
|
|
49
|
+
sections.push(` ${definition.resolution}`);
|
|
50
|
+
sections.push('');
|
|
51
|
+
}
|
|
52
|
+
// Examples section (if present)
|
|
53
|
+
if (definition.examples && definition.examples.length > 0) {
|
|
54
|
+
sections.push('Examples:');
|
|
55
|
+
for (const example of definition.examples) {
|
|
56
|
+
sections.push(` ${example.description}`);
|
|
57
|
+
sections.push('');
|
|
58
|
+
// Indent code block
|
|
59
|
+
const codeLines = example.code.split('\n');
|
|
60
|
+
for (const line of codeLines) {
|
|
61
|
+
sections.push(` ${line}`);
|
|
62
|
+
}
|
|
63
|
+
sections.push('');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return sections.join('\n').trimEnd();
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cli-explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-explain.js","sourceRoot":"","sources":["../src/cli-explain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,6CAA6C;IAC7C,MAAM,cAAc,GAAG,oBAAoB,CAAC;IAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAA+B;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,kCAAkC;IAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,6BAA6B;IAC7B,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,kCAAkC;IAClC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,gCAAgC;IAChC,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,oBAAoB;YACpB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC/B,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI LSP Diagnostic Conversion
|
|
3
|
+
* Convert RillError to LSP Diagnostic format
|
|
4
|
+
*/
|
|
5
|
+
import type { RillError } from '@rcrsr/rill';
|
|
6
|
+
export interface LspDiagnostic {
|
|
7
|
+
readonly range: LspRange | null;
|
|
8
|
+
readonly severity: 1 | 2 | 3;
|
|
9
|
+
readonly code: string;
|
|
10
|
+
readonly source: 'rill';
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly suggestions?: string[] | undefined;
|
|
13
|
+
}
|
|
14
|
+
export interface LspRange {
|
|
15
|
+
readonly start: LspPosition;
|
|
16
|
+
readonly end: LspPosition;
|
|
17
|
+
}
|
|
18
|
+
export interface LspPosition {
|
|
19
|
+
readonly line: number;
|
|
20
|
+
readonly character: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Convert RillError to LSP Diagnostic format.
|
|
24
|
+
*
|
|
25
|
+
* Constraints:
|
|
26
|
+
* - LSP uses zero-based line/character positions
|
|
27
|
+
* - Severity mapping: Error=1, Warning=2, Info=3
|
|
28
|
+
* - Source is always 'rill'
|
|
29
|
+
* - Returns diagnostic with null range when error has no span
|
|
30
|
+
*
|
|
31
|
+
* @param error - RillError to convert
|
|
32
|
+
* @returns LSP Diagnostic
|
|
33
|
+
*/
|
|
34
|
+
export declare function toLspDiagnostic(error: RillError): LspDiagnostic;
|
|
35
|
+
//# sourceMappingURL=cli-lsp-diagnostic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-lsp-diagnostic.d.ts","sourceRoot":"","sources":["../src/cli-lsp-diagnostic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAiC,MAAM,aAAa,CAAC;AAO5E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,CA8C/D"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI LSP Diagnostic Conversion
|
|
3
|
+
* Convert RillError to LSP Diagnostic format
|
|
4
|
+
*/
|
|
5
|
+
import { ERROR_REGISTRY } from '@rcrsr/rill';
|
|
6
|
+
// ============================================================
|
|
7
|
+
// LSP DIAGNOSTIC CONVERSION
|
|
8
|
+
// ============================================================
|
|
9
|
+
/**
|
|
10
|
+
* Convert RillError to LSP Diagnostic format.
|
|
11
|
+
*
|
|
12
|
+
* Constraints:
|
|
13
|
+
* - LSP uses zero-based line/character positions
|
|
14
|
+
* - Severity mapping: Error=1, Warning=2, Info=3
|
|
15
|
+
* - Source is always 'rill'
|
|
16
|
+
* - Returns diagnostic with null range when error has no span
|
|
17
|
+
*
|
|
18
|
+
* @param error - RillError to convert
|
|
19
|
+
* @returns LSP Diagnostic
|
|
20
|
+
*/
|
|
21
|
+
export function toLspDiagnostic(error) {
|
|
22
|
+
// Get error definition for severity mapping
|
|
23
|
+
const definition = ERROR_REGISTRY.get(error.errorId);
|
|
24
|
+
const errorSeverity = definition?.severity ?? 'error';
|
|
25
|
+
// Map ErrorSeverity to LSP severity (Error=1, Warning=2, Info=3)
|
|
26
|
+
const severity = mapSeverityToLsp(errorSeverity);
|
|
27
|
+
// Extract message without location suffix
|
|
28
|
+
const message = error.message.replace(/ at \d+:\d+$/, '');
|
|
29
|
+
// Convert span to LSP range (zero-based positions)
|
|
30
|
+
// EC-11: Missing span returns diagnostic with null range
|
|
31
|
+
const range = error.location
|
|
32
|
+
? {
|
|
33
|
+
start: sourceLocationToLspPosition(error.location),
|
|
34
|
+
end: sourceLocationToLspPosition(error.location),
|
|
35
|
+
}
|
|
36
|
+
: null;
|
|
37
|
+
// Extract suggestions if present (max 3)
|
|
38
|
+
const errorData = error.toData();
|
|
39
|
+
const contextSuggestions = errorData.context?.['suggestions'];
|
|
40
|
+
let suggestions;
|
|
41
|
+
if (contextSuggestions) {
|
|
42
|
+
if (Array.isArray(contextSuggestions) && contextSuggestions.length > 0) {
|
|
43
|
+
const filtered = contextSuggestions
|
|
44
|
+
.slice(0, 3)
|
|
45
|
+
.map((s) => String(s))
|
|
46
|
+
.filter((s) => s.length > 0);
|
|
47
|
+
if (filtered.length > 0) {
|
|
48
|
+
suggestions = filtered;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Build diagnostic
|
|
53
|
+
return {
|
|
54
|
+
range,
|
|
55
|
+
severity,
|
|
56
|
+
code: error.errorId,
|
|
57
|
+
source: 'rill',
|
|
58
|
+
message,
|
|
59
|
+
...(suggestions ? { suggestions } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Convert SourceLocation to zero-based LspPosition.
|
|
64
|
+
*
|
|
65
|
+
* Rill uses 1-based line and column numbers; LSP uses 0-based.
|
|
66
|
+
*
|
|
67
|
+
* @param location - Source location (1-based line, 1-based column)
|
|
68
|
+
* @returns LSP position (0-based line, 0-based character)
|
|
69
|
+
*/
|
|
70
|
+
function sourceLocationToLspPosition(location) {
|
|
71
|
+
return {
|
|
72
|
+
line: location.line - 1, // Convert 1-based to 0-based
|
|
73
|
+
character: location.column - 1, // Convert 1-based to 0-based
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Map ErrorSeverity to LSP severity code.
|
|
78
|
+
*
|
|
79
|
+
* Mapping:
|
|
80
|
+
* - 'error' -> 1 (Error)
|
|
81
|
+
* - 'warning' -> 2 (Warning)
|
|
82
|
+
* - (future) 'info' -> 3 (Information)
|
|
83
|
+
*
|
|
84
|
+
* @param severity - Error severity level
|
|
85
|
+
* @returns LSP severity code (1, 2, or 3)
|
|
86
|
+
*/
|
|
87
|
+
function mapSeverityToLsp(severity) {
|
|
88
|
+
switch (severity) {
|
|
89
|
+
case 'error':
|
|
90
|
+
return 1;
|
|
91
|
+
case 'warning':
|
|
92
|
+
return 2;
|
|
93
|
+
default:
|
|
94
|
+
// Future-proof: if other severities are added, default to error
|
|
95
|
+
return 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=cli-lsp-diagnostic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-lsp-diagnostic.js","sourceRoot":"","sources":["../src/cli-lsp-diagnostic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAyB7C,+DAA+D;AAC/D,4BAA4B;AAC5B,+DAA+D;AAE/D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,4CAA4C;IAC5C,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,aAAa,GAAkB,UAAU,EAAE,QAAQ,IAAI,OAAO,CAAC;IAErE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAEjD,0CAA0C;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAE1D,mDAAmD;IACnD,yDAAyD;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ;QAC1B,CAAC,CAAC;YACE,KAAK,EAAE,2BAA2B,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClD,GAAG,EAAE,2BAA2B,CAAC,KAAK,CAAC,QAAQ,CAAC;SACjD;QACH,CAAC,CAAC,IAAI,CAAC;IAET,yCAAyC;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IACjC,MAAM,kBAAkB,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;IAC9D,IAAI,WAAiC,CAAC;IAEtC,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvE,MAAM,QAAQ,GAAG,kBAAkB;iBAChC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,WAAW,GAAG,QAAQ,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,OAAO;QACL,KAAK;QACL,QAAQ;QACR,IAAI,EAAE,KAAK,CAAC,OAAO;QACnB,MAAM,EAAE,MAAM;QACd,OAAO;QACP,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,2BAA2B,CAAC,QAAwB;IAC3D,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,6BAA6B;QACtD,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,6BAA6B;KAC9D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB,CAAC,QAAuB;IAC/C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX;YACE,gEAAgE;YAChE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Module Loader
|
|
3
|
+
*
|
|
4
|
+
* Implements module loading for the Rill CLI with circular dependency detection.
|
|
5
|
+
* See docs/integration-modules.md for module convention specification.
|
|
6
|
+
*/
|
|
7
|
+
import type { RillValue } from '@rcrsr/rill';
|
|
8
|
+
/**
|
|
9
|
+
* Load a module and its dependencies recursively.
|
|
10
|
+
*
|
|
11
|
+
* @param specifier - Module path (relative or absolute)
|
|
12
|
+
* @param fromPath - Path of the importing file
|
|
13
|
+
* @param cache - Module cache keyed by canonical path
|
|
14
|
+
* @param chain - Set of paths in current import chain for circular detection
|
|
15
|
+
* @returns Dict of exported values
|
|
16
|
+
* @throws Error if module not found or circular dependency detected
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadModule(specifier: string, fromPath: string, cache: Map<string, Record<string, RillValue>>, chain?: Set<string>): Promise<Record<string, RillValue>>;
|
|
19
|
+
//# sourceMappingURL=cli-module-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-module-loader.d.ts","sourceRoot":"","sources":["../src/cli-module-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAC7C,KAAK,GAAE,GAAG,CAAC,MAAM,CAAa,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAuEpC"}
|