@absolutejs/absolute 0.19.0-beta.706 → 0.19.0-beta.707

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 (80) hide show
  1. package/dist/angular/components/constants.js +78 -0
  2. package/dist/angular/components/core/streamingSlotRegistrar.js +58 -0
  3. package/dist/angular/components/core/streamingSlotRegistry.js +114 -0
  4. package/dist/angular/components/defer-slot-payload.js +6 -0
  5. package/dist/angular/components/defer-slot-templates.directive.js +44 -0
  6. package/dist/angular/components/defer-slot.component.js +149 -0
  7. package/dist/angular/components/image.component.js +202 -0
  8. package/dist/angular/components/index.js +4 -0
  9. package/dist/angular/components/stream-slot.component.js +103 -0
  10. package/dist/angular/index.js +7 -9
  11. package/dist/angular/index.js.map +4 -4
  12. package/dist/angular/server.js +7 -9
  13. package/dist/angular/server.js.map +4 -4
  14. package/dist/build.js +19 -26
  15. package/dist/build.js.map +4 -4
  16. package/dist/cli/index.js +197 -144
  17. package/dist/client/index.js +2 -4
  18. package/dist/client/index.js.map +2 -2
  19. package/dist/dev/client/constants.ts +26 -0
  20. package/dist/dev/client/cssUtils.ts +307 -0
  21. package/dist/dev/client/domDiff.ts +226 -0
  22. package/dist/dev/client/domState.ts +421 -0
  23. package/dist/dev/client/domTracker.ts +61 -0
  24. package/dist/dev/client/errorOverlay.ts +184 -0
  25. package/dist/dev/client/frameworkDetect.ts +63 -0
  26. package/dist/dev/client/handlers/angular.ts +572 -0
  27. package/dist/dev/client/handlers/angularRuntime.ts +226 -0
  28. package/dist/dev/client/handlers/html.ts +364 -0
  29. package/dist/dev/client/handlers/htmx.ts +278 -0
  30. package/dist/dev/client/handlers/react.ts +108 -0
  31. package/dist/dev/client/handlers/rebuild.ts +153 -0
  32. package/dist/dev/client/handlers/svelte.ts +334 -0
  33. package/dist/dev/client/handlers/vue.ts +292 -0
  34. package/dist/dev/client/headPatch.ts +233 -0
  35. package/dist/dev/client/hmrClient.ts +273 -0
  36. package/dist/dev/client/hmrState.ts +14 -0
  37. package/dist/dev/client/moduleVersions.ts +62 -0
  38. package/dist/dev/client/reactRefreshSetup.ts +32 -0
  39. package/dist/index.js +29 -33
  40. package/dist/index.js.map +5 -5
  41. package/dist/islands/index.js +6 -8
  42. package/dist/islands/index.js.map +4 -4
  43. package/dist/react/browser.js +7 -7
  44. package/dist/react/browser.js.map +2 -2
  45. package/dist/react/components/browser/index.js +101 -101
  46. package/dist/react/components/index.js +104 -104
  47. package/dist/react/components/index.js.map +2 -2
  48. package/dist/react/index.js +17 -19
  49. package/dist/react/index.js.map +4 -4
  50. package/dist/react/server.js +3 -3
  51. package/dist/react/server.js.map +3 -3
  52. package/dist/src/angular/components/constants.d.ts +75 -0
  53. package/dist/src/angular/components/defer-slot-templates.directive.d.ts +7 -0
  54. package/dist/src/angular/components/defer-slot.component.d.ts +5 -2
  55. package/dist/src/angular/components/image.component.d.ts +5 -2
  56. package/dist/src/angular/components/index.d.ts +4 -4
  57. package/dist/src/angular/components/stream-slot.component.d.ts +3 -0
  58. package/dist/src/constants.d.ts +1 -0
  59. package/dist/svelte/components/AwaitSlot.svelte +39 -0
  60. package/dist/svelte/components/AwaitSlot.svelte.d.ts +2 -0
  61. package/dist/svelte/components/Head.svelte +144 -0
  62. package/dist/svelte/components/Head.svelte.d.ts +2 -0
  63. package/dist/svelte/components/Image.svelte +164 -0
  64. package/dist/svelte/components/Image.svelte.d.ts +5 -0
  65. package/dist/svelte/components/Island.svelte +71 -0
  66. package/dist/svelte/components/Island.svelte.d.ts +5 -0
  67. package/dist/svelte/components/JsonLd.svelte +21 -0
  68. package/dist/svelte/components/JsonLd.svelte.d.ts +2 -0
  69. package/dist/svelte/components/StreamSlot.svelte +41 -0
  70. package/dist/svelte/components/StreamSlot.svelte.d.ts +2 -0
  71. package/dist/svelte/index.js +7 -9
  72. package/dist/svelte/index.js.map +4 -4
  73. package/dist/svelte/server.js +4 -4
  74. package/dist/svelte/server.js.map +3 -3
  75. package/dist/types/globals.d.ts +122 -0
  76. package/dist/vue/index.js +7 -9
  77. package/dist/vue/index.js.map +4 -4
  78. package/dist/vue/server.js +3 -3
  79. package/dist/vue/server.js.map +3 -3
  80. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -18,7 +18,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
18
18
  var __require = import.meta.require;
19
19
 
20
20
  // src/constants.ts
21
- var ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, DEFAULT_PORT = 3000, HTTP_STATUS_OK = 200, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, MAX_ERROR_LENGTH = 200, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
21
+ var ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, DEFAULT_PORT = 3000, HTTP_STATUS_OK = 200, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, MAX_ERROR_LENGTH = 200, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
22
22
  var init_constants = __esm(() => {
23
23
  MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
24
24
  MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
@@ -853,12 +853,15 @@ var cliTag3 = (color, message) => `\x1B[2m${formatTimestamp()}\x1B[0m ${color}[c
853
853
  return null;
854
854
  }
855
855
  }, resolveBuildModule2 = async (candidates) => {
856
- for (const candidate of candidates) {
857
- const mod = await tryImportBuild2(candidate);
858
- if (mod)
859
- return mod;
856
+ const [candidate, ...remaining] = candidates;
857
+ if (!candidate) {
858
+ return;
860
859
  }
861
- return;
860
+ const mod = await tryImportBuild2(candidate);
861
+ if (mod) {
862
+ return mod;
863
+ }
864
+ return resolveBuildModule2(remaining);
862
865
  }, resolveJsxDevRuntimeCompatPath2 = () => {
863
866
  const candidates = [
864
867
  resolve7(import.meta.dir, "..", "..", "dist", "react", "jsxDevRuntimeCompat.js"),
@@ -1203,7 +1206,7 @@ var isCommandService3 = (service) => service.kind === "command" || Array.isArray
1203
1206
  }, shellEscape = (value) => `'${value.replaceAll("'", "'\\''")}'`, runShell = async (name, command) => run(name, ["/bin/bash", "-lc", command]), findBin = (name) => {
1204
1207
  const local = resolve8("node_modules", ".bin", name);
1205
1208
  return existsSync10(local) ? local : null;
1206
- }, stripAnsi3 = (str) => str.replace(/\x1b\[[0-9;]*m/g, ""), formatSvelteOutput = (output) => {
1209
+ }, ANSI_COLOR_REGEX, ANSI_PURPLE_REGEX, ANSI_CYAN_REGEX, ANSI_TOKEN_END_REGEX, stripAnsi3 = (str) => str.replace(ANSI_COLOR_REGEX, ""), formatSvelteOutput = (output) => {
1207
1210
  const cwd = `${process.cwd()}/`;
1208
1211
  const summaryMatch = stripAnsi3(output).match(/svelte-check found (\d+) error/);
1209
1212
  const errorCount = summaryMatch ? parseInt(summaryMatch[1] ?? "0", 10) : 0;
@@ -1220,10 +1223,10 @@ var isCommandService3 = (service) => service.kind === "command" || Array.isArray
1220
1223
  `\x1B[96m${pathMatch[1]}\x1B[0m:\x1B[93m${pathMatch[2]}\x1B[0m`
1221
1224
  ];
1222
1225
  }
1223
- if (result.includes("\x1B[35m")) {
1226
+ if (result.includes(ANSI_PURPLE_REGEX)) {
1224
1227
  const plainLine = stripAnsi3(result);
1225
- const before = stripAnsi3(result.split("\x1B[35m")[0] ?? "");
1226
- const token = stripAnsi3((result.split("\x1B[35m")[1] ?? "").split(/\x1b\[3[69]m/)[0] ?? "");
1228
+ const before = stripAnsi3(result.split(ANSI_PURPLE_REGEX)[0] ?? "");
1229
+ const token = stripAnsi3((result.split(ANSI_PURPLE_REGEX)[1] ?? "").split(ANSI_TOKEN_END_REGEX)[0] ?? "");
1227
1230
  if (!token)
1228
1231
  return [result];
1229
1232
  const expanded = before.replace(/\t/g, " ");
@@ -1234,7 +1237,7 @@ var isCommandService3 = (service) => service.kind === "command" || Array.isArray
1234
1237
  `${" ".repeat(expanded.length)}\x1B[91m${underline}\x1B[0m`
1235
1238
  ];
1236
1239
  }
1237
- if (/^\x1b\[36m|\t/.test(result) && !result.includes("Error") && !result.includes("\x1B[35m")) {
1240
+ if (ANSI_CYAN_REGEX.test(result) && !result.includes("Error") && !result.includes(ANSI_PURPLE_REGEX)) {
1238
1241
  return [];
1239
1242
  }
1240
1243
  return [result];
@@ -1377,6 +1380,11 @@ Found ${errorCount} error${suffix}.`;
1377
1380
  };
1378
1381
  var init_typecheck = __esm(() => {
1379
1382
  init_loadConfig();
1383
+ init_constants();
1384
+ ANSI_COLOR_REGEX = new RegExp(`${String.fromCharCode(ANSI_ESCAPE_CODE)}\\[[0-9;]*m`, "g");
1385
+ ANSI_PURPLE_REGEX = `${String.fromCharCode(ANSI_ESCAPE_CODE)}[35m`;
1386
+ ANSI_CYAN_REGEX = new RegExp(`^${String.fromCharCode(ANSI_ESCAPE_CODE)}\\[36m|\\t`);
1387
+ ANSI_TOKEN_END_REGEX = new RegExp(`${String.fromCharCode(ANSI_ESCAPE_CODE)}\\[3[69]m`);
1380
1388
  TYPECHECK_EXCLUDE = [
1381
1389
  "../node_modules/**/*",
1382
1390
  "../**/.absolutejs/**/*",
@@ -1431,7 +1439,10 @@ var trySetRawMode = () => {
1431
1439
  } catch {
1432
1440
  return null;
1433
1441
  }
1434
- return process.stdin;
1442
+ return {
1443
+ destroyOnDispose: false,
1444
+ stream: process.stdin
1445
+ };
1435
1446
  };
1436
1447
  var openTtyStream = () => {
1437
1448
  const fromStdin = trySetRawMode();
@@ -1441,7 +1452,10 @@ var openTtyStream = () => {
1441
1452
  try {
1442
1453
  const ttyStream = new ReadStream(openSync("/dev/tty", "r"));
1443
1454
  ttyStream.setRawMode(true);
1444
- return ttyStream;
1455
+ return {
1456
+ destroyOnDispose: true,
1457
+ stream: ttyStream
1458
+ };
1445
1459
  } catch {
1446
1460
  return null;
1447
1461
  }
@@ -1633,19 +1647,19 @@ var createInteractiveHandler = (actions) => {
1633
1647
  processChar(str.charAt(idx));
1634
1648
  }
1635
1649
  };
1636
- const ttyStream = openTtyStream();
1637
- const input = ttyStream ?? process.stdin;
1650
+ const ttyInput = openTtyStream();
1651
+ const input = ttyInput?.stream ?? process.stdin;
1638
1652
  input.resume();
1639
1653
  input.on("data", onData);
1640
1654
  const disposeTtyStream = () => {
1641
- if (!ttyStream) {
1655
+ if (!ttyInput) {
1642
1656
  return;
1643
1657
  }
1644
1658
  try {
1645
- ttyStream.setRawMode(false);
1659
+ ttyInput.stream.setRawMode?.(false);
1646
1660
  } catch {}
1647
- if (ttyStream !== process.stdin) {
1648
- ttyStream.destroy();
1661
+ if (ttyInput.destroyOnDispose) {
1662
+ ttyInput.stream.destroy?.();
1649
1663
  }
1650
1664
  };
1651
1665
  const dispose = () => {
@@ -1667,8 +1681,7 @@ init_telemetryEvent();
1667
1681
  init_loadConfig();
1668
1682
  init_utils();
1669
1683
  var cliTag = (color, message) => `\x1B[2m${formatTimestamp()}\x1B[0m ${color}[cli]\x1B[0m ${color}${message}\x1B[0m`;
1670
- var confirmPrompt = (message, defaultYes = true) => {
1671
- const { promise, resolve: resolve4 } = Promise.withResolvers();
1684
+ var confirmPrompt = (message, defaultYes = true) => new Promise((_resolve) => {
1672
1685
  let selected = defaultYes;
1673
1686
  const render = () => {
1674
1687
  const yes = selected ? "\x1B[36m\u25CF\x1B[0m Yes" : "\x1B[2m\u25CB Yes\x1B[0m";
@@ -1694,7 +1707,7 @@ var confirmPrompt = (message, defaultYes = true) => {
1694
1707
  process.stdout.write(`\x1B[2K\x1B[32m\u25C7\x1B[0m ${message}
1695
1708
  \x1B[2K \x1B[2m${label}\x1B[0m
1696
1709
  \x1B[?25h`);
1697
- resolve4(selected);
1710
+ _resolve(selected);
1698
1711
  } else if (key === "\x03") {
1699
1712
  process.stdout.write("\x1B[?25h");
1700
1713
  process.stdin.setRawMode(false);
@@ -1702,8 +1715,7 @@ var confirmPrompt = (message, defaultYes = true) => {
1702
1715
  }
1703
1716
  };
1704
1717
  process.stdin.on("data", onData);
1705
- return promise;
1706
- };
1718
+ });
1707
1719
  var setupCertWithPrompt = async (ensureDevCert2, setupMkcert2) => {
1708
1720
  const install = await confirmPrompt("Install mkcert for trusted HTTPS? (no browser warning)");
1709
1721
  if (install) {
@@ -1929,20 +1941,15 @@ var dev = async (serverEntry, configPath2) => {
1929
1941
  return true;
1930
1942
  };
1931
1943
  const monitorServer = async () => {
1932
- if (cleaning) {
1933
- return;
1934
- }
1935
- const current = serverProcess;
1936
- const exitCode = await current.exited;
1937
- if (cleaning || serverProcess !== current) {
1938
- await monitorServer();
1939
- return;
1940
- }
1941
- const shouldContinue = await handleServerExit(exitCode);
1942
- if (!shouldContinue) {
1943
- return;
1944
+ while (!cleaning) {
1945
+ const current = serverProcess;
1946
+ const exitCode = await current.exited;
1947
+ if (cleaning || serverProcess !== current)
1948
+ continue;
1949
+ const shouldContinue = await handleServerExit(exitCode);
1950
+ if (!shouldContinue)
1951
+ return;
1944
1952
  }
1945
- await monitorServer();
1946
1953
  };
1947
1954
  await monitorServer();
1948
1955
  };
@@ -2203,9 +2210,7 @@ var runTool = async (adapter, args) => {
2203
2210
  batches.push(changed.slice(idx, idx + MAX_FILES_PER_BATCH));
2204
2211
  }
2205
2212
  const failedFiles = new Set;
2206
- for (const batch of batches) {
2207
- await runBatch(adapter, batch, args, failedFiles);
2208
- }
2213
+ await batches.reduce((chain, batch) => chain.then(() => runBatch(adapter, batch, args, failedFiles)), Promise.resolve());
2209
2214
  for (const file of failedFiles) {
2210
2215
  delete cache.files[file];
2211
2216
  }
@@ -2285,13 +2290,15 @@ var readPackageVersion2 = (candidate) => {
2285
2290
  return null;
2286
2291
  };
2287
2292
  var resolveBuildModule = async (candidates) => {
2288
- for (const candidate of candidates) {
2289
- const mod = await tryImportBuild(candidate);
2290
- if (mod) {
2291
- return mod;
2292
- }
2293
+ const [candidate, ...remaining] = candidates;
2294
+ if (!candidate) {
2295
+ return;
2293
2296
  }
2294
- return;
2297
+ const mod = await tryImportBuild(candidate);
2298
+ if (mod) {
2299
+ return mod;
2300
+ }
2301
+ return resolveBuildModule(remaining);
2295
2302
  };
2296
2303
  var tryImportBuild = async (candidate) => {
2297
2304
  try {
@@ -2581,7 +2588,8 @@ import { openSync as openSync2 } from "fs";
2581
2588
  import { ReadStream as ReadStream2 } from "tty";
2582
2589
  var MAX_LOG_ENTRIES = 400;
2583
2590
  var ESCAPE = "\x1B";
2584
- var ANSI_REGEX = /\x1B\[[0-?]*[ -/]*[@-~]/g;
2591
+ var ANSI_REGEX = new RegExp(`${String.fromCharCode(ANSI_ESCAPE_CODE)}\\[[0-?]*[ -/]*[@-~]`, "g");
2592
+ var ANSI_ESCAPE_PREFIX = `${ESCAPE}[`;
2585
2593
  var SHORTCUTS2 = new Map([
2586
2594
  ["c", "clear"],
2587
2595
  ["h", "help"],
@@ -2773,6 +2781,17 @@ var getWorkspaceStatus = (services) => {
2773
2781
  }
2774
2782
  return "ready";
2775
2783
  };
2784
+ var getVisibleLogContent = (contentLines, logHeight, logScrollOffset) => {
2785
+ const end = Math.max(0, contentLines.length - logScrollOffset);
2786
+ const start2 = Math.max(0, end - logHeight);
2787
+ return contentLines.slice(start2, end);
2788
+ };
2789
+ var isPartialEscapeSequence = (value) => {
2790
+ if (!value.startsWith(ANSI_ESCAPE_PREFIX)) {
2791
+ return false;
2792
+ }
2793
+ return Array.from(value.slice(ANSI_ESCAPE_PREFIX.length)).every((char) => char >= "0" && char <= "9");
2794
+ };
2776
2795
  var createWorkspaceTui = ({
2777
2796
  actions,
2778
2797
  services,
@@ -2896,11 +2915,7 @@ var createWorkspaceTui = ({
2896
2915
  lastLogViewportHeight = logHeight;
2897
2916
  logScrollOffset = Math.min(logScrollOffset, Math.max(0, contentLines.length - logHeight));
2898
2917
  }
2899
- const visibleContent = helpVisible ? contentLines.slice(0, logHeight) : (() => {
2900
- const end = Math.max(0, contentLines.length - logScrollOffset);
2901
- const start3 = Math.max(0, end - logHeight);
2902
- return contentLines.slice(start3, end);
2903
- })();
2918
+ const visibleContent = helpVisible ? contentLines.slice(0, logHeight) : getVisibleLogContent(contentLines, logHeight, logScrollOffset);
2904
2919
  const maxLogScrollOffset = !helpVisible ? Math.max(0, contentLines.length - logHeight) : 0;
2905
2920
  const shouldShowScrollbar = !helpVisible && maxLogScrollOffset > 0;
2906
2921
  const scrollbarThumbHeight = shouldShowScrollbar ? Math.max(1, Math.min(logHeight, Math.round(logHeight / contentLines.length * logHeight))) : 0;
@@ -3093,7 +3108,7 @@ var createWorkspaceTui = ({
3093
3108
  handleScrollEscape("end");
3094
3109
  return;
3095
3110
  }
3096
- if (/^\x1b\[[0-9]*$/.test(escapeBuffer)) {
3111
+ if (isPartialEscapeSequence(escapeBuffer)) {
3097
3112
  armEscapeTimer();
3098
3113
  return;
3099
3114
  }
@@ -3161,16 +3176,15 @@ var createWorkspaceTui = ({
3161
3176
  }
3162
3177
  await handlePrintableChar(char);
3163
3178
  };
3179
+ const processInputChars = async (chars) => {
3180
+ await Array.from(chars).reduce((chain, char) => chain.then(() => handleChar(char)), Promise.resolve());
3181
+ };
3164
3182
  const onResize = () => {
3165
3183
  scheduleRender();
3166
3184
  };
3167
3185
  const onData = (chunk) => {
3168
3186
  const chars = chunk.toString();
3169
- (async () => {
3170
- for (const char of chars) {
3171
- await handleChar(char);
3172
- }
3173
- })();
3187
+ processInputChars(chars);
3174
3188
  };
3175
3189
  const start2 = () => {
3176
3190
  process.stdout.write("\x1B[?1049h\x1B[2J\x1B[H\x1B[?25l");
@@ -3222,8 +3236,8 @@ var createWorkspaceTui = ({
3222
3236
 
3223
3237
  // src/cli/scripts/workspace.ts
3224
3238
  init_utils();
3225
- var ANSI_REGEX2 = /\x1B\[[0-?]*[ -/]*[@-~]/g;
3226
- var sleep = (ms) => new Promise((resolvePromise) => setTimeout(resolvePromise, ms));
3239
+ var ANSI_REGEX2 = new RegExp(`${String.fromCharCode(ANSI_ESCAPE_CODE)}\\[[0-?]*[ -/]*[@-~]`, "g");
3240
+ var sleep = (durationMs) => Bun.sleep(durationMs);
3227
3241
  var stripAnsi2 = (value) => value.replace(ANSI_REGEX2, "");
3228
3242
  var sanitizeLogFileName = (value) => value.replace(/[^a-zA-Z0-9._-]/g, "_") || "unknown";
3229
3243
  var createWorkspaceLogSink = (appendLog) => {
@@ -3250,11 +3264,11 @@ var createWorkspaceLogSink = (appendLog) => {
3250
3264
  appendFileSync(resolve6(logDirectory, "all.log"), line);
3251
3265
  };
3252
3266
  return {
3253
- logDirectory,
3254
3267
  appendLog: (source, message, level = "info") => {
3255
3268
  writeLog(source, message, level);
3256
3269
  appendLog(source, message, level);
3257
- }
3270
+ },
3271
+ logDirectory
3258
3272
  };
3259
3273
  };
3260
3274
  var readPackageVersion3 = (candidate) => {
@@ -3299,6 +3313,7 @@ var getDefaultReadyConfig = (service) => {
3299
3313
  return;
3300
3314
  };
3301
3315
  var normalizeExpectedStatuses = (value) => Array.isArray(value) ? value : [value ?? HTTP_STATUS_OK];
3316
+ var runSequentially = (items, action) => items.reduce((chain, item) => chain.then(() => action(item)), Promise.resolve());
3302
3317
  var resolveServiceHttpUrl = (service, path) => {
3303
3318
  if (!path.startsWith("/")) {
3304
3319
  throw new Error(`ready path must start with "/" for service probes. Received "${path}".`);
@@ -3310,17 +3325,18 @@ var resolveServiceHttpUrl = (service, path) => {
3310
3325
  };
3311
3326
  var resolveHttpReadyProbe = (service, ready) => {
3312
3327
  if (typeof ready === "string") {
3313
- if (isAbsoluteService(service)) {
3328
+ if (!isAbsoluteService(service)) {
3314
3329
  return {
3315
- type: "http",
3316
- url: resolveServiceHttpUrl(service, ready),
3317
- method: "GET",
3318
3330
  expectStatus: [HTTP_STATUS_OK],
3319
3331
  headers: {},
3320
3332
  intervalMs: WORKSPACE_READY_PROBE_INTERVAL_MS,
3321
- timeoutMs: WORKSPACE_READY_TIMEOUT_MS
3333
+ method: "GET",
3334
+ timeoutMs: WORKSPACE_READY_TIMEOUT_MS,
3335
+ type: "http",
3336
+ url: ready
3322
3337
  };
3323
3338
  }
3339
+ const url2 = resolveServiceHttpUrl(service, ready);
3324
3340
  return {
3325
3341
  expectStatus: [HTTP_STATUS_OK],
3326
3342
  headers: {},
@@ -3328,26 +3344,38 @@ var resolveHttpReadyProbe = (service, ready) => {
3328
3344
  method: "GET",
3329
3345
  timeoutMs: WORKSPACE_READY_TIMEOUT_MS,
3330
3346
  type: "http",
3331
- url: ready
3347
+ url: url2
3332
3348
  };
3333
3349
  }
3334
3350
  if (ready.path && ready.url) {
3335
3351
  throw new Error('ready HTTP probe cannot define both "path" and "url".');
3336
3352
  }
3337
- const url = ready.path ? resolveServiceHttpUrl(service, ready.path) : ready.url ? ready.url : isAbsoluteService(service) ? resolveServiceHttpUrl(service, "/hmr-status") : null;
3353
+ const url = resolveHttpReadyProbeUrl(service, ready);
3338
3354
  if (!url) {
3339
3355
  throw new Error('ready HTTP probe requires either "url" or "path".');
3340
3356
  }
3341
3357
  return {
3342
- type: "http",
3343
- url,
3344
- method: ready.method ?? "GET",
3345
3358
  expectStatus: normalizeExpectedStatuses(ready.expectStatus),
3346
3359
  headers: ready.headers ?? {},
3347
3360
  intervalMs: ready.intervalMs ?? WORKSPACE_READY_PROBE_INTERVAL_MS,
3348
- timeoutMs: ready.timeoutMs ?? WORKSPACE_READY_TIMEOUT_MS
3361
+ method: ready.method ?? "GET",
3362
+ timeoutMs: ready.timeoutMs ?? WORKSPACE_READY_TIMEOUT_MS,
3363
+ type: "http",
3364
+ url
3349
3365
  };
3350
3366
  };
3367
+ var resolveHttpReadyProbeUrl = (service, ready) => {
3368
+ if (ready.path) {
3369
+ return resolveServiceHttpUrl(service, ready.path);
3370
+ }
3371
+ if (ready.url) {
3372
+ return ready.url;
3373
+ }
3374
+ if (isAbsoluteService(service)) {
3375
+ return resolveServiceHttpUrl(service, "/hmr-status");
3376
+ }
3377
+ return null;
3378
+ };
3351
3379
  var resolveReadyProbe = (service, ready = service.ready ?? getDefaultReadyConfig(service)) => {
3352
3380
  if (ready === false || !ready) {
3353
3381
  return null;
@@ -3357,11 +3385,11 @@ var resolveReadyProbe = (service, ready = service.ready ?? getDefaultReadyConfig
3357
3385
  }
3358
3386
  if (ready.type === "tcp") {
3359
3387
  return {
3360
- type: "tcp",
3361
3388
  host: ready.host ?? getServicePublicHost(service),
3362
- port: ready.port,
3363
3389
  intervalMs: ready.intervalMs ?? WORKSPACE_READY_PROBE_INTERVAL_MS,
3364
- timeoutMs: ready.timeoutMs ?? WORKSPACE_READY_TIMEOUT_MS
3390
+ port: ready.port,
3391
+ timeoutMs: ready.timeoutMs ?? WORKSPACE_READY_TIMEOUT_MS,
3392
+ type: "tcp"
3365
3393
  };
3366
3394
  }
3367
3395
  if (ready.type === "command") {
@@ -3381,14 +3409,16 @@ var resolveReadyProbe = (service, ready = service.ready ?? getDefaultReadyConfig
3381
3409
  return resolveHttpReadyProbe(service, ready);
3382
3410
  };
3383
3411
  var probeHttpReady = async (ready) => {
3412
+ const signal = AbortSignal.timeout(Math.min(ready.timeoutMs, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS));
3384
3413
  const response = await fetch(ready.url, {
3385
- method: ready.method,
3386
3414
  headers: ready.headers,
3387
- signal: AbortSignal.timeout(Math.min(ready.timeoutMs, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS))
3415
+ method: ready.method,
3416
+ signal
3388
3417
  });
3389
3418
  return ready.expectStatus.includes(response.status);
3390
3419
  };
3391
- var probeTcpReady = async (ready) => new Promise((resolveProbe) => {
3420
+ var probeTcpReady = async (ready) => {
3421
+ const { promise, resolve: resolveProbe } = Promise.withResolvers();
3392
3422
  const socket = createConnection({
3393
3423
  host: ready.host,
3394
3424
  port: ready.port
@@ -3407,7 +3437,8 @@ var probeTcpReady = async (ready) => new Promise((resolveProbe) => {
3407
3437
  socket.destroy();
3408
3438
  resolveProbe(false);
3409
3439
  });
3410
- });
3440
+ return promise;
3441
+ };
3411
3442
  var probeCommandReady = async (ready, service) => {
3412
3443
  const processHandle = Bun.spawn(ready.command, {
3413
3444
  cwd: service.cwd,
@@ -3437,14 +3468,30 @@ var waitForReady = async (service) => {
3437
3468
  await sleep(resolved.ms);
3438
3469
  return;
3439
3470
  }
3440
- const startedAt = Date.now();
3441
- while (Date.now() - startedAt < resolved.timeoutMs) {
3442
- if (await probeReady(resolved, service)) {
3443
- return;
3444
- }
3445
- await sleep(resolved.intervalMs);
3471
+ const isReady = await pollReady(resolved, service, Date.now());
3472
+ if (isReady) {
3473
+ return;
3446
3474
  }
3447
- throw new Error(resolved.type === "http" ? `service did not become ready within ${resolved.timeoutMs}ms (${resolved.url})` : resolved.type === "tcp" ? `service did not become ready within ${resolved.timeoutMs}ms (tcp://${resolved.host}:${resolved.port})` : `service did not become ready within ${resolved.timeoutMs}ms (${resolved.command.join(" ")})`);
3475
+ throw new Error(formatReadyTimeoutMessage(resolved));
3476
+ };
3477
+ var pollReady = async (resolved, service, startedAt) => {
3478
+ if (Date.now() - startedAt >= resolved.timeoutMs) {
3479
+ return false;
3480
+ }
3481
+ if (await probeReady(resolved, service)) {
3482
+ return true;
3483
+ }
3484
+ await sleep(resolved.intervalMs);
3485
+ return pollReady(resolved, service, startedAt);
3486
+ };
3487
+ var formatReadyTimeoutMessage = (resolved) => {
3488
+ if (resolved.type === "http") {
3489
+ return `service did not become ready within ${resolved.timeoutMs}ms (${resolved.url})`;
3490
+ }
3491
+ if (resolved.type === "tcp") {
3492
+ return `service did not become ready within ${resolved.timeoutMs}ms (tcp://${resolved.host}:${resolved.port})`;
3493
+ }
3494
+ return `service did not become ready within ${resolved.timeoutMs}ms (${resolved.command.join(" ")})`;
3448
3495
  };
3449
3496
  var probeReady = async (resolved, service) => {
3450
3497
  try {
@@ -3533,13 +3580,17 @@ var pipeProcessLogs = (name, processHandle, appendLog) => {
3533
3580
  const forward = async (stream, level) => {
3534
3581
  let buffer = "";
3535
3582
  const reader = stream.getReader();
3536
- let chunk = await readLogChunk(reader);
3537
- while (chunk !== null) {
3583
+ const forwardNextChunk = async () => {
3584
+ const chunk = await readLogChunk(reader);
3585
+ if (chunk === null) {
3586
+ appendRemainingLogBuffer(buffer, name, level, appendLog);
3587
+ reader.releaseLock();
3588
+ return;
3589
+ }
3538
3590
  buffer = appendLogChunk(buffer, chunk, name, level, appendLog);
3539
- chunk = await readLogChunk(reader);
3540
- }
3541
- appendRemainingLogBuffer(buffer, name, level, appendLog);
3542
- reader.releaseLock();
3591
+ await forwardNextChunk();
3592
+ };
3593
+ await forwardNextChunk();
3543
3594
  };
3544
3595
  forward(processHandle.stdout, "info");
3545
3596
  forward(processHandle.stderr, "error");
@@ -3575,7 +3626,7 @@ var getServicePublicHost = (service) => {
3575
3626
  var getServiceProtocol = (service) => service.env?.ABSOLUTE_HTTPS === "true" || process.env.ABSOLUTE_HTTPS === "true" ? "https" : "http";
3576
3627
  var createWorkspaceServiceEnv = (services) => {
3577
3628
  const workspaceEnv = {};
3578
- for (const [name, service] of Object.entries(services).filter(([, service2]) => Boolean(service2.port))) {
3629
+ for (const [name, service] of Object.entries(services).filter(([, filteredService]) => Boolean(filteredService.port))) {
3579
3630
  const envKey = `ABSOLUTE_SERVICE_${name.toUpperCase().replace(/[^A-Z0-9]+/g, "_")}_URL`;
3580
3631
  workspaceEnv[envKey] = `${getServiceProtocol(service)}://${getServicePublicHost(service)}:${service.port}`;
3581
3632
  }
@@ -3690,9 +3741,7 @@ var workspace = async (subcommand, options) => {
3690
3741
  running.length = 0;
3691
3742
  snapshot.forEach((service) => killProcess(service));
3692
3743
  await Promise.all(snapshot.map((service) => service.process.exited));
3693
- for (const service of snapshot.reverse()) {
3694
- await runShutdownHookSafely(service);
3695
- }
3744
+ await runSequentially(snapshot.reverse(), runShutdownHookSafely);
3696
3745
  };
3697
3746
  const appendRecentLogs = (lines, logsToPrint) => {
3698
3747
  if (logsToPrint.length === 0) {
@@ -3778,54 +3827,58 @@ var workspace = async (subcommand, options) => {
3778
3827
  await killProcesses();
3779
3828
  process.exit(exitCode);
3780
3829
  };
3830
+ const handleServiceExit = (runningService, exitCode) => {
3831
+ if (shuttingDown || restarting) {
3832
+ return;
3833
+ }
3834
+ if (!running.includes(runningService)) {
3835
+ return;
3836
+ }
3837
+ const serviceName = runningService.name;
3838
+ const normalizedExitCode = exitCode || 1;
3839
+ tui.setServiceStatus(serviceName, "error", `exit code ${normalizedExitCode}`);
3840
+ readyServiceNames.delete(serviceName);
3841
+ addLog("workspace", `${serviceName} exited with code ${normalizedExitCode}. Shutting down workspace.`, "error");
3842
+ shutdown(normalizedExitCode);
3843
+ };
3844
+ const startService = async (name) => {
3845
+ const service = services[name];
3846
+ if (!service) {
3847
+ throw new Error(`services is missing "${name}"`);
3848
+ }
3849
+ const resolved = resolveService(name, service, workspaceEnv, options);
3850
+ const port = (resolved.service.port ?? Number(resolved.env.PORT ?? "")) || DEFAULT_PORT;
3851
+ killStaleServicePort(port);
3852
+ if (isAbsoluteService(resolved.service) && resolved.configPath && !existsSync8(resolved.configPath)) {
3853
+ throw new Error(`${name} references missing config "${resolved.configPath}"`);
3854
+ }
3855
+ serviceBootStartedAt.set(name, performance.now());
3856
+ readyServiceNames.delete(name);
3857
+ tui.setServiceStatus(name, restarting ? "restarting" : "starting");
3858
+ const processHandle = Bun.spawn(resolved.command, {
3859
+ cwd: resolved.cwd,
3860
+ env: resolved.env,
3861
+ stderr: "pipe",
3862
+ stdin: "ignore",
3863
+ stdout: "pipe"
3864
+ });
3865
+ pipeProcessLogs(name, processHandle, addLog);
3866
+ const runningService = {
3867
+ name,
3868
+ process: processHandle,
3869
+ resolved
3870
+ };
3871
+ running.push(runningService);
3872
+ processHandle.exited.then(handleServiceExit.bind(null, runningService));
3873
+ await waitForReady(resolved);
3874
+ const startedAt = serviceBootStartedAt.get(name);
3875
+ const readyDuration = typeof startedAt === "number" ? `ready in ${getDurationString(performance.now() - startedAt)}` : undefined;
3876
+ readyServiceNames.add(name);
3877
+ tui.setServiceStatus(name, "ready", readyDuration);
3878
+ };
3781
3879
  const startServices = async () => {
3782
3880
  tui.setReadyDuration(null);
3783
- for (const name of orderedNames) {
3784
- const service = services[name];
3785
- if (!service) {
3786
- throw new Error(`services is missing "${name}"`);
3787
- }
3788
- const resolved = resolveService(name, service, workspaceEnv, options);
3789
- const port = (resolved.service.port ?? Number(resolved.env.PORT ?? "")) || DEFAULT_PORT;
3790
- killStaleServicePort(port);
3791
- if (isAbsoluteService(resolved.service) && resolved.configPath && !existsSync8(resolved.configPath)) {
3792
- throw new Error(`${name} references missing config "${resolved.configPath}"`);
3793
- }
3794
- serviceBootStartedAt.set(name, performance.now());
3795
- readyServiceNames.delete(name);
3796
- tui.setServiceStatus(name, restarting ? "restarting" : "starting");
3797
- const processHandle = Bun.spawn(resolved.command, {
3798
- cwd: resolved.cwd,
3799
- env: resolved.env,
3800
- stderr: "pipe",
3801
- stdin: "ignore",
3802
- stdout: "pipe"
3803
- });
3804
- pipeProcessLogs(name, processHandle, addLog);
3805
- const runningService = {
3806
- name,
3807
- process: processHandle,
3808
- resolved
3809
- };
3810
- running.push(runningService);
3811
- processHandle.exited.then((exitCode) => {
3812
- if (shuttingDown || restarting) {
3813
- return;
3814
- }
3815
- if (!running.includes(runningService)) {
3816
- return;
3817
- }
3818
- tui.setServiceStatus(name, "error", `exit code ${exitCode || 1}`);
3819
- readyServiceNames.delete(name);
3820
- addLog("workspace", `${name} exited with code ${exitCode || 1}. Shutting down workspace.`, "error");
3821
- shutdown(exitCode || 1);
3822
- });
3823
- await waitForReady(resolved);
3824
- const startedAt = serviceBootStartedAt.get(name);
3825
- const readyDuration = typeof startedAt === "number" ? `ready in ${getDurationString(performance.now() - startedAt)}` : undefined;
3826
- readyServiceNames.add(name);
3827
- tui.setServiceStatus(name, "ready", readyDuration);
3828
- }
3881
+ await runSequentially(orderedNames, startService);
3829
3882
  };
3830
3883
  const restartWorkspace = async () => {
3831
3884
  if (shuttingDown || restarting) {
@@ -3910,7 +3963,7 @@ var workspace = async (subcommand, options) => {
3910
3963
  tui.start();
3911
3964
  await startServices();
3912
3965
  tui.setReadyDuration(performance.now() - workspaceBootStartedAt);
3913
- await new Promise(() => {});
3966
+ await Promise.withResolvers().promise;
3914
3967
  };
3915
3968
 
3916
3969
  // src/cli/index.ts
@@ -341,9 +341,7 @@ var initDominoAdapter = (platformServer) => {
341
341
  import(resolveAngularPackage("@angular/common")),
342
342
  import(resolveAngularPackage("@angular/core"))
343
343
  ]);
344
- if (true) {
345
- core.enableProdMode();
346
- }
344
+ if (false) {}
347
345
  initDominoAdapter(platformServer);
348
346
  return {
349
347
  APP_BASE_HREF: common.APP_BASE_HREF,
@@ -1166,5 +1164,5 @@ export {
1166
1164
  createIslandManifestResolver
1167
1165
  };
1168
1166
 
1169
- //# debugId=20A3D85BFDCC164B64756E2164756E21
1167
+ //# debugId=367CE8509FAAC2E564756E2164756E21
1170
1168
  //# sourceMappingURL=index.js.map