shfs 0.3.1 → 0.3.3

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/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as formatStderr, c as compile, i as writeDiagnosticsToStderr, l as parse, o as formatStdoutRecord, r as isShellDiagnosticError, s as ParseSyntaxError, t as execute } from "./execute-1PmTy1KA.mjs";
1
+ import { a as BufferedOutputStream, c as ParseSyntaxError, i as writeDiagnosticsToStderr, l as compile, o as formatStderr, r as isShellDiagnosticError, s as formatStdoutRecord, t as execute, u as parse } from "./execute-DV1hpsh-.mjs";
2
2
  //#region src/output-channels.ts
3
3
  var ShellOutput = class {
4
4
  exitCode;
@@ -216,21 +216,21 @@ var Shell = class {
216
216
  const context = {
217
217
  cwd: commandStartCwd,
218
218
  status: this.currentStatus,
219
- stderr: [],
219
+ stderr: new BufferedOutputStream(),
220
220
  globalVars: this.globalVars,
221
221
  localVars: /* @__PURE__ */ new Map()
222
222
  };
223
223
  try {
224
224
  return {
225
225
  stdout: await collectStdoutRecords(execute(ir(), fs, context)),
226
- stderr: [...context.stderr],
226
+ stderr: context.stderr.snapshot(),
227
227
  exitCode: context.status
228
228
  };
229
229
  } catch (error) {
230
230
  handleDiagnosticFailure(error, context);
231
231
  return {
232
232
  stdout: [],
233
- stderr: [...context.stderr],
233
+ stderr: context.stderr.snapshot(),
234
234
  exitCode: context.status ?? 1
235
235
  };
236
236
  } finally {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["formatRecord"],"sources":["../src/output-channels.ts","../src/consumer/consumer.ts","../src/util/lazy.ts","../src/shell/shell.ts"],"sourcesContent":["import type { Buffer } from 'node:buffer';\n\nimport type { Record as StdoutRecord } from './record';\n\nexport interface OutputChannels<TStdout = StdoutRecord> {\n\tstdout: readonly TStdout[];\n\tstderr: readonly string[];\n\texitCode: number;\n}\n\nexport interface ShellOutputInit {\n\texitCode: number;\n\tstderr: Buffer;\n\tstdout: Buffer;\n}\n\nexport class ShellOutput {\n\treadonly exitCode: number;\n\treadonly stderr: Buffer;\n\treadonly stdout: Buffer;\n\n\tconstructor(init: ShellOutputInit) {\n\t\tthis.exitCode = init.exitCode;\n\t\tthis.stderr = init.stderr;\n\t\tthis.stdout = init.stdout;\n\t}\n\n\tarrayBuffer(): ArrayBuffer {\n\t\treturn toArrayBuffer(this.stdout);\n\t}\n\n\tblob(): Blob {\n\t\treturn new Blob([this.stdout]);\n\t}\n\n\tbytes(): Uint8Array {\n\t\treturn new Uint8Array(this.stdout);\n\t}\n\n\tjson(): unknown {\n\t\treturn JSON.parse(this.text());\n\t}\n\n\ttext(encoding: BufferEncoding = 'utf8'): string {\n\t\treturn this.stdout.toString(encoding);\n\t}\n}\n\nexport class ShellError extends Error {\n\toverride cause?: unknown;\n\treadonly exitCode: number;\n\treadonly stderr: Buffer;\n\treadonly stdout: Buffer;\n\n\tconstructor(output: ShellOutput, cause?: unknown) {\n\t\tconst stderrText = output.stderr.toString('utf8');\n\t\tsuper(\n\t\t\tstderrText === ''\n\t\t\t\t? `Shell command failed with exit code ${output.exitCode}`\n\t\t\t\t: stderrText\n\t\t);\n\t\tthis.name = 'ShellError';\n\t\tthis.cause = cause;\n\t\tthis.exitCode = output.exitCode;\n\t\tthis.stdout = output.stdout;\n\t\tthis.stderr = output.stderr;\n\t}\n}\n\nexport type ExecuteOutput = OutputChannels;\n\nfunction toArrayBuffer(buffer: Uint8Array): ArrayBuffer {\n\treturn buffer.buffer.slice(\n\t\tbuffer.byteOffset,\n\t\tbuffer.byteOffset + buffer.byteLength\n\t) as ArrayBuffer;\n}\n","import { formatRecord, type Record } from '../record';\nimport type { Stream } from '../stream';\n\n/**\n * A Consumer terminates a stream.\n * It pulls values and produces a final result or side-effect.\n */\nexport type Consumer<T, R = void> = (input: Stream<T>) => Promise<R>;\n\n/**\n * Collects the entire stream into memory.\n * Pure from an API perspective.\n */\nexport function collect<T>(): Consumer<T, T[]> {\n\treturn async (input) => {\n\t\tconst out: T[] = [];\n\t\tfor await (const item of input) {\n\t\t\tout.push(item);\n\t\t}\n\t\treturn out;\n\t};\n}\n\n/**\n * Streams records directly to stdout.\n * Side-effecting, non-buffering.\n */\nexport function stdout(): Consumer<Record> {\n\treturn async (input) => {\n\t\tfor await (const record of input) {\n\t\t\tprocess.stdout.write(`${formatRecord(record)}\\n`);\n\t\t}\n\t};\n}\n","export function lazy<T>(fn: () => T) {\n\tlet value: T | undefined;\n\tlet loaded = false;\n\n\treturn (): T => {\n\t\tif (loaded) {\n\t\t\treturn value as T;\n\t\t}\n\n\t\tloaded = true;\n\t\tvalue = fn();\n\t\treturn value as T;\n\t};\n}\n","import {\n\tcompile,\n\tParseSyntaxError,\n\tparse,\n\ttype ScriptIR,\n} from '@shfs/compiler';\n\nimport { collect } from '../consumer/consumer';\nimport {\n\tisShellDiagnosticError,\n\twriteDiagnosticsToStderr,\n} from '../diagnostics';\nimport { type ExecuteResult, execute } from '../execute/execute';\nimport type { FS } from '../fs/fs';\nimport {\n\ttype OutputChannels,\n\tShellError,\n\tShellOutput,\n} from '../output-channels';\nimport { formatRecord, type Record } from '../record';\nimport { formatStderr } from '../stderr';\nimport { lazy } from '../util/lazy';\n\nconst ROOT_DIRECTORY = '/';\nconst MULTIPLE_SLASH_REGEX = /\\/+/g;\nconst TRAILING_NEWLINE_REGEX = /\\n$/;\nconst TRAILING_SLASH_REGEX = /\\/+$/;\n\nexport interface ShellOptions {\n\tcwd?: string;\n}\n\nexport interface ShellCommand {\n\treadonly [Symbol.toStringTag]: string;\n\tarrayBuffer(): Promise<ArrayBuffer>;\n\tblob(): Promise<Blob>;\n\tbytes(): Promise<Uint8Array>;\n\tcatch<TResult = never>(\n\t\tonrejected?:\n\t\t\t| null\n\t\t\t| ((reason: unknown) => TResult | PromiseLike<TResult>)\n\t): Promise<ShellOutput | TResult>;\n\tcwd(path: string): ShellCommand;\n\tfinally(onfinally?: null | (() => void)): Promise<ShellOutput>;\n\tjson(): Promise<unknown>;\n\tlines(): AsyncIterable<string>;\n\tnothrow(): ShellCommand;\n\tquiet(isQuiet?: boolean): ShellCommand;\n\ttext(): Promise<string>;\n\tthen<TResult1 = ShellOutput, TResult2 = never>(\n\t\tonfulfilled?:\n\t\t\t| null\n\t\t\t| ((value: ShellOutput) => TResult1 | PromiseLike<TResult1>),\n\t\tonrejected?:\n\t\t\t| null\n\t\t\t| ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n\t): Promise<TResult1 | TResult2>;\n\tthrows(shouldThrow: boolean): ShellCommand;\n}\n\nfunction normalizeAbsolutePath(path: string): string {\n\tconst withLeadingSlash = path.startsWith(ROOT_DIRECTORY)\n\t\t? path\n\t\t: `${ROOT_DIRECTORY}${path}`;\n\tconst singleSlashes = withLeadingSlash.replace(MULTIPLE_SLASH_REGEX, '/');\n\tconst segments = singleSlashes.split(ROOT_DIRECTORY);\n\tconst normalizedSegments: string[] = [];\n\tfor (const segment of segments) {\n\t\tif (segment === '' || segment === '.') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (segment === '..') {\n\t\t\tnormalizedSegments.pop();\n\t\t\tcontinue;\n\t\t}\n\t\tnormalizedSegments.push(segment);\n\t}\n\treturn `${ROOT_DIRECTORY}${normalizedSegments.join(ROOT_DIRECTORY)}`;\n}\n\nfunction normalizeCwd(cwd: string): string {\n\tif (cwd === '') {\n\t\treturn ROOT_DIRECTORY;\n\t}\n\tconst normalized = normalizeAbsolutePath(cwd);\n\tconst trimmed = normalized.replace(TRAILING_SLASH_REGEX, '');\n\treturn trimmed === '' ? ROOT_DIRECTORY : trimmed;\n}\n\nasync function collectStdoutRecords(result: ExecuteResult): Promise<Record[]> {\n\tif (result.kind === 'sink') {\n\t\tawait result.value;\n\t\treturn [];\n\t}\n\treturn collect<Record>()(result.value);\n}\n\nfunction buildStdoutText(records: readonly Record[]): string {\n\treturn records.map((record) => formatRecord(record)).join('\\n');\n}\n\nfunction createShellOutput(result: OutputChannels<Record>): ShellOutput {\n\treturn new ShellOutput({\n\t\texitCode: result.exitCode,\n\t\tstderr: Buffer.from(formatStderr(result.stderr), 'utf8'),\n\t\tstdout: Buffer.from(buildStdoutText(result.stdout), 'utf8'),\n\t});\n}\n\nfunction splitLines(text: string): string[] {\n\tif (text === '') {\n\t\treturn [];\n\t}\n\treturn text.replace(TRAILING_NEWLINE_REGEX, '').split('\\n');\n}\n\nclass ShellPromise {\n\treadonly [Symbol.toStringTag] = 'ShellPromise';\n\tprivate command: ShellCommand | undefined;\n\tprivate cwdOverride: string | undefined;\n\tprivate settledResult: Promise<OutputChannels<Record>> | undefined;\n\tprivate shouldThrow = true;\n\tprivate readonly runCommand: (\n\t\tcwdOverride: string | undefined\n\t) => Promise<OutputChannels<Record>>;\n\n\tconstructor(\n\t\trunCommand: (\n\t\t\tcwdOverride: string | undefined\n\t\t) => Promise<OutputChannels<Record>>\n\t) {\n\t\tthis.runCommand = runCommand;\n\t}\n\n\tasync arrayBuffer(): Promise<ArrayBuffer> {\n\t\treturn (await this.resolveOutput()).arrayBuffer();\n\t}\n\n\tasync blob(): Promise<Blob> {\n\t\treturn (await this.resolveOutput()).blob();\n\t}\n\n\tasync bytes(): Promise<Uint8Array> {\n\t\treturn (await this.resolveOutput()).bytes();\n\t}\n\n\tcwd(path: string): ShellCommand {\n\t\tthis.cwdOverride = normalizeCwd(path);\n\t\treturn this.command ?? (this as unknown as ShellCommand);\n\t}\n\n\tasync json(): Promise<unknown> {\n\t\treturn (await this.resolveOutput()).json();\n\t}\n\n\tlines(): AsyncIterable<string> {\n\t\treturn (async function* (command: ShellPromise): AsyncIterable<string> {\n\t\t\tfor (const line of splitLines(await command.text())) {\n\t\t\t\tyield line;\n\t\t\t}\n\t\t})(this);\n\t}\n\n\tnothrow(): ShellCommand {\n\t\tthis.shouldThrow = false;\n\t\treturn this.command ?? (this as unknown as ShellCommand);\n\t}\n\n\tquiet(_isQuiet = true): ShellCommand {\n\t\treturn this.command ?? (this as unknown as ShellCommand);\n\t}\n\n\tasync text(): Promise<string> {\n\t\treturn (await this.resolveOutput()).text();\n\t}\n\n\tthrows(shouldThrow: boolean): ShellCommand {\n\t\tthis.shouldThrow = shouldThrow;\n\t\treturn this.command ?? (this as unknown as ShellCommand);\n\t}\n\n\tasPromise(): Promise<ShellOutput> {\n\t\treturn this.resolveOutput();\n\t}\n\n\tsetCommand(command: ShellCommand): void {\n\t\tthis.command = command;\n\t}\n\n\tprivate async resolveOutput(): Promise<ShellOutput> {\n\t\tconst output = createShellOutput(await this.runWithContext());\n\t\tif (this.shouldThrow && output.exitCode !== 0) {\n\t\t\tthrow new ShellError(output);\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate async runWithContext(): Promise<OutputChannels<Record>> {\n\t\tif (!this.settledResult) {\n\t\t\tthis.settledResult = this.runCommand(this.cwdOverride);\n\t\t}\n\t\treturn await this.settledResult;\n\t}\n}\n\nfunction createShellCommand(core: ShellPromise): ShellCommand {\n\tconst command = new Proxy(core as object, {\n\t\tget(target, property, receiver) {\n\t\t\tif (\n\t\t\t\tproperty === 'then' ||\n\t\t\t\tproperty === 'catch' ||\n\t\t\t\tproperty === 'finally'\n\t\t\t) {\n\t\t\t\tconst promise = core.asPromise() as Promise<ShellOutput>;\n\t\t\t\tconst value = Reflect.get(promise, property, promise);\n\t\t\t\treturn typeof value === 'function'\n\t\t\t\t\t? value.bind(promise)\n\t\t\t\t\t: value;\n\t\t\t}\n\n\t\t\tconst value = Reflect.get(target, property, receiver);\n\t\t\treturn typeof value === 'function' ? value.bind(core) : value;\n\t\t},\n\t}) as ShellCommand;\n\n\tcore.setCommand(command);\n\treturn command;\n}\n\nexport class Shell {\n\tprivate readonly fs: FS;\n\tprivate currentCwd: string;\n\tprivate currentStatus = 0;\n\tprivate readonly globalVars = new Map<string, string>();\n\n\tconstructor(fs: FS, options: ShellOptions = {}) {\n\t\tthis.fs = fs;\n\t\tthis.currentCwd = normalizeCwd(options.cwd ?? ROOT_DIRECTORY);\n\t}\n\n\t$ = (strings: TemplateStringsArray, ...exprs: unknown[]) => {\n\t\treturn this._exec(strings, ...exprs);\n\t};\n\n\texec(strings: TemplateStringsArray, ...exprs: unknown[]) {\n\t\treturn this._exec(strings, ...exprs);\n\t}\n\n\tcwd(newCwd: string): void {\n\t\tthis.currentCwd = normalizeCwd(newCwd);\n\t}\n\n\tprivate _exec(strings: TemplateStringsArray, ...exprs: unknown[]) {\n\t\tconst source = String.raw(strings, ...exprs);\n\t\tconst fs = this.fs;\n\t\tconst ir = lazy<ScriptIR>(() => {\n\t\t\tconst ast = parse(source);\n\t\t\treturn compile(ast);\n\t\t});\n\n\t\treturn createShellCommand(\n\t\t\tnew ShellPromise(async (cwdOverride) => {\n\t\t\t\tconst commandStartCwd = normalizeCwd(\n\t\t\t\t\tcwdOverride ?? this.currentCwd\n\t\t\t\t);\n\t\t\t\tconst context = {\n\t\t\t\t\tcwd: commandStartCwd,\n\t\t\t\t\tstatus: this.currentStatus,\n\t\t\t\t\tstderr: [] as string[],\n\t\t\t\t\tglobalVars: this.globalVars,\n\t\t\t\t\tlocalVars: new Map<string, string>(),\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstdout: await collectStdoutRecords(\n\t\t\t\t\t\t\texecute(ir(), fs, context)\n\t\t\t\t\t\t),\n\t\t\t\t\t\tstderr: [...context.stderr],\n\t\t\t\t\t\texitCode: context.status,\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\thandleDiagnosticFailure(error, context);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstdout: [],\n\t\t\t\t\t\tstderr: [...context.stderr],\n\t\t\t\t\t\texitCode: context.status ?? 1,\n\t\t\t\t\t};\n\t\t\t\t} finally {\n\t\t\t\t\tthis.currentStatus = context.status ?? this.currentStatus;\n\t\t\t\t\tif (\n\t\t\t\t\t\tcwdOverride === undefined ||\n\t\t\t\t\t\tcontext.cwd !== commandStartCwd\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.currentCwd = context.cwd;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n}\n\nfunction handleDiagnosticFailure(\n\terror: unknown,\n\tcontext: {\n\t\tstatus?: number;\n\t\tstderr: string[];\n\t}\n): void {\n\tif (error instanceof ParseSyntaxError) {\n\t\tcontext.status = 1;\n\t\twriteDiagnosticsToStderr(context, [error.diagnostic]);\n\t\treturn;\n\t}\n\tif (isShellDiagnosticError(error)) {\n\t\tcontext.status = error.exitCode;\n\t\twriteDiagnosticsToStderr(context, error.diagnostics);\n\t\treturn;\n\t}\n\tcontext.status = 1;\n\tthrow error;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["formatRecord"],"sources":["../src/output-channels.ts","../src/consumer/consumer.ts","../src/util/lazy.ts","../src/shell/shell.ts"],"sourcesContent":["import type { Buffer } from 'node:buffer';\n\nimport type { Record as StdoutRecord } from './record';\n\nexport interface OutputChannels<TStdout = StdoutRecord> {\n\tstdout: readonly TStdout[];\n\tstderr: readonly string[];\n\texitCode: number;\n}\n\nexport interface ShellOutputInit {\n\texitCode: number;\n\tstderr: Buffer;\n\tstdout: Buffer;\n}\n\nexport class ShellOutput {\n\treadonly exitCode: number;\n\treadonly stderr: Buffer;\n\treadonly stdout: Buffer;\n\n\tconstructor(init: ShellOutputInit) {\n\t\tthis.exitCode = init.exitCode;\n\t\tthis.stderr = init.stderr;\n\t\tthis.stdout = init.stdout;\n\t}\n\n\tarrayBuffer(): ArrayBuffer {\n\t\treturn toArrayBuffer(this.stdout);\n\t}\n\n\tblob(): Blob {\n\t\treturn new Blob([this.stdout]);\n\t}\n\n\tbytes(): Uint8Array {\n\t\treturn new Uint8Array(this.stdout);\n\t}\n\n\tjson(): unknown {\n\t\treturn JSON.parse(this.text());\n\t}\n\n\ttext(encoding: BufferEncoding = 'utf8'): string {\n\t\treturn this.stdout.toString(encoding);\n\t}\n}\n\nexport class ShellError extends Error {\n\toverride cause?: unknown;\n\treadonly exitCode: number;\n\treadonly stderr: Buffer;\n\treadonly stdout: Buffer;\n\n\tconstructor(output: ShellOutput, cause?: unknown) {\n\t\tconst stderrText = output.stderr.toString('utf8');\n\t\tsuper(\n\t\t\tstderrText === ''\n\t\t\t\t? `Shell command failed with exit code ${output.exitCode}`\n\t\t\t\t: stderrText\n\t\t);\n\t\tthis.name = 'ShellError';\n\t\tthis.cause = cause;\n\t\tthis.exitCode = output.exitCode;\n\t\tthis.stdout = output.stdout;\n\t\tthis.stderr = output.stderr;\n\t}\n}\n\nexport type ExecuteOutput = OutputChannels;\n\nfunction toArrayBuffer(buffer: Uint8Array): ArrayBuffer {\n\treturn buffer.buffer.slice(\n\t\tbuffer.byteOffset,\n\t\tbuffer.byteOffset + buffer.byteLength\n\t) as ArrayBuffer;\n}\n","import { formatRecord, type Record } from '../record';\nimport type { Stream } from '../stream';\n\n/**\n * A Consumer terminates a stream.\n * It pulls values and produces a final result or side-effect.\n */\nexport type Consumer<T, R = void> = (input: Stream<T>) => Promise<R>;\n\n/**\n * Collects the entire stream into memory.\n * Pure from an API perspective.\n */\nexport function collect<T>(): Consumer<T, T[]> {\n\treturn async (input) => {\n\t\tconst out: T[] = [];\n\t\tfor await (const item of input) {\n\t\t\tout.push(item);\n\t\t}\n\t\treturn out;\n\t};\n}\n\n/**\n * Streams records directly to stdout.\n * Side-effecting, non-buffering.\n */\nexport function stdout(): Consumer<Record> {\n\treturn async (input) => {\n\t\tfor await (const record of input) {\n\t\t\tprocess.stdout.write(`${formatRecord(record)}\\n`);\n\t\t}\n\t};\n}\n","export function lazy<T>(fn: () => T) {\n\tlet value: T | undefined;\n\tlet loaded = false;\n\n\treturn (): T => {\n\t\tif (loaded) {\n\t\t\treturn value as T;\n\t\t}\n\n\t\tloaded = true;\n\t\tvalue = fn();\n\t\treturn value as T;\n\t};\n}\n","import {\n\tcompile,\n\tParseSyntaxError,\n\tparse,\n\ttype ScriptIR,\n} from '@shfs/compiler';\n\nimport { collect } from '../consumer/consumer';\nimport {\n\tisShellDiagnosticError,\n\twriteDiagnosticsToStderr,\n} from '../diagnostics';\nimport { type ExecuteResult, execute } from '../execute/execute';\nimport type { FS } from '../fs/fs';\nimport {\n\ttype OutputChannels,\n\tShellError,\n\tShellOutput,\n} from '../output-channels';\nimport { formatRecord, type Record } from '../record';\nimport {\n\tBufferedOutputStream,\n\tformatStderr,\n\ttype OutputStream,\n} from '../stderr';\nimport { lazy } from '../util/lazy';\n\nconst ROOT_DIRECTORY = '/';\nconst MULTIPLE_SLASH_REGEX = /\\/+/g;\nconst TRAILING_NEWLINE_REGEX = /\\n$/;\nconst TRAILING_SLASH_REGEX = /\\/+$/;\n\nexport interface ShellOptions {\n\tcwd?: string;\n}\n\nexport interface ShellCommand {\n\treadonly [Symbol.toStringTag]: string;\n\tarrayBuffer(): Promise<ArrayBuffer>;\n\tblob(): Promise<Blob>;\n\tbytes(): Promise<Uint8Array>;\n\tcatch<TResult = never>(\n\t\tonrejected?:\n\t\t\t| null\n\t\t\t| ((reason: unknown) => TResult | PromiseLike<TResult>)\n\t): Promise<ShellOutput | TResult>;\n\tcwd(path: string): ShellCommand;\n\tfinally(onfinally?: null | (() => void)): Promise<ShellOutput>;\n\tjson(): Promise<unknown>;\n\tlines(): AsyncIterable<string>;\n\tnothrow(): ShellCommand;\n\tquiet(isQuiet?: boolean): ShellCommand;\n\ttext(): Promise<string>;\n\tthen<TResult1 = ShellOutput, TResult2 = never>(\n\t\tonfulfilled?:\n\t\t\t| null\n\t\t\t| ((value: ShellOutput) => TResult1 | PromiseLike<TResult1>),\n\t\tonrejected?:\n\t\t\t| null\n\t\t\t| ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n\t): Promise<TResult1 | TResult2>;\n\tthrows(shouldThrow: boolean): ShellCommand;\n}\n\nfunction normalizeAbsolutePath(path: string): string {\n\tconst withLeadingSlash = path.startsWith(ROOT_DIRECTORY)\n\t\t? path\n\t\t: `${ROOT_DIRECTORY}${path}`;\n\tconst singleSlashes = withLeadingSlash.replace(MULTIPLE_SLASH_REGEX, '/');\n\tconst segments = singleSlashes.split(ROOT_DIRECTORY);\n\tconst normalizedSegments: string[] = [];\n\tfor (const segment of segments) {\n\t\tif (segment === '' || segment === '.') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (segment === '..') {\n\t\t\tnormalizedSegments.pop();\n\t\t\tcontinue;\n\t\t}\n\t\tnormalizedSegments.push(segment);\n\t}\n\treturn `${ROOT_DIRECTORY}${normalizedSegments.join(ROOT_DIRECTORY)}`;\n}\n\nfunction normalizeCwd(cwd: string): string {\n\tif (cwd === '') {\n\t\treturn ROOT_DIRECTORY;\n\t}\n\tconst normalized = normalizeAbsolutePath(cwd);\n\tconst trimmed = normalized.replace(TRAILING_SLASH_REGEX, '');\n\treturn trimmed === '' ? ROOT_DIRECTORY : trimmed;\n}\n\nasync function collectStdoutRecords(result: ExecuteResult): Promise<Record[]> {\n\tif (result.kind === 'sink') {\n\t\tawait result.value;\n\t\treturn [];\n\t}\n\treturn collect<Record>()(result.value);\n}\n\nfunction buildStdoutText(records: readonly Record[]): string {\n\treturn records.map((record) => formatRecord(record)).join('\\n');\n}\n\nfunction createShellOutput(result: OutputChannels<Record>): ShellOutput {\n\treturn new ShellOutput({\n\t\texitCode: result.exitCode,\n\t\tstderr: Buffer.from(formatStderr(result.stderr), 'utf8'),\n\t\tstdout: Buffer.from(buildStdoutText(result.stdout), 'utf8'),\n\t});\n}\n\nfunction splitLines(text: string): string[] {\n\tif (text === '') {\n\t\treturn [];\n\t}\n\treturn text.replace(TRAILING_NEWLINE_REGEX, '').split('\\n');\n}\n\nclass ShellPromise {\n\treadonly [Symbol.toStringTag] = 'ShellPromise';\n\tprivate command: ShellCommand | undefined;\n\tprivate cwdOverride: string | undefined;\n\tprivate settledResult: Promise<OutputChannels<Record>> | undefined;\n\tprivate shouldThrow = true;\n\tprivate readonly runCommand: (\n\t\tcwdOverride: string | undefined\n\t) => Promise<OutputChannels<Record>>;\n\n\tconstructor(\n\t\trunCommand: (\n\t\t\tcwdOverride: string | undefined\n\t\t) => Promise<OutputChannels<Record>>\n\t) {\n\t\tthis.runCommand = runCommand;\n\t}\n\n\tasync arrayBuffer(): Promise<ArrayBuffer> {\n\t\treturn (await this.resolveOutput()).arrayBuffer();\n\t}\n\n\tasync blob(): Promise<Blob> {\n\t\treturn (await this.resolveOutput()).blob();\n\t}\n\n\tasync bytes(): Promise<Uint8Array> {\n\t\treturn (await this.resolveOutput()).bytes();\n\t}\n\n\tcwd(path: string): ShellCommand {\n\t\tthis.cwdOverride = normalizeCwd(path);\n\t\treturn this.command ?? (this as unknown as ShellCommand);\n\t}\n\n\tasync json(): Promise<unknown> {\n\t\treturn (await this.resolveOutput()).json();\n\t}\n\n\tlines(): AsyncIterable<string> {\n\t\treturn (async function* (command: ShellPromise): AsyncIterable<string> {\n\t\t\tfor (const line of splitLines(await command.text())) {\n\t\t\t\tyield line;\n\t\t\t}\n\t\t})(this);\n\t}\n\n\tnothrow(): ShellCommand {\n\t\tthis.shouldThrow = false;\n\t\treturn this.command ?? (this as unknown as ShellCommand);\n\t}\n\n\tquiet(_isQuiet = true): ShellCommand {\n\t\treturn this.command ?? (this as unknown as ShellCommand);\n\t}\n\n\tasync text(): Promise<string> {\n\t\treturn (await this.resolveOutput()).text();\n\t}\n\n\tthrows(shouldThrow: boolean): ShellCommand {\n\t\tthis.shouldThrow = shouldThrow;\n\t\treturn this.command ?? (this as unknown as ShellCommand);\n\t}\n\n\tasPromise(): Promise<ShellOutput> {\n\t\treturn this.resolveOutput();\n\t}\n\n\tsetCommand(command: ShellCommand): void {\n\t\tthis.command = command;\n\t}\n\n\tprivate async resolveOutput(): Promise<ShellOutput> {\n\t\tconst output = createShellOutput(await this.runWithContext());\n\t\tif (this.shouldThrow && output.exitCode !== 0) {\n\t\t\tthrow new ShellError(output);\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate async runWithContext(): Promise<OutputChannels<Record>> {\n\t\tif (!this.settledResult) {\n\t\t\tthis.settledResult = this.runCommand(this.cwdOverride);\n\t\t}\n\t\treturn await this.settledResult;\n\t}\n}\n\nfunction createShellCommand(core: ShellPromise): ShellCommand {\n\tconst command = new Proxy(core as object, {\n\t\tget(target, property, receiver) {\n\t\t\tif (\n\t\t\t\tproperty === 'then' ||\n\t\t\t\tproperty === 'catch' ||\n\t\t\t\tproperty === 'finally'\n\t\t\t) {\n\t\t\t\tconst promise = core.asPromise() as Promise<ShellOutput>;\n\t\t\t\tconst value = Reflect.get(promise, property, promise);\n\t\t\t\treturn typeof value === 'function'\n\t\t\t\t\t? value.bind(promise)\n\t\t\t\t\t: value;\n\t\t\t}\n\n\t\t\tconst value = Reflect.get(target, property, receiver);\n\t\t\treturn typeof value === 'function' ? value.bind(core) : value;\n\t\t},\n\t}) as ShellCommand;\n\n\tcore.setCommand(command);\n\treturn command;\n}\n\nexport class Shell {\n\tprivate readonly fs: FS;\n\tprivate currentCwd: string;\n\tprivate currentStatus = 0;\n\tprivate readonly globalVars = new Map<string, string>();\n\n\tconstructor(fs: FS, options: ShellOptions = {}) {\n\t\tthis.fs = fs;\n\t\tthis.currentCwd = normalizeCwd(options.cwd ?? ROOT_DIRECTORY);\n\t}\n\n\t$ = (strings: TemplateStringsArray, ...exprs: unknown[]) => {\n\t\treturn this._exec(strings, ...exprs);\n\t};\n\n\texec(strings: TemplateStringsArray, ...exprs: unknown[]) {\n\t\treturn this._exec(strings, ...exprs);\n\t}\n\n\tcwd(newCwd: string): void {\n\t\tthis.currentCwd = normalizeCwd(newCwd);\n\t}\n\n\tprivate _exec(strings: TemplateStringsArray, ...exprs: unknown[]) {\n\t\tconst source = String.raw(strings, ...exprs);\n\t\tconst fs = this.fs;\n\t\tconst ir = lazy<ScriptIR>(() => {\n\t\t\tconst ast = parse(source);\n\t\t\treturn compile(ast);\n\t\t});\n\n\t\treturn createShellCommand(\n\t\t\tnew ShellPromise(async (cwdOverride) => {\n\t\t\t\tconst commandStartCwd = normalizeCwd(\n\t\t\t\t\tcwdOverride ?? this.currentCwd\n\t\t\t\t);\n\t\t\t\tconst context = {\n\t\t\t\t\tcwd: commandStartCwd,\n\t\t\t\t\tstatus: this.currentStatus,\n\t\t\t\t\tstderr: new BufferedOutputStream(),\n\t\t\t\t\tglobalVars: this.globalVars,\n\t\t\t\t\tlocalVars: new Map<string, string>(),\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstdout: await collectStdoutRecords(\n\t\t\t\t\t\t\texecute(ir(), fs, context)\n\t\t\t\t\t\t),\n\t\t\t\t\t\tstderr: context.stderr.snapshot(),\n\t\t\t\t\t\texitCode: context.status,\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\thandleDiagnosticFailure(error, context);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstdout: [],\n\t\t\t\t\t\tstderr: context.stderr.snapshot(),\n\t\t\t\t\t\texitCode: context.status ?? 1,\n\t\t\t\t\t};\n\t\t\t\t} finally {\n\t\t\t\t\tthis.currentStatus = context.status ?? this.currentStatus;\n\t\t\t\t\tif (\n\t\t\t\t\t\tcwdOverride === undefined ||\n\t\t\t\t\t\tcontext.cwd !== commandStartCwd\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.currentCwd = context.cwd;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n}\n\nfunction handleDiagnosticFailure(\n\terror: unknown,\n\tcontext: {\n\t\tstatus?: number;\n\t\tstderr: OutputStream;\n\t}\n): void {\n\tif (error instanceof ParseSyntaxError) {\n\t\tcontext.status = 1;\n\t\twriteDiagnosticsToStderr(context, [error.diagnostic]);\n\t\treturn;\n\t}\n\tif (isShellDiagnosticError(error)) {\n\t\tcontext.status = error.exitCode;\n\t\twriteDiagnosticsToStderr(context, error.diagnostics);\n\t\treturn;\n\t}\n\tcontext.status = 1;\n\tthrow error;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -56,5 +56,5 @@
56
56
  },
57
57
  "type": "module",
58
58
  "types": "./dist/index.d.mts",
59
- "version": "0.3.1"
59
+ "version": "0.3.3"
60
60
  }