@grest-ts/testkit 0.0.5

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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +413 -0
  3. package/dist/src/GGBundleTest.d.ts +8 -0
  4. package/dist/src/GGBundleTest.d.ts.map +1 -0
  5. package/dist/src/GGBundleTest.js +75 -0
  6. package/dist/src/GGBundleTest.js.map +1 -0
  7. package/dist/src/GGTest.d.ts +131 -0
  8. package/dist/src/GGTest.d.ts.map +1 -0
  9. package/dist/src/GGTest.js +245 -0
  10. package/dist/src/GGTest.js.map +1 -0
  11. package/dist/src/GGTestContext.d.ts +36 -0
  12. package/dist/src/GGTestContext.d.ts.map +1 -0
  13. package/dist/src/GGTestContext.js +63 -0
  14. package/dist/src/GGTestContext.js.map +1 -0
  15. package/dist/src/GGTestRunner.d.ts +108 -0
  16. package/dist/src/GGTestRunner.d.ts.map +1 -0
  17. package/dist/src/GGTestRunner.js +242 -0
  18. package/dist/src/GGTestRunner.js.map +1 -0
  19. package/dist/src/GGTestRuntime.d.ts +103 -0
  20. package/dist/src/GGTestRuntime.d.ts.map +1 -0
  21. package/dist/src/GGTestRuntime.js +219 -0
  22. package/dist/src/GGTestRuntime.js.map +1 -0
  23. package/dist/src/GGTestRuntimeWorker.d.ts +41 -0
  24. package/dist/src/GGTestRuntimeWorker.d.ts.map +1 -0
  25. package/dist/src/GGTestRuntimeWorker.js +136 -0
  26. package/dist/src/GGTestRuntimeWorker.js.map +1 -0
  27. package/dist/src/GGTestSharedRef.d.ts +35 -0
  28. package/dist/src/GGTestSharedRef.d.ts.map +1 -0
  29. package/dist/src/GGTestSharedRef.js +126 -0
  30. package/dist/src/GGTestSharedRef.js.map +1 -0
  31. package/dist/src/GGTestkitExtensionsDiscovery.d.ts +21 -0
  32. package/dist/src/GGTestkitExtensionsDiscovery.d.ts.map +1 -0
  33. package/dist/src/GGTestkitExtensionsDiscovery.js +24 -0
  34. package/dist/src/GGTestkitExtensionsDiscovery.js.map +1 -0
  35. package/dist/src/IGGLocalDiscoveryServer.d.ts +16 -0
  36. package/dist/src/IGGLocalDiscoveryServer.d.ts.map +1 -0
  37. package/dist/src/IGGLocalDiscoveryServer.js +2 -0
  38. package/dist/src/IGGLocalDiscoveryServer.js.map +1 -0
  39. package/dist/src/callOn/GGCallOnSelector.d.ts +42 -0
  40. package/dist/src/callOn/GGCallOnSelector.d.ts.map +1 -0
  41. package/dist/src/callOn/GGCallOnSelector.js +35 -0
  42. package/dist/src/callOn/GGCallOnSelector.js.map +1 -0
  43. package/dist/src/callOn/GGContractClass.implement.d.ts +8 -0
  44. package/dist/src/callOn/GGContractClass.implement.d.ts.map +1 -0
  45. package/dist/src/callOn/GGContractClass.implement.js +31 -0
  46. package/dist/src/callOn/GGContractClass.implement.js.map +1 -0
  47. package/dist/src/callOn/GGTestActionForLocatorOnCall.d.ts +28 -0
  48. package/dist/src/callOn/GGTestActionForLocatorOnCall.d.ts.map +1 -0
  49. package/dist/src/callOn/GGTestActionForLocatorOnCall.js +118 -0
  50. package/dist/src/callOn/GGTestActionForLocatorOnCall.js.map +1 -0
  51. package/dist/src/callOn/TestableIPC.d.ts +72 -0
  52. package/dist/src/callOn/TestableIPC.d.ts.map +1 -0
  53. package/dist/src/callOn/TestableIPC.js +34 -0
  54. package/dist/src/callOn/TestableIPC.js.map +1 -0
  55. package/dist/src/callOn/callOn.d.ts +113 -0
  56. package/dist/src/callOn/callOn.d.ts.map +1 -0
  57. package/dist/src/callOn/callOn.js +122 -0
  58. package/dist/src/callOn/callOn.js.map +1 -0
  59. package/dist/src/callOn/registerOnCallHandler.d.ts +13 -0
  60. package/dist/src/callOn/registerOnCallHandler.d.ts.map +1 -0
  61. package/dist/src/callOn/registerOnCallHandler.js +111 -0
  62. package/dist/src/callOn/registerOnCallHandler.js.map +1 -0
  63. package/dist/src/index-node.d.ts +35 -0
  64. package/dist/src/index-node.d.ts.map +1 -0
  65. package/dist/src/index-node.js +50 -0
  66. package/dist/src/index-node.js.map +1 -0
  67. package/dist/src/mockable/GGMockable.d.ts +19 -0
  68. package/dist/src/mockable/GGMockable.d.ts.map +1 -0
  69. package/dist/src/mockable/GGMockable.js +2 -0
  70. package/dist/src/mockable/GGMockable.js.map +1 -0
  71. package/dist/src/mockable/GGMockableCall.d.ts +2 -0
  72. package/dist/src/mockable/GGMockableCall.d.ts.map +1 -0
  73. package/dist/src/mockable/GGMockableCall.js +41 -0
  74. package/dist/src/mockable/GGMockableCall.js.map +1 -0
  75. package/dist/src/mockable/GGMockableIPC.d.ts +17 -0
  76. package/dist/src/mockable/GGMockableIPC.d.ts.map +1 -0
  77. package/dist/src/mockable/GGMockableIPC.js +8 -0
  78. package/dist/src/mockable/GGMockableIPC.js.map +1 -0
  79. package/dist/src/mockable/GGMockableInterceptor.d.ts +24 -0
  80. package/dist/src/mockable/GGMockableInterceptor.d.ts.map +1 -0
  81. package/dist/src/mockable/GGMockableInterceptor.js +32 -0
  82. package/dist/src/mockable/GGMockableInterceptor.js.map +1 -0
  83. package/dist/src/mockable/GGMockableInterceptorsServer.d.ts +12 -0
  84. package/dist/src/mockable/GGMockableInterceptorsServer.d.ts.map +1 -0
  85. package/dist/src/mockable/GGMockableInterceptorsServer.js +55 -0
  86. package/dist/src/mockable/GGMockableInterceptorsServer.js.map +1 -0
  87. package/dist/src/mockable/mockable.d.ts +46 -0
  88. package/dist/src/mockable/mockable.d.ts.map +1 -0
  89. package/dist/src/mockable/mockable.js +47 -0
  90. package/dist/src/mockable/mockable.js.map +1 -0
  91. package/dist/src/runner/InlineRunner.d.ts +12 -0
  92. package/dist/src/runner/InlineRunner.d.ts.map +1 -0
  93. package/dist/src/runner/InlineRunner.js +42 -0
  94. package/dist/src/runner/InlineRunner.js.map +1 -0
  95. package/dist/src/runner/IsolatedRunner.d.ts +17 -0
  96. package/dist/src/runner/IsolatedRunner.d.ts.map +1 -0
  97. package/dist/src/runner/IsolatedRunner.js +155 -0
  98. package/dist/src/runner/IsolatedRunner.js.map +1 -0
  99. package/dist/src/runner/RuntimeRunner.d.ts +14 -0
  100. package/dist/src/runner/RuntimeRunner.d.ts.map +1 -0
  101. package/dist/src/runner/RuntimeRunner.js +2 -0
  102. package/dist/src/runner/RuntimeRunner.js.map +1 -0
  103. package/dist/src/runner/WorkerRunner.d.ts +17 -0
  104. package/dist/src/runner/WorkerRunner.d.ts.map +1 -0
  105. package/dist/src/runner/WorkerRunner.js +155 -0
  106. package/dist/src/runner/WorkerRunner.js.map +1 -0
  107. package/dist/src/runner/isolated-loader.mjs +91 -0
  108. package/dist/src/runner/worker-loader.mjs +49 -0
  109. package/dist/src/testers/GGCallInterceptor.d.ts +71 -0
  110. package/dist/src/testers/GGCallInterceptor.d.ts.map +1 -0
  111. package/dist/src/testers/GGCallInterceptor.js +170 -0
  112. package/dist/src/testers/GGCallInterceptor.js.map +1 -0
  113. package/dist/src/testers/GGMockWith.d.ts +30 -0
  114. package/dist/src/testers/GGMockWith.d.ts.map +1 -0
  115. package/dist/src/testers/GGMockWith.js +70 -0
  116. package/dist/src/testers/GGMockWith.js.map +1 -0
  117. package/dist/src/testers/GGSpyWith.d.ts +40 -0
  118. package/dist/src/testers/GGSpyWith.d.ts.map +1 -0
  119. package/dist/src/testers/GGSpyWith.js +90 -0
  120. package/dist/src/testers/GGSpyWith.js.map +1 -0
  121. package/dist/src/testers/GGTestAction.d.ts +126 -0
  122. package/dist/src/testers/GGTestAction.d.ts.map +1 -0
  123. package/dist/src/testers/GGTestAction.js +245 -0
  124. package/dist/src/testers/GGTestAction.js.map +1 -0
  125. package/dist/src/testers/GGTestComponent.d.ts +15 -0
  126. package/dist/src/testers/GGTestComponent.d.ts.map +1 -0
  127. package/dist/src/testers/GGTestComponent.js +2 -0
  128. package/dist/src/testers/GGTestComponent.js.map +1 -0
  129. package/dist/src/testers/GGTestSelector.d.ts +54 -0
  130. package/dist/src/testers/GGTestSelector.d.ts.map +1 -0
  131. package/dist/src/testers/GGTestSelector.js +179 -0
  132. package/dist/src/testers/GGTestSelector.js.map +1 -0
  133. package/dist/src/testers/IGGTestInterceptor.d.ts +8 -0
  134. package/dist/src/testers/IGGTestInterceptor.d.ts.map +1 -0
  135. package/dist/src/testers/IGGTestInterceptor.js +2 -0
  136. package/dist/src/testers/IGGTestInterceptor.js.map +1 -0
  137. package/dist/src/testers/IGGTestWith.d.ts +13 -0
  138. package/dist/src/testers/IGGTestWith.d.ts.map +1 -0
  139. package/dist/src/testers/IGGTestWith.js +2 -0
  140. package/dist/src/testers/IGGTestWith.js.map +1 -0
  141. package/dist/src/testers/RuntimeSelector.d.ts +117 -0
  142. package/dist/src/testers/RuntimeSelector.d.ts.map +1 -0
  143. package/dist/src/testers/RuntimeSelector.js +2 -0
  144. package/dist/src/testers/RuntimeSelector.js.map +1 -0
  145. package/dist/src/tsconfig.json +17 -0
  146. package/dist/src/utils/GGExpectations.d.ts +18 -0
  147. package/dist/src/utils/GGExpectations.d.ts.map +1 -0
  148. package/dist/src/utils/GGExpectations.js +59 -0
  149. package/dist/src/utils/GGExpectations.js.map +1 -0
  150. package/dist/src/utils/GGTestError.d.ts +13 -0
  151. package/dist/src/utils/GGTestError.d.ts.map +1 -0
  152. package/dist/src/utils/GGTestError.js +26 -0
  153. package/dist/src/utils/GGTestError.js.map +1 -0
  154. package/dist/src/utils/captureStack.d.ts +9 -0
  155. package/dist/src/utils/captureStack.d.ts.map +1 -0
  156. package/dist/src/utils/captureStack.js +51 -0
  157. package/dist/src/utils/captureStack.js.map +1 -0
  158. package/dist/tsconfig.publish.tsbuildinfo +1 -0
  159. package/package.json +66 -0
  160. package/src/GGBundleTest.ts +89 -0
  161. package/src/GGTest.ts +318 -0
  162. package/src/GGTestContext.ts +74 -0
  163. package/src/GGTestRunner.ts +308 -0
  164. package/src/GGTestRuntime.ts +265 -0
  165. package/src/GGTestRuntimeWorker.ts +159 -0
  166. package/src/GGTestSharedRef.ts +116 -0
  167. package/src/GGTestkitExtensionsDiscovery.ts +26 -0
  168. package/src/IGGLocalDiscoveryServer.ts +16 -0
  169. package/src/callOn/GGCallOnSelector.ts +61 -0
  170. package/src/callOn/GGContractClass.implement.ts +43 -0
  171. package/src/callOn/GGTestActionForLocatorOnCall.ts +134 -0
  172. package/src/callOn/TestableIPC.ts +81 -0
  173. package/src/callOn/callOn.ts +224 -0
  174. package/src/callOn/registerOnCallHandler.ts +123 -0
  175. package/src/index-node.ts +64 -0
  176. package/src/mockable/GGMockable.ts +22 -0
  177. package/src/mockable/GGMockableCall.ts +45 -0
  178. package/src/mockable/GGMockableIPC.ts +20 -0
  179. package/src/mockable/GGMockableInterceptor.ts +44 -0
  180. package/src/mockable/GGMockableInterceptorsServer.ts +69 -0
  181. package/src/mockable/mockable.ts +71 -0
  182. package/src/runner/InlineRunner.ts +47 -0
  183. package/src/runner/IsolatedRunner.ts +179 -0
  184. package/src/runner/RuntimeRunner.ts +15 -0
  185. package/src/runner/WorkerRunner.ts +179 -0
  186. package/src/runner/isolated-loader.mjs +91 -0
  187. package/src/runner/worker-loader.mjs +49 -0
  188. package/src/testers/GGCallInterceptor.ts +224 -0
  189. package/src/testers/GGMockWith.ts +92 -0
  190. package/src/testers/GGSpyWith.ts +115 -0
  191. package/src/testers/GGTestAction.ts +333 -0
  192. package/src/testers/GGTestComponent.ts +16 -0
  193. package/src/testers/GGTestSelector.ts +223 -0
  194. package/src/testers/IGGTestInterceptor.ts +11 -0
  195. package/src/testers/IGGTestWith.ts +15 -0
  196. package/src/testers/RuntimeSelector.ts +151 -0
  197. package/src/tsconfig.json +17 -0
  198. package/src/utils/GGExpectations.ts +78 -0
  199. package/src/utils/GGTestError.ts +37 -0
  200. package/src/utils/captureStack.ts +54 -0
@@ -0,0 +1,242 @@
1
+ import { GGLog } from "@grest-ts/logger";
2
+ import { GGContext } from "@grest-ts/context";
3
+ import { GG_TRACE } from "@grest-ts/trace";
4
+ import { GGLocatorKey } from "@grest-ts/locator";
5
+ import { TestableIPC } from "./callOn/TestableIPC.js";
6
+ export const GG_TEST_RUNNER = new GGLocatorKey("GGTestRunner");
7
+ /**
8
+ * Symbol for resources that support test operations.
9
+ * Resources implement this to expose operations like clone().
10
+ */
11
+ export const GG_TEST_RESOURCE = Symbol('GG_TEST_RESOURCE');
12
+ export class GGTestRunner {
13
+ /**
14
+ * Unique identifier for this test context.
15
+ * Used for test resource isolation (e.g., creating isolated DB schemas).
16
+ */
17
+ testId;
18
+ ipcServer;
19
+ discoveryServer;
20
+ config = {
21
+ serviceStartupTimeout: 30000,
22
+ verboseProxy: false
23
+ };
24
+ _started = false;
25
+ /**
26
+ * Runtimes added in the describe block (before start).
27
+ * These are managed by beforeAll/afterAll.
28
+ */
29
+ globalRuntimes = [];
30
+ /**
31
+ * Runtimes added within test blocks (after start).
32
+ * These are managed by afterEach and cleared after each test.
33
+ */
34
+ inTestRuntimes = [];
35
+ /**
36
+ * Extension instances - extensions are some "describe block level components".
37
+ * Some examples EventsServer, HttpInterceptorsServer, MockableInterceptorsServer etc.
38
+ */
39
+ extensionInstances = new Map();
40
+ hooks = new Map();
41
+ constructor(ipcServer, discoveryServer, userConfig) {
42
+ this.testId = "t" + Math.random().toString(36).substring(2, 8);
43
+ this.config = { ...this.config, ...userConfig };
44
+ this.ipcServer = ipcServer;
45
+ this.discoveryServer = discoveryServer;
46
+ // Register IPC handler for key registration from workers
47
+ this.ipcServer.onFrameworkMessage(TestableIPC.server.registerKeys, async (payload) => {
48
+ const runtime = this.getRuntimeById(payload.runtimeId);
49
+ if (runtime) {
50
+ runtime.registerLocatorKeys(payload.keys);
51
+ GGLog.debug(this, `Registered ${payload.keys.length} keys for runtime ${payload.runtimeId}`);
52
+ }
53
+ else {
54
+ GGLog.warn(this, `Received key registration for unknown runtime: ${payload.runtimeId}`);
55
+ }
56
+ });
57
+ }
58
+ // -----------------------------------------------
59
+ // Static component factory registry
60
+ // -----------------------------------------------
61
+ /**
62
+ * Extension factories - extensions are some "describe block level components".
63
+ * Some examples EventsServer, HttpInterceptorsServer, MockableInterceptorsServer etc.
64
+ */
65
+ static extensionFactories = [];
66
+ /**
67
+ * Register a component type.
68
+ * Components must accept GGTestRunner as their constructor argument.
69
+ */
70
+ static registerExtension(type) {
71
+ this.extensionFactories.push(type);
72
+ }
73
+ // -----------------------------------------------
74
+ // Component registry
75
+ // -----------------------------------------------
76
+ /**
77
+ * Get a component by type. Creates it lazily if not yet instantiated.
78
+ */
79
+ getExtensionInstance(type) {
80
+ if (!this.extensionInstances.has(type)) {
81
+ const instance = new type(this);
82
+ this.extensionInstances.set(type, instance);
83
+ }
84
+ return this.extensionInstances.get(type);
85
+ }
86
+ // -----------------------------------------------
87
+ // Instance methods
88
+ // -----------------------------------------------
89
+ /**
90
+ * Whether the test has started (services are running).
91
+ */
92
+ get started() {
93
+ return this._started;
94
+ }
95
+ /**
96
+ * Register a test lifecycle hook.
97
+ * Hooks run beforeAll (during start) and afterAll (during teardown).
98
+ * Duplicate registrations with the same keyName are skipped.
99
+ */
100
+ registerHook(hook) {
101
+ if (this.hooks.has(hook.keyName)) {
102
+ GGLog.debug(this, `Hook already registered for ${hook.keyName}, skipping duplicate`);
103
+ return;
104
+ }
105
+ this.hooks.set(hook.keyName, hook);
106
+ }
107
+ /**
108
+ * Send a command to ALL runtimes.
109
+ * Used by resource hooks (e.g., DB config) that apply globally.
110
+ */
111
+ async sendCommand(type, payload) {
112
+ const promises = this.globalRuntimes.map(runtime => runtime.sendCommand(type, payload));
113
+ await Promise.allSettled(promises);
114
+ }
115
+ /**
116
+ * Add a runtime to this test runner.
117
+ * Automatically routes to the appropriate list based on lifecycle stage.
118
+ */
119
+ addRuntime(runtime) {
120
+ if (this._started) {
121
+ // Added within a test block - managed by afterEach
122
+ this.inTestRuntimes.push(runtime);
123
+ }
124
+ else {
125
+ // Added in describe block - managed by beforeAll/afterAll
126
+ this.globalRuntimes.push(runtime);
127
+ }
128
+ }
129
+ /**
130
+ * Get all active runtimes (both global and in-test).
131
+ */
132
+ getAllRuntimes() {
133
+ return [...this.globalRuntimes, ...this.inTestRuntimes];
134
+ }
135
+ /**
136
+ * Find a runtime by its unique runtimeId.
137
+ */
138
+ getRuntimeById(runtimeId) {
139
+ return this.globalRuntimes.find(r => r.runtimeId === runtimeId)
140
+ ?? this.inTestRuntimes.find(r => r.runtimeId === runtimeId);
141
+ }
142
+ async start() {
143
+ await new GGContext("Test").run(async () => {
144
+ GG_TRACE.init();
145
+ if (this._started) {
146
+ throw new Error("Already started!");
147
+ }
148
+ // 0. Initialize extension (testkits already loaded by vitest setup)
149
+ for (const type of GGTestRunner.extensionFactories) {
150
+ // Create extension instance, which registers its IPC handlers
151
+ this.extensionInstances.set(type, new type(this));
152
+ }
153
+ // 1. Execute all hook beforeAll handlers in parallel
154
+ const hookPromises = Array.from(this.hooks.entries()).map(async ([keyName, hook]) => {
155
+ const startTime = performance.now();
156
+ GGLog.debug(this, `Running beforeAll hook: ${keyName}`);
157
+ await hook.beforeAll();
158
+ const duration = (performance.now() - startTime).toFixed(0);
159
+ GGLog.debug(this, `Completed beforeAll hook: ${keyName} (${duration}ms)`);
160
+ return keyName;
161
+ });
162
+ const results = await Promise.allSettled(hookPromises);
163
+ const failures = results.filter((r) => r.status === 'rejected');
164
+ if (failures.length > 0) {
165
+ const errorMessages = failures.map(f => {
166
+ const reason = f.reason;
167
+ if (reason instanceof AggregateError) {
168
+ const innerErrors = reason.errors?.map((e) => e?.message || String(e)).join(', ');
169
+ return `AggregateError[${innerErrors}]`;
170
+ }
171
+ return reason?.message || String(reason);
172
+ }).join('; ');
173
+ throw new Error(`Failed to run beforeAll hooks: ${errorMessages}`);
174
+ }
175
+ // 2. Start router
176
+ await this.discoveryServer.start();
177
+ // 3. Start components
178
+ for (const [type, component] of this.extensionInstances) {
179
+ if (component.start) {
180
+ GGLog.debug(this, `Starting component: ${type.name}`);
181
+ await component.start();
182
+ }
183
+ }
184
+ // 4. Start runtimes (they will receive commands via env)
185
+ for (const runtime of this.globalRuntimes) {
186
+ await runtime.start();
187
+ }
188
+ this._started = true;
189
+ });
190
+ }
191
+ async runAfterEachHooks() {
192
+ for (const [, component] of this.extensionInstances) {
193
+ await component.afterEach?.();
194
+ }
195
+ GGLog.debug(this, 'Stopping in-test runtimes...');
196
+ for (const runtime of this.inTestRuntimes) {
197
+ await runtime.shutdown();
198
+ }
199
+ this.inTestRuntimes.length = 0;
200
+ GGLog.debug(this, 'All in-test runtimes stopped!');
201
+ }
202
+ async teardown() {
203
+ await new GGContext("Test").run(async () => {
204
+ GG_TRACE.init();
205
+ // Stop global runtimes (teardown services, keep IPC alive)
206
+ GGLog.debug(this, 'Stopping global runtimes...');
207
+ for (const runtime of this.globalRuntimes) {
208
+ await runtime.stop();
209
+ }
210
+ // Shutdown global runtimes (terminate workers/processes)
211
+ GGLog.debug(this, 'Shutting down global runtimes...');
212
+ for (const runtime of this.globalRuntimes) {
213
+ await runtime.shutdown();
214
+ }
215
+ GGLog.debug(this, 'Tearing down router...');
216
+ await this.discoveryServer.teardown();
217
+ // Teardown components
218
+ for (const [type, component] of this.extensionInstances) {
219
+ if (component.teardown) {
220
+ GGLog.debug(this, `Tearing down component: ${type.name}`);
221
+ await component.teardown();
222
+ }
223
+ }
224
+ this.extensionInstances.clear();
225
+ GGLog.debug(this, 'Router torn down');
226
+ // Run afterAll hooks
227
+ GGLog.debug(this, 'Running afterAll hooks...');
228
+ for (const [keyName, hook] of this.hooks) {
229
+ try {
230
+ await hook.afterAll();
231
+ GGLog.debug(this, `Completed afterAll hook: ${keyName}`);
232
+ }
233
+ catch (error) {
234
+ GGLog.error(this, `Failed afterAll hook ${keyName}:`, error);
235
+ }
236
+ }
237
+ this.globalRuntimes.length = 0;
238
+ this.hooks.clear();
239
+ });
240
+ }
241
+ }
242
+ //# sourceMappingURL=GGTestRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGTestRunner.js","sourceRoot":"","sources":["../../src/GGTestRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import { IPCClientRequest } from "@grest-ts/ipc";
2
+ import type { GGTestRunner } from "./GGTestRunner";
3
+ /**
4
+ * Lifecycle state of a runtime instance.
5
+ */
6
+ export declare enum GGTestRuntimeState {
7
+ /** Initial state, not yet started */
8
+ CREATED = "created",
9
+ /** Running successfully */
10
+ STARTED = "started",
11
+ /** Startup failed, but worker/IPC still alive for diagnostics */
12
+ FAILED = "failed",
13
+ /** Runtime stopped, but worker/IPC still alive for log retrieval */
14
+ STOPPED = "stopped",
15
+ /** Fully shut down, no IPC available */
16
+ SHUTDOWN = "shutdown"
17
+ }
18
+ export interface GGTestEnvConfig {
19
+ executablePath: string;
20
+ className: string;
21
+ testRouterPort: number;
22
+ testId: string;
23
+ runtimeId: string;
24
+ initialCommands: GGTestCommand[];
25
+ /** When true, the runtime runs inline (same process). Affects module loading strategy. */
26
+ inline?: boolean;
27
+ }
28
+ export interface GGTestCommand<Payload = unknown> {
29
+ method: string;
30
+ payload: Payload;
31
+ }
32
+ export interface GGTestRuntimeConfig {
33
+ mode?: GGTestMode;
34
+ }
35
+ export declare enum GGTestMode {
36
+ INLINE = "INLINE",
37
+ WORKER = "WORKER",
38
+ ISOLATED = "ISOLATED"
39
+ }
40
+ export declare class GGTestRuntime {
41
+ readonly runner: GGTestRunner;
42
+ /**
43
+ * Unique identifier for this runtime instance.
44
+ * Used for targeted communication (e.g., "checklist-0", "checklist-1").
45
+ */
46
+ readonly runtimeId: string;
47
+ /**
48
+ * The runtime name used for selector access (e.g., "checklist").
49
+ * This is the static NAME property from the runtime class.
50
+ */
51
+ readonly name: string;
52
+ /**
53
+ * The class name of the runtime (e.g., "ChecklistRuntime").
54
+ * Used for file matching and logging.
55
+ */
56
+ readonly className: string;
57
+ /**
58
+ * Lifecycle state of this runtime instance.
59
+ */
60
+ private _state;
61
+ get state(): GGTestRuntimeState;
62
+ /**
63
+ * Locator keys registered by this runtime.
64
+ * Populated via IPC after compose completes.
65
+ */
66
+ private readonly registeredLocatorKeys;
67
+ /**
68
+ * Commands to be sent to this runtime on startup.
69
+ * Queued before start(), passed to worker via env.
70
+ */
71
+ private readonly initialCommands;
72
+ private readonly executablePath;
73
+ private readonly config;
74
+ private runtimeRunner?;
75
+ /** Factory to create the runtime without dynamic import (used by inline mode) */
76
+ runtimeFactory?: () => any;
77
+ /** Counter for generating unique runtime IDs per name */
78
+ private static runtimeCounters;
79
+ constructor(runner: GGTestRunner, executablePath: string, className: string, name: string, config?: GGTestRuntimeConfig);
80
+ private static generateRuntimeId;
81
+ start(): Promise<this>;
82
+ /**
83
+ * Stop the GGRuntime (teardown services) but keep worker/IPC alive.
84
+ * This allows log retrieval after the runtime has stopped.
85
+ * Idempotent - safe to call multiple times.
86
+ */
87
+ stop(): Promise<void>;
88
+ /**
89
+ * Fully shutdown the runtime and worker. IPC will be disconnected.
90
+ * After this, no commands can be sent.
91
+ */
92
+ shutdown(): Promise<void>;
93
+ sendCommand<Payload, Result>(type: IPCClientRequest<Payload, Result>, payload: Payload): Promise<Result>;
94
+ /**
95
+ * Register multiple locator keys at once.
96
+ */
97
+ registerLocatorKeys(keys: string[]): void;
98
+ /**
99
+ * Check if this runtime has a specific locator key.
100
+ */
101
+ hasLocatorKey(key: string): boolean;
102
+ }
103
+ //# sourceMappingURL=GGTestRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGTestRuntime.d.ts","sourceRoot":"","sources":["../../src/GGTestRuntime.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAEjD;;GAEG;AACH,oBAAY,kBAAkB;IAC1B,qCAAqC;IACrC,OAAO,YAAY;IACnB,2BAA2B;IAC3B,OAAO,YAAY;IACnB,iEAAiE;IACjE,MAAM,WAAW;IACjB,oEAAoE;IACpE,OAAO,YAAY;IACnB,wCAAwC;IACxC,QAAQ,aAAa;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,0FAA0F;IAC1F,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa,CAAC,OAAO,GAAG,OAAO;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,oBAAY,UAAU;IAClB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,QAAQ,aAAa;CACxB;AAED,qBAAa,aAAa;IAEtB,SAAgB,MAAM,EAAE,YAAY,CAAC;IAErC;;;OAGG;IACH,SAAgB,SAAS,EAAE,MAAM,CAAA;IAEjC;;;OAGG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAA;IAE5B;;;OAGG;IACH,SAAgB,SAAS,EAAE,MAAM,CAAA;IAEjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAiD;IAE/D,IAAW,KAAK,IAAI,kBAAkB,CAErC;IAED;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAyB;IAE/D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IAEtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAe;IACrC,iFAAiF;IAC1E,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC;IAElC,yDAAyD;IACzD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAkC;gBAE7C,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAW9H,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAMnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiDnC;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BlC;;;OAGG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBzB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBrH;;OAEG;IACI,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAMhD;;OAEG;IACI,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAI7C"}
@@ -0,0 +1,219 @@
1
+ import { GGLog } from "@grest-ts/logger";
2
+ import { withTimeout } from "@grest-ts/common";
3
+ import { GGContext } from "@grest-ts/context";
4
+ import { GG_TRACE } from "@grest-ts/trace";
5
+ import { InlineRunner } from "./runner/InlineRunner.js";
6
+ import { WorkerRunner } from "./runner/WorkerRunner.js";
7
+ import { IsolatedRunner } from "./runner/IsolatedRunner.js";
8
+ /**
9
+ * Lifecycle state of a runtime instance.
10
+ */
11
+ export var GGTestRuntimeState;
12
+ (function (GGTestRuntimeState) {
13
+ /** Initial state, not yet started */
14
+ GGTestRuntimeState["CREATED"] = "created";
15
+ /** Running successfully */
16
+ GGTestRuntimeState["STARTED"] = "started";
17
+ /** Startup failed, but worker/IPC still alive for diagnostics */
18
+ GGTestRuntimeState["FAILED"] = "failed";
19
+ /** Runtime stopped, but worker/IPC still alive for log retrieval */
20
+ GGTestRuntimeState["STOPPED"] = "stopped";
21
+ /** Fully shut down, no IPC available */
22
+ GGTestRuntimeState["SHUTDOWN"] = "shutdown";
23
+ })(GGTestRuntimeState || (GGTestRuntimeState = {}));
24
+ export var GGTestMode;
25
+ (function (GGTestMode) {
26
+ GGTestMode["INLINE"] = "INLINE";
27
+ GGTestMode["WORKER"] = "WORKER";
28
+ GGTestMode["ISOLATED"] = "ISOLATED";
29
+ })(GGTestMode || (GGTestMode = {}));
30
+ export class GGTestRuntime {
31
+ runner;
32
+ /**
33
+ * Unique identifier for this runtime instance.
34
+ * Used for targeted communication (e.g., "checklist-0", "checklist-1").
35
+ */
36
+ runtimeId;
37
+ /**
38
+ * The runtime name used for selector access (e.g., "checklist").
39
+ * This is the static NAME property from the runtime class.
40
+ */
41
+ name;
42
+ /**
43
+ * The class name of the runtime (e.g., "ChecklistRuntime").
44
+ * Used for file matching and logging.
45
+ */
46
+ className;
47
+ /**
48
+ * Lifecycle state of this runtime instance.
49
+ */
50
+ _state = GGTestRuntimeState.CREATED;
51
+ get state() {
52
+ return this._state;
53
+ }
54
+ /**
55
+ * Locator keys registered by this runtime.
56
+ * Populated via IPC after compose completes.
57
+ */
58
+ registeredLocatorKeys = new Set();
59
+ /**
60
+ * Commands to be sent to this runtime on startup.
61
+ * Queued before start(), passed to worker via env.
62
+ */
63
+ initialCommands = [];
64
+ executablePath;
65
+ config;
66
+ runtimeRunner;
67
+ /** Factory to create the runtime without dynamic import (used by inline mode) */
68
+ runtimeFactory;
69
+ /** Counter for generating unique runtime IDs per name */
70
+ static runtimeCounters = new Map();
71
+ constructor(runner, executablePath, className, name, config) {
72
+ this.executablePath = executablePath;
73
+ this.className = className;
74
+ this.name = name;
75
+ this.runtimeId = GGTestRuntime.generateRuntimeId(name);
76
+ this.config = config ?? {};
77
+ this.config.mode ??= GGTestMode.WORKER;
78
+ this.runner = runner;
79
+ this.runner.addRuntime(this);
80
+ }
81
+ static generateRuntimeId(name) {
82
+ const count = GGTestRuntime.runtimeCounters.get(name) ?? 0;
83
+ GGTestRuntime.runtimeCounters.set(name, count + 1);
84
+ return `${name}-${count}`;
85
+ }
86
+ async start() {
87
+ if (this._state !== GGTestRuntimeState.CREATED) {
88
+ throw new Error("Can only start runtimes if they are in CREATED state! Current state: " + this._state);
89
+ }
90
+ await new GGContext("Test").run(async () => {
91
+ GG_TRACE.init();
92
+ GGLog.debug(this, 'Launching ' + this.className + ' in ' + this.config.mode + ' mode...');
93
+ const config = {
94
+ executablePath: this.executablePath,
95
+ className: this.className,
96
+ testRouterPort: this.runner.ipcServer.getPort(),
97
+ testId: this.runner.testId,
98
+ runtimeId: this.runtimeId,
99
+ initialCommands: this.initialCommands
100
+ };
101
+ switch (this.config.mode) {
102
+ case GGTestMode.INLINE:
103
+ config.inline = true;
104
+ this.runtimeRunner = new InlineRunner(config, this.runtimeFactory);
105
+ break;
106
+ case GGTestMode.WORKER:
107
+ this.runtimeRunner = new WorkerRunner(config);
108
+ break;
109
+ case GGTestMode.ISOLATED:
110
+ this.runtimeRunner = new IsolatedRunner(config);
111
+ break;
112
+ default:
113
+ throw new Error(`Unknown test mode: ${this.config.mode}`);
114
+ }
115
+ const startupTimeout = 30000;
116
+ try {
117
+ await withTimeout(this.runtimeRunner.start(), startupTimeout, 'Service ' + this.className + ' failed to start within ' + startupTimeout + 'ms');
118
+ this._state = GGTestRuntimeState.STARTED;
119
+ GGLog.debug(this, this.className + ' started successfully');
120
+ }
121
+ catch (error) {
122
+ // Mark as failed but keep runner alive for diagnostics (e.g., log retrieval)
123
+ this._state = GGTestRuntimeState.FAILED;
124
+ throw error;
125
+ }
126
+ });
127
+ return this;
128
+ }
129
+ /**
130
+ * Stop the GGRuntime (teardown services) but keep worker/IPC alive.
131
+ * This allows log retrieval after the runtime has stopped.
132
+ * Idempotent - safe to call multiple times.
133
+ */
134
+ async stop() {
135
+ await new GGContext("Test").run(async () => {
136
+ GG_TRACE.init();
137
+ if (this._state === GGTestRuntimeState.STOPPED || this._state === GGTestRuntimeState.SHUTDOWN) {
138
+ // Already stopped or shutdown, nothing to do
139
+ return;
140
+ }
141
+ if (this._state === GGTestRuntimeState.FAILED) {
142
+ // Already failed, just mark as stopped
143
+ this._state = GGTestRuntimeState.STOPPED;
144
+ return;
145
+ }
146
+ if (this._state === GGTestRuntimeState.CREATED) {
147
+ // Never started (e.g., another runtime or hook failed first), nothing to stop
148
+ this._state = GGTestRuntimeState.STOPPED;
149
+ return;
150
+ }
151
+ if (this._state !== GGTestRuntimeState.STARTED) {
152
+ throw new Error("Can only stop runtimes in STARTED state! Current state: " + this._state);
153
+ }
154
+ GGLog.debug(this, 'Stopping ' + this.className + '...');
155
+ try {
156
+ await this.runtimeRunner?.stopRuntime();
157
+ }
158
+ catch (error) {
159
+ GGLog.error(this, 'Error stopping ' + this.className, error);
160
+ }
161
+ this._state = GGTestRuntimeState.STOPPED;
162
+ GGLog.debug(this, this.className + ' stopped');
163
+ });
164
+ }
165
+ /**
166
+ * Fully shutdown the runtime and worker. IPC will be disconnected.
167
+ * After this, no commands can be sent.
168
+ */
169
+ async shutdown() {
170
+ await new GGContext("Test").run(async () => {
171
+ GG_TRACE.init();
172
+ if (this._state === GGTestRuntimeState.SHUTDOWN) {
173
+ return; // Already shutdown
174
+ }
175
+ GGLog.debug(this, 'Shutting down ' + this.className + '...');
176
+ try {
177
+ await this.runtimeRunner?.shutdown();
178
+ }
179
+ catch (error) {
180
+ GGLog.error(this, 'Error shutting down ' + this.className, error);
181
+ }
182
+ this.runtimeRunner = undefined;
183
+ this._state = GGTestRuntimeState.SHUTDOWN;
184
+ GGLog.debug(this, this.className + ' shut down');
185
+ });
186
+ }
187
+ async sendCommand(type, payload) {
188
+ switch (this._state) {
189
+ case GGTestRuntimeState.CREATED:
190
+ this.initialCommands.push({ method: type, payload: payload });
191
+ return undefined;
192
+ case GGTestRuntimeState.STARTED:
193
+ case GGTestRuntimeState.FAILED:
194
+ case GGTestRuntimeState.STOPPED:
195
+ // IPC still available in these states
196
+ return await this.runner.ipcServer.sendFrameworkMessage(this.runtimeId, type, payload);
197
+ case GGTestRuntimeState.SHUTDOWN:
198
+ throw new Error(`Cannot send command to shut down runtime ${this.className}`);
199
+ }
200
+ }
201
+ // -----------
202
+ // Key registration (for callOn routing)
203
+ // -----------
204
+ /**
205
+ * Register multiple locator keys at once.
206
+ */
207
+ registerLocatorKeys(keys) {
208
+ for (const key of keys) {
209
+ this.registeredLocatorKeys.add(key);
210
+ }
211
+ }
212
+ /**
213
+ * Check if this runtime has a specific locator key.
214
+ */
215
+ hasLocatorKey(key) {
216
+ return this.registeredLocatorKeys.has(key);
217
+ }
218
+ }
219
+ //# sourceMappingURL=GGTestRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGTestRuntime.js","sourceRoot":"","sources":["../../src/GGTestRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { IPCClient, IPCClientRequest } from "@grest-ts/ipc";
2
+ import { GGRuntime } from "@grest-ts/runtime";
3
+ import { GGLocatorKey } from "@grest-ts/locator";
4
+ import { GGTestCommand, GGTestEnvConfig } from "./GGTestRuntime";
5
+ export declare const GG_TEST_RUNTIME_WORKER: GGLocatorKey<GGTestRuntimeWorker>;
6
+ export declare class GGTestRuntimeWorker {
7
+ private static beforeRuntimeStartHandlers;
8
+ private static beforeRuntimeStartExecuted;
9
+ readonly ipcClient: IPCClient;
10
+ readonly config: GGTestEnvConfig;
11
+ runtime: GGRuntime;
12
+ private runtimeStopped;
13
+ private readonly scope;
14
+ constructor(config: GGTestEnvConfig);
15
+ /**
16
+ * Register a function to be called before the runtime starts.
17
+ * Safe to call at module load time - just adds to array.
18
+ * Handlers are executed during start() after extensions are loaded but before runtime creation.
19
+ */
20
+ static onBeforeRuntimeStart(handler: () => void): void;
21
+ start(createRuntime?: () => GGRuntime): Promise<void>;
22
+ /**
23
+ * Stop the GGRuntime (teardown services) but keep IPC alive.
24
+ * The runtime reference is kept so IPC handlers can still access
25
+ * async contexts (logs, metrics, config) via runInContext().
26
+ */
27
+ stopRuntime(): Promise<void>;
28
+ /**
29
+ * Register an IPC request handler that automatically runs within the runtime's context.
30
+ * Use this instead of ipcClient.onFrameworkRequest() for handlers that need access to
31
+ * runtime services (logs, metrics, config, etc.) even after runtime.stop().
32
+ */
33
+ onIpcRequest<Req, Res>(type: IPCClientRequest<Req, Res>, handler: (payload: Req) => Res | Promise<Res>): void;
34
+ /**
35
+ * Fully shutdown the worker, including IPC disconnection.
36
+ * Calls stopRuntime() if not already stopped.
37
+ */
38
+ shutdown(): Promise<void>;
39
+ getInitialCommandsFor<Payload>(type: IPCClientRequest<Payload, any>): GGTestCommand<Payload>[];
40
+ }
41
+ //# sourceMappingURL=GGTestRuntimeWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGTestRuntimeWorker.d.ts","sourceRoot":"","sources":["../../src/GGTestRuntimeWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAG1D,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAiB,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAC,aAAa,EAAE,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAQ/D,eAAO,MAAM,sBAAsB,mCAA+D,CAAC;AAEnG,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,MAAM,CAAC,0BAA0B,CAAsB;IAC/D,OAAO,CAAC,MAAM,CAAC,0BAA0B,CAAS;IAElD,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,MAAM,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,SAAS,CAAY;IACrC,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;gBAE3B,MAAM,EAAE,eAAe;IASnC;;;;OAIG;WACW,oBAAoB,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAOhD,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAiElE;;;;OAIG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzC;;;;OAIG;IACI,YAAY,CAAC,GAAG,EAAE,GAAG,EACxB,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAChC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAC9C,IAAI;IASP;;;OAGG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B,qBAAqB,CAAC,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE;CAGxG"}