shell-dsl 0.0.28 → 0.0.30

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.
@@ -27,7 +27,9 @@ import { Interpreter, BreakException, ContinueException } from "./interpreter/in
27
27
  import { createVirtualFS } from "./fs/index.mjs";
28
28
  import {
29
29
  FileSystem,
30
- ReadOnlyFileSystem
30
+ ReadOnlyFileSystem,
31
+ WebFileSystem,
32
+ createWebUnderlyingFS
31
33
  } from "./fs/index.mjs";
32
34
  import { createStdin, StdinImpl } from "./io/index.mjs";
33
35
  import { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from "./io/index.mjs";
@@ -55,12 +57,14 @@ export {
55
57
  isAndNode,
56
58
  escapeForInterpolation,
57
59
  escape,
60
+ createWebUnderlyingFS,
58
61
  createVirtualFS,
59
62
  createStdout,
60
63
  createStdin,
61
64
  createStderr,
62
65
  createShellDSL,
63
66
  createPipe,
67
+ WebFileSystem,
64
68
  StdinImpl,
65
69
  ShellPromise,
66
70
  ShellError,
@@ -78,4 +82,4 @@ export {
78
82
  BreakException
79
83
  };
80
84
 
81
- //# debugId=0CC96BD5A2BCA29264756E2164756E21
85
+ //# debugId=4ED32BF992AF089064756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts"],
4
4
  "sourcesContent": [
5
- "// Main class exports\nexport { ShellDSL, createShellDSL, type Program } from \"./shell-dsl.mjs\";\nexport { ShellPromise, type ShellPromiseOptions } from \"./shell-promise.mjs\";\n\n// Types\nexport type {\n VirtualFS,\n FileStat,\n Command,\n CommandContext,\n Stdin,\n Stdout,\n Stderr,\n OutputCollector,\n ExecResult,\n ShellConfig,\n RawValue,\n} from \"./types.mjs\";\nexport { isRawValue } from \"./types.mjs\";\n\n// Errors\nexport { ShellError, LexError, ParseError } from \"./errors.mjs\";\n\n// Lexer\nexport { Lexer, lex, tokenToString } from \"./lexer/index.mjs\";\nexport type { Token, RedirectMode } from \"./lexer/index.mjs\";\n\n// Parser\nexport { Parser, parse } from \"./parser/index.mjs\";\nexport type {\n ASTNode,\n Redirect,\n CommandNode,\n PipelineNode,\n AndNode,\n OrNode,\n SequenceNode,\n LiteralNode,\n VariableNode,\n SubstitutionNode,\n GlobNode,\n ConcatNode,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n CaseClause,\n ArithmeticNode,\n} from \"./parser/index.mjs\";\nexport {\n isCommandNode,\n isPipelineNode,\n isAndNode,\n isOrNode,\n isSequenceNode,\n isLiteralNode,\n isVariableNode,\n isSubstitutionNode,\n isGlobNode,\n isConcatNode,\n isIfNode,\n isForNode,\n isWhileNode,\n isUntilNode,\n isCaseNode,\n isArithmeticNode,\n} from \"./parser/index.mjs\";\n\n// Interpreter\nexport { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter/index.mjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.mjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.mjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.mjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.mjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation } from \"./utils/index.mjs\";\n"
5
+ "// Main class exports\nexport { ShellDSL, createShellDSL, type Program } from \"./shell-dsl.mjs\";\nexport { ShellPromise, type ShellPromiseOptions } from \"./shell-promise.mjs\";\n\n// Types\nexport type {\n VirtualFS,\n FileStat,\n Command,\n CommandContext,\n Stdin,\n Stdout,\n Stderr,\n OutputCollector,\n ExecResult,\n ShellConfig,\n RawValue,\n} from \"./types.mjs\";\nexport { isRawValue } from \"./types.mjs\";\n\n// Errors\nexport { ShellError, LexError, ParseError } from \"./errors.mjs\";\n\n// Lexer\nexport { Lexer, lex, tokenToString } from \"./lexer/index.mjs\";\nexport type { Token, RedirectMode } from \"./lexer/index.mjs\";\n\n// Parser\nexport { Parser, parse } from \"./parser/index.mjs\";\nexport type {\n ASTNode,\n Redirect,\n CommandNode,\n PipelineNode,\n AndNode,\n OrNode,\n SequenceNode,\n LiteralNode,\n VariableNode,\n SubstitutionNode,\n GlobNode,\n ConcatNode,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n CaseClause,\n ArithmeticNode,\n} from \"./parser/index.mjs\";\nexport {\n isCommandNode,\n isPipelineNode,\n isAndNode,\n isOrNode,\n isSequenceNode,\n isLiteralNode,\n isVariableNode,\n isSubstitutionNode,\n isGlobNode,\n isConcatNode,\n isIfNode,\n isForNode,\n isWhileNode,\n isUntilNode,\n isCaseNode,\n isArithmeticNode,\n} from \"./parser/index.mjs\";\n\n// Interpreter\nexport { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter/index.mjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.mjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n WebFileSystem,\n createWebUnderlyingFS,\n type PathOps,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.mjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.mjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.mjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation } from \"./utils/index.mjs\";\n"
6
6
  ],
7
- "mappings": ";AACA;AACA;AAgBA;AAGA;AAGA;AAIA;AAsBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA;AAGA;AACA;AAAA;AAAA;AAAA;AASA;AACA;AAGA;",
8
- "debugId": "0CC96BD5A2BCA29264756E2164756E21",
7
+ "mappings": ";AACA;AACA;AAgBA;AAGA;AAGA;AAIA;AAsBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AACA;AAGA;",
8
+ "debugId": "4ED32BF992AF089064756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -58,7 +58,7 @@ class ShellPromise {
58
58
  }
59
59
  async blob() {
60
60
  const result = await this.run();
61
- return new Blob([result.stdout]);
61
+ return new Blob([new Uint8Array(result.stdout)]);
62
62
  }
63
63
  async buffer() {
64
64
  const result = await this.run();
@@ -126,4 +126,4 @@ export {
126
126
  ShellPromise
127
127
  };
128
128
 
129
- //# debugId=27303E978C3F3C8A64756E2164756E21
129
+ //# debugId=77697BFE77B4E29464756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/shell-promise.ts"],
4
4
  "sourcesContent": [
5
- "import type { ExecResult } from \"./types.mjs\";\nimport { ShellError } from \"./errors.mjs\";\n\nexport interface ExecuteOverrides {\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ShellPromiseOptions {\n execute: (overrides: ExecuteOverrides) => Promise<ExecResult>;\n cwdOverride?: string;\n envOverride?: Record<string, string>;\n shouldThrow?: boolean;\n quiet?: boolean;\n}\n\nexport class ShellPromise implements PromiseLike<ExecResult> {\n private executor: (overrides: ExecuteOverrides) => Promise<ExecResult>;\n private cwdOverride?: string;\n private envOverride?: Record<string, string>;\n private shouldThrow: boolean;\n private isQuiet: boolean;\n private cachedResult?: Promise<ExecResult>;\n\n constructor(options: ShellPromiseOptions) {\n this.executor = options.execute;\n this.cwdOverride = options.cwdOverride;\n this.envOverride = options.envOverride;\n this.shouldThrow = options.shouldThrow ?? true;\n this.isQuiet = options.quiet ?? false;\n }\n\n private async run(): Promise<ExecResult> {\n if (!this.cachedResult) {\n this.cachedResult = this.executor({\n cwd: this.cwdOverride,\n env: this.envOverride,\n });\n }\n\n const result = await this.cachedResult;\n\n if (this.shouldThrow && result.exitCode !== 0) {\n throw new ShellError(\n `Command failed with exit code ${result.exitCode}`,\n result.stdout,\n result.stderr,\n result.exitCode\n );\n }\n\n return result;\n }\n\n then<TResult1 = ExecResult, TResult2 = never>(\n onfulfilled?: ((value: ExecResult) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.run().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\n ): Promise<ExecResult | TResult> {\n return this.run().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<ExecResult> {\n return this.run().finally(onfinally);\n }\n\n // Output formats\n async text(): Promise<string> {\n const result = await this.run();\n return result.stdout.toString(\"utf-8\");\n }\n\n async json<T = unknown>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async *lines(): AsyncIterable<string> {\n const text = await this.text();\n const lines = text.split(\"\\n\");\n // Remove trailing empty line if present\n if (lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n for (const line of lines) {\n yield line;\n }\n }\n\n async blob(): Promise<Blob> {\n const result = await this.run();\n return new Blob([result.stdout]);\n }\n\n async buffer(): Promise<Buffer> {\n const result = await this.run();\n return result.stdout;\n }\n\n // Behavior modifiers - return new ShellPromise with modified options\n quiet(): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: this.shouldThrow,\n quiet: true,\n });\n }\n\n nothrow(): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: false,\n quiet: this.isQuiet,\n });\n }\n\n throws(enable: boolean): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: enable,\n quiet: this.isQuiet,\n });\n }\n\n // Context overrides - these need to be handled by the shell\n cwd(path: string): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: path,\n envOverride: this.envOverride,\n shouldThrow: this.shouldThrow,\n quiet: this.isQuiet,\n });\n }\n\n env(vars: Record<string, string>): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: { ...this.envOverride, ...vars },\n shouldThrow: this.shouldThrow,\n quiet: this.isQuiet,\n });\n }\n\n // Getters for internal state (used by ShellDSL)\n getCwdOverride(): string | undefined {\n return this.cwdOverride;\n }\n\n getEnvOverride(): Record<string, string> | undefined {\n return this.envOverride;\n }\n\n getShouldThrow(): boolean {\n return this.shouldThrow;\n }\n\n getIsQuiet(): boolean {\n return this.isQuiet;\n }\n}\n"
5
+ "import type { ExecResult } from \"./types.mjs\";\nimport { ShellError } from \"./errors.mjs\";\n\nexport interface ExecuteOverrides {\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ShellPromiseOptions {\n execute: (overrides: ExecuteOverrides) => Promise<ExecResult>;\n cwdOverride?: string;\n envOverride?: Record<string, string>;\n shouldThrow?: boolean;\n quiet?: boolean;\n}\n\nexport class ShellPromise implements PromiseLike<ExecResult> {\n private executor: (overrides: ExecuteOverrides) => Promise<ExecResult>;\n private cwdOverride?: string;\n private envOverride?: Record<string, string>;\n private shouldThrow: boolean;\n private isQuiet: boolean;\n private cachedResult?: Promise<ExecResult>;\n\n constructor(options: ShellPromiseOptions) {\n this.executor = options.execute;\n this.cwdOverride = options.cwdOverride;\n this.envOverride = options.envOverride;\n this.shouldThrow = options.shouldThrow ?? true;\n this.isQuiet = options.quiet ?? false;\n }\n\n private async run(): Promise<ExecResult> {\n if (!this.cachedResult) {\n this.cachedResult = this.executor({\n cwd: this.cwdOverride,\n env: this.envOverride,\n });\n }\n\n const result = await this.cachedResult;\n\n if (this.shouldThrow && result.exitCode !== 0) {\n throw new ShellError(\n `Command failed with exit code ${result.exitCode}`,\n result.stdout,\n result.stderr,\n result.exitCode\n );\n }\n\n return result;\n }\n\n then<TResult1 = ExecResult, TResult2 = never>(\n onfulfilled?: ((value: ExecResult) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.run().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\n ): Promise<ExecResult | TResult> {\n return this.run().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<ExecResult> {\n return this.run().finally(onfinally);\n }\n\n // Output formats\n async text(): Promise<string> {\n const result = await this.run();\n return result.stdout.toString(\"utf-8\");\n }\n\n async json<T = unknown>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async *lines(): AsyncIterable<string> {\n const text = await this.text();\n const lines = text.split(\"\\n\");\n // Remove trailing empty line if present\n if (lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n for (const line of lines) {\n yield line;\n }\n }\n\n async blob(): Promise<Blob> {\n const result = await this.run();\n return new Blob([new Uint8Array(result.stdout)]);\n }\n\n async buffer(): Promise<Buffer> {\n const result = await this.run();\n return result.stdout;\n }\n\n // Behavior modifiers - return new ShellPromise with modified options\n quiet(): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: this.shouldThrow,\n quiet: true,\n });\n }\n\n nothrow(): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: false,\n quiet: this.isQuiet,\n });\n }\n\n throws(enable: boolean): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: enable,\n quiet: this.isQuiet,\n });\n }\n\n // Context overrides - these need to be handled by the shell\n cwd(path: string): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: path,\n envOverride: this.envOverride,\n shouldThrow: this.shouldThrow,\n quiet: this.isQuiet,\n });\n }\n\n env(vars: Record<string, string>): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: { ...this.envOverride, ...vars },\n shouldThrow: this.shouldThrow,\n quiet: this.isQuiet,\n });\n }\n\n // Getters for internal state (used by ShellDSL)\n getCwdOverride(): string | undefined {\n return this.cwdOverride;\n }\n\n getEnvOverride(): Record<string, string> | undefined {\n return this.envOverride;\n }\n\n getShouldThrow(): boolean {\n return this.shouldThrow;\n }\n\n getIsQuiet(): boolean {\n return this.isQuiet;\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "27303E978C3F3C8A64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "77697BFE77B4E29464756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,3 +1,4 @@
1
1
  export { createVirtualFS } from "./memfs-adapter.ts";
2
- export { FileSystem, type Permission, type PermissionRules, type UnderlyingFS } from "./real-fs.ts";
2
+ export { FileSystem, type PathOps, type Permission, type PermissionRules, type UnderlyingFS } from "./real-fs.ts";
3
3
  export { ReadOnlyFileSystem } from "./readonly-fs.ts";
4
+ export { WebFileSystem, createWebUnderlyingFS } from "./web-fs.ts";
@@ -1,7 +1,18 @@
1
1
  import type { VirtualFS, FileStat } from "../types.ts";
2
2
  export type Permission = "read-write" | "read-only" | "excluded";
3
3
  export type PermissionRules = Record<string, Permission>;
4
+ export interface PathOps {
5
+ readonly separator: string;
6
+ resolve(...paths: string[]): string;
7
+ normalize(path: string): string;
8
+ join(...paths: string[]): string;
9
+ relative(from: string, to: string): string;
10
+ isAbsolute(path: string): boolean;
11
+ dirname(path: string): string;
12
+ basename(path: string): string;
13
+ }
4
14
  export interface UnderlyingFS {
15
+ pathOps?: PathOps;
5
16
  promises: {
6
17
  readFile(path: string): Promise<Buffer | Uint8Array | string>;
7
18
  readdir(path: string): Promise<string[]>;
@@ -25,6 +36,7 @@ export interface UnderlyingFS {
25
36
  export declare class FileSystem implements VirtualFS {
26
37
  private readonly mountBase;
27
38
  private readonly rules;
39
+ private readonly pathOps;
28
40
  protected readonly underlyingFs: UnderlyingFS;
29
41
  constructor(mountPath?: string, permissions?: PermissionRules, fs?: UnderlyingFS);
30
42
  private compileRules;
@@ -0,0 +1,5 @@
1
+ import { FileSystem, type PermissionRules, type UnderlyingFS } from "./real-fs.ts";
2
+ export declare function createWebUnderlyingFS(root: FileSystemDirectoryHandle): UnderlyingFS;
3
+ export declare class WebFileSystem extends FileSystem {
4
+ constructor(root: FileSystemDirectoryHandle, permissions?: PermissionRules);
5
+ }
@@ -10,7 +10,7 @@ export type { ASTNode, Redirect, CommandNode, PipelineNode, AndNode, OrNode, Seq
10
10
  export { isCommandNode, isPipelineNode, isAndNode, isOrNode, isSequenceNode, isLiteralNode, isVariableNode, isSubstitutionNode, isGlobNode, isConcatNode, isIfNode, isForNode, isWhileNode, isUntilNode, isCaseNode, isArithmeticNode, } from "./parser/index.ts";
11
11
  export { Interpreter, type InterpreterOptions, BreakException, ContinueException } from "./interpreter/index.ts";
12
12
  export { createVirtualFS } from "./fs/index.ts";
13
- export { FileSystem, ReadOnlyFileSystem, type Permission, type PermissionRules, type UnderlyingFS, } from "./fs/index.ts";
13
+ export { FileSystem, ReadOnlyFileSystem, WebFileSystem, createWebUnderlyingFS, type PathOps, type Permission, type PermissionRules, type UnderlyingFS, } from "./fs/index.ts";
14
14
  export { createStdin, StdinImpl } from "./io/index.ts";
15
15
  export { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from "./io/index.ts";
16
16
  export { escape, escapeForInterpolation } from "./utils/index.ts";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shell-dsl",
3
- "version": "0.0.28",
3
+ "version": "0.0.30",
4
4
  "description": "A sandboxed shell-style DSL for running scriptable command pipelines in-process without host OS access",
5
5
  "author": "ricsam <oss@ricsam.dev>",
6
6
  "license": "MIT",