shfs 0.3.0 → 0.3.2
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
|
|
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-D1oWUkmO.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:
|
|
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:
|
|
233
|
+
stderr: context.stderr.snapshot(),
|
|
234
234
|
exitCode: context.status ?? 1
|
|
235
235
|
};
|
|
236
236
|
} finally {
|
package/dist/index.mjs.map
CHANGED
|
@@ -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