@beignet/core 0.0.2 → 0.0.4
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/CHANGELOG.md +173 -0
- package/README.md +821 -30
- package/dist/application/index.d.ts +28 -2
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +140 -12
- package/dist/application/index.js.map +1 -1
- package/dist/client/client.d.ts +2 -2
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +136 -48
- package/dist/client/client.js.map +1 -1
- package/dist/client/error-messages.d.ts +14 -0
- package/dist/client/error-messages.d.ts.map +1 -0
- package/dist/client/error-messages.js +23 -0
- package/dist/client/error-messages.js.map +1 -0
- package/dist/client/index.d.ts +8 -4
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +6 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/types.d.ts +35 -5
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client-only.d.ts +8 -0
- package/dist/client-only.d.ts.map +1 -0
- package/dist/client-only.js +8 -0
- package/dist/client-only.js.map +1 -0
- package/dist/config/index.d.ts +5 -5
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/index.js.map +1 -1
- package/dist/contracts/catalog-errors.d.ts +27 -0
- package/dist/contracts/catalog-errors.d.ts.map +1 -0
- package/dist/contracts/catalog-errors.js +69 -0
- package/dist/contracts/catalog-errors.js.map +1 -0
- package/dist/contracts/contract-builder.d.ts +15 -12
- package/dist/contracts/contract-builder.d.ts.map +1 -1
- package/dist/contracts/contract-builder.js +15 -41
- package/dist/contracts/contract-builder.js.map +1 -1
- package/dist/contracts/contract-group.d.ts +11 -8
- package/dist/contracts/contract-group.d.ts.map +1 -1
- package/dist/contracts/contract-group.js +13 -40
- package/dist/contracts/contract-group.js.map +1 -1
- package/dist/contracts/contract-like.d.ts +1 -1
- package/dist/contracts/contract-like.d.ts.map +1 -1
- package/dist/contracts/index.d.ts +13 -9
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +9 -5
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/openapi-meta.d.ts +48 -0
- package/dist/contracts/openapi-meta.d.ts.map +1 -1
- package/dist/contracts/openapi-meta.js +3 -0
- package/dist/contracts/openapi-meta.js.map +1 -1
- package/dist/contracts/path-template.d.ts +1 -1
- package/dist/contracts/path-template.js +2 -2
- package/dist/contracts/path-template.js.map +1 -1
- package/dist/contracts/schema-shape.d.ts +37 -0
- package/dist/contracts/schema-shape.d.ts.map +1 -0
- package/dist/contracts/schema-shape.js +61 -0
- package/dist/contracts/schema-shape.js.map +1 -0
- package/dist/contracts/success-status.d.ts +32 -0
- package/dist/contracts/success-status.d.ts.map +1 -0
- package/dist/contracts/success-status.js +18 -0
- package/dist/contracts/success-status.js.map +1 -0
- package/dist/contracts/types.d.ts +25 -5
- package/dist/contracts/types.d.ts.map +1 -1
- package/dist/contracts/types.js.map +1 -1
- package/dist/contracts/utils.d.ts +1 -1
- package/dist/contracts/utils.d.ts.map +1 -1
- package/dist/contracts/utils.js +1 -1
- package/dist/contracts/utils.js.map +1 -1
- package/dist/domain/events.d.ts +1 -1
- package/dist/domain/events.d.ts.map +1 -1
- package/dist/domain/events.js +1 -1
- package/dist/domain/events.js.map +1 -1
- package/dist/domain/index.d.ts +3 -3
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +3 -3
- package/dist/domain/index.js.map +1 -1
- package/dist/errors/catalog.d.ts +9 -1
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/catalog.js +7 -1
- package/dist/errors/catalog.js.map +1 -1
- package/dist/errors/http.d.ts +10 -0
- package/dist/errors/http.d.ts.map +1 -1
- package/dist/errors/http.js +11 -1
- package/dist/errors/http.js.map +1 -1
- package/dist/errors/index.d.ts +4 -4
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +4 -4
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/response.d.ts +4 -1
- package/dist/errors/response.d.ts.map +1 -1
- package/dist/errors/response.js.map +1 -1
- package/dist/events/index.d.ts +10 -12
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +10 -10
- package/dist/events/index.js.map +1 -1
- package/dist/idempotency/index.d.ts +5 -3
- package/dist/idempotency/index.d.ts.map +1 -1
- package/dist/idempotency/index.js.map +1 -1
- package/dist/jobs/index.d.ts +148 -16
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +174 -14
- package/dist/jobs/index.js.map +1 -1
- package/dist/notifications/index.d.ts +14 -16
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +14 -14
- package/dist/notifications/index.js.map +1 -1
- package/dist/openapi/index.d.ts +8 -3
- package/dist/openapi/index.d.ts.map +1 -1
- package/dist/openapi/index.js +41 -29
- package/dist/openapi/index.js.map +1 -1
- package/dist/openapi/schema-introspector.d.ts +37 -0
- package/dist/openapi/schema-introspector.d.ts.map +1 -1
- package/dist/openapi/schema-introspector.js +23 -17
- package/dist/openapi/schema-introspector.js.map +1 -1
- package/dist/outbox/index.d.ts +18 -4
- package/dist/outbox/index.d.ts.map +1 -1
- package/dist/outbox/index.js +104 -4
- package/dist/outbox/index.js.map +1 -1
- package/dist/ports/audit.d.ts +56 -10
- package/dist/ports/audit.d.ts.map +1 -1
- package/dist/ports/audit.js +71 -3
- package/dist/ports/audit.js.map +1 -1
- package/dist/ports/auth.d.ts +92 -0
- package/dist/ports/auth.d.ts.map +1 -1
- package/dist/ports/auth.js +92 -0
- package/dist/ports/auth.js.map +1 -1
- package/dist/ports/events.d.ts +2 -2
- package/dist/ports/events.d.ts.map +1 -1
- package/dist/ports/index.d.ts +62 -33
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +28 -34
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/policy.d.ts +32 -3
- package/dist/ports/policy.d.ts.map +1 -1
- package/dist/ports/policy.js +13 -2
- package/dist/ports/policy.js.map +1 -1
- package/dist/ports/testing.d.ts +1030 -2
- package/dist/ports/testing.d.ts.map +1 -1
- package/dist/ports/testing.js +1031 -1
- package/dist/ports/testing.js.map +1 -1
- package/dist/ports/unbound.d.ts +21 -0
- package/dist/ports/unbound.d.ts.map +1 -0
- package/dist/ports/unbound.js +57 -0
- package/dist/ports/unbound.js.map +1 -0
- package/dist/ports/unit-of-work.d.ts +1 -1
- package/dist/ports/unit-of-work.d.ts.map +1 -1
- package/dist/ports/unit-of-work.js +1 -1
- package/dist/ports/unit-of-work.js.map +1 -1
- package/dist/providers/index.d.ts +3 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/instrumentation.d.ts +46 -5
- package/dist/providers/instrumentation.d.ts.map +1 -1
- package/dist/providers/instrumentation.js +25 -6
- package/dist/providers/instrumentation.js.map +1 -1
- package/dist/providers/metadata.d.ts +39 -0
- package/dist/providers/metadata.d.ts.map +1 -0
- package/dist/providers/metadata.js +169 -0
- package/dist/providers/metadata.js.map +1 -0
- package/dist/providers/provider.d.ts +114 -9
- package/dist/providers/provider.d.ts.map +1 -1
- package/dist/providers/provider.js +3 -20
- package/dist/providers/provider.js.map +1 -1
- package/dist/schedules/index.d.ts +94 -13
- package/dist/schedules/index.d.ts.map +1 -1
- package/dist/schedules/index.js +66 -12
- package/dist/schedules/index.js.map +1 -1
- package/dist/server/audit-context.d.ts +29 -0
- package/dist/server/audit-context.d.ts.map +1 -0
- package/dist/server/audit-context.js +44 -0
- package/dist/server/audit-context.js.map +1 -0
- package/dist/server/context.d.ts +141 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +39 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/contract-like.d.ts +1 -1
- package/dist/server/contract-like.d.ts.map +1 -1
- package/dist/server/contract-like.js +1 -1
- package/dist/server/contract-like.js.map +1 -1
- package/dist/server/health.d.ts +2 -2
- package/dist/server/health.d.ts.map +1 -1
- package/dist/server/hooks/auth.d.ts +89 -65
- package/dist/server/hooks/auth.d.ts.map +1 -1
- package/dist/server/hooks/auth.js +84 -55
- package/dist/server/hooks/auth.js.map +1 -1
- package/dist/server/hooks/cors.d.ts +1 -1
- package/dist/server/hooks/cors.d.ts.map +1 -1
- package/dist/server/hooks/errors.d.ts +2 -2
- package/dist/server/hooks/errors.d.ts.map +1 -1
- package/dist/server/hooks/errors.js +2 -2
- package/dist/server/hooks/errors.js.map +1 -1
- package/dist/server/hooks/idempotency.d.ts +78 -0
- package/dist/server/hooks/idempotency.d.ts.map +1 -0
- package/dist/server/hooks/idempotency.js +154 -0
- package/dist/server/hooks/idempotency.js.map +1 -0
- package/dist/server/hooks/index.d.ts +8 -7
- package/dist/server/hooks/index.d.ts.map +1 -1
- package/dist/server/hooks/index.js +6 -5
- package/dist/server/hooks/index.js.map +1 -1
- package/dist/server/hooks/logging.d.ts +2 -2
- package/dist/server/hooks/logging.d.ts.map +1 -1
- package/dist/server/hooks/logging.js +1 -1
- package/dist/server/hooks/logging.js.map +1 -1
- package/dist/server/hooks/rate-limit.d.ts +25 -7
- package/dist/server/hooks/rate-limit.d.ts.map +1 -1
- package/dist/server/hooks/rate-limit.js +47 -12
- package/dist/server/hooks/rate-limit.js.map +1 -1
- package/dist/server/hooks.d.ts +1 -1
- package/dist/server/hooks.d.ts.map +1 -1
- package/dist/server/hooks.js +1 -1
- package/dist/server/hooks.js.map +1 -1
- package/dist/server/http.d.ts +84 -6
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/index.d.ts +36 -12
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +24 -8
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +108 -0
- package/dist/server/instrumentation.d.ts.map +1 -0
- package/dist/server/instrumentation.js +297 -0
- package/dist/server/instrumentation.js.map +1 -0
- package/dist/server/openapi.d.ts +3 -3
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/openapi.js +1 -1
- package/dist/server/openapi.js.map +1 -1
- package/dist/server/providers/index.d.ts +3 -3
- package/dist/server/providers/index.d.ts.map +1 -1
- package/dist/server/providers/index.js +3 -3
- package/dist/server/providers/index.js.map +1 -1
- package/dist/server/providers/loadProviderConfig.d.ts +2 -2
- package/dist/server/providers/loadProviderConfig.d.ts.map +1 -1
- package/dist/server/providers/loadProviderConfig.js +2 -2
- package/dist/server/providers/loadProviderConfig.js.map +1 -1
- package/dist/server/request-context.d.ts +67 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +79 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/server-context.d.ts +38 -0
- package/dist/server/server-context.d.ts.map +1 -0
- package/dist/server/server-context.js +38 -0
- package/dist/server/server-context.js.map +1 -0
- package/dist/server/server.d.ts +148 -35
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +482 -145
- package/dist/server/server.js.map +1 -1
- package/dist/server/types.d.ts +2 -2
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +2 -2
- package/dist/server/types.js.map +1 -1
- package/dist/server/use-case-route.d.ts +263 -0
- package/dist/server/use-case-route.d.ts.map +1 -0
- package/dist/server/use-case-route.js +77 -0
- package/dist/server/use-case-route.js.map +1 -0
- package/dist/server-only.d.ts +8 -0
- package/dist/server-only.d.ts.map +1 -0
- package/dist/server-only.js +8 -0
- package/dist/server-only.js.map +1 -0
- package/dist/tasks/index.d.ts +139 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +98 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/testing/index.d.ts +611 -5
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +434 -4
- package/dist/testing/index.js.map +1 -1
- package/dist/tracing/index.d.ts +89 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +101 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/uploads/client.d.ts +278 -0
- package/dist/uploads/client.d.ts.map +1 -0
- package/dist/uploads/client.js +428 -0
- package/dist/uploads/client.js.map +1 -0
- package/dist/uploads/index.d.ts +361 -0
- package/dist/uploads/index.d.ts.map +1 -0
- package/dist/uploads/index.js +543 -0
- package/dist/uploads/index.js.map +1 -0
- package/package.json +34 -3
- package/src/application/index.ts +193 -10
- package/src/client/client.ts +148 -150
- package/src/client/error-messages.ts +35 -0
- package/src/client/index.ts +12 -4
- package/src/client/types.ts +44 -5
- package/src/client-only.ts +7 -0
- package/src/config/index.ts +6 -6
- package/src/contracts/catalog-errors.ts +115 -0
- package/src/contracts/contract-builder.ts +39 -76
- package/src/contracts/contract-group.ts +33 -68
- package/src/contracts/contract-like.ts +1 -1
- package/src/contracts/index.ts +24 -11
- package/src/contracts/openapi-meta.ts +55 -0
- package/src/contracts/path-template.ts +2 -2
- package/src/contracts/schema-shape.ts +75 -0
- package/src/contracts/success-status.ts +68 -0
- package/src/contracts/types.ts +32 -5
- package/src/contracts/utils.ts +5 -2
- package/src/domain/events.ts +6 -2
- package/src/domain/index.ts +3 -3
- package/src/errors/catalog.ts +9 -1
- package/src/errors/http.ts +11 -1
- package/src/errors/index.ts +4 -4
- package/src/errors/response.ts +4 -1
- package/src/events/index.ts +12 -26
- package/src/idempotency/index.ts +5 -3
- package/src/jobs/index.ts +340 -29
- package/src/notifications/index.ts +17 -27
- package/src/openapi/index.ts +73 -38
- package/src/openapi/schema-introspector.ts +68 -17
- package/src/outbox/index.ts +151 -6
- package/src/ports/audit.ts +120 -11
- package/src/ports/auth.ts +132 -0
- package/src/ports/events.ts +2 -2
- package/src/ports/index.ts +104 -35
- package/src/ports/policy.ts +50 -3
- package/src/ports/testing.ts +2220 -33
- package/src/ports/unbound.ts +64 -0
- package/src/ports/unit-of-work.ts +6 -2
- package/src/providers/index.ts +16 -3
- package/src/providers/instrumentation.ts +93 -8
- package/src/providers/metadata.ts +234 -0
- package/src/providers/provider.ts +168 -9
- package/src/schedules/index.ts +173 -23
- package/src/server/audit-context.ts +45 -0
- package/src/server/context.ts +224 -0
- package/src/server/contract-like.ts +1 -1
- package/src/server/health.ts +2 -2
- package/src/server/hooks/auth.ts +175 -158
- package/src/server/hooks/cors.ts +1 -1
- package/src/server/hooks/errors.ts +7 -4
- package/src/server/hooks/idempotency.ts +263 -0
- package/src/server/hooks/index.ts +15 -12
- package/src/server/hooks/logging.ts +3 -3
- package/src/server/hooks/rate-limit.ts +85 -17
- package/src/server/hooks.ts +1 -1
- package/src/server/http.ts +112 -6
- package/src/server/index.ts +63 -12
- package/src/server/instrumentation.ts +470 -0
- package/src/server/openapi.ts +4 -4
- package/src/server/providers/index.ts +6 -3
- package/src/server/providers/loadProviderConfig.ts +4 -4
- package/src/server/request-context.ts +116 -0
- package/src/server/server-context.ts +44 -0
- package/src/server/server.ts +1045 -229
- package/src/server/types.ts +2 -2
- package/src/server/use-case-route.ts +430 -0
- package/src/server-only.ts +7 -0
- package/src/tasks/index.ts +275 -0
- package/src/testing/index.ts +1153 -6
- package/src/tracing/index.ts +176 -0
- package/src/uploads/client.ts +861 -0
- package/src/uploads/index.ts +1071 -0
- package/dist/ports/mailer.d.ts +0 -6
- package/dist/ports/mailer.d.ts.map +0 -1
- package/dist/ports/mailer.js +0 -2
- package/dist/ports/mailer.js.map +0 -1
- package/dist/ports/schedules.d.ts +0 -9
- package/dist/ports/schedules.d.ts.map +0 -1
- package/dist/ports/schedules.js +0 -2
- package/dist/ports/schedules.js.map +0 -1
package/src/server/index.ts
CHANGED
|
@@ -13,40 +13,91 @@ export type {
|
|
|
13
13
|
InferOutput,
|
|
14
14
|
StandardSchema,
|
|
15
15
|
StandardSchemaV1,
|
|
16
|
-
} from "../contracts";
|
|
16
|
+
} from "../contracts/index.js";
|
|
17
17
|
/**
|
|
18
18
|
* Application error base class re-exported for server users.
|
|
19
19
|
*/
|
|
20
|
-
export { AppError } from "../errors";
|
|
20
|
+
export { AppError } from "../errors/index.js";
|
|
21
21
|
/**
|
|
22
22
|
* Any-ports helper type re-exported for server users.
|
|
23
23
|
*/
|
|
24
|
-
export type { AnyPorts } from "../ports";
|
|
24
|
+
export type { AnyPorts } from "../ports/index.js";
|
|
25
25
|
/**
|
|
26
26
|
* Provider type re-exported for server users.
|
|
27
27
|
*/
|
|
28
|
-
export type { ServiceProvider } from "../providers";
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
export
|
|
33
|
-
|
|
28
|
+
export type { ServiceProvider } from "../providers/index.js";
|
|
29
|
+
/**
|
|
30
|
+
* Ambient audit enrichment for app audit ports.
|
|
31
|
+
*/
|
|
32
|
+
export { createAmbientAuditLog } from "./audit-context.js";
|
|
33
|
+
/**
|
|
34
|
+
* Server context blueprint types.
|
|
35
|
+
*/
|
|
36
|
+
export type {
|
|
37
|
+
ContextSeed,
|
|
38
|
+
RequestContextArgs,
|
|
39
|
+
ServerContextConfig,
|
|
40
|
+
ServerContextOptions,
|
|
41
|
+
ServiceContextArgs,
|
|
42
|
+
ServiceContextInputArgs,
|
|
43
|
+
} from "./context.js";
|
|
44
|
+
export * from "./health.js";
|
|
45
|
+
export * from "./hooks.js";
|
|
46
|
+
export * from "./http.js";
|
|
47
|
+
/**
|
|
48
|
+
* Server-owned request instrumentation types.
|
|
49
|
+
*/
|
|
50
|
+
export type {
|
|
51
|
+
RequestCorrelation,
|
|
52
|
+
ServerInstrumentationOptions,
|
|
53
|
+
} from "./instrumentation.js";
|
|
54
|
+
export * from "./openapi.js";
|
|
55
|
+
export * from "./providers/index.js";
|
|
56
|
+
/**
|
|
57
|
+
* Ambient request correlation context shared with instrumentation sinks.
|
|
58
|
+
*/
|
|
59
|
+
export {
|
|
60
|
+
type ActiveRequestContext,
|
|
61
|
+
clearActiveRequestContext,
|
|
62
|
+
enterActiveRequestContext,
|
|
63
|
+
getActiveRequestContext,
|
|
64
|
+
inheritActiveRequestContext,
|
|
65
|
+
} from "./request-context.js";
|
|
34
66
|
/**
|
|
35
67
|
* Server configuration and route types.
|
|
36
68
|
*/
|
|
37
69
|
export type {
|
|
38
70
|
CreateServerOptions,
|
|
71
|
+
HandlerRouteDef,
|
|
39
72
|
RouteDef,
|
|
40
73
|
RouteGroup,
|
|
41
74
|
ServerInstance,
|
|
42
|
-
} from "./server";
|
|
75
|
+
} from "./server.js";
|
|
43
76
|
/**
|
|
44
77
|
* Server runtime helpers.
|
|
45
78
|
*/
|
|
46
79
|
export {
|
|
47
80
|
contractsFromRoutes,
|
|
48
81
|
createServer,
|
|
82
|
+
defineRoute,
|
|
49
83
|
defineRouteGroup,
|
|
50
84
|
defineRoutes,
|
|
51
|
-
} from "./server";
|
|
52
|
-
|
|
85
|
+
} from "./server.js";
|
|
86
|
+
/**
|
|
87
|
+
* Server context blueprint declaration helper.
|
|
88
|
+
*/
|
|
89
|
+
export { defineServerContext } from "./server-context.js";
|
|
90
|
+
export * from "./types.js";
|
|
91
|
+
/**
|
|
92
|
+
* Contract-aware route binder types and helpers.
|
|
93
|
+
*/
|
|
94
|
+
export {
|
|
95
|
+
type AnyUseCaseLike,
|
|
96
|
+
type AnyUseCaseRouteDef,
|
|
97
|
+
type BinderStatusOption,
|
|
98
|
+
defaultBinderInput,
|
|
99
|
+
type UseCaseFitsRoute,
|
|
100
|
+
type UseCaseRouteDef,
|
|
101
|
+
type UseCaseRouteInput,
|
|
102
|
+
type UseCaseRouteInputParts,
|
|
103
|
+
} from "./use-case-route.js";
|
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BEIGNET_ERROR_OWNER_HEADER,
|
|
3
|
+
type HttpContractConfig,
|
|
4
|
+
} from "../contracts/index.js";
|
|
5
|
+
import type { AnyPorts } from "../ports/index.js";
|
|
6
|
+
import { redactValue } from "../ports/redaction.js";
|
|
7
|
+
import {
|
|
8
|
+
type ProviderInstrumentationEventInput,
|
|
9
|
+
type ProviderInstrumentationPort,
|
|
10
|
+
resolveProviderInstrumentationPort,
|
|
11
|
+
} from "../providers/instrumentation.js";
|
|
12
|
+
import {
|
|
13
|
+
createTraceContext,
|
|
14
|
+
parseTraceparent,
|
|
15
|
+
type TraceContext,
|
|
16
|
+
} from "../tracing/index.js";
|
|
17
|
+
import type { HttpRequestLike, HttpResponseLike, ServerHook } from "./http.js";
|
|
18
|
+
import {
|
|
19
|
+
clearActiveRequestContext,
|
|
20
|
+
enterActiveRequestContext,
|
|
21
|
+
readContextActor,
|
|
22
|
+
readContextTenant,
|
|
23
|
+
} from "./request-context.js";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Options for the server-owned request instrumentation pipeline.
|
|
27
|
+
*
|
|
28
|
+
* The server resolves request IDs and W3C trace context before user hooks and
|
|
29
|
+
* context creation run, writes them to response headers, and records request
|
|
30
|
+
* and error events into the resolved provider instrumentation port
|
|
31
|
+
* (`ports.instrumentation`, then `ports.devtools`) after responses are sent.
|
|
32
|
+
*
|
|
33
|
+
* Pass `instrumentation: false` to `createServer(...)` to disable headers and
|
|
34
|
+
* event recording entirely.
|
|
35
|
+
*/
|
|
36
|
+
export interface ServerInstrumentationOptions<Ctx = unknown> {
|
|
37
|
+
/**
|
|
38
|
+
* Request/response header used for the request correlation ID.
|
|
39
|
+
*
|
|
40
|
+
* Pass `false` to avoid reading or writing a request ID header.
|
|
41
|
+
*
|
|
42
|
+
* @default "x-request-id"
|
|
43
|
+
*/
|
|
44
|
+
requestIdHeader?: string | false;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* W3C trace context header used to correlate events with distributed
|
|
48
|
+
* traces.
|
|
49
|
+
*
|
|
50
|
+
* Pass `false` to avoid reading or writing a trace context header.
|
|
51
|
+
*
|
|
52
|
+
* @default "traceparent"
|
|
53
|
+
*/
|
|
54
|
+
traceContextHeader?: string | false;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Request path prefixes that should not enter ambient correlation or record
|
|
58
|
+
* events. Response headers are still written.
|
|
59
|
+
*
|
|
60
|
+
* Defaults to the devtools dashboard prefix so its polling traffic does not
|
|
61
|
+
* fill the event timeline.
|
|
62
|
+
*
|
|
63
|
+
* @default ["/api/devtools"]
|
|
64
|
+
*/
|
|
65
|
+
ignorePaths?: readonly string[];
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Apply a custom redactor to events produced by the server. Sink-level
|
|
69
|
+
* redaction (such as the devtools redactor) still runs when events are
|
|
70
|
+
* stored.
|
|
71
|
+
*/
|
|
72
|
+
redact?: (
|
|
73
|
+
event: ProviderInstrumentationEventInput,
|
|
74
|
+
) => ProviderInstrumentationEventInput;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Decide whether to capture a completed request event.
|
|
78
|
+
*/
|
|
79
|
+
shouldCapture?: (args: {
|
|
80
|
+
req: HttpRequestLike;
|
|
81
|
+
ctx?: Ctx;
|
|
82
|
+
contract: HttpContractConfig;
|
|
83
|
+
response: HttpResponseLike;
|
|
84
|
+
error?: unknown;
|
|
85
|
+
}) => boolean;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Correlation values resolved by the server for one request or service
|
|
90
|
+
* context.
|
|
91
|
+
*/
|
|
92
|
+
export interface RequestCorrelation {
|
|
93
|
+
/**
|
|
94
|
+
* Request correlation ID.
|
|
95
|
+
*/
|
|
96
|
+
requestId: string;
|
|
97
|
+
/**
|
|
98
|
+
* W3C trace context.
|
|
99
|
+
*/
|
|
100
|
+
trace: TraceContext;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Internal runtime created by `createServer(...)` from its `instrumentation`
|
|
105
|
+
* option.
|
|
106
|
+
*/
|
|
107
|
+
export interface ServerInstrumentationRuntime<Ctx> {
|
|
108
|
+
/**
|
|
109
|
+
* Resolve the instrumentation sink once final ports are known.
|
|
110
|
+
*/
|
|
111
|
+
attachPorts(ports: AnyPorts): void;
|
|
112
|
+
/**
|
|
113
|
+
* Resolve (and cache per request) the request ID and trace context.
|
|
114
|
+
*/
|
|
115
|
+
prepareRequest(req: HttpRequestLike): RequestCorrelation;
|
|
116
|
+
/**
|
|
117
|
+
* Create fresh correlation values for a service context.
|
|
118
|
+
*/
|
|
119
|
+
createServiceCorrelation(): RequestCorrelation;
|
|
120
|
+
/**
|
|
121
|
+
* Pipeline hook installed before user hooks, when instrumentation is
|
|
122
|
+
* enabled.
|
|
123
|
+
*/
|
|
124
|
+
hook?: ServerHook<Ctx, AnyPorts>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
type TraceContextFields = {
|
|
128
|
+
traceId?: string;
|
|
129
|
+
spanId?: string;
|
|
130
|
+
parentSpanId?: string;
|
|
131
|
+
traceparent?: string;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
function getContextRequestId(ctx: unknown): string | undefined {
|
|
135
|
+
if (!ctx || typeof ctx !== "object") return undefined;
|
|
136
|
+
const requestId = (ctx as { requestId?: unknown }).requestId;
|
|
137
|
+
return typeof requestId === "string" ? requestId : undefined;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function getContextTraceContext(ctx: unknown): TraceContextFields | undefined {
|
|
141
|
+
if (!ctx || typeof ctx !== "object") return undefined;
|
|
142
|
+
const context = ctx as TraceContextFields;
|
|
143
|
+
if (
|
|
144
|
+
!context.traceId &&
|
|
145
|
+
!context.spanId &&
|
|
146
|
+
!context.parentSpanId &&
|
|
147
|
+
!context.traceparent
|
|
148
|
+
) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
traceId: context.traceId,
|
|
153
|
+
spanId: context.spanId,
|
|
154
|
+
parentSpanId: context.parentSpanId,
|
|
155
|
+
traceparent: context.traceparent,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function getErrorMessage(error: unknown): string {
|
|
160
|
+
if (error instanceof Error) return error.message;
|
|
161
|
+
if (typeof error === "string") return error;
|
|
162
|
+
return "Unknown error";
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function getErrorStack(error: unknown): string | undefined {
|
|
166
|
+
return error instanceof Error ? error.stack : undefined;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function createRequestId(): string {
|
|
170
|
+
if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
|
|
171
|
+
return crypto.randomUUID();
|
|
172
|
+
}
|
|
173
|
+
return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function getPathname(req: HttpRequestLike): string {
|
|
177
|
+
try {
|
|
178
|
+
return new URL(req.url).pathname;
|
|
179
|
+
} catch {
|
|
180
|
+
return req.url;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function isIgnoredPath(
|
|
185
|
+
pathname: string,
|
|
186
|
+
ignorePaths: readonly string[],
|
|
187
|
+
): boolean {
|
|
188
|
+
return ignorePaths.some((ignorePath) => {
|
|
189
|
+
const normalized = ignorePath.replace(/\/+$/, "");
|
|
190
|
+
return pathname === normalized || pathname.startsWith(`${normalized}/`);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function requestHeadersToRecord(headers: Headers): Record<string, string> {
|
|
195
|
+
const record: Record<string, string> = {};
|
|
196
|
+
headers.forEach((value, key) => {
|
|
197
|
+
record[key] = value;
|
|
198
|
+
});
|
|
199
|
+
return record;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function getResponseHeader(
|
|
203
|
+
headers: Record<string, string> | undefined,
|
|
204
|
+
name: string,
|
|
205
|
+
): string | undefined {
|
|
206
|
+
if (!headers) return undefined;
|
|
207
|
+
const direct = headers[name];
|
|
208
|
+
if (direct !== undefined) return direct;
|
|
209
|
+
const normalized = name.toLowerCase();
|
|
210
|
+
const entry = Object.entries(headers).find(
|
|
211
|
+
([key]) => key.toLowerCase() === normalized,
|
|
212
|
+
);
|
|
213
|
+
return entry?.[1];
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function getResponseOwner(
|
|
217
|
+
response: HttpResponseLike,
|
|
218
|
+
): "route" | "framework" | "transport" | "unknown" {
|
|
219
|
+
return getResponseHeader(response.headers, BEIGNET_ERROR_OWNER_HEADER) ===
|
|
220
|
+
"framework"
|
|
221
|
+
? "framework"
|
|
222
|
+
: "route";
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function isWatcherEnabled(
|
|
226
|
+
port: ProviderInstrumentationPort,
|
|
227
|
+
name: string,
|
|
228
|
+
): boolean {
|
|
229
|
+
return port.isWatcherEnabled?.(name) ?? true;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Create the server-owned instrumentation runtime for `createServer(...)`.
|
|
234
|
+
*
|
|
235
|
+
* Correlation values (request ID and trace context) are always resolved so
|
|
236
|
+
* context factories receive stable `requestId`/`trace` arguments, even when
|
|
237
|
+
* instrumentation is disabled. Headers and event recording only run when
|
|
238
|
+
* instrumentation is enabled.
|
|
239
|
+
*/
|
|
240
|
+
export function createServerInstrumentation<Ctx>(
|
|
241
|
+
options: ServerInstrumentationOptions<Ctx> | false | undefined,
|
|
242
|
+
): ServerInstrumentationRuntime<Ctx> {
|
|
243
|
+
const enabled = options !== false;
|
|
244
|
+
const resolvedOptions =
|
|
245
|
+
options === false || options === undefined ? {} : options;
|
|
246
|
+
const requestIdHeader = resolvedOptions.requestIdHeader ?? "x-request-id";
|
|
247
|
+
const traceContextHeader =
|
|
248
|
+
resolvedOptions.traceContextHeader ?? "traceparent";
|
|
249
|
+
const ignorePaths = resolvedOptions.ignorePaths ?? ["/api/devtools"];
|
|
250
|
+
|
|
251
|
+
let port: ProviderInstrumentationPort | undefined;
|
|
252
|
+
const correlations = new WeakMap<HttpRequestLike, RequestCorrelation>();
|
|
253
|
+
|
|
254
|
+
const prepareRequest = (req: HttpRequestLike): RequestCorrelation => {
|
|
255
|
+
const cached = correlations.get(req);
|
|
256
|
+
if (cached) return cached;
|
|
257
|
+
|
|
258
|
+
const headerRequestId =
|
|
259
|
+
requestIdHeader === false
|
|
260
|
+
? undefined
|
|
261
|
+
: (req.headers.get(requestIdHeader) ?? undefined);
|
|
262
|
+
const headerTraceparent =
|
|
263
|
+
traceContextHeader === false
|
|
264
|
+
? undefined
|
|
265
|
+
: (req.headers.get(traceContextHeader) ?? undefined);
|
|
266
|
+
|
|
267
|
+
const correlation: RequestCorrelation = {
|
|
268
|
+
requestId: headerRequestId ?? createRequestId(),
|
|
269
|
+
trace: createTraceContext({
|
|
270
|
+
traceparent: parseTraceparent(headerTraceparent)?.traceparent,
|
|
271
|
+
}),
|
|
272
|
+
};
|
|
273
|
+
correlations.set(req, correlation);
|
|
274
|
+
return correlation;
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
const resolveRequestId = (args: {
|
|
278
|
+
req: HttpRequestLike;
|
|
279
|
+
ctx?: unknown;
|
|
280
|
+
}): string =>
|
|
281
|
+
getContextRequestId(args.ctx) ?? prepareRequest(args.req).requestId;
|
|
282
|
+
|
|
283
|
+
const resolveTraceContext = (args: {
|
|
284
|
+
req: HttpRequestLike;
|
|
285
|
+
ctx?: unknown;
|
|
286
|
+
}): TraceContext => {
|
|
287
|
+
const contextTrace = getContextTraceContext(args.ctx);
|
|
288
|
+
if (contextTrace) {
|
|
289
|
+
return createTraceContext(contextTrace);
|
|
290
|
+
}
|
|
291
|
+
return prepareRequest(args.req).trace;
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
const record = (event: ProviderInstrumentationEventInput) => {
|
|
295
|
+
if (!port) return;
|
|
296
|
+
|
|
297
|
+
let prepared = redactValue(event);
|
|
298
|
+
if (resolvedOptions.redact) {
|
|
299
|
+
try {
|
|
300
|
+
prepared = resolvedOptions.redact(prepared);
|
|
301
|
+
} catch (error) {
|
|
302
|
+
try {
|
|
303
|
+
port.record({
|
|
304
|
+
type: "error",
|
|
305
|
+
message: "Server instrumentation redactor failed",
|
|
306
|
+
owner: "framework",
|
|
307
|
+
details: {
|
|
308
|
+
message: getErrorMessage(error),
|
|
309
|
+
},
|
|
310
|
+
});
|
|
311
|
+
} catch {
|
|
312
|
+
// Instrumentation sinks must never affect responses.
|
|
313
|
+
}
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
try {
|
|
319
|
+
port.record(prepared);
|
|
320
|
+
} catch {
|
|
321
|
+
// Instrumentation sinks must never affect responses.
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const enterAmbientContext = (args: {
|
|
326
|
+
req: HttpRequestLike;
|
|
327
|
+
ctx?: unknown;
|
|
328
|
+
}) => {
|
|
329
|
+
if (isIgnoredPath(getPathname(args.req), ignorePaths)) return;
|
|
330
|
+
const trace = resolveTraceContext(args);
|
|
331
|
+
enterActiveRequestContext({
|
|
332
|
+
requestId: resolveRequestId(args),
|
|
333
|
+
traceId: trace.traceId,
|
|
334
|
+
spanId: trace.spanId,
|
|
335
|
+
parentSpanId: trace.parentSpanId,
|
|
336
|
+
traceparent: trace.traceparent,
|
|
337
|
+
actor: readContextActor(args.ctx),
|
|
338
|
+
tenant: readContextTenant(args.ctx),
|
|
339
|
+
});
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
const hook: ServerHook<Ctx, AnyPorts> = {
|
|
343
|
+
name: "beignet.instrumentation",
|
|
344
|
+
onRequest: ({ req }) => {
|
|
345
|
+
enterAmbientContext({ req });
|
|
346
|
+
return undefined;
|
|
347
|
+
},
|
|
348
|
+
beforeHandle: ({ req, ctx }) => {
|
|
349
|
+
// Re-enter with context values so app-owned overrides win for ambient
|
|
350
|
+
// correlation inheritance.
|
|
351
|
+
enterAmbientContext({ req, ctx });
|
|
352
|
+
return undefined;
|
|
353
|
+
},
|
|
354
|
+
beforeSend: ({ req, ctx, response }) => {
|
|
355
|
+
if (requestIdHeader === false && traceContextHeader === false) {
|
|
356
|
+
return undefined;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const requestId = resolveRequestId({ req, ctx });
|
|
360
|
+
const trace = resolveTraceContext({ req, ctx });
|
|
361
|
+
return {
|
|
362
|
+
...response,
|
|
363
|
+
headers: {
|
|
364
|
+
...response.headers,
|
|
365
|
+
...(requestIdHeader === false
|
|
366
|
+
? {}
|
|
367
|
+
: { [requestIdHeader]: requestId }),
|
|
368
|
+
...(traceContextHeader === false
|
|
369
|
+
? {}
|
|
370
|
+
: { [traceContextHeader]: trace.traceparent }),
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
},
|
|
374
|
+
afterSend: ({ req, ctx, contract, response, error, durationMs }) => {
|
|
375
|
+
try {
|
|
376
|
+
if (!port) return;
|
|
377
|
+
|
|
378
|
+
const path = getPathname(req);
|
|
379
|
+
if (isIgnoredPath(path, ignorePaths)) return;
|
|
380
|
+
|
|
381
|
+
const shouldCaptureRequest = isWatcherEnabled(port, "requests");
|
|
382
|
+
const shouldCaptureError =
|
|
383
|
+
Boolean(error) && isWatcherEnabled(port, "errors");
|
|
384
|
+
if (!shouldCaptureRequest && !shouldCaptureError) return;
|
|
385
|
+
|
|
386
|
+
if (
|
|
387
|
+
resolvedOptions.shouldCapture &&
|
|
388
|
+
!resolvedOptions.shouldCapture({
|
|
389
|
+
req,
|
|
390
|
+
ctx: ctx as Ctx | undefined,
|
|
391
|
+
contract,
|
|
392
|
+
response,
|
|
393
|
+
error,
|
|
394
|
+
})
|
|
395
|
+
) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const requestId = resolveRequestId({ req, ctx });
|
|
400
|
+
const trace = resolveTraceContext({ req, ctx });
|
|
401
|
+
const responseOwner = getResponseOwner(response);
|
|
402
|
+
|
|
403
|
+
if (shouldCaptureRequest) {
|
|
404
|
+
record({
|
|
405
|
+
type: "request",
|
|
406
|
+
requestId,
|
|
407
|
+
traceId: trace.traceId,
|
|
408
|
+
spanId: trace.spanId,
|
|
409
|
+
parentSpanId: trace.parentSpanId,
|
|
410
|
+
traceparent: trace.traceparent,
|
|
411
|
+
method: req.method,
|
|
412
|
+
path,
|
|
413
|
+
contractName: contract.name,
|
|
414
|
+
responseOwner,
|
|
415
|
+
status: response.status,
|
|
416
|
+
durationMs,
|
|
417
|
+
details: {
|
|
418
|
+
headers: requestHeadersToRecord(req.headers),
|
|
419
|
+
route: {
|
|
420
|
+
contractName: contract.name,
|
|
421
|
+
method: req.method,
|
|
422
|
+
path,
|
|
423
|
+
},
|
|
424
|
+
response: {
|
|
425
|
+
owner: responseOwner,
|
|
426
|
+
status: response.status,
|
|
427
|
+
},
|
|
428
|
+
hookPhases: [
|
|
429
|
+
"onRequest",
|
|
430
|
+
"beforeHandle",
|
|
431
|
+
"beforeSend",
|
|
432
|
+
"afterSend",
|
|
433
|
+
],
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
if (error && shouldCaptureError) {
|
|
439
|
+
record({
|
|
440
|
+
type: "error",
|
|
441
|
+
requestId,
|
|
442
|
+
traceId: trace.traceId,
|
|
443
|
+
spanId: trace.spanId,
|
|
444
|
+
parentSpanId: trace.parentSpanId,
|
|
445
|
+
traceparent: trace.traceparent,
|
|
446
|
+
message: getErrorMessage(error),
|
|
447
|
+
stack: getErrorStack(error),
|
|
448
|
+
contractName: contract.name,
|
|
449
|
+
owner: responseOwner === "framework" ? "framework" : "route",
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
} finally {
|
|
453
|
+
clearActiveRequestContext();
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
return {
|
|
459
|
+
attachPorts(ports) {
|
|
460
|
+
if (!enabled) return;
|
|
461
|
+
port = resolveProviderInstrumentationPort(ports);
|
|
462
|
+
},
|
|
463
|
+
prepareRequest,
|
|
464
|
+
createServiceCorrelation: () => ({
|
|
465
|
+
requestId: createRequestId(),
|
|
466
|
+
trace: createTraceContext(),
|
|
467
|
+
}),
|
|
468
|
+
hook: enabled ? hook : undefined,
|
|
469
|
+
};
|
|
470
|
+
}
|
package/src/server/openapi.ts
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* OpenAPI helpers for the Beignet server runtime.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { HttpContractConfig } from "../contracts";
|
|
7
|
-
import type { AppEnvironment } from "./health";
|
|
8
|
-
import type { HttpRequestLike, HttpResponseLike } from "./types";
|
|
6
|
+
import type { HttpContractConfig } from "../contracts/index.js";
|
|
7
|
+
import type { AppEnvironment } from "./health.js";
|
|
8
|
+
import type { HttpRequestLike, HttpResponseLike } from "./types.js";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* OpenAPI route handler configuration.
|
|
@@ -46,7 +46,7 @@ export function createOpenAPIHandler(
|
|
|
46
46
|
if (!cachedSpec) {
|
|
47
47
|
try {
|
|
48
48
|
// Dynamic import to avoid hard dependency
|
|
49
|
-
const { contractsToOpenAPI } = await import("../openapi");
|
|
49
|
+
const { contractsToOpenAPI } = await import("../openapi/index.js");
|
|
50
50
|
cachedSpec = contractsToOpenAPI(contracts, {
|
|
51
51
|
title: openapiConfig?.title ?? "Beignet API",
|
|
52
52
|
version: openapiConfig?.version ?? "1.0.0",
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
export { ConfigValidationError, readEnv } from "../../config";
|
|
2
|
-
export { SchemaValidationError } from "../../errors";
|
|
3
|
-
export {
|
|
1
|
+
export { ConfigValidationError, readEnv } from "../../config/index.js";
|
|
2
|
+
export { SchemaValidationError } from "../../errors/index.js";
|
|
3
|
+
export {
|
|
4
|
+
loadProviderConfig,
|
|
5
|
+
parseStandardSchema,
|
|
6
|
+
} from "./loadProviderConfig.js";
|
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
ConfigValidationError,
|
|
4
4
|
parseStandardSchemaAsync,
|
|
5
5
|
readEnv,
|
|
6
|
-
} from "../../config";
|
|
7
|
-
import { SchemaValidationError } from "../../errors";
|
|
8
|
-
import type { AnyPorts } from "../../ports";
|
|
9
|
-
import type { ServiceProvider } from "../../providers";
|
|
6
|
+
} from "../../config/index.js";
|
|
7
|
+
import { SchemaValidationError } from "../../errors/index.js";
|
|
8
|
+
import type { AnyPorts } from "../../ports/index.js";
|
|
9
|
+
import type { ServiceProvider } from "../../providers/index.js";
|
|
10
10
|
|
|
11
11
|
type ProviderConfigDef<Schema extends StandardSchemaV1<unknown, unknown>> = {
|
|
12
12
|
schema: Schema;
|