@seanhogg/builderforce-webcontainers-core 2026.10.7 → 2026.10.8

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 (150) hide show
  1. package/dist/archive.d.ts +2 -0
  2. package/dist/archive.d.ts.map +1 -1
  3. package/dist/archive.js +6 -4
  4. package/dist/archive.js.map +1 -1
  5. package/dist/html.d.ts +2 -0
  6. package/dist/html.d.ts.map +1 -1
  7. package/dist/html.js +5 -3
  8. package/dist/html.js.map +1 -1
  9. package/dist/index.d.ts +2 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/node/http/client.d.ts +3 -1
  14. package/dist/node/http/client.d.ts.map +1 -1
  15. package/dist/node/http/client.js +74 -5
  16. package/dist/node/http/client.js.map +1 -1
  17. package/dist/node/http/index.d.ts.map +1 -1
  18. package/dist/node/http/index.js +2 -1
  19. package/dist/node/http/index.js.map +1 -1
  20. package/dist/node/http/messages.d.ts +87 -0
  21. package/dist/node/http/messages.d.ts.map +1 -0
  22. package/dist/node/http/messages.js +146 -0
  23. package/dist/node/http/messages.js.map +1 -0
  24. package/dist/node/http/server.d.ts +13 -98
  25. package/dist/node/http/server.d.ts.map +1 -1
  26. package/dist/node/http/server.js +34 -202
  27. package/dist/node/http/server.js.map +1 -1
  28. package/dist/node/http/serverResponse.d.ts +42 -0
  29. package/dist/node/http/serverResponse.d.ts.map +1 -0
  30. package/dist/node/http/serverResponse.js +89 -0
  31. package/dist/node/http/serverResponse.js.map +1 -0
  32. package/dist/node/http/upgradeSocket.d.ts +34 -0
  33. package/dist/node/http/upgradeSocket.d.ts.map +1 -0
  34. package/dist/node/http/upgradeSocket.js +73 -0
  35. package/dist/node/http/upgradeSocket.js.map +1 -0
  36. package/dist/node/runtime.js +2 -2
  37. package/dist/node/runtime.js.map +1 -1
  38. package/dist/previewBridge.d.ts +42 -0
  39. package/dist/previewBridge.d.ts.map +1 -0
  40. package/dist/previewBridge.js +192 -0
  41. package/dist/previewBridge.js.map +1 -0
  42. package/dist/shell/ast.d.ts +101 -0
  43. package/dist/shell/ast.d.ts.map +1 -0
  44. package/dist/shell/ast.js +7 -0
  45. package/dist/shell/ast.js.map +1 -0
  46. package/dist/shell/builtins.d.ts +14 -0
  47. package/dist/shell/builtins.d.ts.map +1 -1
  48. package/dist/shell/builtins.js +87 -7
  49. package/dist/shell/builtins.js.map +1 -1
  50. package/dist/shell/compound.d.ts +30 -0
  51. package/dist/shell/compound.d.ts.map +1 -0
  52. package/dist/shell/compound.js +73 -0
  53. package/dist/shell/compound.js.map +1 -0
  54. package/dist/shell/exec.d.ts +27 -6
  55. package/dist/shell/exec.d.ts.map +1 -1
  56. package/dist/shell/exec.js +127 -41
  57. package/dist/shell/exec.js.map +1 -1
  58. package/dist/shell/expand.d.ts +5 -1
  59. package/dist/shell/expand.d.ts.map +1 -1
  60. package/dist/shell/expand.js +7 -5
  61. package/dist/shell/expand.js.map +1 -1
  62. package/dist/shell/lineReader.d.ts +9 -0
  63. package/dist/shell/lineReader.d.ts.map +1 -0
  64. package/dist/shell/lineReader.js +42 -0
  65. package/dist/shell/lineReader.js.map +1 -0
  66. package/dist/shell/packageManagers.d.ts +20 -0
  67. package/dist/shell/packageManagers.d.ts.map +1 -0
  68. package/dist/shell/packageManagers.js +74 -0
  69. package/dist/shell/packageManagers.js.map +1 -0
  70. package/dist/shell/parse.d.ts +16 -66
  71. package/dist/shell/parse.d.ts.map +1 -1
  72. package/dist/shell/parse.js +244 -243
  73. package/dist/shell/parse.js.map +1 -1
  74. package/dist/shell/program.d.ts.map +1 -1
  75. package/dist/shell/program.js +2 -1
  76. package/dist/shell/program.js.map +1 -1
  77. package/dist/shell/testCommand.d.ts +9 -0
  78. package/dist/shell/testCommand.d.ts.map +1 -0
  79. package/dist/shell/testCommand.js +105 -0
  80. package/dist/shell/testCommand.js.map +1 -0
  81. package/dist/shell/tokenize.d.ts +25 -0
  82. package/dist/shell/tokenize.d.ts.map +1 -0
  83. package/dist/shell/tokenize.js +279 -0
  84. package/dist/shell/tokenize.js.map +1 -0
  85. package/dist/system/cookieJar.d.ts +59 -0
  86. package/dist/system/cookieJar.d.ts.map +1 -0
  87. package/dist/system/cookieJar.js +187 -0
  88. package/dist/system/cookieJar.js.map +1 -0
  89. package/dist/system/httpStream.d.ts +40 -0
  90. package/dist/system/httpStream.d.ts.map +1 -0
  91. package/dist/system/httpStream.js +156 -0
  92. package/dist/system/httpStream.js.map +1 -0
  93. package/dist/system/index.d.ts +9 -1
  94. package/dist/system/index.d.ts.map +1 -1
  95. package/dist/system/index.js +4 -0
  96. package/dist/system/index.js.map +1 -1
  97. package/dist/system/kernel.d.ts +10 -2
  98. package/dist/system/kernel.d.ts.map +1 -1
  99. package/dist/system/kernel.js +12 -3
  100. package/dist/system/kernel.js.map +1 -1
  101. package/dist/system/ports.d.ts +9 -4
  102. package/dist/system/ports.d.ts.map +1 -1
  103. package/dist/system/ports.js +21 -2
  104. package/dist/system/ports.js.map +1 -1
  105. package/dist/system/programs.d.ts +1 -1
  106. package/dist/system/programs.d.ts.map +1 -1
  107. package/dist/system/programs.js +2 -0
  108. package/dist/system/programs.js.map +1 -1
  109. package/dist/system/types.d.ts +36 -6
  110. package/dist/system/types.d.ts.map +1 -1
  111. package/dist/system/webSocketClient.d.ts +37 -0
  112. package/dist/system/webSocketClient.d.ts.map +1 -0
  113. package/dist/system/webSocketClient.js +152 -0
  114. package/dist/system/webSocketClient.js.map +1 -0
  115. package/dist/system/webSocketFrames.d.ts +39 -0
  116. package/dist/system/webSocketFrames.d.ts.map +1 -0
  117. package/dist/system/webSocketFrames.js +117 -0
  118. package/dist/system/webSocketFrames.js.map +1 -0
  119. package/package.json +1 -1
  120. package/src/archive.ts +8 -4
  121. package/src/html.ts +5 -3
  122. package/src/index.ts +2 -1
  123. package/src/node/http/client.ts +69 -6
  124. package/src/node/http/index.ts +2 -1
  125. package/src/node/http/messages.ts +150 -0
  126. package/src/node/http/server.ts +37 -202
  127. package/src/node/http/serverResponse.ts +98 -0
  128. package/src/node/http/upgradeSocket.ts +79 -0
  129. package/src/node/runtime.ts +2 -2
  130. package/src/previewBridge.ts +194 -0
  131. package/src/shell/ast.ts +85 -0
  132. package/src/shell/builtins.ts +97 -7
  133. package/src/shell/compound.ts +89 -0
  134. package/src/shell/exec.ts +128 -40
  135. package/src/shell/expand.ts +8 -6
  136. package/src/shell/lineReader.ts +46 -0
  137. package/src/shell/packageManagers.ts +75 -0
  138. package/src/shell/parse.ts +233 -236
  139. package/src/shell/program.ts +2 -1
  140. package/src/shell/testCommand.ts +105 -0
  141. package/src/shell/tokenize.ts +257 -0
  142. package/src/system/cookieJar.ts +187 -0
  143. package/src/system/httpStream.ts +168 -0
  144. package/src/system/index.ts +24 -1
  145. package/src/system/kernel.ts +16 -4
  146. package/src/system/ports.ts +23 -4
  147. package/src/system/programs.ts +3 -1
  148. package/src/system/types.ts +40 -6
  149. package/src/system/webSocketClient.ts +177 -0
  150. package/src/system/webSocketFrames.ts +118 -0
@@ -1 +1 @@
1
- {"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/shell/builtins.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5D,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAElF,wEAAwE;AACxE,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAI7C,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,eAAe,UAA+C,CAAC;AAY5E,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CA4F5C,CAAC"}
1
+ {"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/shell/builtins.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACvB;AAED,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,iEAAiE;IACjE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClD,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC7D,iDAAiD;IACjD,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAElF,wEAAwE;AACxE,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAK7C,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,eAAe,UAA+D,CAAC;AAe5F,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAuJ5C,CAAC"}
@@ -6,21 +6,27 @@ import { findExecutable } from '../system/commands.js';
6
6
  import { resolvePath } from './context.js';
7
7
  import { cat, cp, ls, mkdir, mv, pwd, rm, touch } from './fileCommands.js';
8
8
  import { basename, clear, dirname, echo, env, falseCommand, grep, head, printf, sleep, tail, trueCommand, wc } from './textCommands.js';
9
+ import { bracket, test } from './testCommand.js';
10
+ import { readLine } from './lineReader.js';
9
11
  /** Coreutils: plain commands, also spawnable as standalone programs. */
10
12
  export const COREUTILS = {
11
- ls, cat, mkdir, rm, cp, mv, touch, pwd, echo, printf, head, tail, grep, wc, env, clear, sleep, basename, dirname,
13
+ ls, cat, mkdir, rm, cp, mv, touch, pwd, echo, printf, head, tail, grep, wc, env, clear, sleep, basename, dirname, test,
14
+ '[': bracket,
12
15
  true: trueCommand,
13
16
  false: falseCommand,
14
17
  };
15
18
  /** Programs the runtime provides besides coreutils (reported by `which`/`type`). */
16
- export const SYSTEM_PROGRAMS = ['node', 'npm', 'npx', 'bfsh', 'sh', 'bash'];
19
+ export const SYSTEM_PROGRAMS = ['node', 'npm', 'npx', 'pnpm', 'yarn', 'bfsh', 'sh', 'bash'];
17
20
  const HELP = `bfsh — BuilderForce WebContainers shell
18
21
 
19
- Builtins: cd, pwd, export, unset, exit, source, history, type, which, help
20
- Files: ls [-la], cat, mkdir [-p], rm [-rf], cp [-r], mv, touch
22
+ Builtins: cd, pwd, export, unset, exit, source, history, type, which, help,
23
+ read, local, shift, return, break, continue, jobs, wait
24
+ Files: ls [-la], cat, mkdir [-p], rm [-rf], cp [-r], mv, touch, test / [ … ]
21
25
  Text: echo, printf, head, tail, grep, wc, env, clear, sleep, basename, dirname
22
- Node: node <file>, npm install|ci|run|start|test, npx <bin>
26
+ Node: node <file>, npm install|ci|run|start|test, npx <bin>, pnpm, yarn
23
27
  Syntax: 'quotes' "\$VARS" a && b || c; a | b > out.txt >> log 2>&1 2> err; FOO=bar cmd; $(cmd); *.js
28
+ if …; then …; elif …; else …; fi while|until …; do …; done for x in …; do …; done
29
+ case $x in a|b) …;; *) …;; esac name() { …; } { …; } ( … ) cat <<EOF … EOF
24
30
 
25
31
  `;
26
32
  export const BUILTINS = {
@@ -103,10 +109,12 @@ export const BUILTINS = {
103
109
  }
104
110
  return status;
105
111
  },
106
- async type(ctx) {
112
+ async type(ctx, shell) {
107
113
  let status = 0;
108
114
  for (const name of ctx.args) {
109
- if (name in BUILTINS)
115
+ if (shell.functions.has(name))
116
+ ctx.io.stdout(`${name} is a function\n`);
117
+ else if (name in BUILTINS)
110
118
  ctx.io.stdout(`${name} is a shell builtin\n`);
111
119
  else if (name in COREUTILS || SYSTEM_PROGRAMS.includes(name))
112
120
  ctx.io.stdout(`${name} is /usr/local/bin/${name}\n`);
@@ -125,7 +133,79 @@ export const BUILTINS = {
125
133
  async set() {
126
134
  return 0; // options (-e, -x) are accepted and ignored
127
135
  },
136
+ async break(ctx, shell) {
137
+ return loopControl(ctx, shell, 'break');
138
+ },
139
+ async continue(ctx, shell) {
140
+ return loopControl(ctx, shell, 'continue');
141
+ },
142
+ async return(ctx, shell) {
143
+ if (!shell.localFrames.length) {
144
+ ctx.io.stderr('return: can only `return\' from a function or sourced script\n');
145
+ return 1;
146
+ }
147
+ const status = ctx.args[0] === undefined ? shell.lastStatus : Number(ctx.args[0]) & 255;
148
+ shell.flow = { kind: 'return', status };
149
+ return status;
150
+ },
151
+ async local(ctx, shell) {
152
+ const frame = shell.localFrames[shell.localFrames.length - 1];
153
+ if (!frame) {
154
+ ctx.io.stderr('local: can only be used in a function\n');
155
+ return 1;
156
+ }
157
+ for (const arg of ctx.args) {
158
+ const eq = arg.indexOf('=');
159
+ const name = eq > 0 ? arg.slice(0, eq) : arg;
160
+ if (!frame.has(name))
161
+ frame.set(name, shell.env[name]);
162
+ shell.env[name] = eq > 0 ? arg.slice(eq + 1) : '';
163
+ }
164
+ return 0;
165
+ },
166
+ async shift(ctx, shell) {
167
+ const count = ctx.args[0] === undefined ? 1 : Number(ctx.args[0]);
168
+ if (!Number.isInteger(count) || count < 0 || count > shell.positional.length)
169
+ return 1;
170
+ shell.positional = shell.positional.slice(count);
171
+ return 0;
172
+ },
173
+ async read(ctx, shell) {
174
+ const raw = ctx.args.includes('-r');
175
+ const names = ctx.args.filter((a) => !a.startsWith('-'));
176
+ let line = await readLine(ctx.io.stdin, ctx.signal);
177
+ if (line === null)
178
+ return 1;
179
+ if (!raw)
180
+ line = line.replace(/\\(.)/g, '$1');
181
+ const targets = names.length ? names : ['REPLY'];
182
+ const fields = names.length ? line.trim().split(/\s+/) : [line];
183
+ targets.forEach((name, i) => {
184
+ shell.env[name] = i === targets.length - 1 ? fields.slice(i).join(' ') : fields[i] ?? '';
185
+ });
186
+ return 0;
187
+ },
188
+ async jobs(ctx, shell) {
189
+ for (const job of shell.jobs.values())
190
+ ctx.io.stdout(`[${job.id}] Running\n`);
191
+ return 0;
192
+ },
193
+ async wait(ctx, shell) {
194
+ const ids = ctx.args.map((a) => Number(a.replace(/^%/, '')));
195
+ const jobs = ids.length ? ids.map((id) => shell.jobs.get(id)).filter((j) => !!j) : [...shell.jobs.values()];
196
+ const statuses = await Promise.all(jobs.map((job) => job.done));
197
+ return statuses.length ? statuses[statuses.length - 1] : 0;
198
+ },
128
199
  };
200
+ function loopControl(ctx, shell, kind) {
201
+ const levels = ctx.args[0] === undefined ? 1 : Number(ctx.args[0]);
202
+ if (!Number.isInteger(levels) || levels < 1) {
203
+ ctx.io.stderr(`${kind}: ${ctx.args[0]}: loop count out of range\n`);
204
+ return 1;
205
+ }
206
+ shell.flow = { kind, levels };
207
+ return 0;
208
+ }
129
209
  BUILTINS['.'] = BUILTINS.source;
130
210
  BUILTINS[':'] = async () => 0;
131
211
  //# sourceMappingURL=builtins.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/shell/builtins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/shell/builtins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Running compound commands (`if`, `while`/`until`, `for`, `case`, `{ }`,
3
+ * `( )`) against a narrow {@link ScriptRunner}, so the executor stays a
4
+ * dispatcher. Loop control (`break`, `continue`) and `return` travel as a
5
+ * {@link Flow} the runner holds: lists stop running while one is set, and the
6
+ * construct it targets clears it.
7
+ */
8
+ import type { CompoundCommand, Script, Word } from './ast.js';
9
+ import type { JobInput, ShellIO } from './exec.js';
10
+ export type Flow = {
11
+ kind: 'break' | 'continue';
12
+ levels: number;
13
+ } | {
14
+ kind: 'return';
15
+ status: number;
16
+ };
17
+ export interface ScriptRunner {
18
+ flow?: Flow;
19
+ readonly positional: readonly string[];
20
+ runScript(script: Script, io: ShellIO, input: JobInput, signal: AbortSignal): Promise<number>;
21
+ /** Words with splitting and globbing, as command arguments. */
22
+ expandWords(words: Word[], io: ShellIO, signal: AbortSignal): Promise<string[]>;
23
+ /** One word as a single string: no splitting, no globbing. */
24
+ expandText(word: Word, io: ShellIO, signal: AbortSignal): Promise<string>;
25
+ setVar(name: string, value: string): void;
26
+ /** A copy of this shell for `( … )`: changes inside do not leak out. */
27
+ subshell(): ScriptRunner;
28
+ }
29
+ export declare function runCompound(node: CompoundCommand, runner: ScriptRunner, io: ShellIO, input: JobInput, signal: AbortSignal): Promise<number>;
30
+ //# sourceMappingURL=compound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.d.ts","sourceRoot":"","sources":["../../src/shell/compound.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,MAAM,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvG,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9F,+DAA+D;IAC/D,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChF,8DAA8D;IAC9D,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,wEAAwE;IACxE,QAAQ,IAAI,YAAY,CAAC;CAC1B;AAeD,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDjJ"}
@@ -0,0 +1,73 @@
1
+ import { patternToRegExp } from './expand.js';
2
+ /** After one pass of a loop body: whether the loop goes on. Consumes the flow aimed at this loop. */
3
+ function continueLoop(runner) {
4
+ const flow = runner.flow;
5
+ if (!flow)
6
+ return true;
7
+ if (flow.kind === 'return')
8
+ return false;
9
+ if (flow.levels > 1) {
10
+ runner.flow = { kind: flow.kind, levels: flow.levels - 1 };
11
+ return false;
12
+ }
13
+ runner.flow = undefined;
14
+ return flow.kind === 'continue';
15
+ }
16
+ export async function runCompound(node, runner, io, input, signal) {
17
+ switch (node.type) {
18
+ case 'group':
19
+ return runner.runScript(node.body, io, input, signal);
20
+ case 'subshell':
21
+ return runner.subshell().runScript(node.body, io, input, signal);
22
+ case 'if': {
23
+ for (const clause of node.clauses) {
24
+ const condition = await runner.runScript(clause.condition, io, input, signal);
25
+ if (runner.flow)
26
+ return condition;
27
+ if (condition === 0)
28
+ return runner.runScript(clause.body, io, input, signal);
29
+ }
30
+ return node.otherwise ? runner.runScript(node.otherwise, io, input, signal) : 0;
31
+ }
32
+ case 'while':
33
+ case 'until': {
34
+ let status = 0;
35
+ while (!signal.aborted) {
36
+ const condition = await runner.runScript(node.condition, io, input, signal);
37
+ if (runner.flow && !continueLoop(runner))
38
+ break;
39
+ if ((condition === 0) !== (node.type === 'while'))
40
+ break;
41
+ status = await runner.runScript(node.body, io, input, signal);
42
+ if (!continueLoop(runner))
43
+ break;
44
+ }
45
+ return status;
46
+ }
47
+ case 'for': {
48
+ const items = node.items ? await runner.expandWords(node.items, io, signal) : [...runner.positional];
49
+ let status = 0;
50
+ for (const item of items) {
51
+ if (signal.aborted)
52
+ break;
53
+ runner.setVar(node.name, item);
54
+ status = await runner.runScript(node.body, io, input, signal);
55
+ if (!continueLoop(runner))
56
+ break;
57
+ }
58
+ return status;
59
+ }
60
+ case 'case': {
61
+ const subject = await runner.expandText(node.subject, io, signal);
62
+ for (const arm of node.arms) {
63
+ for (const pattern of arm.patterns) {
64
+ if (patternToRegExp(await runner.expandText(pattern, io, signal), { slash: true }).test(subject)) {
65
+ return runner.runScript(arm.body, io, input, signal);
66
+ }
67
+ }
68
+ }
69
+ return 0;
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=compound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.js","sourceRoot":"","sources":["../../src/shell/compound.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,18 @@
1
1
  /**
2
2
  * The executor: runs a parsed script. Lists honour `&&`/`||`/`;`/`&`; pipeline
3
- * stages run concurrently, joined by in-memory pipes; redirects swap a stage's
4
- * stdin/stdout/stderr for files. Dispatch order per command: shell builtins,
3
+ * stages run concurrently, joined by in-memory pipes; redirects (here-documents
4
+ * included) swap a stage's stdin/stdout/stderr. Compound commands run through
5
+ * compound.ts. Dispatch order per simple command: shell functions, builtins,
5
6
  * extra in-process commands (npm, npx), the dev-server handoff, coreutils, and
6
7
  * finally `system.spawn` (node, scripts on PATH, `.bin` entries) — which in the
7
8
  * browser is a separate Web Worker.
8
9
  */
9
10
  import type { System } from '../system/types.js';
10
11
  import { InputQueue } from '../system/terminal.js';
11
- import { type ShellState } from './builtins.js';
12
+ import type { FunctionDefinition, Script, Word } from './ast.js';
13
+ import { type BackgroundJob, type ShellState } from './builtins.js';
12
14
  import { type CommandContext } from './context.js';
15
+ import { type Flow, type ScriptRunner } from './compound.js';
13
16
  export interface ShellIO {
14
17
  stdout(text: string): void;
15
18
  stderr(text: string): void;
@@ -35,33 +38,51 @@ export interface ShellOptions {
35
38
  rows: number;
36
39
  } | undefined;
37
40
  commands?: Record<string, ShellCommand>;
41
+ /** Functions inherited from a parent shell (subshells and `$(…)`). */
42
+ functions?: Map<string, FunctionDefinition>;
38
43
  }
39
- export declare class Shell implements ShellState {
44
+ export declare class Shell implements ShellState, ScriptRunner {
40
45
  readonly options: ShellOptions;
41
46
  cwd: string;
42
47
  env: Record<string, string>;
43
48
  lastStatus: number;
44
49
  history: string[];
45
50
  exitRequested?: number;
51
+ flow?: Flow;
52
+ positional: string[];
53
+ readonly functions: Map<string, FunctionDefinition>;
54
+ readonly jobs: Map<number, BackgroundJob>;
55
+ /** One frame per running function: names declared `local`, with the value to restore. */
56
+ readonly localFrames: Array<Map<string, string | undefined>>;
46
57
  readonly pid: number;
47
58
  readonly system: System;
48
- private readonly positional;
59
+ private nextJob;
49
60
  private current?;
50
61
  constructor(options: ShellOptions);
51
- /** A child shell for `npm run` / subshells: same IO, its own cwd and environment. */
62
+ /** A child shell for `npm run` / subshells: same IO, its own cwd, environment and functions. */
52
63
  fork(overrides: {
53
64
  cwd?: string;
54
65
  env?: Record<string, string>;
55
66
  positional?: string[];
56
67
  }): Shell;
68
+ subshell(): Shell;
57
69
  /** Parse and run `source`. Syntax errors print and return 2. */
58
70
  exec(source: string, io: ShellIO, input: JobInput, signal: AbortSignal): Promise<number>;
59
71
  /** `source` and friends: run in this shell with the current job's IO. */
60
72
  run(source: string): Promise<number>;
73
+ runScript(script: Script, io: ShellIO, input: JobInput, signal: AbortSignal): Promise<number>;
74
+ expandWords(words: Word[], io: ShellIO, signal: AbortSignal): Promise<string[]>;
75
+ expandText(word: Word, io: ShellIO, signal: AbortSignal): Promise<string>;
76
+ setVar(name: string, value: string): void;
61
77
  private expandContext;
62
78
  private runPipeline;
63
79
  private runCommand;
80
+ private runSimple;
81
+ /** Apply redirects; returns the new IO, or an exit status when a redirect fails. */
82
+ private applyRedirects;
64
83
  private dispatch;
84
+ /** A shell function: its own positional parameters and `local` frame; `return` ends it. */
85
+ private callFunction;
65
86
  private spawnExternal;
66
87
  }
67
88
  //# sourceMappingURL=exec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/shell/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGhE,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,mGAAmG;AACnG,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,gHAAgH;IAChH,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;CAC/D;AAED,kFAAkF;AAClF,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEnG,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACzC;AAID,qBAAa,KAAM,YAAW,UAAU;IAW1B,QAAQ,CAAC,OAAO,EAAE,YAAY;IAV1C,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,UAAU,SAAK;IACf,OAAO,EAAE,MAAM,EAAE,CAAM;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,SAAkB;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,OAAO,CAAC,CAAwD;gBAEnD,OAAO,EAAE,YAAY;IAO1C,qFAAqF;IACrF,IAAI,CAAC,SAAS,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,KAAK;IAI7F,gEAAgE;IAC1D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAmC9F,yEAAyE;IACzE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMpC,OAAO,CAAC,aAAa;YAkBP,WAAW;YAmBX,UAAU;YA+DV,QAAQ;YAwBR,aAAa;CA0B5B"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/shell/exec.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { expandWord, expandWords } from './expand.js';
4
4
  import { BUILTINS, COREUTILS } from './builtins.js';
5
5
  import { resolvePath } from './context.js';
6
6
  import { matchDevServer, runDevServerHandoff } from './devHandoff.js';
7
+ import { runCompound } from './compound.js';
7
8
  let nextShellPid = 500;
8
9
  export class Shell {
9
10
  options;
@@ -12,20 +13,30 @@ export class Shell {
12
13
  lastStatus = 0;
13
14
  history = [];
14
15
  exitRequested;
16
+ flow;
17
+ positional;
18
+ functions;
19
+ jobs = new Map();
20
+ /** One frame per running function: names declared `local`, with the value to restore. */
21
+ localFrames = [];
15
22
  pid = nextShellPid++;
16
23
  system;
17
- positional;
24
+ nextJob = 1;
18
25
  current;
19
26
  constructor(options) {
20
27
  this.options = options;
21
28
  this.system = options.system;
22
29
  this.cwd = options.cwd;
23
30
  this.env = { ...options.env, PWD: options.cwd };
24
- this.positional = options.positional ?? [];
31
+ this.positional = [...(options.positional ?? [])];
32
+ this.functions = new Map(options.functions);
25
33
  }
26
- /** A child shell for `npm run` / subshells: same IO, its own cwd and environment. */
34
+ /** A child shell for `npm run` / subshells: same IO, its own cwd, environment and functions. */
27
35
  fork(overrides) {
28
- return new Shell({ ...this.options, cwd: overrides.cwd ?? this.cwd, env: { ...this.env, ...overrides.env }, positional: overrides.positional });
36
+ return new Shell({ ...this.options, cwd: overrides.cwd ?? this.cwd, env: { ...this.env, ...overrides.env }, positional: overrides.positional ?? this.positional, functions: this.functions });
37
+ }
38
+ subshell() {
39
+ return this.fork({});
29
40
  }
30
41
  /** Parse and run `source`. Syntax errors print and return 2. */
31
42
  async exec(source, io, input, signal) {
@@ -43,29 +54,13 @@ export class Shell {
43
54
  const previous = this.current;
44
55
  this.current = { io, input, signal };
45
56
  try {
46
- for (const list of script) {
47
- if (this.exitRequested !== undefined || signal.aborted)
48
- break;
49
- const run = async () => {
50
- let status = await this.runPipeline(list.first, io, input, signal);
51
- for (const { op, pipeline } of list.rest) {
52
- if (this.exitRequested !== undefined || signal.aborted)
53
- break;
54
- if ((op === '&&') === (status === 0))
55
- status = await this.runPipeline(pipeline, io, input, signal);
56
- }
57
- return status;
58
- };
59
- if (list.background) {
60
- void run();
61
- this.lastStatus = 0;
62
- }
63
- else
64
- this.lastStatus = await run();
65
- }
57
+ await this.runScript(script, io, input, signal);
66
58
  }
67
59
  finally {
68
60
  this.current = previous;
61
+ // A `break`/`continue` outside any loop (or `return` outside a function) must not stop later lines.
62
+ if (!this.localFrames.length)
63
+ this.flow = undefined;
69
64
  }
70
65
  if (signal.aborted && this.lastStatus === 0)
71
66
  this.lastStatus = 130;
@@ -78,6 +73,41 @@ export class Shell {
78
73
  throw new Error('Shell.run outside a job');
79
74
  return this.exec(source, job.io, job.input, job.signal);
80
75
  }
76
+ async runScript(script, io, input, signal) {
77
+ for (const list of script) {
78
+ if (this.exitRequested !== undefined || signal.aborted || this.flow)
79
+ break;
80
+ const run = async () => {
81
+ let status = await this.runPipeline(list.first, io, input, signal);
82
+ for (const { op, pipeline } of list.rest) {
83
+ if (this.exitRequested !== undefined || signal.aborted || this.flow)
84
+ break;
85
+ if ((op === '&&') === (status === 0))
86
+ status = await this.runPipeline(pipeline, io, input, signal);
87
+ }
88
+ return status;
89
+ };
90
+ if (list.background) {
91
+ const id = this.nextJob++;
92
+ const done = run();
93
+ this.jobs.set(id, { id, done });
94
+ void done.finally(() => this.jobs.delete(id));
95
+ this.lastStatus = 0;
96
+ }
97
+ else
98
+ this.lastStatus = await run();
99
+ }
100
+ return this.lastStatus;
101
+ }
102
+ expandWords(words, io, signal) {
103
+ return expandWords(words, this.expandContext(io, signal));
104
+ }
105
+ async expandText(word, io, signal) {
106
+ return (await expandWord(word, this.expandContext(io, signal), { split: false, glob: false })).join('');
107
+ }
108
+ setVar(name, value) {
109
+ this.env[name] = value;
110
+ }
81
111
  expandContext(io, signal) {
82
112
  return {
83
113
  fs: this.system.fs,
@@ -114,6 +144,23 @@ export class Shell {
114
144
  return pipeline.negate ? (status === 0 ? 1 : 0) : status;
115
145
  }
116
146
  async runCommand(node, io, input, signal, alone) {
147
+ if (node.type === 'function') {
148
+ this.functions.set(node.name, node);
149
+ return 0;
150
+ }
151
+ if (node.type === 'simple')
152
+ return this.runSimple(node, io, input, signal, alone);
153
+ const redirected = await this.applyRedirects(node.redirects, io, input, signal);
154
+ if (typeof redirected === 'number')
155
+ return redirected;
156
+ try {
157
+ return await runCompound(node, this, redirected.io, redirected.input, signal);
158
+ }
159
+ finally {
160
+ redirected.flush();
161
+ }
162
+ }
163
+ async runSimple(node, io, input, signal, alone) {
117
164
  const ectx = this.expandContext(io, signal);
118
165
  const argv = await expandWords(node.words, ectx);
119
166
  const assigned = {};
@@ -123,13 +170,28 @@ export class Shell {
123
170
  Object.assign(this.env, assigned);
124
171
  return 0;
125
172
  }
126
- // Redirects.
127
- let stdout = io.stdout;
128
- let stderr = io.stderr;
173
+ const redirected = await this.applyRedirects(node.redirects, io, input, signal);
174
+ if (typeof redirected === 'number')
175
+ return redirected;
176
+ try {
177
+ return await this.dispatch(argv, assigned, redirected.io, redirected.input, signal, alone && redirected.io.isTerminal);
178
+ }
179
+ finally {
180
+ redirected.flush();
181
+ }
182
+ }
183
+ /** Apply redirects; returns the new IO, or an exit status when a redirect fails. */
184
+ async applyRedirects(redirects, io, input, signal) {
185
+ let { stdout, stderr, isTerminal } = io;
129
186
  let stdin = input;
130
- let isTerminal = io.isTerminal;
131
187
  const flushes = [];
132
- for (const redirect of node.redirects) {
188
+ const fromText = (text) => {
189
+ const queue = new InputQueue();
190
+ queue.push(text);
191
+ queue.push(null);
192
+ return { queue };
193
+ };
194
+ for (const redirect of redirects) {
133
195
  if (redirect.op === '2>&1') {
134
196
  stderr = stdout;
135
197
  continue;
@@ -138,7 +200,12 @@ export class Shell {
138
200
  stdout = stderr;
139
201
  continue;
140
202
  }
141
- const target = (await expandWord(redirect.target, ectx)).join(' ');
203
+ if (redirect.heredoc) {
204
+ const text = await this.expandText(redirect.heredoc.body, io, signal);
205
+ stdin = fromText(text);
206
+ continue;
207
+ }
208
+ const target = (await expandWord(redirect.target, this.expandContext(io, signal))).join(' ');
142
209
  const path = resolvePath(this, target);
143
210
  if (redirect.op === '<') {
144
211
  const text = this.system.fs.readText(path);
@@ -146,10 +213,7 @@ export class Shell {
146
213
  io.stderr(`bfsh: ${target}: No such file or directory\n`);
147
214
  return 1;
148
215
  }
149
- const queue = new InputQueue();
150
- queue.push(text);
151
- queue.push(null);
152
- stdin = { queue };
216
+ stdin = fromText(text);
153
217
  continue;
154
218
  }
155
219
  if (this.system.fs.isDirectory(path)) {
@@ -170,16 +234,13 @@ export class Shell {
170
234
  isTerminal = false;
171
235
  }
172
236
  }
173
- try {
174
- return await this.dispatch(argv, assigned, { stdout, stderr, isTerminal }, stdin, signal, alone && isTerminal);
175
- }
176
- finally {
177
- for (const flush of flushes)
178
- flush();
179
- }
237
+ return { io: { stdout, stderr, isTerminal }, input: stdin, flush: () => flushes.forEach((flush) => flush()) };
180
238
  }
181
239
  async dispatch(argv, assigned, io, input, signal, attachTerminal) {
182
240
  const [name, ...args] = argv;
241
+ const fn = this.functions.get(name);
242
+ if (fn)
243
+ return this.callFunction(fn, args, io, input, signal);
183
244
  const env = { ...this.env, ...assigned };
184
245
  const ctx = {
185
246
  args,
@@ -205,6 +266,31 @@ export class Shell {
205
266
  return coreutil(ctx);
206
267
  return this.spawnExternal(name, args, env, io, input, signal, attachTerminal);
207
268
  }
269
+ /** A shell function: its own positional parameters and `local` frame; `return` ends it. */
270
+ async callFunction(fn, args, io, input, signal) {
271
+ const savedPositional = this.positional;
272
+ this.positional = args;
273
+ const frame = new Map();
274
+ this.localFrames.push(frame);
275
+ try {
276
+ let status = await runCompound(fn.body, this, io, input, signal);
277
+ if (this.flow?.kind === 'return') {
278
+ status = this.flow.status;
279
+ this.flow = undefined;
280
+ }
281
+ return status;
282
+ }
283
+ finally {
284
+ this.localFrames.pop();
285
+ for (const [name, value] of frame) {
286
+ if (value === undefined)
287
+ delete this.env[name];
288
+ else
289
+ this.env[name] = value;
290
+ }
291
+ this.positional = savedPositional;
292
+ }
293
+ }
208
294
  async spawnExternal(name, args, env, io, input, signal, attachTerminal) {
209
295
  const size = attachTerminal ? this.options.terminalSize?.() : undefined;
210
296
  let child;