@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,35 @@
1
+ /**
2
+ * @grest-ts/testkit - Component testing library
3
+ */
4
+ export * from './GGTest';
5
+ export * from './GGTestRunner';
6
+ export * from './IGGLocalDiscoveryServer';
7
+ export * from './GGTestRuntime';
8
+ export * from './testers/GGTestComponent';
9
+ export * from './mockable/GGMockable';
10
+ export * from './mockable/GGMockableCall';
11
+ export * from './mockable/mockable';
12
+ export * from './GGTestContext';
13
+ export * from './mockable/GGMockableInterceptorsServer';
14
+ export * from './callOn/callOn';
15
+ export * from './callOn/GGTestActionForLocatorOnCall';
16
+ export * from './callOn/GGCallOnSelector';
17
+ import './callOn/GGContractClass.implement';
18
+ export * from './GGTestRuntimeWorker';
19
+ export * from './testers/IGGTestWith';
20
+ export * from './testers/GGTestAction';
21
+ export * from './testers/GGMockWith';
22
+ export * from './testers/GGSpyWith';
23
+ export * from './testers/GGCallInterceptor';
24
+ export * from './utils/GGExpectations';
25
+ export * from './utils/GGTestError';
26
+ export { captureStackSourceFile } from './utils/captureStack';
27
+ export * from './GGTestSharedRef';
28
+ export * from './GGBundleTest';
29
+ export * from './mockable/GGMockableInterceptor';
30
+ export * from './testers/GGTestSelector';
31
+ export * from './testers/RuntimeSelector';
32
+ export * from './runner/WorkerRunner';
33
+ export type * from "./testers/IGGTestWith";
34
+ export type * from "./testers/IGGTestInterceptor";
35
+ //# sourceMappingURL=index-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,yCAAyC,CAAA;AAGvD,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uCAAuC,CAAA;AACrD,cAAc,2BAA2B,CAAA;AAGzC,OAAO,oCAAoC,CAAA;AAG3C,cAAc,uBAAuB,CAAA;AAGrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAC,sBAAsB,EAAC,MAAM,sBAAsB,CAAA;AAC3D,cAAc,mBAAmB,CAAA;AAGjC,cAAc,gBAAgB,CAAA;AAG9B,cAAc,kCAAkC,CAAA;AAGhD,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AAGzC,cAAc,uBAAuB,CAAA;AAErC,mBAAmB,uBAAuB,CAAC;AAC3C,mBAAmB,8BAA8B,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @grest-ts/testkit - Component testing library
3
+ */
4
+ // Core test framework
5
+ import path from "path";
6
+ import { fileURLToPath } from "url";
7
+ import { WorkerRunner } from "./runner/WorkerRunner.js";
8
+ import { IsolatedRunner } from "./runner/IsolatedRunner.js";
9
+ export * from './GGTest.js';
10
+ export * from './GGTestRunner.js';
11
+ export * from './IGGLocalDiscoveryServer.js';
12
+ export * from './GGTestRuntime.js';
13
+ export * from './testers/GGTestComponent.js';
14
+ export * from './mockable/GGMockable.js';
15
+ export * from './mockable/GGMockableCall.js';
16
+ export * from './mockable/mockable.js';
17
+ export * from './GGTestContext.js';
18
+ // Mockable component server (import triggers factory registration)
19
+ export * from './mockable/GGMockableInterceptorsServer.js';
20
+ // Testable - direct service invocation from tests
21
+ export * from './callOn/callOn.js';
22
+ export * from './callOn/GGTestActionForLocatorOnCall.js';
23
+ export * from './callOn/GGCallOnSelector.js';
24
+ // Contract registration - patches GGContractClass.implement() to auto-register
25
+ import './callOn/GGContractClass.implement.js';
26
+ // Control channel for runtime config updates
27
+ export * from './GGTestRuntimeWorker.js';
28
+ // Test utilities - core infrastructure
29
+ export * from './testers/IGGTestWith.js';
30
+ export * from './testers/GGTestAction.js';
31
+ export * from './testers/GGMockWith.js';
32
+ export * from './testers/GGSpyWith.js';
33
+ export * from './testers/GGCallInterceptor.js';
34
+ export * from './utils/GGExpectations.js';
35
+ export * from './utils/GGTestError.js';
36
+ export { captureStackSourceFile } from './utils/captureStack.js';
37
+ export * from './GGTestSharedRef.js';
38
+ // Production bundle DCE verification
39
+ export * from './GGBundleTest.js';
40
+ // Mockable interceptor
41
+ export * from './mockable/GGMockableInterceptor.js';
42
+ // Selector system for runtime access
43
+ export * from './testers/GGTestSelector.js';
44
+ export * from './testers/RuntimeSelector.js';
45
+ // Worker runner (path configured by @grest-ts/testkit-vitest)
46
+ export * from './runner/WorkerRunner.js';
47
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
48
+ WorkerRunner.setWorkerLoaderPath(path.join(__dirname, 'runner', 'worker-loader.mjs'));
49
+ IsolatedRunner.setIsolatedLoaderPath(path.join(__dirname, 'runner', 'isolated-loader.mjs'));
50
+ //# sourceMappingURL=index-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-node.js","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sBAAsB;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAC;AAClC,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAC,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAEvD,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAE/B,mEAAmE;AACnE,cAAc,yCAAyC,CAAA;AAEvD,kDAAkD;AAClD,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uCAAuC,CAAA;AACrD,cAAc,2BAA2B,CAAA;AAEzC,+EAA+E;AAC/E,OAAO,oCAAoC,CAAA;AAE3C,6CAA6C;AAC7C,cAAc,uBAAuB,CAAA;AAErC,uCAAuC;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAC,sBAAsB,EAAC,MAAM,sBAAsB,CAAA;AAC3D,cAAc,mBAAmB,CAAA;AAEjC,qCAAqC;AACrC,cAAc,gBAAgB,CAAA;AAE9B,uBAAuB;AACvB,cAAc,kCAAkC,CAAA;AAEhD,qCAAqC;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AAEzC,8DAA8D;AAC9D,cAAc,uBAAuB,CAAA;AAKrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACtF,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Marker interface for external API services that can be mocked in tests.
3
+ * When a class implements this interface, the test framework can intercept
4
+ * all method calls and provide mock responses.
5
+ *
6
+ * Examples: REST APIs, GraphQL clients, third-party SDKs
7
+ */
8
+ export interface GGMockableExternalApi {
9
+ }
10
+ /**
11
+ * Marker interface for database/storage services that can be mocked in tests.
12
+ * When a class implements this interface, the test framework can intercept
13
+ * all method calls and provide mock responses.
14
+ *
15
+ * Examples: Database clients, cache services, file storage
16
+ */
17
+ export interface GGMockableDatabaseApi {
18
+ }
19
+ //# sourceMappingURL=GGMockable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockable.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockable.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;CAErC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;CAErC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=GGMockable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockable.js","sourceRoot":"","sources":["../../../src/mockable/GGMockable.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function GGMockableCall(cls: any, methodName: string, nameMapping: string[]): void;
2
+ //# sourceMappingURL=GGMockableCall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockableCall.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockableCall.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAsCxF"}
@@ -0,0 +1,41 @@
1
+ import { GG_TEST_RUNTIME_WORKER } from "../GGTestRuntimeWorker.js";
2
+ import { CALL_THROUGH } from "./GGMockableInterceptorsServer.js";
3
+ import { GGMockableIPC } from "./GGMockableIPC.js";
4
+ const MOCKABLE_WRAPPED = Symbol('GGMockableWrapped');
5
+ export function GGMockableCall(cls, methodName, nameMapping) {
6
+ // Skip if already wrapped (happens in INLINE mode with multiple runtime instances)
7
+ if (cls.prototype[methodName]?.[MOCKABLE_WRAPPED]) {
8
+ return;
9
+ }
10
+ const originalMethod = cls.prototype[methodName];
11
+ const wrappedMethod = async function (...inputArgs) {
12
+ const worker = GG_TEST_RUNTIME_WORKER.get();
13
+ const args = {};
14
+ for (let i = 0; i < inputArgs.length; i++) {
15
+ if (!nameMapping[i])
16
+ break;
17
+ args[nameMapping[i]] = inputArgs[i];
18
+ }
19
+ const result = await worker.ipcClient.sendFrameworkRequest(GGMockableIPC.testServer.call, {
20
+ className: cls.name,
21
+ methodName: methodName,
22
+ callArgs: args
23
+ });
24
+ if (result === CALL_THROUGH) {
25
+ const realResult = await originalMethod.apply(this, inputArgs);
26
+ await worker.ipcClient.sendFrameworkRequest(GGMockableIPC.testServer.spyResult, {
27
+ className: cls.name,
28
+ methodName: methodName,
29
+ callResult: realResult
30
+ });
31
+ return realResult;
32
+ }
33
+ else {
34
+ return result;
35
+ }
36
+ };
37
+ // Mark as wrapped and assign to prototype
38
+ wrappedMethod[MOCKABLE_WRAPPED] = true;
39
+ cls.prototype[methodName] = wrappedMethod;
40
+ }
41
+ //# sourceMappingURL=GGMockableCall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockableCall.js","sourceRoot":"","sources":["../../../src/mockable/GGMockableCall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAC,YAAY,EAAC,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAErD,MAAM,UAAU,cAAc,CAAC,GAAQ,EAAE,UAAkB,EAAE,WAAqB;IAC9E,mFAAmF;IACnF,IAAI,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChD,OAAO;IACX,CAAC;IAED,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,KAAK,WAAsB,GAAG,SAAgB;QAChE,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,EAAE,CAAC;QAE5C,MAAM,IAAI,GAAQ,EAAE,CAAA;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAAE,MAAM;YAC3B,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE;YACtF,SAAS,EAAE,GAAG,CAAC,IAAI;YACnB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC/D,MAAM,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE;gBAC5E,SAAS,EAAE,GAAG,CAAC,IAAI;gBACnB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,UAAU;aACzB,CAAC,CAAC;YACH,OAAO,UAAU,CAAC;QACtB,CAAC;aAAM,CAAC;YACJ,OAAO,MAAM,CAAC;QAClB,CAAC;IACL,CAAC,CAAC;IAEF,0CAA0C;IACzC,aAAqB,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAChD,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface MockableCallPayload {
2
+ className: string;
3
+ methodName: string;
4
+ callArgs: any;
5
+ }
6
+ export interface MockableSpyResultPayload {
7
+ className: string;
8
+ methodName: string;
9
+ callResult: any;
10
+ }
11
+ export declare const GGMockableIPC: {
12
+ testServer: {
13
+ call: import("@grest-ts/ipc").IPCServerRequest<MockableCallPayload, any>;
14
+ spyResult: import("@grest-ts/ipc").IPCServerRequest<MockableSpyResultPayload, any>;
15
+ };
16
+ };
17
+ //# sourceMappingURL=GGMockableIPC.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockableIPC.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockableIPC.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,GAAG,CAAC;CACnB;AAED,eAAO,MAAM,aAAa;;;;;CAKzB,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { IPCServer } from "@grest-ts/ipc";
2
+ export const GGMockableIPC = {
3
+ testServer: {
4
+ call: IPCServer.defineRequest("mockable/call"),
5
+ spyResult: IPCServer.defineRequest("mockable/spy-result"),
6
+ }
7
+ };
8
+ //# sourceMappingURL=GGMockableIPC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockableIPC.js","sourceRoot":"","sources":["../../../src/mockable/GGMockableIPC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAcxC,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,UAAU,EAAE;QACR,IAAI,EAAE,SAAS,CAAC,aAAa,CAA2B,eAAe,CAAC;QACxE,SAAS,EAAE,SAAS,CAAC,aAAa,CAAgC,qBAAqB,CAAC;KAC3F;CACJ,CAAA"}
@@ -0,0 +1,24 @@
1
+ import type { GGTestRunner } from "../GGTestRunner";
2
+ import { GGCallInterceptor, GGCallInterceptorConfig } from "../testers/GGCallInterceptor";
3
+ export interface MockableInterceptorConfig extends GGCallInterceptorConfig {
4
+ className: string;
5
+ methodName: string;
6
+ }
7
+ /**
8
+ * Interceptor for mocking/spying on mockable class methods.
9
+ * Registers with GGMockableInterceptorsServer which handles the IPC communication.
10
+ *
11
+ * For spy mode, the flow is two-phase:
12
+ * 1. mockable/call → onRequest() validates input, returns undefined (CALL_THROUGH)
13
+ * 2. mockable/spy-result → onResponse() validates output
14
+ */
15
+ export declare class GGMockableInterceptor extends GGCallInterceptor {
16
+ readonly className: string;
17
+ readonly methodName: string;
18
+ constructor(test: GGTestRunner, config: MockableInterceptorConfig);
19
+ getKey(): string;
20
+ protected doRegister(): void;
21
+ protected doUnregister(): void;
22
+ protected parseResponseData(result: any): any;
23
+ }
24
+ //# sourceMappingURL=GGMockableInterceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockableInterceptor.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockableInterceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAC,iBAAiB,EAAE,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AAGxF,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,qBAAa,qBAAsB,SAAQ,iBAAiB;IAExD,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB;IAM1D,MAAM,IAAI,MAAM;IAIvB,SAAS,CAAC,UAAU,IAAI,IAAI;IAI5B,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;CAGhD"}
@@ -0,0 +1,32 @@
1
+ import { GGCallInterceptor } from "../testers/GGCallInterceptor.js";
2
+ import { GGMockableInterceptorsServer } from "./GGMockableInterceptorsServer.js";
3
+ /**
4
+ * Interceptor for mocking/spying on mockable class methods.
5
+ * Registers with GGMockableInterceptorsServer which handles the IPC communication.
6
+ *
7
+ * For spy mode, the flow is two-phase:
8
+ * 1. mockable/call → onRequest() validates input, returns undefined (CALL_THROUGH)
9
+ * 2. mockable/spy-result → onResponse() validates output
10
+ */
11
+ export class GGMockableInterceptor extends GGCallInterceptor {
12
+ className;
13
+ methodName;
14
+ constructor(test, config) {
15
+ super(test, config);
16
+ this.className = config.className;
17
+ this.methodName = config.methodName;
18
+ }
19
+ getKey() {
20
+ return `${this.className}.${this.methodName}`;
21
+ }
22
+ doRegister() {
23
+ this.test.getExtensionInstance(GGMockableInterceptorsServer).addInterceptor(this);
24
+ }
25
+ doUnregister() {
26
+ this.test.getExtensionInstance(GGMockableInterceptorsServer).deleteInterceptor(this);
27
+ }
28
+ parseResponseData(result) {
29
+ return result;
30
+ }
31
+ }
32
+ //# sourceMappingURL=GGMockableInterceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockableInterceptor.js","sourceRoot":"","sources":["../../../src/mockable/GGMockableInterceptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,iBAAiB,EAA0B,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAC,4BAA4B,EAAC,MAAM,gCAAgC,CAAC;AAO5E;;;;;;;GAOG;AACH,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;IAExC,SAAS,CAAS;IAClB,UAAU,CAAS;IAEnC,YAAY,IAAkB,EAAE,MAAiC;QAC7D,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACxC,CAAC;IAEM,MAAM;QACT,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;IAClD,CAAC;IAES,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC;IAES,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IAES,iBAAiB,CAAC,MAAW;QACnC,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
@@ -0,0 +1,12 @@
1
+ import type { GGMockableInterceptor } from "./GGMockableInterceptor";
2
+ import { GGTestComponent } from "../testers/GGTestComponent";
3
+ import { GGTestRunner } from "../GGTestRunner";
4
+ export declare const CALL_THROUGH = "__spyCallThrough|migo0am5g0htea";
5
+ export declare class GGMockableInterceptorsServer implements GGTestComponent {
6
+ private readonly interceptors;
7
+ constructor(runner: GGTestRunner);
8
+ addInterceptor(interceptor: GGMockableInterceptor): void;
9
+ deleteInterceptor(interceptor: GGMockableInterceptor): void;
10
+ teardown(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=GGMockableInterceptorsServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockableInterceptorsServer.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockableInterceptorsServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAG7C,eAAO,MAAM,YAAY,oCAAoC,CAAC;AAE9D,qBAAa,4BAA6B,YAAW,eAAe;IAEhE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiD;gBAElE,MAAM,EAAE,YAAY;IA4CzB,cAAc,CAAC,WAAW,EAAE,qBAAqB;IAIjD,iBAAiB,CAAC,WAAW,EAAE,qBAAqB;IAI9C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGzC"}
@@ -0,0 +1,55 @@
1
+ import { GGTestRunner } from "../GGTestRunner.js";
2
+ import { GGMockableIPC } from "./GGMockableIPC.js";
3
+ export const CALL_THROUGH = "__spyCallThrough|migo0am5g0htea";
4
+ export class GGMockableInterceptorsServer {
5
+ interceptors = new Map();
6
+ constructor(runner) {
7
+ const server = runner.ipcServer;
8
+ server.onFrameworkMessage(GGMockableIPC.testServer.call, async (body) => {
9
+ const key = body.className + "." + body.methodName;
10
+ const handler = this.interceptors.get(key);
11
+ if (!handler) {
12
+ // No mock configured - call through to real implementation
13
+ // This allows testable() to invoke real methods on @mockable services
14
+ // throw new Error(
15
+ // `Expected handler to be set for mockable '${key}'!\n` +
16
+ // "Did you forget to call .with(...)?"
17
+ // );
18
+ return CALL_THROUGH;
19
+ }
20
+ // onRequest validates input and returns mock data (or undefined for spy)
21
+ const result = await handler.onRequest(body.callArgs);
22
+ if (handler.passThrough) {
23
+ // Spy mode - signal worker to call through
24
+ return CALL_THROUGH;
25
+ }
26
+ else {
27
+ // Mock mode - return the mock data
28
+ return result;
29
+ }
30
+ });
31
+ server.onFrameworkMessage(GGMockableIPC.testServer.spyResult, async (body) => {
32
+ const key = body.className + "." + body.methodName;
33
+ const handler = this.interceptors.get(key);
34
+ if (!handler || !handler.passThrough) {
35
+ // No spy handler configured - just ignore the result
36
+ // This allows testable() to call through without requiring spyOn()
37
+ // throw new Error(`Expected spy handler for '${key}'`);
38
+ return;
39
+ }
40
+ // Validate the response from the real implementation
41
+ await handler.onResponse(body.callResult);
42
+ });
43
+ }
44
+ addInterceptor(interceptor) {
45
+ this.interceptors.set(interceptor.getKey(), interceptor);
46
+ }
47
+ deleteInterceptor(interceptor) {
48
+ this.interceptors.delete(interceptor.getKey());
49
+ }
50
+ async teardown() {
51
+ this.interceptors.clear();
52
+ }
53
+ }
54
+ GGTestRunner.registerExtension(GGMockableInterceptorsServer);
55
+ //# sourceMappingURL=GGMockableInterceptorsServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGMockableInterceptorsServer.js","sourceRoot":"","sources":["../../../src/mockable/GGMockableInterceptorsServer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAE9D,MAAM,OAAO,4BAA4B;IAEpB,YAAY,GAAuC,IAAI,GAAG,EAAE,CAAC;IAE9E,YAAY,MAAoB;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;QAChC,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,2DAA2D;gBAC3D,sEAAsE;gBACtE,mBAAmB;gBACnB,8DAA8D;gBAC9D,2CAA2C;gBAC3C,KAAK;gBACL,OAAO,YAAY,CAAC;YACxB,CAAC;YAED,yEAAyE;YACzE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtB,2CAA2C;gBAC3C,OAAO,YAAY,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,mCAAmC;gBACnC,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACzE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE3C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACnC,qDAAqD;gBACrD,mEAAmE;gBACnE,wDAAwD;gBACxD,OAAO;YACX,CAAC;YAED,qDAAqD;YACrD,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,cAAc,CAAC,WAAkC;QACpD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAEM,iBAAiB,CAAC,WAAkC;QACvD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,QAAQ;QACjB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Mockable decorator and test helpers.
3
+ *
4
+ * The @mockable decorator is re-exported from mockable-runtime.ts for production use.
5
+ * mockBy() and spyOn() are test-only utilities that require the full testkit.
6
+ */
7
+ import { GGMockWith } from "../testers/GGMockWith";
8
+ import { GGSpyWith } from "../testers/GGSpyWith";
9
+ /**
10
+ * Type for mock access - maps class methods to GGMockWith
11
+ */
12
+ type MockAccess<T> = {
13
+ [K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R> ? GGMockWith<A extends [infer Single] ? (Single extends object ? Single : Record<string, Single>) : Record<string, any>, Awaited<R>, never> : never;
14
+ };
15
+ /**
16
+ * Type for spy access - maps class methods to GGSpyWith
17
+ */
18
+ type SpyAccess<T> = {
19
+ [K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R> ? GGSpyWith<A extends [infer Single] ? (Single extends object ? Single : Record<string, Single>) : Record<string, any>, Awaited<R>, never> : never;
20
+ };
21
+ /**
22
+ * Get mock access for a @mockable class.
23
+ * Use this to create mock expectations in tests.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * .with(mockOf(AddressResolverService).resolveAddress
28
+ * .toEqual({address: "123 Main St"})
29
+ * .andReturn({lat: 40.7, lng: -74.0}))
30
+ * ```
31
+ */
32
+ export declare function mockOf<T>(cls: new (...args: any[]) => T): MockAccess<T>;
33
+ /**
34
+ * Get spy access for a @mockable class.
35
+ * Use this to create spy expectations in tests - the real method will be called.
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * .with(spyOn(AddressResolverService).resolveAddress
40
+ * .toEqual({address: "123 Main St"})
41
+ * .responseToMatchObject({lat: 40.7}))
42
+ * ```
43
+ */
44
+ export declare function spyOn<T>(cls: new (...args: any[]) => T): SpyAccess<T>;
45
+ export {};
46
+ //# sourceMappingURL=mockable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockable.d.ts","sourceRoot":"","sources":["../../../src/mockable/mockable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAM/C;;GAEG;AACH,KAAK,UAAU,CAAC,CAAC,IAAI;KAChB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAC7D,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GACzI,KAAK;CACd,CAAC;AAEF;;GAEG;AACH,KAAK,SAAS,CAAC,CAAC,IAAI;KACf,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAC7D,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GACxI,KAAK;CACd,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAMvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAMrE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Mockable decorator and test helpers.
3
+ *
4
+ * The @mockable decorator is re-exported from mockable-runtime.ts for production use.
5
+ * mockBy() and spyOn() are test-only utilities that require the full testkit.
6
+ */
7
+ // Test-only imports - these pull in testkit infrastructure
8
+ import { GGMockableInterceptor } from "./GGMockableInterceptor.js";
9
+ import { GGMockWith } from "../testers/GGMockWith.js";
10
+ import { GGSpyWith } from "../testers/GGSpyWith.js";
11
+ /**
12
+ * Get mock access for a @mockable class.
13
+ * Use this to create mock expectations in tests.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * .with(mockOf(AddressResolverService).resolveAddress
18
+ * .toEqual({address: "123 Main St"})
19
+ * .andReturn({lat: 40.7, lng: -74.0}))
20
+ * ```
21
+ */
22
+ export function mockOf(cls) {
23
+ return new Proxy({}, {
24
+ get(_, methodName) {
25
+ return new GGMockWith(GGMockableInterceptor, { className: cls.name, methodName });
26
+ }
27
+ });
28
+ }
29
+ /**
30
+ * Get spy access for a @mockable class.
31
+ * Use this to create spy expectations in tests - the real method will be called.
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * .with(spyOn(AddressResolverService).resolveAddress
36
+ * .toEqual({address: "123 Main St"})
37
+ * .responseToMatchObject({lat: 40.7}))
38
+ * ```
39
+ */
40
+ export function spyOn(cls) {
41
+ return new Proxy({}, {
42
+ get(_, methodName) {
43
+ return new GGSpyWith(GGMockableInterceptor, { className: cls.name, methodName });
44
+ }
45
+ });
46
+ }
47
+ //# sourceMappingURL=mockable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockable.js","sourceRoot":"","sources":["../../../src/mockable/mockable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2DAA2D;AAC3D,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAwB/C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,MAAM,CAAI,GAA8B;IACpD,OAAO,IAAI,KAAK,CAAC,EAAS,EAAE;QACxB,GAAG,CAAC,CAAC,EAAE,UAAkB;YACrB,OAAO,IAAI,UAAU,CAAC,qBAAqB,EAAE,EAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAC,CAAC,CAAA;QACnF,CAAC;KACJ,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,KAAK,CAAI,GAA8B;IACnD,OAAO,IAAI,KAAK,CAAC,EAAS,EAAE;QACxB,GAAG,CAAC,CAAC,EAAE,UAAkB;YACrB,OAAO,IAAI,SAAS,CAAC,qBAAqB,EAAE,EAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAC,CAAC,CAAA;QAClF,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { RuntimeRunner } from "./RuntimeRunner";
2
+ import { GGTestEnvConfig } from "../GGTestRuntime";
3
+ export declare class InlineRunner implements RuntimeRunner {
4
+ private readonly config;
5
+ private readonly runtimeFactory?;
6
+ private controlClient?;
7
+ constructor(config: GGTestEnvConfig, runtimeFactory?: () => any);
8
+ start(): Promise<void>;
9
+ stopRuntime(): Promise<void>;
10
+ shutdown(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=InlineRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineRunner.d.ts","sourceRoot":"","sources":["../../../src/runner/InlineRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAGjD,qBAAa,YAAa,YAAW,aAAa;IAK1C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAJpC,OAAO,CAAC,aAAa,CAAC,CAAsB;gBAGvB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,MAAM,GAAG;IAIzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}
@@ -0,0 +1,42 @@
1
+ import { GGTestRuntimeWorker } from "../GGTestRuntimeWorker.js";
2
+ import { GGLocatorScope } from "@grest-ts/locator";
3
+ export class InlineRunner {
4
+ config;
5
+ runtimeFactory;
6
+ controlClient;
7
+ constructor(config, runtimeFactory) {
8
+ this.config = config;
9
+ this.runtimeFactory = runtimeFactory;
10
+ }
11
+ async start() {
12
+ // Use setTimeout + enterBlank() to create a fully isolated async context.
13
+ // This gives the inline runtime its own context tree where GGLog.init()
14
+ // creates an independent log context, similar to how Worker/Isolated modes
15
+ // naturally get separate contexts by running in different threads/processes.
16
+ const factory = this.runtimeFactory;
17
+ await new Promise((resolve, reject) => {
18
+ setTimeout(async () => {
19
+ try {
20
+ // Create blank context - inline runtime should not inherit test context
21
+ new GGLocatorScope("GGInlineRunner").enter();
22
+ this.controlClient = new GGTestRuntimeWorker(this.config);
23
+ // Pass factory to avoid dynamic import() which causes duplicate
24
+ // module loading in Vite/vitest environments
25
+ await this.controlClient.start(factory);
26
+ resolve();
27
+ }
28
+ catch (err) {
29
+ reject(err);
30
+ }
31
+ }, 0);
32
+ });
33
+ }
34
+ async stopRuntime() {
35
+ await this.controlClient?.stopRuntime();
36
+ }
37
+ async shutdown() {
38
+ await this.controlClient?.shutdown();
39
+ this.controlClient = undefined;
40
+ }
41
+ }
42
+ //# sourceMappingURL=InlineRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineRunner.js","sourceRoot":"","sources":["../../../src/runner/InlineRunner.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,YAAY;IAKA;IACA;IAJb,aAAa,CAAuB;IAE5C,YACqB,MAAuB,EACvB,cAA0B;QAD1B,WAAM,GAAN,MAAM,CAAiB;QACvB,mBAAc,GAAd,cAAc,CAAY;IAE/C,CAAC;IAED,KAAK,CAAC,KAAK;QACP,0EAA0E;QAC1E,wEAAwE;QACxE,2EAA2E;QAC3E,6EAA6E;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;QACpC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,UAAU,CAAC,KAAK,IAAI,EAAE;gBAClB,IAAI,CAAC;oBACD,wEAAwE;oBACxE,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC7C,IAAI,CAAC,aAAa,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1D,gEAAgE;oBAChE,6CAA6C;oBAC7C,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACxC,OAAO,EAAE,CAAC;gBACd,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;YACL,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,WAAW;QACb,MAAM,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACnC,CAAC;CACJ"}
@@ -0,0 +1,17 @@
1
+ import type { RuntimeRunner } from "./RuntimeRunner";
2
+ import { GGTestEnvConfig } from "../GGTestRuntime";
3
+ export declare class IsolatedRunner implements RuntimeRunner {
4
+ private config;
5
+ private process?;
6
+ private static isolatedLoaderPath;
7
+ /**
8
+ * Set the path to the isolated-loader.mjs file.
9
+ * Called by @grest-ts/testkit-vitest to inject the path.
10
+ */
11
+ static setIsolatedLoaderPath(path: string): void;
12
+ constructor(config: GGTestEnvConfig);
13
+ start(): Promise<void>;
14
+ stopRuntime(): Promise<void>;
15
+ shutdown(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=IsolatedRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IsolatedRunner.d.ts","sourceRoot":"","sources":["../../../src/runner/IsolatedRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAKjD,qBAAa,cAAe,YAAW,aAAa;IAapC,OAAO,CAAC,MAAM;IAZ1B,OAAO,CAAC,OAAO,CAAC,CAAe;IAE/B,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;IAEtD;;;OAGG;WACW,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;gBAInC,MAAM,EAAE,eAAe;IAGrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwEtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAuClC"}