@taliesinb/mash 0.0.0-stage → 0.1.0

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.
Files changed (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -2
  3. package/bin/mash.ts +253 -0
  4. package/dist/bin/mash.d.ts +39 -0
  5. package/dist/bin/mash.d.ts.map +1 -0
  6. package/dist/bin/mash.js +281 -0
  7. package/dist/bin/mash.js.map +1 -0
  8. package/dist/src/analysis/analyze.d.ts +97 -0
  9. package/dist/src/analysis/analyze.d.ts.map +1 -0
  10. package/dist/src/analysis/analyze.js +1406 -0
  11. package/dist/src/analysis/analyze.js.map +1 -0
  12. package/dist/src/analysis/fs.d.ts +39 -0
  13. package/dist/src/analysis/fs.d.ts.map +1 -0
  14. package/dist/src/analysis/fs.js +117 -0
  15. package/dist/src/analysis/fs.js.map +1 -0
  16. package/dist/src/analysis/outputs.d.ts +16 -0
  17. package/dist/src/analysis/outputs.d.ts.map +1 -0
  18. package/dist/src/analysis/outputs.js +277 -0
  19. package/dist/src/analysis/outputs.js.map +1 -0
  20. package/dist/src/analysis/value.d.ts +76 -0
  21. package/dist/src/analysis/value.d.ts.map +1 -0
  22. package/dist/src/analysis/value.js +248 -0
  23. package/dist/src/analysis/value.js.map +1 -0
  24. package/dist/src/behaviors/defs/core.d.ts +15 -0
  25. package/dist/src/behaviors/defs/core.d.ts.map +1 -0
  26. package/dist/src/behaviors/defs/core.js +1084 -0
  27. package/dist/src/behaviors/defs/core.js.map +1 -0
  28. package/dist/src/behaviors/defs/devtools.d.ts +9 -0
  29. package/dist/src/behaviors/defs/devtools.d.ts.map +1 -0
  30. package/dist/src/behaviors/defs/devtools.js +432 -0
  31. package/dist/src/behaviors/defs/devtools.js.map +1 -0
  32. package/dist/src/behaviors/defs/macos.d.ts +12 -0
  33. package/dist/src/behaviors/defs/macos.d.ts.map +1 -0
  34. package/dist/src/behaviors/defs/macos.js +454 -0
  35. package/dist/src/behaviors/defs/macos.js.map +1 -0
  36. package/dist/src/behaviors/defs/tools.d.ts +9 -0
  37. package/dist/src/behaviors/defs/tools.d.ts.map +1 -0
  38. package/dist/src/behaviors/defs/tools.js +639 -0
  39. package/dist/src/behaviors/defs/tools.js.map +1 -0
  40. package/dist/src/behaviors/dsl.d.ts +95 -0
  41. package/dist/src/behaviors/dsl.d.ts.map +1 -0
  42. package/dist/src/behaviors/dsl.js +267 -0
  43. package/dist/src/behaviors/dsl.js.map +1 -0
  44. package/dist/src/behaviors/index.d.ts +12 -0
  45. package/dist/src/behaviors/index.d.ts.map +1 -0
  46. package/dist/src/behaviors/index.js +18 -0
  47. package/dist/src/behaviors/index.js.map +1 -0
  48. package/dist/src/behaviors/registry.d.ts +45 -0
  49. package/dist/src/behaviors/registry.d.ts.map +1 -0
  50. package/dist/src/behaviors/registry.js +266 -0
  51. package/dist/src/behaviors/registry.js.map +1 -0
  52. package/dist/src/behaviors/roles.d.ts +29 -0
  53. package/dist/src/behaviors/roles.d.ts.map +1 -0
  54. package/dist/src/behaviors/roles.js +198 -0
  55. package/dist/src/behaviors/roles.js.map +1 -0
  56. package/dist/src/behaviors/types.d.ts +120 -0
  57. package/dist/src/behaviors/types.d.ts.map +1 -0
  58. package/dist/src/behaviors/types.js +12 -0
  59. package/dist/src/behaviors/types.js.map +1 -0
  60. package/dist/src/index.d.ts +27 -0
  61. package/dist/src/index.d.ts.map +1 -0
  62. package/dist/src/index.js +24 -0
  63. package/dist/src/index.js.map +1 -0
  64. package/dist/src/integrations/deepsea.d.ts +121 -0
  65. package/dist/src/integrations/deepsea.d.ts.map +1 -0
  66. package/dist/src/integrations/deepsea.js +199 -0
  67. package/dist/src/integrations/deepsea.js.map +1 -0
  68. package/dist/src/machine.d.ts +139 -0
  69. package/dist/src/machine.d.ts.map +1 -0
  70. package/dist/src/machine.js +400 -0
  71. package/dist/src/machine.js.map +1 -0
  72. package/dist/src/parser/ast.d.ts +369 -0
  73. package/dist/src/parser/ast.d.ts.map +1 -0
  74. package/dist/src/parser/ast.js +17 -0
  75. package/dist/src/parser/ast.js.map +1 -0
  76. package/dist/src/parser/parser.d.ts +48 -0
  77. package/dist/src/parser/parser.d.ts.map +1 -0
  78. package/dist/src/parser/parser.js +1950 -0
  79. package/dist/src/parser/parser.js.map +1 -0
  80. package/dist/src/policy/effects.d.ts +86 -0
  81. package/dist/src/policy/effects.d.ts.map +1 -0
  82. package/dist/src/policy/effects.js +53 -0
  83. package/dist/src/policy/effects.js.map +1 -0
  84. package/dist/src/policy/policy.d.ts +130 -0
  85. package/dist/src/policy/policy.d.ts.map +1 -0
  86. package/dist/src/policy/policy.js +532 -0
  87. package/dist/src/policy/policy.js.map +1 -0
  88. package/dist/src/printer/doc.d.ts +151 -0
  89. package/dist/src/printer/doc.d.ts.map +1 -0
  90. package/dist/src/printer/doc.js +409 -0
  91. package/dist/src/printer/doc.js.map +1 -0
  92. package/dist/src/printer/highlight.d.ts +53 -0
  93. package/dist/src/printer/highlight.d.ts.map +1 -0
  94. package/dist/src/printer/highlight.js +339 -0
  95. package/dist/src/printer/highlight.js.map +1 -0
  96. package/dist/src/printer/html.d.ts +72 -0
  97. package/dist/src/printer/html.d.ts.map +1 -0
  98. package/dist/src/printer/html.js +423 -0
  99. package/dist/src/printer/html.js.map +1 -0
  100. package/dist/src/printer/print.d.ts +63 -0
  101. package/dist/src/printer/print.d.ts.map +1 -0
  102. package/dist/src/printer/print.js +484 -0
  103. package/dist/src/printer/print.js.map +1 -0
  104. package/dist/src/printer/summary.d.ts +50 -0
  105. package/dist/src/printer/summary.d.ts.map +1 -0
  106. package/dist/src/printer/summary.js +621 -0
  107. package/dist/src/printer/summary.js.map +1 -0
  108. package/dist/src/trace/events.d.ts +183 -0
  109. package/dist/src/trace/events.d.ts.map +1 -0
  110. package/dist/src/trace/events.js +9 -0
  111. package/dist/src/trace/events.js.map +1 -0
  112. package/dist/src/trace/progress.d.ts +58 -0
  113. package/dist/src/trace/progress.d.ts.map +1 -0
  114. package/dist/src/trace/progress.js +83 -0
  115. package/dist/src/trace/progress.js.map +1 -0
  116. package/dist/src/vm/arith.d.ts +29 -0
  117. package/dist/src/vm/arith.d.ts.map +1 -0
  118. package/dist/src/vm/arith.js +258 -0
  119. package/dist/src/vm/arith.js.map +1 -0
  120. package/dist/src/vm/builtins.d.ts +31 -0
  121. package/dist/src/vm/builtins.d.ts.map +1 -0
  122. package/dist/src/vm/builtins.js +1773 -0
  123. package/dist/src/vm/builtins.js.map +1 -0
  124. package/dist/src/vm/emulate.d.ts +75 -0
  125. package/dist/src/vm/emulate.d.ts.map +1 -0
  126. package/dist/src/vm/emulate.js +380 -0
  127. package/dist/src/vm/emulate.js.map +1 -0
  128. package/dist/src/vm/expand.d.ts +68 -0
  129. package/dist/src/vm/expand.d.ts.map +1 -0
  130. package/dist/src/vm/expand.js +744 -0
  131. package/dist/src/vm/expand.js.map +1 -0
  132. package/dist/src/vm/external.d.ts +34 -0
  133. package/dist/src/vm/external.d.ts.map +1 -0
  134. package/dist/src/vm/external.js +228 -0
  135. package/dist/src/vm/external.js.map +1 -0
  136. package/dist/src/vm/fifo.d.ts +66 -0
  137. package/dist/src/vm/fifo.d.ts.map +1 -0
  138. package/dist/src/vm/fifo.js +232 -0
  139. package/dist/src/vm/fifo.js.map +1 -0
  140. package/dist/src/vm/interp.d.ts +209 -0
  141. package/dist/src/vm/interp.d.ts.map +1 -0
  142. package/dist/src/vm/interp.js +1641 -0
  143. package/dist/src/vm/interp.js.map +1 -0
  144. package/dist/src/vm/io.d.ts +180 -0
  145. package/dist/src/vm/io.d.ts.map +1 -0
  146. package/dist/src/vm/io.js +502 -0
  147. package/dist/src/vm/io.js.map +1 -0
  148. package/dist/src/vm/pattern.d.ts +46 -0
  149. package/dist/src/vm/pattern.d.ts.map +1 -0
  150. package/dist/src/vm/pattern.js +498 -0
  151. package/dist/src/vm/pattern.js.map +1 -0
  152. package/dist/src/vm/proc.d.ts +94 -0
  153. package/dist/src/vm/proc.d.ts.map +1 -0
  154. package/dist/src/vm/proc.js +130 -0
  155. package/dist/src/vm/proc.js.map +1 -0
  156. package/dist/src/vm/state.d.ts +104 -0
  157. package/dist/src/vm/state.d.ts.map +1 -0
  158. package/dist/src/vm/state.js +233 -0
  159. package/dist/src/vm/state.js.map +1 -0
  160. package/dist/src/vm/test.d.ts +11 -0
  161. package/dist/src/vm/test.d.ts.map +1 -0
  162. package/dist/src/vm/test.js +277 -0
  163. package/dist/src/vm/test.js.map +1 -0
  164. package/package.json +63 -4
  165. package/src/analysis/analyze.ts +1395 -0
  166. package/src/analysis/fs.ts +121 -0
  167. package/src/analysis/outputs.ts +242 -0
  168. package/src/analysis/value.ts +264 -0
  169. package/src/behaviors/defs/core.ts +970 -0
  170. package/src/behaviors/defs/devtools.ts +400 -0
  171. package/src/behaviors/defs/macos.ts +426 -0
  172. package/src/behaviors/defs/tools.ts +596 -0
  173. package/src/behaviors/dsl.ts +293 -0
  174. package/src/behaviors/index.ts +19 -0
  175. package/src/behaviors/registry.ts +261 -0
  176. package/src/behaviors/roles.ts +187 -0
  177. package/src/behaviors/types.ts +127 -0
  178. package/src/index.ts +27 -0
  179. package/src/integrations/deepsea.ts +259 -0
  180. package/src/machine.ts +483 -0
  181. package/src/parser/ast.ts +472 -0
  182. package/src/parser/parser.ts +1826 -0
  183. package/src/policy/effects.ts +102 -0
  184. package/src/policy/policy.ts +578 -0
  185. package/src/printer/doc.ts +454 -0
  186. package/src/printer/highlight.ts +283 -0
  187. package/src/printer/html.ts +441 -0
  188. package/src/printer/print.ts +528 -0
  189. package/src/printer/summary.ts +601 -0
  190. package/src/trace/events.ts +102 -0
  191. package/src/trace/progress.ts +119 -0
  192. package/src/vm/arith.ts +236 -0
  193. package/src/vm/builtins.ts +1590 -0
  194. package/src/vm/emulate.ts +337 -0
  195. package/src/vm/expand.ts +721 -0
  196. package/src/vm/external.ts +265 -0
  197. package/src/vm/fifo.ts +226 -0
  198. package/src/vm/interp.ts +1623 -0
  199. package/src/vm/io.ts +570 -0
  200. package/src/vm/pattern.ts +477 -0
  201. package/src/vm/proc.ts +147 -0
  202. package/src/vm/state.ts +267 -0
  203. package/src/vm/test.ts +253 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Execution contexts. A {@link Proc} is one shell "process" as the script
3
+ * sees it: a {@link ShellState} plus an fd table and a virtual pid. Contexts
4
+ * that differ only in fds or errexit suppression (redirected builtins, `if`
5
+ * conditions) are derived views sharing the same state.
6
+ */
7
+ import { FdTable } from "./io.js";
8
+ import { ShellState } from "./state.js";
9
+ export class ExitSignal {
10
+ status;
11
+ constructor(status) {
12
+ this.status = status;
13
+ }
14
+ }
15
+ export class ReturnSignal {
16
+ status;
17
+ constructor(status) {
18
+ this.status = status;
19
+ }
20
+ }
21
+ export class LoopSignal {
22
+ kind;
23
+ levels;
24
+ constructor(kind, levels) {
25
+ this.kind = kind;
26
+ this.levels = levels;
27
+ }
28
+ }
29
+ /** Abort the whole run (policy abort, external cancellation). */
30
+ export class AbortRun extends Error {
31
+ status;
32
+ constructor(reason, status = 126) {
33
+ super(reason);
34
+ this.name = 'AbortRun';
35
+ this.status = status;
36
+ }
37
+ }
38
+ /** A fatal expansion error: prints a message and exits the (sub)shell. */
39
+ export class FatalError extends Error {
40
+ status;
41
+ constructor(message, status = 1) {
42
+ super(message);
43
+ this.name = 'FatalError';
44
+ this.status = status;
45
+ }
46
+ }
47
+ /**
48
+ * An expansion error that discards the current top-level command (bash's
49
+ * `jump_to_top_level(DISCARD)`, e.g. arithmetic errors): the script goes on
50
+ * with the next top-level command, `eval` fails with status 1.
51
+ */
52
+ export class DiscardError extends Error {
53
+ status;
54
+ constructor(message, status = 1) {
55
+ super(message);
56
+ this.name = 'DiscardError';
57
+ this.status = status;
58
+ }
59
+ }
60
+ /** A non-fatal command error: prints a message, the command fails with `status`. */
61
+ export class CommandError extends Error {
62
+ status;
63
+ constructor(message, status = 1) {
64
+ super(message);
65
+ this.name = 'CommandError';
66
+ this.status = status;
67
+ }
68
+ }
69
+ export class Proc {
70
+ state;
71
+ fds;
72
+ /** Virtual `$BASHPID`. */
73
+ pid;
74
+ parentPid;
75
+ /** `$BASH_SUBSHELL` */
76
+ depth;
77
+ /** >0 inside if/while conditions, `!`, and non-final `&&`/`||` items. */
78
+ errexitSuppressed = 0;
79
+ loopDepth = 0;
80
+ /** Background jobs started from this shell process. */
81
+ jobs;
82
+ /** Status of the last command substitution (for `x=$(false)`). */
83
+ lastSubstStatus = null;
84
+ /** Line currently executing ($LINENO). */
85
+ line = 0;
86
+ /** Process-substitution fds to close when the current command finishes (shared by derived views). */
87
+ procSubstFds = [];
88
+ /** Running `source`: `return` is allowed. */
89
+ sourcing = false;
90
+ /** Set inside background jobs: aborted by `kill` on the job. */
91
+ jobSignal = undefined;
92
+ /** OS child processes started inside a background job (for `kill $!`). */
93
+ jobChildren = undefined;
94
+ /** Exit-trap ownership: traps set in this process. */
95
+ isSubshell;
96
+ constructor(state, fds, pid, parentPid, depth, jobs, isSubshell) {
97
+ this.state = state;
98
+ this.fds = fds;
99
+ this.pid = pid;
100
+ this.parentPid = parentPid;
101
+ this.depth = depth;
102
+ this.jobs = jobs;
103
+ this.isSubshell = isSubshell;
104
+ }
105
+ /** A view sharing state, with different fds and/or errexit suppression. */
106
+ derive(opts) {
107
+ const p = Object.create(Proc.prototype);
108
+ Object.assign(p, this);
109
+ if (opts.fds)
110
+ p.fds = opts.fds;
111
+ if (opts.suppress)
112
+ p.errexitSuppressed = this.errexitSuppressed + 1;
113
+ if (opts.loop)
114
+ p.loopDepth = this.loopDepth + 1;
115
+ return p;
116
+ }
117
+ /** A subshell: deep-copied state (traps reset), cloned fds. */
118
+ subshell(pid) {
119
+ const state = this.state.clone();
120
+ state.parentTraps = this.state.parentTraps ?? new Map(this.state.traps);
121
+ state.traps.clear();
122
+ const p = new Proc(state, this.fds.clone(), pid, this.pid, this.depth + 1, new Map(), true);
123
+ p.errexitSuppressed = this.errexitSuppressed;
124
+ p.line = this.line;
125
+ p.jobSignal = this.jobSignal;
126
+ p.jobChildren = this.jobChildren;
127
+ return p;
128
+ }
129
+ }
130
+ //# sourceMappingURL=proc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proc.js","sourceRoot":"","sources":["../../../src/vm/proc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Shell state: variables (with bash's dynamic scoping), functions, options,
3
+ * positional parameters and the working directory. A subshell gets a deep
4
+ * copy via {@link ShellState.clone}.
5
+ */
6
+ import type * as A from '../parser/ast.ts';
7
+ /** The host process's umask (read once; children inherit it unless the script changes it). */
8
+ export declare const HOST_UMASK: number;
9
+ export type VarValue = {
10
+ kind: 'string';
11
+ value: string;
12
+ } | {
13
+ kind: 'indexed';
14
+ values: Map<number, string>;
15
+ } | {
16
+ kind: 'assoc';
17
+ values: Map<string, string>;
18
+ };
19
+ export interface Variable {
20
+ /** null: declared but unset (`local x`, `declare -a x` before assignment keeps kind via attrs). */
21
+ value: VarValue | null;
22
+ exported: boolean;
23
+ readonly: boolean;
24
+ integer: boolean;
25
+ lower: boolean;
26
+ upper: boolean;
27
+ /** `declare -a` / `-A` without a value yet. */
28
+ declaredKind?: 'indexed' | 'assoc';
29
+ }
30
+ export interface FunctionEntry {
31
+ def: A.FunctionDef;
32
+ /** `export -f`: passed to child bash processes (BASH_FUNC_name%%) and inline scripts. */
33
+ exported?: boolean;
34
+ }
35
+ export interface ShellOptions {
36
+ errexit: boolean;
37
+ nounset: boolean;
38
+ pipefail: boolean;
39
+ xtrace: boolean;
40
+ noglob: boolean;
41
+ noclobber: boolean;
42
+ allexport: boolean;
43
+ noexec: boolean;
44
+ verbose: boolean;
45
+ }
46
+ export declare const SET_O_NAMES: Record<string, keyof ShellOptions>;
47
+ export declare const SET_FLAGS: Record<string, keyof ShellOptions>;
48
+ export declare const KNOWN_SHOPTS: readonly ["nullglob", "failglob", "dotglob", "globstar", "nocaseglob", "nocasematch", "extglob", "lastpipe", "patsub_replacement", "expand_aliases", "inherit_errexit", "globasciiranges", "checkwinsize", "histappend", "sourcepath", "xpg_echo"];
49
+ /**
50
+ * The variables a new bash process sets for itself (after importing the
51
+ * environment): the top-level shell and nested scripts run in the VM.
52
+ */
53
+ export declare function initShellVars(state: ShellState): void;
54
+ export declare function newVar(value: VarValue | null, attrs?: Partial<Variable>): Variable;
55
+ export declare class ShellState {
56
+ globals: Map<string, Variable>;
57
+ /** Function-local scopes, innermost last. */
58
+ locals: Map<string, Variable>[];
59
+ functions: Map<string, FunctionEntry>;
60
+ options: ShellOptions;
61
+ shopts: Set<string>;
62
+ positional: string[];
63
+ arg0: string;
64
+ cwd: string;
65
+ lastStatus: number;
66
+ lastBgPid: number | null;
67
+ traps: Map<string, string>;
68
+ /**
69
+ * In a subshell, the parent's traps, which `trap`/`trap -p` still list until
70
+ * the subshell changes a trap (bash 4.2+; lets `$(trap -p)` save them).
71
+ */
72
+ parentTraps: Map<string, string> | undefined;
73
+ dirStack: string[];
74
+ /** Command hash table (name → resolved path). */
75
+ hash: Map<string, string>;
76
+ aliases: Map<string, string>;
77
+ /** Function call stack (for FUNCNAME). */
78
+ funcStack: string[];
79
+ /** File creation mask applied to redirections and child processes. */
80
+ umask: number;
81
+ /** Alias expansion depth guard. */
82
+ aliasDepth: number;
83
+ constructor(cwd: string);
84
+ clone(): ShellState;
85
+ /** Find a variable following dynamic scope (innermost function scope first). */
86
+ lookup(name: string): Variable | undefined;
87
+ /** The scope map holding `name`, or the global scope if none does. */
88
+ scopeOf(name: string): Map<string, Variable>;
89
+ /** String value of a scalar (or element 0 of an array), undefined if unset. */
90
+ getString(name: string): string | undefined;
91
+ isSet(name: string): boolean;
92
+ /** Declare a local in the innermost function scope (or global when not in a function). */
93
+ declareLocal(name: string): Variable;
94
+ /** Get or create (in the scope that holds it, else global) the variable record. */
95
+ ensure(name: string): Variable;
96
+ unset(name: string): boolean;
97
+ /** The environment passed to child processes: exported scalars. */
98
+ environment(): Record<string, string>;
99
+ /** All variable names visible (for `${!prefix*}`, `set`, `declare -p`). */
100
+ visibleNames(): string[];
101
+ }
102
+ /** Format `$-` from the options. */
103
+ export declare function dashFlags(state: ShellState): string;
104
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/vm/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Shell state: variables (with bash's dynamic scoping), functions, options,
3
+ * positional parameters and the working directory. A subshell gets a deep
4
+ * copy via {@link ShellState.clone}.
5
+ */
6
+ import * as os from 'node:os';
7
+ /** The host process's umask (read once; children inherit it unless the script changes it). */
8
+ export const HOST_UMASK = (() => {
9
+ const m = process.umask(0o022);
10
+ process.umask(m);
11
+ return m;
12
+ })();
13
+ export const SET_O_NAMES = {
14
+ errexit: 'errexit', nounset: 'nounset', pipefail: 'pipefail', xtrace: 'xtrace', noglob: 'noglob',
15
+ noclobber: 'noclobber', allexport: 'allexport', noexec: 'noexec', verbose: 'verbose',
16
+ };
17
+ export const SET_FLAGS = {
18
+ e: 'errexit', u: 'nounset', x: 'xtrace', f: 'noglob', C: 'noclobber', a: 'allexport', n: 'noexec', v: 'verbose',
19
+ };
20
+ export const KNOWN_SHOPTS = [
21
+ 'nullglob', 'failglob', 'dotglob', 'globstar', 'nocaseglob', 'nocasematch', 'extglob', 'lastpipe', 'patsub_replacement',
22
+ 'expand_aliases', 'inherit_errexit', 'globasciiranges', 'checkwinsize', 'histappend', 'sourcepath', 'xpg_echo',
23
+ ];
24
+ function cloneValue(v) {
25
+ if (v === null)
26
+ return null;
27
+ if (v.kind === 'string')
28
+ return { kind: 'string', value: v.value };
29
+ if (v.kind === 'indexed')
30
+ return { kind: 'indexed', values: new Map(v.values) };
31
+ return { kind: 'assoc', values: new Map(v.values) };
32
+ }
33
+ function cloneVar(v) {
34
+ return { ...v, value: cloneValue(v.value) };
35
+ }
36
+ /** bash's OSTYPE / HOSTTYPE / MACHTYPE for the host (`darwin24` / `linux-gnu`, `x86_64`, ...). */
37
+ function hostTypeVars() {
38
+ const darwin = process.platform === 'darwin';
39
+ const hosttype = process.arch === 'x64' ? 'x86_64' : process.arch === 'arm64' ? (darwin ? 'arm64' : 'aarch64') : process.arch;
40
+ const ostype = darwin ? `darwin${os.release().split('.')[0]}` : process.platform === 'linux' ? 'linux-gnu' : process.platform;
41
+ const vendor = darwin ? 'apple' : hosttype === 'x86_64' ? 'pc' : 'unknown';
42
+ return { OSTYPE: ostype, HOSTTYPE: hosttype, MACHTYPE: `${hosttype}-${vendor}-${ostype}` };
43
+ }
44
+ /**
45
+ * The variables a new bash process sets for itself (after importing the
46
+ * environment): the top-level shell and nested scripts run in the VM.
47
+ */
48
+ export function initShellVars(state) {
49
+ const set = (k, value) => void state.globals.set(k, newVar(value));
50
+ set('BASH_VERSION', { kind: 'string', value: '5.2.0(1)-mash' });
51
+ // like bash's set_if_not: values from the environment win
52
+ for (const [k, v] of Object.entries(hostTypeVars()))
53
+ if (!state.globals.has(k))
54
+ set(k, { kind: 'string', value: v });
55
+ set('PS4', { kind: 'string', value: '+ ' });
56
+ set('IFS', { kind: 'string', value: ' \t\n' });
57
+ set('OPTIND', { kind: 'string', value: '1' });
58
+ // PIPESTATUS is empty until the first command runs (bash 3.2 and 5.2 alike;
59
+ // the "(0)" seen in an earlier CI run came from commands in a sourced ~/.bashrc)
60
+ }
61
+ export function newVar(value, attrs = {}) {
62
+ return { value, exported: false, readonly: false, integer: false, lower: false, upper: false, ...attrs };
63
+ }
64
+ export class ShellState {
65
+ globals = new Map();
66
+ /** Function-local scopes, innermost last. */
67
+ locals = [];
68
+ functions = new Map();
69
+ options = {
70
+ errexit: false, nounset: false, pipefail: false, xtrace: false, noglob: false,
71
+ noclobber: false, allexport: false, noexec: false, verbose: false,
72
+ };
73
+ // patsub_replacement: bash 5.2's default (`&` in ${x/p/r} is the match)
74
+ shopts = new Set(['globasciiranges', 'sourcepath', 'patsub_replacement']);
75
+ positional = [];
76
+ arg0 = 'mash';
77
+ cwd;
78
+ lastStatus = 0;
79
+ lastBgPid = null;
80
+ traps = new Map();
81
+ /**
82
+ * In a subshell, the parent's traps, which `trap`/`trap -p` still list until
83
+ * the subshell changes a trap (bash 4.2+; lets `$(trap -p)` save them).
84
+ */
85
+ parentTraps = undefined;
86
+ dirStack = [];
87
+ /** Command hash table (name → resolved path). */
88
+ hash = new Map();
89
+ aliases = new Map();
90
+ /** Function call stack (for FUNCNAME). */
91
+ funcStack = [];
92
+ /** File creation mask applied to redirections and child processes. */
93
+ umask = HOST_UMASK;
94
+ /** Alias expansion depth guard. */
95
+ aliasDepth = 0;
96
+ constructor(cwd) {
97
+ this.cwd = cwd;
98
+ }
99
+ clone() {
100
+ const s = new ShellState(this.cwd);
101
+ for (const [k, v] of this.globals)
102
+ s.globals.set(k, cloneVar(v));
103
+ s.locals = this.locals.map((scope) => {
104
+ const m = new Map();
105
+ for (const [k, v] of scope)
106
+ m.set(k, cloneVar(v));
107
+ return m;
108
+ });
109
+ s.functions = new Map(this.functions);
110
+ s.options = { ...this.options };
111
+ s.shopts = new Set(this.shopts);
112
+ s.positional = [...this.positional];
113
+ s.arg0 = this.arg0;
114
+ s.lastStatus = this.lastStatus;
115
+ s.lastBgPid = this.lastBgPid;
116
+ s.traps = new Map(this.traps);
117
+ s.parentTraps = this.parentTraps;
118
+ s.dirStack = [...this.dirStack];
119
+ s.hash = new Map(this.hash);
120
+ s.aliases = new Map(this.aliases);
121
+ s.funcStack = [...this.funcStack];
122
+ s.umask = this.umask;
123
+ return s;
124
+ }
125
+ /** Find a variable following dynamic scope (innermost function scope first). */
126
+ lookup(name) {
127
+ for (let i = this.locals.length - 1; i >= 0; i--) {
128
+ const v = this.locals[i].get(name);
129
+ if (v)
130
+ return v;
131
+ }
132
+ return this.globals.get(name);
133
+ }
134
+ /** The scope map holding `name`, or the global scope if none does. */
135
+ scopeOf(name) {
136
+ for (let i = this.locals.length - 1; i >= 0; i--) {
137
+ if (this.locals[i].has(name))
138
+ return this.locals[i];
139
+ }
140
+ return this.globals;
141
+ }
142
+ /** String value of a scalar (or element 0 of an array), undefined if unset. */
143
+ getString(name) {
144
+ const v = this.lookup(name);
145
+ if (!v || v.value === null)
146
+ return undefined;
147
+ if (v.value.kind === 'string')
148
+ return v.value.value;
149
+ if (v.value.kind === 'indexed')
150
+ return v.value.values.get(0);
151
+ return v.value.values.get('0');
152
+ }
153
+ isSet(name) {
154
+ const v = this.lookup(name);
155
+ return v !== undefined && v.value !== null;
156
+ }
157
+ /** Declare a local in the innermost function scope (or global when not in a function). */
158
+ declareLocal(name) {
159
+ const scope = this.locals.length > 0 ? this.locals[this.locals.length - 1] : this.globals;
160
+ let v = scope.get(name);
161
+ if (!v) {
162
+ v = newVar(null);
163
+ scope.set(name, v);
164
+ }
165
+ return v;
166
+ }
167
+ /** Get or create (in the scope that holds it, else global) the variable record. */
168
+ ensure(name) {
169
+ const scope = this.scopeOf(name);
170
+ let v = scope.get(name);
171
+ if (!v) {
172
+ v = newVar(null);
173
+ if (this.options.allexport)
174
+ v.exported = true;
175
+ scope.set(name, v);
176
+ }
177
+ return v;
178
+ }
179
+ unset(name) {
180
+ const scope = this.scopeOf(name);
181
+ const v = scope.get(name);
182
+ if (v?.readonly)
183
+ return false;
184
+ if (scope === this.globals)
185
+ scope.delete(name);
186
+ else if (v) {
187
+ // bash: unsetting a local makes it unset in that scope (still shadows)
188
+ v.value = null;
189
+ }
190
+ return true;
191
+ }
192
+ /** The environment passed to child processes: exported scalars. */
193
+ environment() {
194
+ const env = {};
195
+ const visit = (scope) => {
196
+ for (const [k, v] of scope) {
197
+ if (!v.exported) {
198
+ // a non-exported local shadows an exported global of the same name
199
+ if (k in env && scope !== this.globals)
200
+ delete env[k];
201
+ continue;
202
+ }
203
+ if (v.value === null)
204
+ continue;
205
+ if (v.value.kind === 'string')
206
+ env[k] = v.value.value;
207
+ else if (v.value.kind === 'indexed')
208
+ env[k] = v.value.values.get(0) ?? '';
209
+ }
210
+ };
211
+ visit(this.globals);
212
+ for (const scope of this.locals)
213
+ visit(scope);
214
+ return env;
215
+ }
216
+ /** All variable names visible (for `${!prefix*}`, `set`, `declare -p`). */
217
+ visibleNames() {
218
+ const names = new Set(this.globals.keys());
219
+ for (const scope of this.locals)
220
+ for (const k of scope.keys())
221
+ names.add(k);
222
+ return [...names].sort();
223
+ }
224
+ }
225
+ /** Format `$-` from the options. */
226
+ export function dashFlags(state) {
227
+ let s = 'h';
228
+ for (const [flag, opt] of Object.entries(SET_FLAGS))
229
+ if (state.options[opt])
230
+ s += flag;
231
+ return s + 'B';
232
+ }
233
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/vm/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `[[ ... ]]` and `test` / `[` evaluation.
3
+ */
4
+ import type * as A from '../parser/ast.ts';
5
+ import type { Interpreter } from './interp.ts';
6
+ import { type Proc } from './proc.ts';
7
+ export declare function fileTest(op: string, operand: string, proc: Proc): boolean;
8
+ export declare function evalCond(e: A.CondExpr, proc: Proc, interp: Interpreter): Promise<boolean>;
9
+ /** `test` / `[`: returns 0 (true), 1 (false); throws CommandError(2) on syntax errors. */
10
+ export declare function evalTest(args: string[], proc: Proc): number;
11
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/vm/test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,KAAK,CAAC,MAAM,kBAAkB,CAAA;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,WAAW,CAAA;AAoBnD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CA2BzE;AA+ED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CA8C/F;AAKD,0FAA0F;AAC1F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAgE3D"}