@geekmidas/constructs 10.0.0-alpha.37 → 10.0.0-alpha.39
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.
- package/README.md +156 -155
- package/dist/{Construct-Detz65RA.mjs → Construct-BO1X-kt9.mjs} +3 -6
- package/dist/Construct-BO1X-kt9.mjs.map +1 -0
- package/dist/Construct-BQALFCh2.d.cts +230 -0
- package/dist/Construct-BQALFCh2.d.cts.map +1 -0
- package/dist/{Construct-yG9Sw-5p.cjs → Construct-DmvXceVY.cjs} +3 -6
- package/dist/Construct-DmvXceVY.cjs.map +1 -0
- package/dist/Construct-QXnl3VqT.d.mts +230 -0
- package/dist/Construct-QXnl3VqT.d.mts.map +1 -0
- package/dist/{Cron-CA2oa2nC.d.cts → Cron-CMEGfRs8.d.cts} +7 -5
- package/dist/Cron-CMEGfRs8.d.cts.map +1 -0
- package/dist/{Cron-B_iuyNxr.d.mts → Cron-D6X4-xjB.d.mts} +7 -5
- package/dist/Cron-D6X4-xjB.d.mts.map +1 -0
- package/dist/{CronBuilder-B_KqaodP.d.cts → CronBuilder-CEK7aOqD.d.cts} +21 -16
- package/dist/CronBuilder-CEK7aOqD.d.cts.map +1 -0
- package/dist/{CronBuilder-BbnT7tqo.cjs → CronBuilder-DB35T5dL.cjs} +13 -11
- package/dist/CronBuilder-DB35T5dL.cjs.map +1 -0
- package/dist/{CronBuilder-BRkzUOAs.mjs → CronBuilder-Dv0IlZs0.mjs} +14 -12
- package/dist/CronBuilder-Dv0IlZs0.mjs.map +1 -0
- package/dist/{CronBuilder-BIKCLWu7.d.mts → CronBuilder-O_gvButp.d.mts} +21 -16
- package/dist/CronBuilder-O_gvButp.d.mts.map +1 -0
- package/dist/{Endpoint-DO332Dnm.mjs → Endpoint-CQAeh1Rh.mjs} +5 -5
- package/dist/Endpoint-CQAeh1Rh.mjs.map +1 -0
- package/dist/{Endpoint-QKuFg5gs.cjs → Endpoint-D1L9qu5C.cjs} +5 -5
- package/dist/Endpoint-D1L9qu5C.cjs.map +1 -0
- package/dist/{Endpoint-1-XYQSx0.d.cts → Endpoint-Dp5AKIXl.d.cts} +10 -13
- package/dist/Endpoint-Dp5AKIXl.d.cts.map +1 -0
- package/dist/{Endpoint-GFIxYb9L.d.mts → Endpoint-DtI7heFm.d.mts} +10 -13
- package/dist/Endpoint-DtI7heFm.d.mts.map +1 -0
- package/dist/{EndpointFactory-B9HAjDAP.mjs → EndpointFactory-BBdNeaGJ.mjs} +23 -52
- package/dist/EndpointFactory-BBdNeaGJ.mjs.map +1 -0
- package/dist/{EndpointFactory-BmO0WnXE.cjs → EndpointFactory-BZOCOaK6.cjs} +22 -51
- package/dist/EndpointFactory-BZOCOaK6.cjs.map +1 -0
- package/dist/{EndpointFactory-BCZdh_u3.d.mts → EndpointFactory-CgMDvERK.d.mts} +58 -48
- package/dist/EndpointFactory-CgMDvERK.d.mts.map +1 -0
- package/dist/{EndpointFactory-BnK_YkW1.d.cts → EndpointFactory-FeFRmlDZ.d.cts} +58 -48
- package/dist/EndpointFactory-FeFRmlDZ.d.cts.map +1 -0
- package/dist/{HonoEndpointAdaptor-CiqAZ5Mt.mjs → HonoEndpointAdaptor-Aui-x9Lg.mjs} +4 -3
- package/dist/HonoEndpointAdaptor-Aui-x9Lg.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DoEQdC3r.cjs → HonoEndpointAdaptor-Cq99r9H7.cjs} +5 -4
- package/dist/HonoEndpointAdaptor-Cq99r9H7.cjs.map +1 -0
- package/dist/{Queue-DpKTLl6E.mjs → Queue-C1uDgjxt.mjs} +29 -48
- package/dist/Queue-C1uDgjxt.mjs.map +1 -0
- package/dist/{Queue-B7yRXQmL.cjs → Queue-Ckmudcm8.cjs} +29 -48
- package/dist/Queue-Ckmudcm8.cjs.map +1 -0
- package/dist/{Queue-Bhzi2WQC.d.cts → Queue-CpQIGB_2.d.cts} +22 -33
- package/dist/Queue-CpQIGB_2.d.cts.map +1 -0
- package/dist/{Queue-BoUA-e83.d.mts → Queue-YmvN2vEP.d.mts} +21 -32
- package/dist/Queue-YmvN2vEP.d.mts.map +1 -0
- package/dist/QueueBuilder-CJNcv4dy.cjs +112 -0
- package/dist/QueueBuilder-CJNcv4dy.cjs.map +1 -0
- package/dist/QueueBuilder-CM0WUxfw.d.mts +62 -0
- package/dist/QueueBuilder-CM0WUxfw.d.mts.map +1 -0
- package/dist/QueueBuilder-XEnnOWGe.d.cts +62 -0
- package/dist/QueueBuilder-XEnnOWGe.d.cts.map +1 -0
- package/dist/QueueBuilder-XuPKZwKH.mjs +95 -0
- package/dist/QueueBuilder-XuPKZwKH.mjs.map +1 -0
- package/dist/{Subscriber-DQCaiOXF.d.cts → Subscriber-B91YSkZt.d.cts} +12 -13
- package/dist/Subscriber-B91YSkZt.d.cts.map +1 -0
- package/dist/{Subscriber-CIO3pwji.d.mts → Subscriber-BjHYe5hK.d.mts} +11 -12
- package/dist/Subscriber-BjHYe5hK.d.mts.map +1 -0
- package/dist/{SubscriberBuilder-CjDGSTZc.d.cts → SubscriberBuilder-BSpQX1JT.d.cts} +19 -23
- package/dist/SubscriberBuilder-BSpQX1JT.d.cts.map +1 -0
- package/dist/{SubscriberBuilder-C2FRfd26.d.mts → SubscriberBuilder-BhMphk4z.d.mts} +18 -22
- package/dist/SubscriberBuilder-BhMphk4z.d.mts.map +1 -0
- package/dist/{SubscriberBuilder-C2bCOuPT.cjs → SubscriberBuilder-Duk028pD.cjs} +11 -19
- package/dist/SubscriberBuilder-Duk028pD.cjs.map +1 -0
- package/dist/{SubscriberBuilder-B4YRTBng.mjs → SubscriberBuilder-DzQUWE08.mjs} +11 -19
- package/dist/SubscriberBuilder-DzQUWE08.mjs.map +1 -0
- package/dist/{Topic-D5rlM9wS.cjs → Topic-BBVXC3H4.cjs} +46 -51
- package/dist/Topic-BBVXC3H4.cjs.map +1 -0
- package/dist/Topic-DOw051ch.mjs +98 -0
- package/dist/Topic-DOw051ch.mjs.map +1 -0
- package/dist/adaptors/aws.cjs +5 -5
- package/dist/adaptors/aws.cjs.map +1 -1
- package/dist/adaptors/aws.d.cts +26 -26
- package/dist/adaptors/aws.d.cts.map +1 -1
- package/dist/adaptors/aws.d.mts +25 -25
- package/dist/adaptors/aws.d.mts.map +1 -1
- package/dist/adaptors/aws.mjs +5 -5
- package/dist/adaptors/aws.mjs.map +1 -1
- package/dist/adaptors/hono.cjs +1 -1
- package/dist/adaptors/hono.d.cts +4 -5
- package/dist/adaptors/hono.d.cts.map +1 -1
- package/dist/adaptors/hono.d.mts +4 -5
- package/dist/adaptors/hono.d.mts.map +1 -1
- package/dist/adaptors/hono.mjs +1 -1
- package/dist/adaptors/testing.cjs +59 -23
- package/dist/adaptors/testing.cjs.map +1 -1
- package/dist/adaptors/testing.d.cts +40 -28
- package/dist/adaptors/testing.d.cts.map +1 -1
- package/dist/adaptors/testing.d.mts +40 -28
- package/dist/adaptors/testing.d.mts.map +1 -1
- package/dist/adaptors/testing.mjs +59 -23
- package/dist/adaptors/testing.mjs.map +1 -1
- package/dist/{auth-c6nWnvD8.d.cts → auth-CMwml9QN.d.mts} +4 -4
- package/dist/{auth-c6nWnvD8.d.cts.map → auth-CMwml9QN.d.mts.map} +1 -1
- package/dist/{auth-pS_U1H_X.d.mts → auth-rVRDjIw_.d.cts} +4 -4
- package/dist/{auth-pS_U1H_X.d.mts.map → auth-rVRDjIw_.d.cts.map} +1 -1
- package/dist/auth.d.cts +1 -1
- package/dist/auth.d.mts +1 -1
- package/dist/{cache-B2s0b-ss.d.mts → cache-C9a_hVCc.d.cts} +3 -3
- package/dist/{cache-B2s0b-ss.d.mts.map → cache-C9a_hVCc.d.cts.map} +1 -1
- package/dist/{cache-CYe2Kzjc.d.cts → cache-CeTMI8LR.d.mts} +3 -3
- package/dist/{cache-CYe2Kzjc.d.cts.map → cache-CeTMI8LR.d.mts.map} +1 -1
- package/dist/cache.d.cts +1 -1
- package/dist/cache.d.mts +1 -1
- package/dist/{construct-interface-D2gesxos.d.mts → construct-interface-_3zgxzXl.d.mts} +11 -20
- package/dist/{construct-interface-D2gesxos.d.mts.map → construct-interface-_3zgxzXl.d.mts.map} +1 -1
- package/dist/{construct-interface-DPusCUSQ.d.cts → construct-interface-_xi4BPN8.d.cts} +11 -20
- package/dist/{construct-interface-DPusCUSQ.d.cts.map → construct-interface-_xi4BPN8.d.cts.map} +1 -1
- package/dist/construct-interface.cjs +4 -33
- package/dist/construct-interface.cjs.map +1 -1
- package/dist/construct-interface.d.cts +2 -2
- package/dist/construct-interface.d.mts +2 -2
- package/dist/construct-interface.mjs +5 -32
- package/dist/construct-interface.mjs.map +1 -1
- package/dist/credential.cjs +22 -9
- package/dist/credential.cjs.map +1 -1
- package/dist/credential.d.cts +12 -2
- package/dist/credential.d.cts.map +1 -1
- package/dist/credential.d.mts +12 -2
- package/dist/credential.d.mts.map +1 -1
- package/dist/credential.mjs +22 -10
- package/dist/credential.mjs.map +1 -1
- package/dist/crons/index.cjs +1 -1
- package/dist/crons/index.d.cts +2 -2
- package/dist/crons/index.d.mts +2 -2
- package/dist/crons/index.mjs +1 -1
- package/dist/database/kysely.d.cts +1 -1
- package/dist/database/kysely.d.mts +1 -1
- package/dist/email.d.cts +1 -1
- package/dist/email.d.mts +1 -1
- package/dist/endpoints/index.cjs +5 -4
- package/dist/endpoints/index.d.cts +4 -13
- package/dist/endpoints/index.d.cts.map +1 -1
- package/dist/endpoints/index.d.mts +4 -13
- package/dist/endpoints/index.d.mts.map +1 -1
- package/dist/endpoints/index.mjs +4 -3
- package/dist/external-api-DS3mujT5.d.mts +86 -0
- package/dist/external-api-DS3mujT5.d.mts.map +1 -0
- package/dist/external-api-LBfE-q3g.d.cts +86 -0
- package/dist/external-api-LBfE-q3g.d.cts.map +1 -0
- package/dist/external-api.cjs +124 -0
- package/dist/external-api.cjs.map +1 -0
- package/dist/external-api.d.cts +2 -0
- package/dist/external-api.d.mts +2 -0
- package/dist/external-api.mjs +121 -0
- package/dist/external-api.mjs.map +1 -0
- package/dist/file-server.d.cts +1 -1
- package/dist/file-server.d.mts +1 -1
- package/dist/functions/index.cjs +1 -1
- package/dist/functions/index.d.cts +1 -1
- package/dist/functions/index.d.mts +1 -1
- package/dist/functions/index.mjs +1 -1
- package/dist/{functions-DlFm8HmH.mjs → functions-DCIfCRR-.mjs} +94 -23
- package/dist/functions-DCIfCRR-.mjs.map +1 -0
- package/dist/{functions-DKN6aQWJ.cjs → functions-ZH60FE7H.cjs} +99 -19
- package/dist/functions-ZH60FE7H.cjs.map +1 -0
- package/dist/{index-BI23K3wy.d.cts → index-B0kxstwf.d.cts} +36 -24
- package/dist/index-B0kxstwf.d.cts.map +1 -0
- package/dist/{index-yb3fXNyH.d.mts → index-CjVEjOw0.d.mts} +36 -24
- package/dist/index-CjVEjOw0.d.mts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{kysely-CEVXacPN.d.cts → kysely-BJ8IQ_1P.d.mts} +4 -4
- package/dist/{kysely-CEVXacPN.d.cts.map → kysely-BJ8IQ_1P.d.mts.map} +1 -1
- package/dist/{kysely-mcTdPNhl.d.mts → kysely-DVF8wOT4.d.cts} +4 -4
- package/dist/{kysely-mcTdPNhl.d.mts.map → kysely-DVF8wOT4.d.cts.map} +1 -1
- package/dist/{lazyAccessors-BHtcqgz2.mjs → lazyAccessors-CFanua0O.mjs} +2 -39
- package/dist/lazyAccessors-CFanua0O.mjs.map +1 -0
- package/dist/{lazyAccessors-Dx9NLwJZ.cjs → lazyAccessors-hJKGv8Ay.cjs} +1 -50
- package/dist/lazyAccessors-hJKGv8Ay.cjs.map +1 -0
- package/dist/mobile-app.d.cts +1 -1
- package/dist/mobile-app.d.mts +1 -1
- package/dist/object-storage.d.cts +1 -1
- package/dist/object-storage.d.mts +1 -1
- package/dist/processAudits-BpRlPQMW.mjs.map +1 -1
- package/dist/processAudits-D_2W5x8k.cjs.map +1 -1
- package/dist/queue/index.cjs +4 -78
- package/dist/queue/index.d.cts +3 -53
- package/dist/queue/index.d.mts +3 -53
- package/dist/queue/index.mjs +3 -77
- package/dist/rest-api.cjs +2 -4
- package/dist/rest-api.cjs.map +1 -1
- package/dist/rest-api.d.cts +4 -5
- package/dist/rest-api.d.cts.map +1 -1
- package/dist/rest-api.d.mts +4 -5
- package/dist/rest-api.d.mts.map +1 -1
- package/dist/rest-api.mjs +2 -4
- package/dist/rest-api.mjs.map +1 -1
- package/dist/site.d.cts +1 -1
- package/dist/site.d.mts +1 -1
- package/dist/subscribers/index.cjs +1 -1
- package/dist/subscribers/index.d.cts +2 -2
- package/dist/subscribers/index.d.mts +2 -2
- package/dist/subscribers/index.mjs +1 -1
- package/dist/topic/index.cjs +1 -36
- package/dist/topic/index.d.cts +2 -3
- package/dist/topic/index.d.mts +2 -3
- package/dist/topic/index.mjs +2 -35
- package/dist/worker.cjs +26 -17
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.cts +37 -29
- package/dist/worker.d.cts.map +1 -1
- package/dist/worker.d.mts +37 -29
- package/dist/worker.d.mts.map +1 -1
- package/dist/worker.mjs +26 -17
- package/dist/worker.mjs.map +1 -1
- package/package.json +41 -31
- package/dist/Construct-DTqYvkPG.d.cts +0 -115
- package/dist/Construct-DTqYvkPG.d.cts.map +0 -1
- package/dist/Construct-Detz65RA.mjs.map +0 -1
- package/dist/Construct-pVadmURD.d.mts +0 -115
- package/dist/Construct-pVadmURD.d.mts.map +0 -1
- package/dist/Construct-yG9Sw-5p.cjs.map +0 -1
- package/dist/Cron-B_iuyNxr.d.mts.map +0 -1
- package/dist/Cron-CA2oa2nC.d.cts.map +0 -1
- package/dist/CronBuilder-BIKCLWu7.d.mts.map +0 -1
- package/dist/CronBuilder-BRkzUOAs.mjs.map +0 -1
- package/dist/CronBuilder-B_KqaodP.d.cts.map +0 -1
- package/dist/CronBuilder-BbnT7tqo.cjs.map +0 -1
- package/dist/Endpoint-1-XYQSx0.d.cts.map +0 -1
- package/dist/Endpoint-DO332Dnm.mjs.map +0 -1
- package/dist/Endpoint-GFIxYb9L.d.mts.map +0 -1
- package/dist/Endpoint-QKuFg5gs.cjs.map +0 -1
- package/dist/EndpointFactory-B9HAjDAP.mjs.map +0 -1
- package/dist/EndpointFactory-BCZdh_u3.d.mts.map +0 -1
- package/dist/EndpointFactory-BmO0WnXE.cjs.map +0 -1
- package/dist/EndpointFactory-BnK_YkW1.d.cts.map +0 -1
- package/dist/HonoEndpointAdaptor-CiqAZ5Mt.mjs.map +0 -1
- package/dist/HonoEndpointAdaptor-DoEQdC3r.cjs.map +0 -1
- package/dist/Queue-B7yRXQmL.cjs.map +0 -1
- package/dist/Queue-Bhzi2WQC.d.cts.map +0 -1
- package/dist/Queue-BoUA-e83.d.mts.map +0 -1
- package/dist/Queue-DpKTLl6E.mjs.map +0 -1
- package/dist/Subscriber-CIO3pwji.d.mts.map +0 -1
- package/dist/Subscriber-DQCaiOXF.d.cts.map +0 -1
- package/dist/SubscriberBuilder-B4YRTBng.mjs.map +0 -1
- package/dist/SubscriberBuilder-C2FRfd26.d.mts.map +0 -1
- package/dist/SubscriberBuilder-C2bCOuPT.cjs.map +0 -1
- package/dist/SubscriberBuilder-CjDGSTZc.d.cts.map +0 -1
- package/dist/Topic-Ct3Le8Wt.mjs +0 -103
- package/dist/Topic-Ct3Le8Wt.mjs.map +0 -1
- package/dist/Topic-D5rlM9wS.cjs.map +0 -1
- package/dist/Topic-D6blllEn.d.cts +0 -89
- package/dist/Topic-D6blllEn.d.cts.map +0 -1
- package/dist/Topic-DVvheJ_-.d.mts +0 -89
- package/dist/Topic-DVvheJ_-.d.mts.map +0 -1
- package/dist/functions-DKN6aQWJ.cjs.map +0 -1
- package/dist/functions-DlFm8HmH.mjs.map +0 -1
- package/dist/index-BI23K3wy.d.cts.map +0 -1
- package/dist/index-fnpjXiA-.d.mts +0 -26
- package/dist/index-fnpjXiA-.d.mts.map +0 -1
- package/dist/index-tE_119SX.d.cts +0 -26
- package/dist/index-tE_119SX.d.cts.map +0 -1
- package/dist/index-yb3fXNyH.d.mts.map +0 -1
- package/dist/lazyAccessors-BHtcqgz2.mjs.map +0 -1
- package/dist/lazyAccessors-Dx9NLwJZ.cjs.map +0 -1
- package/dist/queue/index.cjs.map +0 -1
- package/dist/queue/index.d.cts.map +0 -1
- package/dist/queue/index.d.mts.map +0 -1
- package/dist/queue/index.mjs.map +0 -1
- package/dist/topic/index.cjs.map +0 -1
- package/dist/topic/index.mjs.map +0 -1
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import { t as StandardSchemaV1 } from "../index-CeEtxDmK.cjs";
|
|
2
|
-
import { r as Function } from "../index-
|
|
2
|
+
import { r as Function } from "../index-B0kxstwf.cjs";
|
|
3
3
|
import { t as HttpMethod } from "../types-DMuSQeLL.cjs";
|
|
4
|
-
import { c as EndpointSchemas, i as Endpoint } from "../Endpoint-
|
|
5
|
-
import { t as Queue } from "../Queue-
|
|
6
|
-
import { t as Subscriber } from "../Subscriber-
|
|
7
|
-
import { t as KyselyDatabase } from "../kysely-
|
|
8
|
-
import {
|
|
4
|
+
import { c as EndpointSchemas, i as Endpoint } from "../Endpoint-Dp5AKIXl.cjs";
|
|
5
|
+
import { t as Queue } from "../Queue-CpQIGB_2.cjs";
|
|
6
|
+
import { t as Subscriber } from "../Subscriber-B91YSkZt.cjs";
|
|
7
|
+
import { t as KyselyDatabase } from "../kysely-DVF8wOT4.cjs";
|
|
8
|
+
import { r as Fake } from "../external-api-LBfE-q3g.cjs";
|
|
9
9
|
import { Logger } from "@geekmidas/logger";
|
|
10
10
|
import { ComposableStandardSchema, InferComposableStandardSchema, InferStandardSchema } from "@geekmidas/schema";
|
|
11
11
|
import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
|
|
12
12
|
import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
|
|
13
|
+
import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
|
|
13
14
|
import { TEST_CONTEXT_HEADER } from "@geekmidas/testkit/context";
|
|
14
15
|
import { HttpHandler } from "msw";
|
|
15
16
|
import { Browser } from "@geekmidas/testkit/browser";
|
|
17
|
+
import { FakerFactory } from "@geekmidas/testkit/faker";
|
|
16
18
|
import { Mailbox } from "@geekmidas/testkit/mailbox";
|
|
17
19
|
import { Kysely } from "kysely";
|
|
18
20
|
//#region src/endpoints/MswEndpointAdaptor.d.ts
|
|
@@ -56,16 +58,16 @@ interface CreateMswHandlersOptions {
|
|
|
56
58
|
}
|
|
57
59
|
/**
|
|
58
60
|
* Options for registering a per-test context.
|
|
59
|
-
* Follows the same pattern as TestRequestAdaptor — services, database
|
|
60
|
-
*
|
|
61
|
+
* Follows the same pattern as TestRequestAdaptor — services, database and
|
|
62
|
+
* auditorStorage are provided explicitly. A topic is a service under its own
|
|
63
|
+
* name, so a recorder in `services` (`{ users: recorder }`) captures what an
|
|
64
|
+
* endpoint publishes to it.
|
|
61
65
|
*/
|
|
62
66
|
interface RegisterContextOptions {
|
|
63
67
|
/** Service instances keyed by serviceName */
|
|
64
68
|
services?: Record<string, unknown>;
|
|
65
69
|
/** Database instance — required when endpoints use .database() */
|
|
66
70
|
database?: unknown;
|
|
67
|
-
/** Event publisher service definition */
|
|
68
|
-
publisher?: Service;
|
|
69
71
|
/** Audit storage instance — required when endpoints use .auditor() */
|
|
70
72
|
auditorStorage?: unknown;
|
|
71
73
|
}
|
|
@@ -101,13 +103,13 @@ type TestHttpResponse<TBody = any> = {
|
|
|
101
103
|
status: number;
|
|
102
104
|
headers: Record<string, string | string[]>;
|
|
103
105
|
};
|
|
104
|
-
export declare class TestEndpointAdaptor<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown,
|
|
106
|
+
export declare class TestEndpointAdaptor<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string> {
|
|
105
107
|
private readonly endpoint;
|
|
106
108
|
private serviceDiscovery;
|
|
107
|
-
static getDefaultServiceDiscover<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown,
|
|
108
|
-
constructor(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession,
|
|
109
|
-
fullRequest(ctx: TestRequestAdaptor<TInput, TServices,
|
|
110
|
-
request(ctx: TestRequestAdaptor<TInput, TServices,
|
|
109
|
+
static getDefaultServiceDiscover<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string>(_endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>): any;
|
|
110
|
+
constructor(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>, serviceDiscovery?: ServiceDiscovery<any>);
|
|
111
|
+
fullRequest(ctx: TestRequestAdaptor<TInput, TServices, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<TestHttpResponse<InferStandardSchema<TOutSchema>>>;
|
|
112
|
+
request(ctx: TestRequestAdaptor<TInput, TServices, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<InferStandardSchema<TOutSchema>>;
|
|
111
113
|
}
|
|
112
114
|
/**
|
|
113
115
|
* Conditional audit storage requirement - required when TAuditStorage is configured
|
|
@@ -123,24 +125,22 @@ type DatabaseRequirement<TDatabase = undefined> = TDatabase extends undefined ?
|
|
|
123
125
|
/** Database instance - required when endpoint uses .database() */
|
|
124
126
|
database: TDatabase;
|
|
125
127
|
};
|
|
126
|
-
type TestRequestAdaptor<TInput extends EndpointSchemas = {}, TServices extends Service[] = [],
|
|
128
|
+
type TestRequestAdaptor<TInput extends EndpointSchemas = {}, TServices extends Service[] = [], TAuditStorage extends AuditStorage | undefined = undefined, _TAuditStorageServiceName extends string = string, TDatabase = undefined, _TDatabaseServiceName extends string = string> = {
|
|
127
129
|
services: ServiceRecord<TServices>;
|
|
128
130
|
headers: Record<string, string>;
|
|
129
|
-
publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
130
131
|
} & InferComposableStandardSchema<TInput> & AuditStorageRequirement<TAuditStorage> & DatabaseRequirement<TDatabase>;
|
|
131
132
|
//#endregion
|
|
132
133
|
//#region src/functions/TestFunctionAdaptor.d.ts
|
|
133
|
-
export declare class TestFunctionAdaptor<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger,
|
|
134
|
+
export declare class TestFunctionAdaptor<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> {
|
|
134
135
|
private readonly fn;
|
|
135
136
|
private serviceDiscovery;
|
|
136
|
-
static getDefaultServiceDiscovery<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger,
|
|
137
|
-
constructor(fn: Function<TInput, TServices, TLogger, TOutSchema,
|
|
138
|
-
invoke(ctx: TestFunctionRequest<TInput, TServices,
|
|
137
|
+
static getDefaultServiceDiscovery<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>>(_fn: Function<TInput, TServices, TLogger, TOutSchema, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>): any;
|
|
138
|
+
constructor(fn: Function<TInput, TServices, TLogger, TOutSchema, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>, serviceDiscovery?: ServiceDiscovery<any>);
|
|
139
|
+
invoke(ctx: TestFunctionRequest<TInput, TServices, TDatabase, TAuditAction>): Promise<InferStandardSchema<TOutSchema>>;
|
|
139
140
|
}
|
|
140
|
-
type TestFunctionRequest<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [],
|
|
141
|
+
type TestFunctionRequest<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TDatabase = undefined, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> = {
|
|
141
142
|
input: InferComposableStandardSchema<TInput>;
|
|
142
143
|
services: ServiceRecord<TServices>;
|
|
143
|
-
publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
144
144
|
db?: TDatabase;
|
|
145
145
|
auditor?: Auditor<TAuditAction>;
|
|
146
146
|
} & InferComposableStandardSchema<{
|
|
@@ -173,11 +173,11 @@ type TestQueueRequest<TMessage extends StandardSchemaV1 = StandardSchemaV1, TSer
|
|
|
173
173
|
type ExtractEventPayloads<TPublisher extends EventPublisher<any> | undefined, TEventTypes extends any[]> = TPublisher extends EventPublisher<any> ? Extract<ExtractPublisherMessage<TPublisher>, {
|
|
174
174
|
type: TEventTypes[number];
|
|
175
175
|
}> : never;
|
|
176
|
-
export declare class TestSubscriberAdaptor<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
176
|
+
export declare class TestSubscriberAdaptor<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][]> {
|
|
177
177
|
private readonly subscriber;
|
|
178
178
|
private serviceDiscovery;
|
|
179
179
|
static getDefaultServiceDiscovery(): any;
|
|
180
|
-
constructor(subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher,
|
|
180
|
+
constructor(subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TSubscribedEvents>, serviceDiscovery?: ServiceDiscovery<any>);
|
|
181
181
|
invoke(request: TestSubscriberRequest<TEventPublisher, TSubscribedEvents, TServices>): Promise<InferStandardSchema<OutSchema>>;
|
|
182
182
|
private filterEvents;
|
|
183
183
|
}
|
|
@@ -262,6 +262,12 @@ interface FeatureTestOptions<TBrowser extends Browser, TFactories extends Factor
|
|
|
262
262
|
* back with everything else, and seen by the endpoints it calls.
|
|
263
263
|
*/
|
|
264
264
|
factories?: TFactories;
|
|
265
|
+
/**
|
|
266
|
+
* Each external API's fake — the default export of `test/fakes/<id>.ts`,
|
|
267
|
+
* which the generated harness imports — keyed by the API's construct id.
|
|
268
|
+
* An app fake is served at the URL the test stage resolved for it.
|
|
269
|
+
*/
|
|
270
|
+
fakes?: Readonly<Record<string, Fake>>;
|
|
265
271
|
}
|
|
266
272
|
/** Each database's schema, keyed by its service name. */
|
|
267
273
|
type DatabaseSchemas = Record<string, unknown>;
|
|
@@ -299,6 +305,12 @@ interface FeatureContext<TBrowser extends Browser, TDatabases extends DatabaseSc
|
|
|
299
305
|
* returns.
|
|
300
306
|
*/
|
|
301
307
|
factories: TestFactories<TFactories>;
|
|
308
|
+
/**
|
|
309
|
+
* Testkit's faker — the one factories are handed — seeded from this test's
|
|
310
|
+
* name, so a failing test fails again with the same data, and so a test
|
|
311
|
+
* imports nothing to make some.
|
|
312
|
+
*/
|
|
313
|
+
faker: FakerFactory;
|
|
302
314
|
/** The mail sent to an address during this test, read from Mailpit. */
|
|
303
315
|
mailbox: (address: string) => Mailbox;
|
|
304
316
|
/**
|
|
@@ -314,11 +326,11 @@ interface FeatureContext<TBrowser extends Browser, TDatabases extends DatabaseSc
|
|
|
314
326
|
* with this test's services: its databases resolve to this test's
|
|
315
327
|
* transactions, as an endpoint's do.
|
|
316
328
|
*/
|
|
317
|
-
subscriber: <S extends Subscriber<any, any, any, any, any
|
|
329
|
+
subscriber: <S extends Subscriber<any, any, any, any, any>>(subscriber: S) => SubscriberAdaptorOf<S>;
|
|
318
330
|
/** A queue's worker, run on its own with this test's services. */
|
|
319
331
|
queue: <Q extends Queue<any, any, any, any>>(queue: Q) => QueueAdaptorOf<Q>;
|
|
320
332
|
}
|
|
321
|
-
type SubscriberAdaptorOf<S> = S extends Subscriber<infer TServices, infer TLogger, infer OutSchema, infer TEventPublisher, infer
|
|
333
|
+
type SubscriberAdaptorOf<S> = S extends Subscriber<infer TServices, infer TLogger, infer OutSchema, infer TEventPublisher, infer TSubscribedEvents> ? TestSubscriberAdaptor<TServices, TLogger, OutSchema, TEventPublisher, TSubscribedEvents> : never;
|
|
322
334
|
type QueueAdaptorOf<Q> = Q extends Queue<infer TName, infer TMessage, infer TServices, infer TLogger> ? TestQueueAdaptor<TName, TMessage, TServices, TLogger> : never;
|
|
323
335
|
/** The schema a database construct was declared with — what `db` is typed by. */
|
|
324
336
|
type DatabaseOf<C> = C extends KyselyDatabase<infer DB, any> ? DB : unknown;
|
|
@@ -358,7 +370,7 @@ interface MagicLinkAuthClient<TSession> {
|
|
|
358
370
|
* — and cleared again after the test, like any address a test reads. Returns
|
|
359
371
|
* the session the auth server then reports, as better-auth hands it back.
|
|
360
372
|
*/
|
|
361
|
-
export declare function signInWithMagicLink<TSession>(browser: Browser, auth: MagicLinkAuthClient<TSession>, email
|
|
373
|
+
export declare function signInWithMagicLink<TSession>(browser: Browser, auth: MagicLinkAuthClient<TSession>, email?: string): Promise<TSession>;
|
|
362
374
|
/** `browser.signIn` finished without a session. */
|
|
363
375
|
export declare class SignInFailed extends Error {
|
|
364
376
|
readonly email: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.cts","names":["TestBrowser"],"sources":["../../src/endpoints/MswEndpointAdaptor.ts","../../src/endpoints/TestEndpointAdaptor.ts","../../src/functions/TestFunctionAdaptor.ts","../../src/queue/TestQueueAdaptor.ts","../../src/subscribers/TestSubscriberAdaptor.ts","../../src/testing/manifest.ts","../../src/testing/featureTest.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"testing.d.cts","names":["TestBrowser"],"sources":["../../src/endpoints/MswEndpointAdaptor.ts","../../src/endpoints/TestEndpointAdaptor.ts","../../src/functions/TestFunctionAdaptor.ts","../../src/queue/TestQueueAdaptor.ts","../../src/subscribers/TestSubscriberAdaptor.ts","../../src/testing/manifest.ts","../../src/testing/featureTest.ts"],"mappings":"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"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { t as StandardSchemaV1 } from "../index-CeEtxDmK.mjs";
|
|
2
|
-
import { r as Function } from "../index-
|
|
2
|
+
import { r as Function } from "../index-CjVEjOw0.mjs";
|
|
3
3
|
import { t as HttpMethod } from "../types-DMuSQeLL.mjs";
|
|
4
|
-
import { c as EndpointSchemas, i as Endpoint } from "../Endpoint-
|
|
5
|
-
import { t as Queue } from "../Queue-
|
|
6
|
-
import { t as Subscriber } from "../Subscriber-
|
|
7
|
-
import { t as KyselyDatabase } from "../kysely-
|
|
8
|
-
import {
|
|
4
|
+
import { c as EndpointSchemas, i as Endpoint } from "../Endpoint-DtI7heFm.mjs";
|
|
5
|
+
import { t as Queue } from "../Queue-YmvN2vEP.mjs";
|
|
6
|
+
import { t as Subscriber } from "../Subscriber-BjHYe5hK.mjs";
|
|
7
|
+
import { t as KyselyDatabase } from "../kysely-BJ8IQ_1P.mjs";
|
|
8
|
+
import { r as Fake } from "../external-api-DS3mujT5.mjs";
|
|
9
9
|
import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
|
|
10
|
+
import { Kysely } from "kysely";
|
|
10
11
|
import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
|
|
11
12
|
import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
|
|
12
13
|
import { TEST_CONTEXT_HEADER } from "@geekmidas/testkit/context";
|
|
13
14
|
import { HttpHandler } from "msw";
|
|
14
15
|
import { Browser } from "@geekmidas/testkit/browser";
|
|
16
|
+
import { FakerFactory } from "@geekmidas/testkit/faker";
|
|
15
17
|
import { Mailbox } from "@geekmidas/testkit/mailbox";
|
|
16
18
|
import { Logger } from "@geekmidas/logger";
|
|
17
19
|
import { ComposableStandardSchema, InferComposableStandardSchema, InferStandardSchema } from "@geekmidas/schema";
|
|
@@ -56,16 +58,16 @@ interface CreateMswHandlersOptions {
|
|
|
56
58
|
}
|
|
57
59
|
/**
|
|
58
60
|
* Options for registering a per-test context.
|
|
59
|
-
* Follows the same pattern as TestRequestAdaptor — services, database
|
|
60
|
-
*
|
|
61
|
+
* Follows the same pattern as TestRequestAdaptor — services, database and
|
|
62
|
+
* auditorStorage are provided explicitly. A topic is a service under its own
|
|
63
|
+
* name, so a recorder in `services` (`{ users: recorder }`) captures what an
|
|
64
|
+
* endpoint publishes to it.
|
|
61
65
|
*/
|
|
62
66
|
interface RegisterContextOptions {
|
|
63
67
|
/** Service instances keyed by serviceName */
|
|
64
68
|
services?: Record<string, unknown>;
|
|
65
69
|
/** Database instance — required when endpoints use .database() */
|
|
66
70
|
database?: unknown;
|
|
67
|
-
/** Event publisher service definition */
|
|
68
|
-
publisher?: Service;
|
|
69
71
|
/** Audit storage instance — required when endpoints use .auditor() */
|
|
70
72
|
auditorStorage?: unknown;
|
|
71
73
|
}
|
|
@@ -101,13 +103,13 @@ type TestHttpResponse<TBody = any> = {
|
|
|
101
103
|
status: number;
|
|
102
104
|
headers: Record<string, string | string[]>;
|
|
103
105
|
};
|
|
104
|
-
export declare class TestEndpointAdaptor<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown,
|
|
106
|
+
export declare class TestEndpointAdaptor<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string> {
|
|
105
107
|
private readonly endpoint;
|
|
106
108
|
private serviceDiscovery;
|
|
107
|
-
static getDefaultServiceDiscover<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown,
|
|
108
|
-
constructor(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession,
|
|
109
|
-
fullRequest(ctx: TestRequestAdaptor<TInput, TServices,
|
|
110
|
-
request(ctx: TestRequestAdaptor<TInput, TServices,
|
|
109
|
+
static getDefaultServiceDiscover<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string>(_endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>): any;
|
|
110
|
+
constructor(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>, serviceDiscovery?: ServiceDiscovery<any>);
|
|
111
|
+
fullRequest(ctx: TestRequestAdaptor<TInput, TServices, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<TestHttpResponse<InferStandardSchema<TOutSchema>>>;
|
|
112
|
+
request(ctx: TestRequestAdaptor<TInput, TServices, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<InferStandardSchema<TOutSchema>>;
|
|
111
113
|
}
|
|
112
114
|
/**
|
|
113
115
|
* Conditional audit storage requirement - required when TAuditStorage is configured
|
|
@@ -123,24 +125,22 @@ type DatabaseRequirement<TDatabase = undefined> = TDatabase extends undefined ?
|
|
|
123
125
|
/** Database instance - required when endpoint uses .database() */
|
|
124
126
|
database: TDatabase;
|
|
125
127
|
};
|
|
126
|
-
type TestRequestAdaptor<TInput extends EndpointSchemas = {}, TServices extends Service[] = [],
|
|
128
|
+
type TestRequestAdaptor<TInput extends EndpointSchemas = {}, TServices extends Service[] = [], TAuditStorage extends AuditStorage | undefined = undefined, _TAuditStorageServiceName extends string = string, TDatabase = undefined, _TDatabaseServiceName extends string = string> = {
|
|
127
129
|
services: ServiceRecord<TServices>;
|
|
128
130
|
headers: Record<string, string>;
|
|
129
|
-
publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
130
131
|
} & InferComposableStandardSchema<TInput> & AuditStorageRequirement<TAuditStorage> & DatabaseRequirement<TDatabase>;
|
|
131
132
|
//#endregion
|
|
132
133
|
//#region src/functions/TestFunctionAdaptor.d.ts
|
|
133
|
-
export declare class TestFunctionAdaptor<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger,
|
|
134
|
+
export declare class TestFunctionAdaptor<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> {
|
|
134
135
|
private readonly fn;
|
|
135
136
|
private serviceDiscovery;
|
|
136
|
-
static getDefaultServiceDiscovery<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger,
|
|
137
|
-
constructor(fn: Function<TInput, TServices, TLogger, TOutSchema,
|
|
138
|
-
invoke(ctx: TestFunctionRequest<TInput, TServices,
|
|
137
|
+
static getDefaultServiceDiscovery<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>>(_fn: Function<TInput, TServices, TLogger, TOutSchema, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>): any;
|
|
138
|
+
constructor(fn: Function<TInput, TServices, TLogger, TOutSchema, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>, serviceDiscovery?: ServiceDiscovery<any>);
|
|
139
|
+
invoke(ctx: TestFunctionRequest<TInput, TServices, TDatabase, TAuditAction>): Promise<InferStandardSchema<TOutSchema>>;
|
|
139
140
|
}
|
|
140
|
-
type TestFunctionRequest<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [],
|
|
141
|
+
type TestFunctionRequest<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TDatabase = undefined, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> = {
|
|
141
142
|
input: InferComposableStandardSchema<TInput>;
|
|
142
143
|
services: ServiceRecord<TServices>;
|
|
143
|
-
publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
144
144
|
db?: TDatabase;
|
|
145
145
|
auditor?: Auditor<TAuditAction>;
|
|
146
146
|
} & InferComposableStandardSchema<{
|
|
@@ -173,11 +173,11 @@ type TestQueueRequest<TMessage extends StandardSchemaV1 = StandardSchemaV1, TSer
|
|
|
173
173
|
type ExtractEventPayloads<TPublisher extends EventPublisher<any> | undefined, TEventTypes extends any[]> = TPublisher extends EventPublisher<any> ? Extract<ExtractPublisherMessage<TPublisher>, {
|
|
174
174
|
type: TEventTypes[number];
|
|
175
175
|
}> : never;
|
|
176
|
-
export declare class TestSubscriberAdaptor<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
176
|
+
export declare class TestSubscriberAdaptor<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][]> {
|
|
177
177
|
private readonly subscriber;
|
|
178
178
|
private serviceDiscovery;
|
|
179
179
|
static getDefaultServiceDiscovery(): any;
|
|
180
|
-
constructor(subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher,
|
|
180
|
+
constructor(subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TSubscribedEvents>, serviceDiscovery?: ServiceDiscovery<any>);
|
|
181
181
|
invoke(request: TestSubscriberRequest<TEventPublisher, TSubscribedEvents, TServices>): Promise<InferStandardSchema<OutSchema>>;
|
|
182
182
|
private filterEvents;
|
|
183
183
|
}
|
|
@@ -262,6 +262,12 @@ interface FeatureTestOptions<TBrowser extends Browser, TFactories extends Factor
|
|
|
262
262
|
* back with everything else, and seen by the endpoints it calls.
|
|
263
263
|
*/
|
|
264
264
|
factories?: TFactories;
|
|
265
|
+
/**
|
|
266
|
+
* Each external API's fake — the default export of `test/fakes/<id>.ts`,
|
|
267
|
+
* which the generated harness imports — keyed by the API's construct id.
|
|
268
|
+
* An app fake is served at the URL the test stage resolved for it.
|
|
269
|
+
*/
|
|
270
|
+
fakes?: Readonly<Record<string, Fake>>;
|
|
265
271
|
}
|
|
266
272
|
/** Each database's schema, keyed by its service name. */
|
|
267
273
|
type DatabaseSchemas = Record<string, unknown>;
|
|
@@ -299,6 +305,12 @@ interface FeatureContext<TBrowser extends Browser, TDatabases extends DatabaseSc
|
|
|
299
305
|
* returns.
|
|
300
306
|
*/
|
|
301
307
|
factories: TestFactories<TFactories>;
|
|
308
|
+
/**
|
|
309
|
+
* Testkit's faker — the one factories are handed — seeded from this test's
|
|
310
|
+
* name, so a failing test fails again with the same data, and so a test
|
|
311
|
+
* imports nothing to make some.
|
|
312
|
+
*/
|
|
313
|
+
faker: FakerFactory;
|
|
302
314
|
/** The mail sent to an address during this test, read from Mailpit. */
|
|
303
315
|
mailbox: (address: string) => Mailbox;
|
|
304
316
|
/**
|
|
@@ -314,11 +326,11 @@ interface FeatureContext<TBrowser extends Browser, TDatabases extends DatabaseSc
|
|
|
314
326
|
* with this test's services: its databases resolve to this test's
|
|
315
327
|
* transactions, as an endpoint's do.
|
|
316
328
|
*/
|
|
317
|
-
subscriber: <S extends Subscriber<any, any, any, any, any
|
|
329
|
+
subscriber: <S extends Subscriber<any, any, any, any, any>>(subscriber: S) => SubscriberAdaptorOf<S>;
|
|
318
330
|
/** A queue's worker, run on its own with this test's services. */
|
|
319
331
|
queue: <Q extends Queue<any, any, any, any>>(queue: Q) => QueueAdaptorOf<Q>;
|
|
320
332
|
}
|
|
321
|
-
type SubscriberAdaptorOf<S> = S extends Subscriber<infer TServices, infer TLogger, infer OutSchema, infer TEventPublisher, infer
|
|
333
|
+
type SubscriberAdaptorOf<S> = S extends Subscriber<infer TServices, infer TLogger, infer OutSchema, infer TEventPublisher, infer TSubscribedEvents> ? TestSubscriberAdaptor<TServices, TLogger, OutSchema, TEventPublisher, TSubscribedEvents> : never;
|
|
322
334
|
type QueueAdaptorOf<Q> = Q extends Queue<infer TName, infer TMessage, infer TServices, infer TLogger> ? TestQueueAdaptor<TName, TMessage, TServices, TLogger> : never;
|
|
323
335
|
/** The schema a database construct was declared with — what `db` is typed by. */
|
|
324
336
|
type DatabaseOf<C> = C extends KyselyDatabase<infer DB, any> ? DB : unknown;
|
|
@@ -358,7 +370,7 @@ interface MagicLinkAuthClient<TSession> {
|
|
|
358
370
|
* — and cleared again after the test, like any address a test reads. Returns
|
|
359
371
|
* the session the auth server then reports, as better-auth hands it back.
|
|
360
372
|
*/
|
|
361
|
-
export declare function signInWithMagicLink<TSession>(browser: Browser, auth: MagicLinkAuthClient<TSession>, email
|
|
373
|
+
export declare function signInWithMagicLink<TSession>(browser: Browser, auth: MagicLinkAuthClient<TSession>, email?: string): Promise<TSession>;
|
|
362
374
|
/** `browser.signIn` finished without a session. */
|
|
363
375
|
export declare class SignInFailed extends Error {
|
|
364
376
|
readonly email: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.mts","names":["TestBrowser"],"sources":["../../src/endpoints/MswEndpointAdaptor.ts","../../src/endpoints/TestEndpointAdaptor.ts","../../src/functions/TestFunctionAdaptor.ts","../../src/queue/TestQueueAdaptor.ts","../../src/subscribers/TestSubscriberAdaptor.ts","../../src/testing/manifest.ts","../../src/testing/featureTest.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"testing.d.mts","names":["TestBrowser"],"sources":["../../src/endpoints/MswEndpointAdaptor.ts","../../src/endpoints/TestEndpointAdaptor.ts","../../src/functions/TestFunctionAdaptor.ts","../../src/queue/TestQueueAdaptor.ts","../../src/subscribers/TestSubscriberAdaptor.ts","../../src/testing/manifest.ts","../../src/testing/featureTest.ts"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { BetterAuth } from "../auth.mjs";
|
|
2
|
-
import { t as FunctionBuilder } from "../functions-
|
|
3
|
-
import { n as ResponseBuilder, t as Endpoint } from "../Endpoint-
|
|
2
|
+
import { a as publishEvents, i as publishConstructEvents, t as FunctionBuilder } from "../functions-DCIfCRR-.mjs";
|
|
3
|
+
import { n as ResponseBuilder, t as Endpoint } from "../Endpoint-CQAeh1Rh.mjs";
|
|
4
|
+
import { t as Queue } from "../Queue-C1uDgjxt.mjs";
|
|
4
5
|
import { Email } from "../email.mjs";
|
|
5
6
|
import { KyselyDatabase } from "../database/kysely.mjs";
|
|
6
|
-
import { c as createObjectHeaders,
|
|
7
|
-
import { t as
|
|
8
|
-
import { t as
|
|
9
|
-
import { t as HonoEndpoint } from "../HonoEndpointAdaptor-CiqAZ5Mt.mjs";
|
|
7
|
+
import { c as createObjectHeaders, r as createCookieHeaderAccessor } from "../lazyAccessors-CFanua0O.mjs";
|
|
8
|
+
import { t as Topic } from "../Topic-DOw051ch.mjs";
|
|
9
|
+
import { t as HonoEndpoint } from "../HonoEndpointAdaptor-Aui-x9Lg.mjs";
|
|
10
10
|
import { n as executeWithAuditTransaction } from "../processAudits-BpRlPQMW.mjs";
|
|
11
11
|
import { provideKey } from "@geekmidas/manifest";
|
|
12
12
|
import { ForbiddenError } from "@geekmidas/errors";
|
|
@@ -18,6 +18,7 @@ import { TEST_CONTEXT_HEADER, currentTestContext, installContextFetch, runAsServ
|
|
|
18
18
|
import { http } from "msw";
|
|
19
19
|
import { randomUUID } from "node:crypto";
|
|
20
20
|
import { Browser } from "@geekmidas/testkit/browser";
|
|
21
|
+
import { faker } from "@geekmidas/testkit/faker";
|
|
21
22
|
import { createMailbox } from "@geekmidas/testkit/mailbox";
|
|
22
23
|
import { TransactionRegistry } from "@geekmidas/testkit/transactions";
|
|
23
24
|
import { setupServer } from "msw/node";
|
|
@@ -73,7 +74,6 @@ function createMswHandlers(endpoints, options) {
|
|
|
73
74
|
break;
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
|
-
if (ctxOptions.publisher) serviceDefs.push(ctxOptions.publisher);
|
|
77
77
|
if (ctxOptions.auditorStorage !== void 0) {
|
|
78
78
|
for (const endpoint of endpoints) if (endpoint.auditorStorageService) {
|
|
79
79
|
serviceDefs.push({
|
|
@@ -256,8 +256,7 @@ var TestEndpointAdaptor = class TestEndpointAdaptor {
|
|
|
256
256
|
});
|
|
257
257
|
}
|
|
258
258
|
}, { db: rawDb });
|
|
259
|
-
|
|
260
|
-
await publishConstructEvents(this.endpoint, output, this.serviceDiscovery);
|
|
259
|
+
await publishConstructEvents(this.endpoint, output, this.serviceDiscovery, this.endpoint.logger, ctx.services);
|
|
261
260
|
const headers = { ...metadata.headers || {} };
|
|
262
261
|
if (metadata.cookies && metadata.cookies.size > 0) {
|
|
263
262
|
const setCookieValues = [];
|
|
@@ -333,7 +332,7 @@ var TestFunctionAdaptor = class TestFunctionAdaptor {
|
|
|
333
332
|
await auditor.flush();
|
|
334
333
|
}
|
|
335
334
|
}
|
|
336
|
-
await publishEvents(logger, this.serviceDiscovery, this.fn.events, output,
|
|
335
|
+
await publishEvents(logger, this.serviceDiscovery, this.fn.events, output, services);
|
|
337
336
|
return output;
|
|
338
337
|
});
|
|
339
338
|
}
|
|
@@ -410,7 +409,6 @@ var TestSubscriberAdaptor = class TestSubscriberAdaptor {
|
|
|
410
409
|
if (validationResult.issues) throw new Error("Subscriber output validation failed");
|
|
411
410
|
output = validationResult.value;
|
|
412
411
|
}
|
|
413
|
-
await publishEvents(logger, this.serviceDiscovery, this.subscriber.events, output, this.subscriber.publisherService);
|
|
414
412
|
return output;
|
|
415
413
|
});
|
|
416
414
|
}
|
|
@@ -512,7 +510,7 @@ function featureTest(options = {}) {
|
|
|
512
510
|
owned = ownDatabases(app, manifest);
|
|
513
511
|
factoryDatabases = databasesFor(options.factories ?? {}, owned);
|
|
514
512
|
for (const database of app.databases) bindToTests(database);
|
|
515
|
-
network = setupServer(...surfaceHandlers(app.endpoints, manifest.env), ...app.auths.map((auth) => authHandler(auth, manifest.env, app.envParser)));
|
|
513
|
+
network = setupServer(...surfaceHandlers(app.endpoints, manifest.env), ...app.auths.map((auth) => authHandler(auth, manifest.env, app.envParser)), ...Object.entries(options.fakes ?? {}).flatMap(([id, fake]) => fakeHandler(id, fake, manifest.env)));
|
|
516
514
|
network.listen({ onUnhandledRequest(request, print) {
|
|
517
515
|
if (isLocal(new URL(request.url))) return;
|
|
518
516
|
print.error();
|
|
@@ -523,8 +521,9 @@ function featureTest(options = {}) {
|
|
|
523
521
|
restoreFetch();
|
|
524
522
|
network?.close();
|
|
525
523
|
});
|
|
526
|
-
const run = (fn) => async () => {
|
|
524
|
+
const run = (name, fn) => async () => {
|
|
527
525
|
const id = randomUUID();
|
|
526
|
+
faker.seed(seedOf(name));
|
|
528
527
|
const state = {
|
|
529
528
|
transactions: new TransactionRegistry(),
|
|
530
529
|
discovery: new ServiceDiscovery(app.envParser),
|
|
@@ -565,6 +564,7 @@ function featureTest(options = {}) {
|
|
|
565
564
|
}
|
|
566
565
|
return factory;
|
|
567
566
|
} },
|
|
567
|
+
faker,
|
|
568
568
|
mailbox: (address) => {
|
|
569
569
|
if (!state.mailbox) throw new NoInbox();
|
|
570
570
|
return state.mailbox(address);
|
|
@@ -582,12 +582,21 @@ function featureTest(options = {}) {
|
|
|
582
582
|
await Promise.all([state.transactions.rollbackAll(), ...[...state.addresses].map((address) => app.readMail?.(address).clear())]);
|
|
583
583
|
}
|
|
584
584
|
};
|
|
585
|
-
const it = ((name, fn, timeout) => test(name, run(fn), timeout));
|
|
586
|
-
it.only = (name, fn, timeout) => test.only(name, run(fn), timeout);
|
|
587
|
-
it.skip = (name, fn, timeout) => test.skip(name, run(fn), timeout);
|
|
585
|
+
const it = ((name, fn, timeout) => test(name, run(name, fn), timeout));
|
|
586
|
+
it.only = (name, fn, timeout) => test.only(name, run(name, fn), timeout);
|
|
587
|
+
it.skip = (name, fn, timeout) => test.skip(name, run(name, fn), timeout);
|
|
588
588
|
return it;
|
|
589
589
|
}
|
|
590
590
|
/**
|
|
591
|
+
* A test's faker seed, from its name: the same test draws the same data on
|
|
592
|
+
* every run, and two tests draw different data.
|
|
593
|
+
*/
|
|
594
|
+
function seedOf(name) {
|
|
595
|
+
let hash = 0;
|
|
596
|
+
for (const char of name) hash = Math.imul(hash, 31) + char.charCodeAt(0) | 0;
|
|
597
|
+
return hash >>> 0;
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
591
600
|
* Import what the manifest points at.
|
|
592
601
|
*
|
|
593
602
|
* The same modules the app runs, so a construct here *is* the app's construct —
|
|
@@ -615,21 +624,22 @@ async function load(manifest, modules) {
|
|
|
615
624
|
};
|
|
616
625
|
}
|
|
617
626
|
/**
|
|
618
|
-
* A publisher that records rather than sends, under
|
|
619
|
-
*
|
|
627
|
+
* A publisher that records rather than sends, under the name a topic or queue
|
|
628
|
+
* is injected by — `services.users` — which is also the one `.event(users, …)`
|
|
629
|
+
* publishes through.
|
|
620
630
|
*/
|
|
621
631
|
function recorders(channels, state) {
|
|
622
|
-
return channels.
|
|
632
|
+
return channels.map((channel) => {
|
|
623
633
|
const publisher = { async publish(messages) {
|
|
624
634
|
state.published.set(channel.id, [...state.published.get(channel.id) ?? [], ...messages.map(({ type, payload }) => ({
|
|
625
635
|
type,
|
|
626
636
|
payload
|
|
627
637
|
}))]);
|
|
628
638
|
} };
|
|
629
|
-
return
|
|
630
|
-
serviceName,
|
|
639
|
+
return {
|
|
640
|
+
serviceName: channel.service.serviceName,
|
|
631
641
|
register: () => publisher
|
|
632
|
-
}
|
|
642
|
+
};
|
|
633
643
|
});
|
|
634
644
|
}
|
|
635
645
|
/**
|
|
@@ -698,6 +708,20 @@ function surfaceHandlers(endpoints, env) {
|
|
|
698
708
|
}));
|
|
699
709
|
});
|
|
700
710
|
}
|
|
711
|
+
/**
|
|
712
|
+
* An external API's app fake, answering at the URL the test stage resolved for
|
|
713
|
+
* it — so a handler that calls Polar calls the fake, and the test sets up
|
|
714
|
+
* nothing.
|
|
715
|
+
*
|
|
716
|
+
* Not per test, unlike a surface: a fake stands in for somebody else's server,
|
|
717
|
+
* which no test's transaction reaches. An image fake has no handler here — its
|
|
718
|
+
* container answers on localhost, which is let through.
|
|
719
|
+
*/
|
|
720
|
+
function fakeHandler(id, fake, env) {
|
|
721
|
+
const base = env[provideKey(id, "url")];
|
|
722
|
+
if (fake.kind !== "app" || !base) return [];
|
|
723
|
+
return [http.all(`${trim(base)}/*`, ({ request }) => fake.handler.fetch(request))];
|
|
724
|
+
}
|
|
701
725
|
/** An auth server, served at its URL, on the transaction of the test that asked. */
|
|
702
726
|
function authHandler(auth, env, envParser) {
|
|
703
727
|
const base = trim(env[provideKey(auth.id, "url")] ?? "");
|
|
@@ -735,7 +759,7 @@ function isLocal(url) {
|
|
|
735
759
|
* — and cleared again after the test, like any address a test reads. Returns
|
|
736
760
|
* the session the auth server then reports, as better-auth hands it back.
|
|
737
761
|
*/
|
|
738
|
-
async function signInWithMagicLink(browser, auth, email) {
|
|
762
|
+
async function signInWithMagicLink(browser, auth, email = freshAddress()) {
|
|
739
763
|
const context = currentTestContext();
|
|
740
764
|
const state = context && contexts.get(context.id);
|
|
741
765
|
if (!state) throw new UnknownTestContext("signIn", context?.id);
|
|
@@ -751,6 +775,18 @@ async function signInWithMagicLink(browser, auth, email) {
|
|
|
751
775
|
if (!data) throw new SignInFailed(email, "the auth server reported no session after the link was opened");
|
|
752
776
|
return data;
|
|
753
777
|
}
|
|
778
|
+
/**
|
|
779
|
+
* An address nobody else signs in as — what `browser.signIn()` uses when the
|
|
780
|
+
* test does not care who it is.
|
|
781
|
+
*
|
|
782
|
+
* Unique rather than only seeded: tests in other files run at the same time,
|
|
783
|
+
* against the same Mailpit and the same unique columns, and a seeded address
|
|
784
|
+
* repeats wherever two tests share a name. The readable half is the seeded
|
|
785
|
+
* faker's, so a failure still names somebody.
|
|
786
|
+
*/
|
|
787
|
+
function freshAddress() {
|
|
788
|
+
return `${faker.internet.username().toLowerCase().replace(/[^a-z0-9]/g, "")}.${randomUUID().slice(0, 8)}@example.test`;
|
|
789
|
+
}
|
|
754
790
|
/** `browser.signIn` finished without a session. */
|
|
755
791
|
var SignInFailed = class extends Error {
|
|
756
792
|
email;
|