import { dirname, delimiter } from './std/path.ts'import xArgs, { FlagDescriptor, PartialOptionDescriptor, BinaryFlag, PartialOption, Text, MAIN_COMMAND,} from './x/args.ts'
function getTargetFiles(args: readonly string[]) { const flagAlias = (x: string): FlagDescriptor => ({ alias: [x] }) const optionAlias = (x: string): PartialOptionDescriptor<string, null> => ({ alias: [x], type: Text, default: null, })
const res = xArgs .with(BinaryFlag('help', flagAlias('h'))) .with(BinaryFlag('version', flagAlias('V'))) .with(BinaryFlag('stdio')) .with(PartialOption('include', optionAlias('I'))) .parse(args)
if (res.tag !== MAIN_COMMAND) { throw new Error('Something goes wrong.') }
const { help, version, stdio, include } = res.value if (help || version || stdio) return null
const result = res.remaining().rawValues() return include ? [...result, include] : result}
function parsePreopensEnv(env?: string): Record<string, string> { if (!env) return {} const entries = env.split(delimiter).map(path => [path, path]) return Object.fromEntries(entries)}
export async function preopens(args: readonly string[], env?: string): Promise<Record<string, string>> { const preopens: Record<string, string> = parsePreopensEnv(env)
const targetFiles = getTargetFiles(args) if (!targetFiles) return preopens
if (!targetFiles.length) return { '.': '.', ...preopens }
const directories = await Promise.all( targetFiles.map(async name => { try { const stats = await Deno.lstat(name) return stats.isDirectory ? name : dirname(name) } catch (error) { if (error instanceof Deno.errors.NotFound) { return null } throw error } }), )
for (const name of directories) { if (name === null) continue preopens[name] = name }
return preopens}
export default preopens