42 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
## Cross-Runtime Compatibility
 | 
						|
 | 
						|
### CLI Argument Parsing
 | 
						|
The module uses a robust cross-runtime approach for parsing command-line arguments through the `getUserArgs()` utility in `ts/smartcli.helpers.ts`.
 | 
						|
 | 
						|
**Runtime-Specific Implementations:**
 | 
						|
 | 
						|
| Runtime | process.argv Structure | Preferred API | Reason |
 | 
						|
|---------|------------------------|---------------|---------|
 | 
						|
| **Node.js** | `["/path/to/node", "/path/to/script.js", ...userArgs]` | Manual parsing | No native user-args API |
 | 
						|
| **Deno run** | `["deno", "/path/to/script.ts", ...userArgs]` | `Deno.args` ✅ | Pre-filtered by runtime |
 | 
						|
| **Deno compiled** | `["/path/to/binary", "/tmp/deno-compile-.../mod.ts", ...userArgs]` | `Deno.args` ✅ | Filters internal bundle path |
 | 
						|
| **Bun** | `["/path/to/bun", "/path/to/script.ts", ...userArgs]` | Manual parsing | Bun.argv not pre-filtered |
 | 
						|
 | 
						|
**Why Deno.args is Critical for Compiled Executables:**
 | 
						|
 | 
						|
Deno compiled executables insert an internal bundle path at `argv[1]`:
 | 
						|
```javascript
 | 
						|
process.argv = [
 | 
						|
  "/usr/local/bin/moxytool",              // argv[0] - executable
 | 
						|
  "/tmp/deno-compile-moxytool/mod.ts",    // argv[1] - INTERNAL bundle path
 | 
						|
  "scripts",                               // argv[2] - actual user command
 | 
						|
  "--option"                               // argv[3+] - user args
 | 
						|
]
 | 
						|
 | 
						|
Deno.args = ["scripts", "--option"]  // ✓ Correctly filtered by Deno runtime
 | 
						|
```
 | 
						|
 | 
						|
**getUserArgs() Logic:**
 | 
						|
 | 
						|
1. **Prefer Deno.args** when available (unless process.argv appears manipulated for testing)
 | 
						|
2. **Fallback to manual parsing** for Node.js and Bun:
 | 
						|
   - Check `process.execPath` basename
 | 
						|
   - Known launchers (node, deno, bun, tsx, ts-node) → skip 2 args
 | 
						|
   - Unknown (compiled executables) → skip 1 arg
 | 
						|
3. **Test detection**: If `process.argv.length > 2` in Deno, use manual parsing (handles test manipulation)
 | 
						|
 | 
						|
**Key Benefits:**
 | 
						|
- ✅ Works with custom-named compiled executables
 | 
						|
- ✅ Handles Deno's internal bundle path automatically
 | 
						|
- ✅ Compatible with test environments
 | 
						|
- ✅ No heuristics needed for Deno (runtime does the work) |