@superblocksteam/sdk 2.0.156-next.3 → 2.0.156

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 (62) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/cli-replacement/automatic-upgrades.d.ts.map +1 -1
  3. package/dist/cli-replacement/automatic-upgrades.js +8 -4
  4. package/dist/cli-replacement/automatic-upgrades.js.map +1 -1
  5. package/dist/cli-replacement/automatic-upgrades.test.js +1 -2
  6. package/dist/cli-replacement/automatic-upgrades.test.js.map +1 -1
  7. package/dist/cli-replacement/dev-s3-restore.test.mjs +2 -6
  8. package/dist/cli-replacement/dev-s3-restore.test.mjs.map +1 -1
  9. package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs +2 -6
  10. package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs.map +1 -1
  11. package/dist/cli-replacement/dev.d.mts +6 -6
  12. package/dist/cli-replacement/dev.d.mts.map +1 -1
  13. package/dist/cli-replacement/dev.interception.test.mjs +12 -12
  14. package/dist/cli-replacement/dev.interception.test.mjs.map +1 -1
  15. package/dist/cli-replacement/dev.mjs +42 -100
  16. package/dist/cli-replacement/dev.mjs.map +1 -1
  17. package/dist/dev-utils/dev-server.d.mts +1 -34
  18. package/dist/dev-utils/dev-server.d.mts.map +1 -1
  19. package/dist/dev-utils/dev-server.mjs +70 -69
  20. package/dist/dev-utils/dev-server.mjs.map +1 -1
  21. package/dist/telemetry/logging.js +1 -1
  22. package/dist/telemetry/logging.js.map +1 -1
  23. package/dist/telemetry/safe-stringify.d.ts.map +1 -1
  24. package/dist/telemetry/safe-stringify.js +9 -25
  25. package/dist/telemetry/safe-stringify.js.map +1 -1
  26. package/package.json +6 -10
  27. package/src/cli-replacement/automatic-upgrades.test.ts +1 -2
  28. package/src/cli-replacement/automatic-upgrades.ts +11 -4
  29. package/src/cli-replacement/dev-s3-restore.test.mts +2 -6
  30. package/src/cli-replacement/dev-startup-git-before-dbfs-order.test.mts +2 -6
  31. package/src/cli-replacement/dev.interception.test.mts +12 -12
  32. package/src/cli-replacement/dev.mts +56 -112
  33. package/src/dev-utils/dev-server.mts +88 -93
  34. package/src/telemetry/logging.ts +1 -1
  35. package/src/telemetry/safe-stringify.ts +10 -25
  36. package/test/safe-stringify.test.mts +0 -25
  37. package/tsconfig.tsbuildinfo +1 -1
  38. package/dist/cli-replacement/dev-startup-lock-acquisition.test.d.mts +0 -2
  39. package/dist/cli-replacement/dev-startup-lock-acquisition.test.d.mts.map +0 -1
  40. package/dist/cli-replacement/dev-startup-lock-acquisition.test.mjs +0 -487
  41. package/dist/cli-replacement/dev-startup-lock-acquisition.test.mjs.map +0 -1
  42. package/dist/dev-utils/dev-server.shutdown-lock.test.d.mts +0 -2
  43. package/dist/dev-utils/dev-server.shutdown-lock.test.d.mts.map +0 -1
  44. package/dist/dev-utils/dev-server.shutdown-lock.test.mjs +0 -48
  45. package/dist/dev-utils/dev-server.shutdown-lock.test.mjs.map +0 -1
  46. package/dist/dev-utils/fatal-process-barrier.d.mts +0 -71
  47. package/dist/dev-utils/fatal-process-barrier.d.mts.map +0 -1
  48. package/dist/dev-utils/fatal-process-barrier.mjs +0 -161
  49. package/dist/dev-utils/fatal-process-barrier.mjs.map +0 -1
  50. package/dist/dev-utils/fatal-process-barrier.spawn-fixture.d.mts +0 -2
  51. package/dist/dev-utils/fatal-process-barrier.spawn-fixture.d.mts.map +0 -1
  52. package/dist/dev-utils/fatal-process-barrier.spawn-fixture.mjs +0 -9
  53. package/dist/dev-utils/fatal-process-barrier.spawn-fixture.mjs.map +0 -1
  54. package/dist/dev-utils/fatal-process-barrier.test.d.mts +0 -2
  55. package/dist/dev-utils/fatal-process-barrier.test.d.mts.map +0 -1
  56. package/dist/dev-utils/fatal-process-barrier.test.mjs +0 -281
  57. package/dist/dev-utils/fatal-process-barrier.test.mjs.map +0 -1
  58. package/src/cli-replacement/dev-startup-lock-acquisition.test.mts +0 -573
  59. package/src/dev-utils/dev-server.shutdown-lock.test.mts +0 -58
  60. package/src/dev-utils/fatal-process-barrier.mts +0 -262
  61. package/src/dev-utils/fatal-process-barrier.spawn-fixture.mts +0 -12
  62. package/src/dev-utils/fatal-process-barrier.test.mts +0 -346
@@ -1 +0,0 @@
1
- {"version":3,"file":"fatal-process-barrier.d.mts","sourceRoot":"","sources":["../../src/dev-utils/fatal-process-barrier.mts"],"names":[],"mappings":"AAQA,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,oBAAoB,CAAC;AAE7E,MAAM,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC5D,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IACxE;;;;OAIG;IACH,OAAO,CAAC,EAAE,CACR,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,OAAO,KACZ,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,wBAAwB,GAAG;IAClE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,UAAU,CAAC,EAAE,wBAAwB,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,EAAE,OAAO,CAAC;QAChB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;QACtD,OAAO,CAAC,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC;KAC/C,CAAC;IACF,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,qCAAqC,EACrC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,GACvC,SAAS,CAAC;CACf;AA0HD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,0BAA+B,GACvC,MAAM,IAAI,CAuCZ;AAED,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,gBAA0B,GAC/B,OAAO,CAET;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,gBAA0B,GAAG,MAAM,CAE3E;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
@@ -1,161 +0,0 @@
1
- import { sanitizeLogError, sanitizeLogMessage, } from "@superblocksteam/telemetry";
2
- import { safeStringify } from "../telemetry/safe-stringify.js";
3
- import { buildFatalExitLog, parseIsWarm } from "./fatal-exit.mjs";
4
- function armedHosts() {
5
- const existing = globalThis.__superblocksFatalProcessBarrierArmed;
6
- if (existing) {
7
- return existing;
8
- }
9
- const created = new WeakMap();
10
- globalThis.__superblocksFatalProcessBarrierArmed = created;
11
- return created;
12
- }
13
- function fatalErrorMeta(reason) {
14
- if (reason instanceof Error) {
15
- return {
16
- error: {
17
- kind: reason.name,
18
- message: reason.message,
19
- stack: reason.stack,
20
- },
21
- };
22
- }
23
- return {
24
- error: {
25
- kind: "Unknown Error",
26
- message: safeStringify(reason),
27
- },
28
- };
29
- }
30
- function stringField(value, key) {
31
- if (typeof value !== "object" || value === null || !(key in value)) {
32
- return undefined;
33
- }
34
- const field = Reflect.get(value, key);
35
- if (typeof field === "string") {
36
- return field;
37
- }
38
- if (field === undefined) {
39
- return undefined;
40
- }
41
- return safeStringify(field);
42
- }
43
- function defaultLog(message, meta) {
44
- const safeMessage = sanitizeLogMessage(message);
45
- if (!meta?.error) {
46
- console.error(safeMessage);
47
- return;
48
- }
49
- const sanitized = sanitizeLogError(meta.error);
50
- console.error(safeMessage, {
51
- error: {
52
- kind: stringField(sanitized, "kind") ??
53
- stringField(sanitized, "name") ??
54
- "Error",
55
- message: stringField(sanitized, "message"),
56
- stack: stringField(sanitized, "stack"),
57
- },
58
- });
59
- }
60
- function mergeHooks(existing, options) {
61
- return {
62
- exit: options.exit ?? existing.exit,
63
- isNonFatal: options.isNonFatal ?? existing.isNonFatal,
64
- isWarm: options.isWarm ?? existing.isWarm,
65
- log: options.log ?? existing.log,
66
- onFatal: options.onFatal ?? existing.onFatal,
67
- };
68
- }
69
- function handleCrash(state, handler, reason) {
70
- if (state.fatalHandled) {
71
- return;
72
- }
73
- try {
74
- if (state.hooks.isNonFatal?.(handler, reason)) {
75
- return;
76
- }
77
- }
78
- catch (predicateError) {
79
- // A throw inside the non-fatal check must not skip the fatal-exit line.
80
- state.hooks.log("fatal process barrier isNonFatal threw; continuing as fatal", fatalErrorMeta(predicateError));
81
- }
82
- state.fatalHandled = true;
83
- try {
84
- state.hooks.log(buildFatalExitLog({
85
- exitCode: 1,
86
- handler,
87
- isWarm: state.hooks.isWarm,
88
- }), fatalErrorMeta(reason));
89
- }
90
- catch {
91
- // Meta construction or the logger can throw; still run onFatal and exit(1).
92
- }
93
- const finish = () => {
94
- state.hooks.exit(1);
95
- };
96
- const onFatal = state.hooks.onFatal;
97
- if (!onFatal) {
98
- finish();
99
- return;
100
- }
101
- void Promise.resolve()
102
- .then(() => onFatal(handler, reason))
103
- .catch(() => undefined)
104
- .finally(finish);
105
- }
106
- /**
107
- * Arm process-level crash handlers once per host. A second call on the same
108
- * host is a no-op for listeners and updates hooks when the caller supplies them
109
- * (preload arms early; `createDevServer` later attaches shutdown). Shared
110
- * across the node_modules and esbuild copies of this module.
111
- */
112
- export function installFatalProcessBarrier(options = {}) {
113
- const host = options.process ?? process;
114
- const armed = armedHosts();
115
- const existing = armed.get(host);
116
- if (existing) {
117
- existing.hooks = mergeHooks(existing.hooks, options);
118
- return existing.off;
119
- }
120
- const state = {
121
- fatalHandled: false,
122
- hooks: {
123
- exit: options.exit ?? ((code) => process.exit(code)),
124
- isNonFatal: options.isNonFatal,
125
- isWarm: options.isWarm ?? parseIsWarm(process.env.SUPERBLOCKS_WARM_STANDBY),
126
- log: options.log ?? defaultLog,
127
- onFatal: options.onFatal,
128
- },
129
- off: () => undefined,
130
- };
131
- const onException = (error) => {
132
- handleCrash(state, "uncaughtException", error);
133
- };
134
- const onRejection = (reason) => {
135
- handleCrash(state, "unhandledRejection", reason);
136
- };
137
- host.on("uncaughtException", onException);
138
- host.on("unhandledRejection", onRejection);
139
- state.off = () => {
140
- armed.delete(host);
141
- host.off("uncaughtException", onException);
142
- host.off("unhandledRejection", onRejection);
143
- };
144
- armed.set(host, state);
145
- return state.off;
146
- }
147
- export function isFatalProcessHandled(host = process) {
148
- return armedHosts().get(host)?.fatalHandled ?? false;
149
- }
150
- /** Exit code graceful shutdown should use so a crash is not reported as 0. */
151
- export function fatalAwareExitCode(host = process) {
152
- return isFatalProcessHandled(host) ? 1 : 0;
153
- }
154
- /**
155
- * Child/warm entry: arm before oclif/`dev()` so a startup crash still writes
156
- * `event=dev_server_fatal_exit`. Safe to call again later from createDevServer.
157
- */
158
- export function installEarlyFatalProcessBarrier() {
159
- installFatalProcessBarrier();
160
- }
161
- //# sourceMappingURL=fatal-process-barrier.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fatal-process-barrier.mjs","sourceRoot":"","sources":["../../src/dev-utils/fatal-process-barrier.mts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=fatal-process-barrier.spawn-fixture.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fatal-process-barrier.spawn-fixture.d.mts","sourceRoot":"","sources":["../../src/dev-utils/fatal-process-barrier.spawn-fixture.mts"],"names":[],"mappings":""}
@@ -1,9 +0,0 @@
1
- import { pathToFileURL } from "node:url";
2
- import { installEarlyFatalProcessBarrier } from "./fatal-process-barrier.mjs";
3
- const isMain = process.argv[1] !== undefined &&
4
- import.meta.url === pathToFileURL(process.argv[1]).href;
5
- if (isMain) {
6
- installEarlyFatalProcessBarrier();
7
- throw new TypeError("spawn-fixture crash");
8
- }
9
- //# sourceMappingURL=fatal-process-barrier.spawn-fixture.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fatal-process-barrier.spawn-fixture.mjs","sourceRoot":"","sources":["../../src/dev-utils/fatal-process-barrier.spawn-fixture.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAE9E,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;IAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAE1D,IAAI,MAAM,EAAE,CAAC;IACX,+BAA+B,EAAE,CAAC;IAClC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;AAC7C,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=fatal-process-barrier.test.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fatal-process-barrier.test.d.mts","sourceRoot":"","sources":["../../src/dev-utils/fatal-process-barrier.test.mts"],"names":[],"mappings":""}
@@ -1,281 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import { createRequire } from "node:module";
3
- import { fileURLToPath } from "node:url";
4
- import { afterEach, describe, expect, it, vi } from "vitest";
5
- import { FATAL_EXIT_EVENT } from "./fatal-exit.mjs";
6
- import { fatalAwareExitCode, installFatalProcessBarrier, isFatalProcessHandled, } from "./fatal-process-barrier.mjs";
7
- /**
8
- * Stands in for `process` so a test can emit crash events without arming the
9
- * real handlers, which would take the test runner down with them.
10
- */
11
- function fakeProcess() {
12
- const handlers = new Map();
13
- return {
14
- emit(event, ...args) {
15
- for (const handler of handlers.get(event) ?? []) {
16
- handler(...args);
17
- }
18
- },
19
- listenerCount(event) {
20
- return handlers.get(event)?.length ?? 0;
21
- },
22
- off(event, handler) {
23
- handlers.set(event, (handlers.get(event) ?? []).filter((each) => each !== handler));
24
- },
25
- on(event, handler) {
26
- handlers.set(event, [...(handlers.get(event) ?? []), handler]);
27
- },
28
- };
29
- }
30
- describe("installFatalProcessBarrier", () => {
31
- it("logs a fatal-exit line with error meta and exits 1 when a throw happens before the server exists", async () => {
32
- const host = fakeProcess();
33
- const exit = vi.fn();
34
- const log = vi.fn();
35
- const crash = new TypeError("cannot read properties of null");
36
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
37
- host.emit("uncaughtException", crash);
38
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
39
- expect(log).toHaveBeenCalledTimes(1);
40
- const [message, meta] = log.mock.calls[0] ?? [];
41
- expect(message).toContain(`event=${FATAL_EXIT_EVENT}`);
42
- expect(message).toContain("handler=uncaughtException");
43
- expect(message).toContain("exit_code=1");
44
- expect(meta).toEqual({
45
- error: {
46
- kind: "TypeError",
47
- message: "cannot read properties of null",
48
- stack: crash.stack,
49
- },
50
- });
51
- });
52
- it("serializes a plain-object rejection so the message is not [object Object]", async () => {
53
- const host = fakeProcess();
54
- const exit = vi.fn();
55
- const log = vi.fn();
56
- const reason = { code: 8, message: "[internal] Connection closed" };
57
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
58
- host.emit("unhandledRejection", reason);
59
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
60
- const [, meta] = log.mock.calls[0] ?? [];
61
- expect(meta).toEqual({
62
- error: {
63
- kind: "Unknown Error",
64
- message: JSON.stringify(reason),
65
- },
66
- });
67
- });
68
- it("serializes a BigInt field in a non-Error rejection and still exits 1", async () => {
69
- const host = fakeProcess();
70
- const exit = vi.fn();
71
- const log = vi.fn();
72
- const reason = { id: 8n, message: "closed" };
73
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
74
- host.emit("unhandledRejection", reason);
75
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
76
- const [message, meta] = log.mock.calls[0] ?? [];
77
- expect(String(message)).toContain(`event=${FATAL_EXIT_EVENT}`);
78
- expect(meta).toEqual({
79
- error: {
80
- kind: "Unknown Error",
81
- message: '{"id":"8","message":"closed"}',
82
- },
83
- });
84
- });
85
- it("still writes the fatal-exit line and exits 1 when toJSON throws", async () => {
86
- const host = fakeProcess();
87
- const exit = vi.fn();
88
- const log = vi.fn();
89
- const reason = {
90
- toJSON() {
91
- throw new Error("cannot serialize");
92
- },
93
- };
94
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
95
- host.emit("unhandledRejection", reason);
96
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
97
- expect(log).toHaveBeenCalledTimes(1);
98
- const [message, meta] = log.mock.calls[0] ?? [];
99
- expect(String(message)).toContain(`event=${FATAL_EXIT_EVENT}`);
100
- expect(meta).toEqual({
101
- error: {
102
- kind: "Unknown Error",
103
- message: "[object Object]",
104
- },
105
- });
106
- expect(isFatalProcessHandled(host)).toBe(true);
107
- });
108
- it("still exits 1 when the fatal log itself throws after the barrier is marked handled", async () => {
109
- const host = fakeProcess();
110
- const exit = vi.fn();
111
- installFatalProcessBarrier({
112
- exit,
113
- isWarm: false,
114
- log: () => {
115
- throw new Error("logger exploded");
116
- },
117
- process: host,
118
- });
119
- host.emit("uncaughtException", new Error("boom"));
120
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
121
- expect(isFatalProcessHandled(host)).toBe(true);
122
- });
123
- it("labels an unhandled rejection as a rejection, not an exception", async () => {
124
- const host = fakeProcess();
125
- const exit = vi.fn();
126
- const log = vi.fn();
127
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
128
- host.emit("unhandledRejection", new Error("upstream timed out"));
129
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
130
- const [message] = log.mock.calls[0] ?? [];
131
- expect(message).toContain("handler=unhandledRejection");
132
- });
133
- it("writes one fatal-exit line for a burst of crashes", async () => {
134
- const host = fakeProcess();
135
- const exit = vi.fn();
136
- const log = vi.fn();
137
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
138
- host.emit("uncaughtException", new Error("first"));
139
- host.emit("unhandledRejection", new Error("second"));
140
- host.emit("uncaughtException", new Error("third"));
141
- await vi.waitFor(() => expect(exit).toHaveBeenCalledTimes(1));
142
- expect(log).toHaveBeenCalledTimes(1);
143
- expect(String(log.mock.calls[0]?.[0])).toContain("handler=uncaughtException");
144
- });
145
- it("arms one set of handlers however many times it is installed", async () => {
146
- const host = fakeProcess();
147
- const exit = vi.fn();
148
- const log = vi.fn();
149
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
150
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
151
- host.emit("uncaughtException", new Error("boom"));
152
- await vi.waitFor(() => expect(exit).toHaveBeenCalledTimes(1));
153
- expect(log).toHaveBeenCalledTimes(1);
154
- });
155
- it("still exits fatally when isNonFatal throws, and logs the predicate failure", async () => {
156
- const host = fakeProcess();
157
- const exit = vi.fn();
158
- const log = vi.fn();
159
- const predicateError = new Error("predicate exploded");
160
- installFatalProcessBarrier({
161
- exit,
162
- isNonFatal: () => {
163
- throw predicateError;
164
- },
165
- log,
166
- process: host,
167
- });
168
- host.emit("unhandledRejection", new Error("closed"));
169
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
170
- expect(log).toHaveBeenCalledTimes(2);
171
- const [predicateMessage, predicateMeta] = log.mock.calls[0] ?? [];
172
- expect(String(predicateMessage)).not.toContain(`event=${FATAL_EXIT_EVENT}`);
173
- expect(predicateMeta).toEqual({
174
- error: {
175
- kind: "Error",
176
- message: "predicate exploded",
177
- stack: predicateError.stack,
178
- },
179
- });
180
- const [fatalMessage] = log.mock.calls[1] ?? [];
181
- expect(String(fatalMessage)).toContain(`event=${FATAL_EXIT_EVENT}`);
182
- });
183
- it("keeps the process alive when isNonFatal says the reason is recoverable", () => {
184
- const host = fakeProcess();
185
- const exit = vi.fn();
186
- const log = vi.fn();
187
- installFatalProcessBarrier({
188
- exit,
189
- isNonFatal: (_handler, reason) => reason instanceof Error && reason.message === "closed",
190
- log,
191
- process: host,
192
- });
193
- host.emit("unhandledRejection", new Error("closed"));
194
- expect(exit).not.toHaveBeenCalled();
195
- expect(log).not.toHaveBeenCalled();
196
- });
197
- it("upgrades onFatal on an already-armed host without a second listener", async () => {
198
- const host = fakeProcess();
199
- const exit = vi.fn();
200
- const log = vi.fn();
201
- const onFatal = vi.fn();
202
- installFatalProcessBarrier({ exit, isWarm: false, log, process: host });
203
- installFatalProcessBarrier({ onFatal, process: host });
204
- host.emit("uncaughtException", new Error("boom"));
205
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
206
- expect(onFatal).toHaveBeenCalledTimes(1);
207
- expect(onFatal.mock.calls[0]?.[0]).toBe("uncaughtException");
208
- });
209
- it("reports a crash as exit code 1 so graceful shutdown cannot claim 0", async () => {
210
- const host = fakeProcess();
211
- const exit = vi.fn();
212
- installFatalProcessBarrier({
213
- exit,
214
- log: () => undefined,
215
- onFatal: () => undefined,
216
- process: host,
217
- });
218
- expect(fatalAwareExitCode(host)).toBe(0);
219
- host.emit("uncaughtException", new Error("boom"));
220
- await vi.waitFor(() => expect(isFatalProcessHandled(host)).toBe(true));
221
- expect(fatalAwareExitCode(host)).toBe(1);
222
- });
223
- });
224
- describe("installFatalProcessBarrier across CLI module copies", () => {
225
- afterEach(() => {
226
- vi.resetModules();
227
- });
228
- it("shares hooks across module instances, as when bin/run.js and the esbuild bundle each load their own", async () => {
229
- const host = fakeProcess();
230
- const exit = vi.fn();
231
- const log = vi.fn();
232
- const onFatal = vi.fn();
233
- const early = await import("./fatal-process-barrier.mjs");
234
- early.installFatalProcessBarrier({
235
- exit,
236
- isWarm: false,
237
- log,
238
- process: host,
239
- });
240
- expect(host.listenerCount("uncaughtException")).toBe(1);
241
- expect(host.listenerCount("unhandledRejection")).toBe(1);
242
- vi.resetModules();
243
- const later = await import("./fatal-process-barrier.mjs");
244
- later.installFatalProcessBarrier({
245
- exit,
246
- isNonFatal: (_handler, reason) => reason instanceof Error && reason.message === "closed",
247
- log,
248
- onFatal,
249
- process: host,
250
- });
251
- expect(host.listenerCount("uncaughtException")).toBe(1);
252
- expect(host.listenerCount("unhandledRejection")).toBe(1);
253
- host.emit("unhandledRejection", new Error("closed"));
254
- expect(exit).not.toHaveBeenCalled();
255
- expect(log).not.toHaveBeenCalled();
256
- expect(onFatal).not.toHaveBeenCalled();
257
- host.emit("uncaughtException", new Error("boom"));
258
- await vi.waitFor(() => expect(exit).toHaveBeenCalledWith(1));
259
- expect(onFatal).toHaveBeenCalledTimes(1);
260
- expect(log).toHaveBeenCalledTimes(1);
261
- });
262
- });
263
- describe("installEarlyFatalProcessBarrier in a real Node process", () => {
264
- it("writes the fatal-exit token and stack to stderr before exiting 1", () => {
265
- const fixture = fileURLToPath(new URL("./fatal-process-barrier.spawn-fixture.mts", import.meta.url));
266
- const require = createRequire(fileURLToPath(new URL("../../package.json", import.meta.url)));
267
- const tsx = require.resolve("tsx");
268
- const result = spawnSync(process.execPath, ["--import", tsx, fixture], {
269
- encoding: "utf8",
270
- env: { ...process.env, NODE_OPTIONS: "" },
271
- timeout: 30_000,
272
- });
273
- const output = `${result.stdout}${result.stderr}`;
274
- expect(result.status).toBe(1);
275
- expect(output).toContain(`event=${FATAL_EXIT_EVENT}`);
276
- expect(output).toContain("handler=uncaughtException");
277
- expect(output).toContain("spawn-fixture crash");
278
- expect(output).toMatch(/TypeError/);
279
- });
280
- });
281
- //# sourceMappingURL=fatal-process-barrier.test.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fatal-process-barrier.test.mjs","sourceRoot":"","sources":["../../src/dev-utils/fatal-process-barrier.test.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,qBAAqB,GAEtB,MAAM,6BAA6B,CAAC;AAErC;;;GAGG;AACH,SAAS,WAAW;IAIlB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4C,CAAC;IACrE,OAAO;QACL,IAAI,CAAC,KAAa,EAAE,GAAG,IAAe;YACpC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,aAAa,CAAC,KAAa;YACzB,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,GAAG,CAAC,KAAa,EAAE,OAAqC;YACtD,QAAQ,CAAC,GAAG,CACV,KAAK,EACL,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAC/D,CAAC;QACJ,CAAC;QACD,EAAE,CAAC,KAAa,EAAE,OAAqC;YACrD,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;QAChH,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAE9D,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAEtC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,gCAAgC;gBACzC,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;QAEpE,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAExC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;aAChC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAE7C,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAExC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,+BAA+B;aACzC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG;YACb,MAAM;gBACJ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;SACF,CAAC;QAEF,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAExC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,iBAAiB;aAC3B;SACF,CAAC,CAAC;QACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAErB,0BAA0B,CAAC;YACzB,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAElD,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAEpB,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEjE,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAEpB,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAEnD,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAC9C,2BAA2B,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAEpB,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAElD,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAEvD,0BAA0B,CAAC;YACzB,IAAI;YACJ,UAAU,EAAE,GAAG,EAAE;gBACf,MAAM,cAAc,CAAC;YACvB,CAAC;YACD,GAAG;YACH,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAErD,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC;YAC5B,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,oBAAoB;gBAC7B,KAAK,EAAE,cAAc,CAAC,KAAK;aAC5B;SACF,CAAC,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAEpB,0BAA0B,CAAC;YACzB,IAAI;YACJ,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAC/B,MAAM,YAAY,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ;YACxD,GAAG;YACH,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAErD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAExB,0BAA0B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,0BAA0B,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAElD,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAErB,0BAA0B,CAAC;YACzB,IAAI;YACJ,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;YACpB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;YACxB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,YAAY,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;QACnH,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAExB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC1D,KAAK,CAAC,0BAA0B,CAAC;YAC/B,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,GAAG;YACH,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzD,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC1D,KAAK,CAAC,0BAA0B,CAAC;YAC/B,IAAI;YACJ,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAC/B,MAAM,YAAY,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ;YACxD,GAAG;YACH,OAAO;YACP,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wDAAwD,EAAE,GAAG,EAAE;IACtE,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,OAAO,GAAG,aAAa,CAC3B,IAAI,GAAG,CAAC,2CAA2C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CACtE,CAAC;QACF,MAAM,OAAO,GAAG,aAAa,CAC3B,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAC9D,CAAC;QACF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;YACrE,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;YACzC,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}