args and --

This commit is contained in:
Chris Wanstrath 2025-11-09 20:25:34 -08:00
parent feae5d314e
commit 5d3f91b380
3 changed files with 43 additions and 19 deletions

View File

@ -33,10 +33,10 @@ function showVersion() {
console.log('🦐 v0.0.1') console.log('🦐 v0.0.1')
} }
async function evalCode(code: string, imports: string[]) { async function evalCode(code: string, imports: string[], globals?: Record<string, any>) {
const importStatement = imports.length > 0 ? `import ${imports.join(' ')}` : '' const importStatement = imports.length > 0 ? `import ${imports.join(' ')}` : ''
if (importStatement) code = `${importStatement}; ${code}` if (importStatement) code = `${importStatement}; ${code}`
return await runCode(code) return await runCode(code, globals)
} }
async function main() { async function main() {
@ -47,11 +47,29 @@ async function main() {
return return
} }
// Parse -I flags for imports (supports both "-I math" and "-Imath") // cli command and arg
let command = ''
let cmdArg = ''
// parse -I flags for imports. supports both "-I math" and "-Imath"
const imports: string[] = [] const imports: string[] = []
while (args.length > 0) { // shrimp -E args -- arg1 arg2
const arg = args[0] let grabArgs = false
let scriptArgs = []
for (const arg of args) {
// everything after -- goes into "args" for this script
if (arg === '--') {
grabArgs = true
continue
}
// grab all args after --
if (grabArgs) {
scriptArgs.push(arg)
continue
}
if (arg === '-I') { if (arg === '-I') {
// "-I math" format // "-I math" format
@ -70,8 +88,12 @@ async function main() {
} }
imports.push(moduleName) imports.push(moduleName)
args = args.slice(1) args = args.slice(1)
}
if (!command) {
command = arg
} else { } else {
break cmdArg = arg
} }
} }
@ -80,8 +102,6 @@ async function main() {
return return
} }
const command = args[0]
if (['help', '-help', '--help', '-h'].includes(command)) { if (['help', '-help', '--help', '-h'].includes(command)) {
showHelp() showHelp()
return return
@ -101,29 +121,29 @@ async function main() {
} }
if (['eval', '-eval', '--eval', '-e'].includes(command)) { if (['eval', '-eval', '--eval', '-e'].includes(command)) {
const code = args[1] const code = cmdArg
if (!code) { if (!code) {
console.log(`${colors.bright}usage: shrimp eval <code>${colors.reset}`) console.log(`${colors.bright}usage: shrimp eval <code>${colors.reset}`)
process.exit(1) process.exit(1)
} }
await evalCode(code, imports) await evalCode(code, imports, { args: scriptArgs })
return return
} }
if (['print', '-print', '--print', '-E'].includes(command)) { if (['print', '-print', '--print', '-E'].includes(command)) {
const code = args[1] const code = cmdArg
if (!code) { if (!code) {
console.log(`${colors.bright}usage: shrimp print <code>${colors.reset}`) console.log(`${colors.bright}usage: shrimp print <code>${colors.reset}`)
process.exit(1) process.exit(1)
} }
console.log(await evalCode(code, imports)) console.log(await evalCode(code, imports, { args: scriptArgs }))
return return
} }
if (['bytecode', '-bytecode', '--bytecode', '-b'].includes(command)) { if (['bytecode', '-bytecode', '--bytecode', '-b'].includes(command)) {
const file = args[1] const file = cmdArg
if (!file) { if (!file) {
console.log(`${colors.bright}usage: shrimp bytecode <file>${colors.reset}`) console.log(`${colors.bright}usage: shrimp bytecode <file>${colors.reset}`)
process.exit(1) process.exit(1)
@ -133,7 +153,7 @@ async function main() {
} }
if (['parse', '-parse', '--parse', '-p'].includes(command)) { if (['parse', '-parse', '--parse', '-p'].includes(command)) {
const file = args[1] const file = cmdArg
if (!file) { if (!file) {
console.log(`${colors.bright}usage: shrimp parse <file>${colors.reset}`) console.log(`${colors.bright}usage: shrimp parse <file>${colors.reset}`)
process.exit(1) process.exit(1)
@ -144,7 +164,7 @@ async function main() {
} }
if (['run', '-run', '--run', '-r'].includes(command)) { if (['run', '-run', '--run', '-r'].includes(command)) {
const file = args[1] const file = cmdArg
if (!file) { if (!file) {
console.log(`${colors.bright}usage: shrimp run <file>${colors.reset}`) console.log(`${colors.bright}usage: shrimp run <file>${colors.reset}`)
process.exit(1) process.exit(1)

View File

@ -50,7 +50,6 @@ export const globals = {
const only = new Set(onlyArray) const only = new Set(onlyArray)
const wantsOnly = only.size > 0 const wantsOnly = only.size > 0
for (const ident of idents) { for (const ident of idents) {
const module = this.get(ident) const module = this.get(ident)
@ -66,7 +65,8 @@ export const globals = {
}, },
// env // env
args: Bun.argv.slice(1), argv: Bun.argv.slice(1), // everything
args: Bun.argv.slice(3), // only args specifically passed to this script/program
exit: (num: number) => process.exit(num ?? 0), exit: (num: number) => process.exit(num ?? 0),
// type predicates // type predicates

View File

@ -87,8 +87,12 @@ describe('environment', () => {
await expect(`type args`).toEvaluateTo('array', globals) await expect(`type args`).toEvaluateTo('array', globals)
}) })
test('', async () => { test('args is just stuff passed to the script', async () => {
await expect(`list.first args | str.ends-with? 'shrimp.test.ts'`).toEvaluateTo(true) await expect(`list.empty? args`).toEvaluateTo(true)
})
test('argv is all the classic argv info (minus bun)', async () => {
await expect(`list.first argv | str.ends-with? 'shrimp.test.ts'`).toEvaluateTo(true)
}) })
}) })