@beignet/core 0.0.1
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 +5 -0
- package/README.md +288 -0
- package/dist/application/index.d.ts +260 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +324 -0
- package/dist/application/index.js.map +1 -0
- package/dist/client/client.d.ts +241 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +531 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +139 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config/index.d.ts +122 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +216 -0
- package/dist/config/index.js.map +1 -0
- package/dist/contracts/contract-builder.d.ts +121 -0
- package/dist/contracts/contract-builder.d.ts.map +1 -0
- package/dist/contracts/contract-builder.js +346 -0
- package/dist/contracts/contract-builder.js.map +1 -0
- package/dist/contracts/contract-group.d.ts +106 -0
- package/dist/contracts/contract-group.d.ts.map +1 -0
- package/dist/contracts/contract-group.js +240 -0
- package/dist/contracts/contract-group.js.map +1 -0
- package/dist/contracts/contract-like.d.ts +21 -0
- package/dist/contracts/contract-like.d.ts.map +1 -0
- package/dist/contracts/contract-like.js +9 -0
- package/dist/contracts/contract-like.js.map +1 -0
- package/dist/contracts/index.d.ts +15 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +11 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/openapi-meta.d.ts +23 -0
- package/dist/contracts/openapi-meta.d.ts.map +1 -0
- package/dist/contracts/openapi-meta.js +2 -0
- package/dist/contracts/openapi-meta.js.map +1 -0
- package/dist/contracts/path-template.d.ts +17 -0
- package/dist/contracts/path-template.d.ts.map +1 -0
- package/dist/contracts/path-template.js +50 -0
- package/dist/contracts/path-template.js.map +1 -0
- package/dist/contracts/rate-limit.d.ts +50 -0
- package/dist/contracts/rate-limit.d.ts.map +1 -0
- package/dist/contracts/rate-limit.js +2 -0
- package/dist/contracts/rate-limit.js.map +1 -0
- package/dist/contracts/types.d.ts +97 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +54 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/contracts/utils.d.ts +3 -0
- package/dist/contracts/utils.d.ts.map +1 -0
- package/dist/contracts/utils.js +44 -0
- package/dist/contracts/utils.js.map +1 -0
- package/dist/domain/entity.d.ts +87 -0
- package/dist/domain/entity.d.ts.map +1 -0
- package/dist/domain/entity.js +155 -0
- package/dist/domain/entity.js.map +1 -0
- package/dist/domain/events.d.ts +41 -0
- package/dist/domain/events.d.ts.map +1 -0
- package/dist/domain/events.js +21 -0
- package/dist/domain/events.js.map +1 -0
- package/dist/domain/index.d.ts +14 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +14 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/value-object.d.ts +60 -0
- package/dist/domain/value-object.d.ts.map +1 -0
- package/dist/domain/value-object.js +87 -0
- package/dist/domain/value-object.js.map +1 -0
- package/dist/errors/catalog.d.ts +71 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +71 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/http.d.ts +77 -0
- package/dist/errors/http.d.ts.map +1 -0
- package/dist/errors/http.js +74 -0
- package/dist/errors/http.js.map +1 -0
- package/dist/errors/index.d.ts +10 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +14 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/response.d.ts +26 -0
- package/dist/errors/response.d.ts.map +1 -0
- package/dist/errors/response.js +34 -0
- package/dist/errors/response.js.map +1 -0
- package/dist/errors/validation.d.ts +18 -0
- package/dist/errors/validation.d.ts.map +1 -0
- package/dist/errors/validation.js +21 -0
- package/dist/errors/validation.js.map +1 -0
- package/dist/events/index.d.ts +58 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +102 -0
- package/dist/events/index.js.map +1 -0
- package/dist/jobs/index.d.ts +56 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +89 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/mail/index.d.ts +75 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +84 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/openapi/index.d.ts +207 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +449 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/schema-introspector.d.ts +38 -0
- package/dist/openapi/schema-introspector.d.ts.map +1 -0
- package/dist/openapi/schema-introspector.js +67 -0
- package/dist/openapi/schema-introspector.js.map +1 -0
- package/dist/ports/audit.d.ts +58 -0
- package/dist/ports/audit.d.ts.map +1 -0
- package/dist/ports/audit.js +74 -0
- package/dist/ports/audit.js.map +1 -0
- package/dist/ports/auth.d.ts +23 -0
- package/dist/ports/auth.d.ts.map +1 -0
- package/dist/ports/auth.js +31 -0
- package/dist/ports/auth.js.map +1 -0
- package/dist/ports/builder.d.ts +61 -0
- package/dist/ports/builder.d.ts.map +1 -0
- package/dist/ports/builder.js +48 -0
- package/dist/ports/builder.js.map +1 -0
- package/dist/ports/cache.d.ts +15 -0
- package/dist/ports/cache.d.ts.map +1 -0
- package/dist/ports/cache.js +57 -0
- package/dist/ports/cache.js.map +1 -0
- package/dist/ports/clock.d.ts +10 -0
- package/dist/ports/clock.d.ts.map +1 -0
- package/dist/ports/clock.js +21 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/events.d.ts +71 -0
- package/dist/ports/events.d.ts.map +1 -0
- package/dist/ports/events.js +2 -0
- package/dist/ports/events.js.map +1 -0
- package/dist/ports/id-generator.d.ts +12 -0
- package/dist/ports/id-generator.d.ts.map +1 -0
- package/dist/ports/id-generator.js +22 -0
- package/dist/ports/id-generator.js.map +1 -0
- package/dist/ports/index.d.ts +98 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +67 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/logger.d.ts +22 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/logger.js +34 -0
- package/dist/ports/logger.js.map +1 -0
- package/dist/ports/mailer.d.ts +6 -0
- package/dist/ports/mailer.d.ts.map +1 -0
- package/dist/ports/mailer.js +2 -0
- package/dist/ports/mailer.js.map +1 -0
- package/dist/ports/policy.d.ts +53 -0
- package/dist/ports/policy.d.ts.map +1 -0
- package/dist/ports/policy.js +81 -0
- package/dist/ports/policy.js.map +1 -0
- package/dist/ports/rate-limit.d.ts +41 -0
- package/dist/ports/rate-limit.d.ts.map +1 -0
- package/dist/ports/rate-limit.js +37 -0
- package/dist/ports/rate-limit.js.map +1 -0
- package/dist/ports/redaction.d.ts +26 -0
- package/dist/ports/redaction.d.ts.map +1 -0
- package/dist/ports/redaction.js +126 -0
- package/dist/ports/redaction.js.map +1 -0
- package/dist/ports/schedules.d.ts +9 -0
- package/dist/ports/schedules.d.ts.map +1 -0
- package/dist/ports/schedules.js +2 -0
- package/dist/ports/schedules.js.map +1 -0
- package/dist/ports/storage.d.ts +47 -0
- package/dist/ports/storage.d.ts.map +1 -0
- package/dist/ports/storage.js +185 -0
- package/dist/ports/storage.js.map +1 -0
- package/dist/ports/testing.d.ts +73 -0
- package/dist/ports/testing.d.ts.map +1 -0
- package/dist/ports/testing.js +105 -0
- package/dist/ports/testing.js.map +1 -0
- package/dist/ports/unit-of-work.d.ts +56 -0
- package/dist/ports/unit-of-work.d.ts.map +1 -0
- package/dist/ports/unit-of-work.js +64 -0
- package/dist/ports/unit-of-work.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/instrumentation.d.ts +91 -0
- package/dist/providers/instrumentation.d.ts.map +1 -0
- package/dist/providers/instrumentation.js +93 -0
- package/dist/providers/instrumentation.js.map +1 -0
- package/dist/providers/provider.d.ts +146 -0
- package/dist/providers/provider.d.ts.map +1 -0
- package/dist/providers/provider.js +31 -0
- package/dist/providers/provider.js.map +1 -0
- package/dist/schedules/index.d.ts +105 -0
- package/dist/schedules/index.d.ts.map +1 -0
- package/dist/schedules/index.js +178 -0
- package/dist/schedules/index.js.map +1 -0
- package/dist/server/contract-like.d.ts +5 -0
- package/dist/server/contract-like.d.ts.map +1 -0
- package/dist/server/contract-like.js +5 -0
- package/dist/server/contract-like.js.map +1 -0
- package/dist/server/health.d.ts +41 -0
- package/dist/server/health.d.ts.map +1 -0
- package/dist/server/health.js +46 -0
- package/dist/server/health.js.map +1 -0
- package/dist/server/hooks/auth.d.ts +42 -0
- package/dist/server/hooks/auth.d.ts.map +1 -0
- package/dist/server/hooks/auth.js +61 -0
- package/dist/server/hooks/auth.js.map +1 -0
- package/dist/server/hooks/cors.d.ts +13 -0
- package/dist/server/hooks/cors.d.ts.map +1 -0
- package/dist/server/hooks/cors.js +70 -0
- package/dist/server/hooks/cors.js.map +1 -0
- package/dist/server/hooks/errors.d.ts +66 -0
- package/dist/server/hooks/errors.d.ts.map +1 -0
- package/dist/server/hooks/errors.js +83 -0
- package/dist/server/hooks/errors.js.map +1 -0
- package/dist/server/hooks/index.d.ts +12 -0
- package/dist/server/hooks/index.d.ts.map +1 -0
- package/dist/server/hooks/index.js +12 -0
- package/dist/server/hooks/index.js.map +1 -0
- package/dist/server/hooks/logging.d.ts +33 -0
- package/dist/server/hooks/logging.d.ts.map +1 -0
- package/dist/server/hooks/logging.js +90 -0
- package/dist/server/hooks/logging.js.map +1 -0
- package/dist/server/hooks/rate-limit.d.ts +29 -0
- package/dist/server/hooks/rate-limit.d.ts.map +1 -0
- package/dist/server/hooks/rate-limit.js +93 -0
- package/dist/server/hooks/rate-limit.js.map +1 -0
- package/dist/server/hooks/utils.d.ts +9 -0
- package/dist/server/hooks/utils.d.ts.map +1 -0
- package/dist/server/hooks/utils.js +16 -0
- package/dist/server/hooks/utils.js.map +1 -0
- package/dist/server/hooks.d.ts +2 -0
- package/dist/server/hooks.d.ts.map +1 -0
- package/dist/server/hooks.js +2 -0
- package/dist/server/hooks.js.map +1 -0
- package/dist/server/http.d.ts +124 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +2 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +19 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +15 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/openapi.d.ts +32 -0
- package/dist/server/openapi.d.ts.map +1 -0
- package/dist/server/openapi.js +43 -0
- package/dist/server/openapi.js.map +1 -0
- package/dist/server/providers/index.d.ts +4 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +4 -0
- package/dist/server/providers/index.js.map +1 -0
- package/dist/server/providers/loadProviderConfig.d.ts +7 -0
- package/dist/server/providers/loadProviderConfig.d.ts.map +1 -0
- package/dist/server/providers/loadProviderConfig.js +42 -0
- package/dist/server/providers/loadProviderConfig.js.map +1 -0
- package/dist/server/server.d.ts +86 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +1031 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +3 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/package.json +129 -0
- package/src/application/index.ts +747 -0
- package/src/client/client.ts +1105 -0
- package/src/client/index.ts +45 -0
- package/src/client/types.ts +305 -0
- package/src/config/index.ts +497 -0
- package/src/contracts/contract-builder.ts +583 -0
- package/src/contracts/contract-group.ts +502 -0
- package/src/contracts/contract-like.ts +29 -0
- package/src/contracts/index.ts +53 -0
- package/src/contracts/openapi-meta.ts +22 -0
- package/src/contracts/path-template.ts +91 -0
- package/src/contracts/rate-limit.ts +50 -0
- package/src/contracts/types.ts +207 -0
- package/src/contracts/utils.ts +56 -0
- package/src/domain/entity.ts +256 -0
- package/src/domain/events.ts +52 -0
- package/src/domain/index.ts +18 -0
- package/src/domain/value-object.ts +135 -0
- package/src/errors/catalog.ts +149 -0
- package/src/errors/http.ts +80 -0
- package/src/errors/index.ts +28 -0
- package/src/errors/response.ts +54 -0
- package/src/errors/validation.ts +35 -0
- package/src/events/index.ts +246 -0
- package/src/jobs/index.ts +211 -0
- package/src/mail/index.ts +177 -0
- package/src/openapi/index.ts +865 -0
- package/src/openapi/schema-introspector.ts +107 -0
- package/src/ports/audit.ts +176 -0
- package/src/ports/auth.ts +76 -0
- package/src/ports/builder.ts +97 -0
- package/src/ports/cache.ts +94 -0
- package/src/ports/clock.ts +34 -0
- package/src/ports/events.ts +100 -0
- package/src/ports/id-generator.ts +36 -0
- package/src/ports/index.ts +221 -0
- package/src/ports/logger.ts +67 -0
- package/src/ports/policy.ts +242 -0
- package/src/ports/rate-limit.ts +91 -0
- package/src/ports/redaction.ts +199 -0
- package/src/ports/storage.ts +282 -0
- package/src/ports/testing.ts +234 -0
- package/src/ports/unit-of-work.ts +134 -0
- package/src/providers/index.ts +40 -0
- package/src/providers/instrumentation.ts +248 -0
- package/src/providers/provider.ts +191 -0
- package/src/schedules/index.ts +442 -0
- package/src/server/contract-like.ts +8 -0
- package/src/server/health.ts +82 -0
- package/src/server/hooks/auth.ts +147 -0
- package/src/server/hooks/cors.ts +87 -0
- package/src/server/hooks/errors.ts +126 -0
- package/src/server/hooks/index.ts +43 -0
- package/src/server/hooks/logging.ts +121 -0
- package/src/server/hooks/rate-limit.ts +171 -0
- package/src/server/hooks/utils.ts +16 -0
- package/src/server/hooks.ts +1 -0
- package/src/server/http.ts +189 -0
- package/src/server/index.ts +35 -0
- package/src/server/openapi.ts +72 -0
- package/src/server/providers/index.ts +3 -0
- package/src/server/providers/loadProviderConfig.ts +72 -0
- package/src/server/server.ts +1521 -0
- package/src/server/types.ts +2 -0
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/openapi
|
|
3
|
+
*
|
|
4
|
+
* OpenAPI 3.1 generation from Beignet contracts
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { getContractHeaderSchemas, methodSupportsRequestBody, parsePathTemplate, resolveContract, STANDARD_ERROR_RESPONSE_SCHEMA, } from "../contracts";
|
|
8
|
+
import { createZodIntrospector, } from "./schema-introspector";
|
|
9
|
+
// Re-export the introspector types for consumers who want custom implementations
|
|
10
|
+
export { createZodIntrospector, } from "./schema-introspector";
|
|
11
|
+
/**
|
|
12
|
+
* Convert an array of contracts to an OpenAPI 3.1 document
|
|
13
|
+
*
|
|
14
|
+
* @param contracts - Array of HTTP contracts (ContractBuilder instances or configs)
|
|
15
|
+
* @param options - OpenAPI generation options
|
|
16
|
+
* @returns OpenAPI 3.1 document object
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { contractsToOpenAPI } from "@beignet/core/openapi";
|
|
21
|
+
* import { getTodo, listTodos } from "./contracts";
|
|
22
|
+
*
|
|
23
|
+
* const spec = contractsToOpenAPI(
|
|
24
|
+
* [getTodo, listTodos],
|
|
25
|
+
* {
|
|
26
|
+
* title: "Todo API",
|
|
27
|
+
* version: "1.0.0",
|
|
28
|
+
* servers: [{ url: "https://api.example.com" }],
|
|
29
|
+
* }
|
|
30
|
+
* );
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function contractsToOpenAPI(contracts, options) {
|
|
34
|
+
const paths = {};
|
|
35
|
+
const components = {
|
|
36
|
+
schemas: {},
|
|
37
|
+
securitySchemes: options.securitySchemes ?? {},
|
|
38
|
+
};
|
|
39
|
+
const state = {
|
|
40
|
+
components,
|
|
41
|
+
jsonMediaType: options.jsonMediaType ?? "application/json",
|
|
42
|
+
introspector: options.schemaIntrospector ?? createZodIntrospector(),
|
|
43
|
+
};
|
|
44
|
+
for (const contract of contracts) {
|
|
45
|
+
const config = resolveContract(contract);
|
|
46
|
+
addContractToPaths(config, paths, state);
|
|
47
|
+
}
|
|
48
|
+
const openapi = {
|
|
49
|
+
openapi: "3.1.0",
|
|
50
|
+
info: {
|
|
51
|
+
title: options.title,
|
|
52
|
+
version: options.version,
|
|
53
|
+
description: options.description,
|
|
54
|
+
},
|
|
55
|
+
servers: options.servers,
|
|
56
|
+
paths,
|
|
57
|
+
components: Object.keys(components.schemas ?? {}).length > 0 ||
|
|
58
|
+
Object.keys(components.securitySchemes ?? {}).length > 0
|
|
59
|
+
? components
|
|
60
|
+
: undefined,
|
|
61
|
+
security: options.security,
|
|
62
|
+
};
|
|
63
|
+
return openapi;
|
|
64
|
+
}
|
|
65
|
+
// =============================================================================
|
|
66
|
+
// OpenAPI Generation Helpers
|
|
67
|
+
// =============================================================================
|
|
68
|
+
/**
|
|
69
|
+
* Add a single contract to the paths object
|
|
70
|
+
*/
|
|
71
|
+
function addContractToPaths(contract, paths, state) {
|
|
72
|
+
const pathKey = parsePathTemplate(contract.path).openApiPath;
|
|
73
|
+
if (!paths[pathKey]) {
|
|
74
|
+
paths[pathKey] = {};
|
|
75
|
+
}
|
|
76
|
+
const pathItem = paths[pathKey];
|
|
77
|
+
const meta = contract.metadata?.openapi;
|
|
78
|
+
const operation = {
|
|
79
|
+
operationId: meta?.operationId ?? contract.name,
|
|
80
|
+
summary: meta?.summary,
|
|
81
|
+
description: meta?.description,
|
|
82
|
+
tags: meta?.tags,
|
|
83
|
+
deprecated: meta?.deprecated,
|
|
84
|
+
externalDocs: meta?.externalDocs,
|
|
85
|
+
security: meta?.security,
|
|
86
|
+
parameters: [],
|
|
87
|
+
responses: {},
|
|
88
|
+
};
|
|
89
|
+
addPathParams(contract, operation, state);
|
|
90
|
+
addQueryParams(contract, operation, state);
|
|
91
|
+
addHeaderParams(contract, operation, state);
|
|
92
|
+
addRequestBody(contract, operation, state);
|
|
93
|
+
addResponses(contract, operation, state);
|
|
94
|
+
// Clean up empty parameters array
|
|
95
|
+
if (operation.parameters?.length === 0) {
|
|
96
|
+
delete operation.parameters;
|
|
97
|
+
}
|
|
98
|
+
const methodKey = contract.method.toLowerCase();
|
|
99
|
+
pathItem[methodKey] = operation;
|
|
100
|
+
}
|
|
101
|
+
function addParameter(operation, parameter) {
|
|
102
|
+
if (!operation.parameters) {
|
|
103
|
+
operation.parameters = [];
|
|
104
|
+
}
|
|
105
|
+
const existingIndex = operation.parameters.findIndex((existing) => existing.in === parameter.in && existing.name === parameter.name);
|
|
106
|
+
if (existingIndex >= 0) {
|
|
107
|
+
operation.parameters[existingIndex] = parameter;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
operation.parameters.push(parameter);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Add path parameters from contract to operation.
|
|
114
|
+
*/
|
|
115
|
+
function addPathParams(contract, operation, state) {
|
|
116
|
+
const pathKeys = parsePathTemplate(contract.path).keys;
|
|
117
|
+
if (!contract.pathParams) {
|
|
118
|
+
for (const key of pathKeys) {
|
|
119
|
+
addParameter(operation, {
|
|
120
|
+
name: key,
|
|
121
|
+
in: "path",
|
|
122
|
+
required: true,
|
|
123
|
+
schema: { type: "string" },
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const shape = state.introspector.getShape(contract.pathParams);
|
|
129
|
+
if (!shape) {
|
|
130
|
+
if (pathKeys.length > 0) {
|
|
131
|
+
throw new Error(`Unable to introspect pathParams for contract "${contract.name}" at "${contract.path}". OpenAPI path parameters must match the path template.`);
|
|
132
|
+
}
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const shapeKeys = Object.keys(shape);
|
|
136
|
+
const missingKeys = pathKeys.filter((key) => !shapeKeys.includes(key));
|
|
137
|
+
const extraKeys = shapeKeys.filter((key) => !pathKeys.includes(key));
|
|
138
|
+
if (missingKeys.length > 0 || extraKeys.length > 0) {
|
|
139
|
+
const details = [
|
|
140
|
+
missingKeys.length > 0
|
|
141
|
+
? `missing pathParams keys: ${missingKeys.join(", ")}`
|
|
142
|
+
: undefined,
|
|
143
|
+
extraKeys.length > 0
|
|
144
|
+
? `extra pathParams keys: ${extraKeys.join(", ")}`
|
|
145
|
+
: undefined,
|
|
146
|
+
]
|
|
147
|
+
.filter(Boolean)
|
|
148
|
+
.join("; ");
|
|
149
|
+
throw new Error(`Path parameters for contract "${contract.name}" must match "${contract.path}" (${details}).`);
|
|
150
|
+
}
|
|
151
|
+
for (const key of pathKeys) {
|
|
152
|
+
const field = shape[key];
|
|
153
|
+
const paramSchemaRef = zodToSchemaRef(field, `${contract.name}_path_${key}`, state, "input");
|
|
154
|
+
const description = state.introspector.getDescription(field);
|
|
155
|
+
const param = {
|
|
156
|
+
name: key,
|
|
157
|
+
in: "path",
|
|
158
|
+
required: true,
|
|
159
|
+
schema: paramSchemaRef,
|
|
160
|
+
description,
|
|
161
|
+
};
|
|
162
|
+
addParameter(operation, param);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Add query parameters from contract to operation.
|
|
167
|
+
*/
|
|
168
|
+
function addQueryParams(contract, operation, state) {
|
|
169
|
+
if (!contract.query)
|
|
170
|
+
return;
|
|
171
|
+
const shape = state.introspector.getShape(contract.query);
|
|
172
|
+
if (!shape)
|
|
173
|
+
return;
|
|
174
|
+
for (const key of Object.keys(shape)) {
|
|
175
|
+
const originalField = shape[key];
|
|
176
|
+
const optional = state.introspector.isOptional(originalField);
|
|
177
|
+
let description = state.introspector.getDescription(originalField);
|
|
178
|
+
const field = originalField;
|
|
179
|
+
// If outer optional didn't have description, check inner type
|
|
180
|
+
if (!description && optional) {
|
|
181
|
+
description = state.introspector.getDescription(field);
|
|
182
|
+
}
|
|
183
|
+
const paramSchemaRef = zodToSchemaRef(field, `${contract.name}_query_${key}`, state, "input");
|
|
184
|
+
const param = {
|
|
185
|
+
name: key,
|
|
186
|
+
in: "query",
|
|
187
|
+
required: !optional,
|
|
188
|
+
schema: paramSchemaRef,
|
|
189
|
+
description,
|
|
190
|
+
};
|
|
191
|
+
addParameter(operation, param);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Add header parameters from contract to operation.
|
|
196
|
+
*/
|
|
197
|
+
function addHeaderParams(contract, operation, state) {
|
|
198
|
+
const headerSchemas = getContractHeaderSchemas(contract.headers);
|
|
199
|
+
for (const headerSchema of headerSchemas) {
|
|
200
|
+
const shape = state.introspector.getShape(headerSchema);
|
|
201
|
+
if (!shape)
|
|
202
|
+
continue;
|
|
203
|
+
for (const key of Object.keys(shape)) {
|
|
204
|
+
const originalField = shape[key];
|
|
205
|
+
const optional = state.introspector.isOptional(originalField);
|
|
206
|
+
const description = state.introspector.getDescription(originalField);
|
|
207
|
+
const paramSchemaRef = zodToSchemaRef(originalField, `${contract.name}_header_${key}`, state, "input");
|
|
208
|
+
addParameter(operation, {
|
|
209
|
+
name: key,
|
|
210
|
+
in: "header",
|
|
211
|
+
required: !optional,
|
|
212
|
+
schema: paramSchemaRef,
|
|
213
|
+
description,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Add request body from contract to operation
|
|
220
|
+
*/
|
|
221
|
+
function addRequestBody(contract, operation, state) {
|
|
222
|
+
if (!contract.body)
|
|
223
|
+
return;
|
|
224
|
+
if (!methodSupportsRequestBody(contract.method)) {
|
|
225
|
+
throw new Error(`Request bodies are not supported for ${contract.method} contracts. Use POST, PUT, or PATCH for contract request bodies.`);
|
|
226
|
+
}
|
|
227
|
+
const schemaRef = zodToSchemaRef(contract.body, `${contract.name}_body`, state, "input");
|
|
228
|
+
const description = state.introspector.getDescription(contract.body);
|
|
229
|
+
operation.requestBody = {
|
|
230
|
+
required: true,
|
|
231
|
+
description,
|
|
232
|
+
content: {
|
|
233
|
+
[state.jsonMediaType]: {
|
|
234
|
+
schema: schemaRef,
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Add responses from contract to operation
|
|
241
|
+
*/
|
|
242
|
+
function addResponses(contract, operation, state) {
|
|
243
|
+
// Process all responses (both success and error status codes)
|
|
244
|
+
for (const [statusKey, zodSchema] of Object.entries(contract.responses)) {
|
|
245
|
+
const status = statusKey; // Keep as string
|
|
246
|
+
const catalogErrors = getCatalogErrorsForStatus(contract, Number(status));
|
|
247
|
+
// null schema means void/empty response (e.g. .responses({ 204: null }))
|
|
248
|
+
const hasSchema = zodSchema != null;
|
|
249
|
+
const schemaRef = hasSchema
|
|
250
|
+
? catalogErrors.length > 0 && zodSchema === STANDARD_ERROR_RESPONSE_SCHEMA
|
|
251
|
+
? catalogErrorResponseSchemaRef(catalogErrors, `${contract.name}_response_${status}`, state)
|
|
252
|
+
: schemaToSchemaRef(zodSchema, `${contract.name}_response_${status}`, state, "output")
|
|
253
|
+
: undefined;
|
|
254
|
+
const described = hasSchema
|
|
255
|
+
? state.introspector.getDescription(zodSchema)
|
|
256
|
+
: undefined;
|
|
257
|
+
let description;
|
|
258
|
+
if (described) {
|
|
259
|
+
description = described;
|
|
260
|
+
}
|
|
261
|
+
else if (catalogErrors.length === 1) {
|
|
262
|
+
description = catalogErrors[0].message;
|
|
263
|
+
}
|
|
264
|
+
else if (catalogErrors.length > 1) {
|
|
265
|
+
description = catalogErrors.map((error) => error.message).join("; ");
|
|
266
|
+
}
|
|
267
|
+
else if (status === "200") {
|
|
268
|
+
description = "OK";
|
|
269
|
+
}
|
|
270
|
+
else if (status === "201") {
|
|
271
|
+
description = "Created";
|
|
272
|
+
}
|
|
273
|
+
else if (status === "204") {
|
|
274
|
+
description = "No Content";
|
|
275
|
+
}
|
|
276
|
+
else if (status === "400") {
|
|
277
|
+
description = "Bad Request";
|
|
278
|
+
}
|
|
279
|
+
else if (status === "401") {
|
|
280
|
+
description = "Unauthorized";
|
|
281
|
+
}
|
|
282
|
+
else if (status === "403") {
|
|
283
|
+
description = "Forbidden";
|
|
284
|
+
}
|
|
285
|
+
else if (status === "404") {
|
|
286
|
+
description = "Not Found";
|
|
287
|
+
}
|
|
288
|
+
else if (status === "500") {
|
|
289
|
+
description = "Internal Server Error";
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
description = `HTTP ${status}`;
|
|
293
|
+
}
|
|
294
|
+
const examples = examplesFromCatalogErrors(catalogErrors);
|
|
295
|
+
operation.responses[status] = {
|
|
296
|
+
description,
|
|
297
|
+
content: !hasSchema || status === "204"
|
|
298
|
+
? undefined
|
|
299
|
+
: {
|
|
300
|
+
[state.jsonMediaType]: {
|
|
301
|
+
schema: schemaRef,
|
|
302
|
+
...(examples ? { examples } : {}),
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
function getCatalogErrorsForStatus(contract, status) {
|
|
309
|
+
const errors = contract.metadata?.errors;
|
|
310
|
+
if (typeof errors !== "object" || errors === null)
|
|
311
|
+
return [];
|
|
312
|
+
return Object.entries(errors)
|
|
313
|
+
.map(([key, error]) => {
|
|
314
|
+
if (typeof error !== "object" ||
|
|
315
|
+
error === null ||
|
|
316
|
+
typeof error.code !== "string" ||
|
|
317
|
+
typeof error.status !== "number" ||
|
|
318
|
+
typeof error.message !== "string") {
|
|
319
|
+
return undefined;
|
|
320
|
+
}
|
|
321
|
+
const catalogError = {
|
|
322
|
+
key,
|
|
323
|
+
code: error.code,
|
|
324
|
+
status: error.status,
|
|
325
|
+
message: error.message,
|
|
326
|
+
};
|
|
327
|
+
const details = error.details;
|
|
328
|
+
if (details !== undefined) {
|
|
329
|
+
catalogError.details = details;
|
|
330
|
+
}
|
|
331
|
+
return catalogError;
|
|
332
|
+
})
|
|
333
|
+
.filter((error) => error !== undefined && error.status === status);
|
|
334
|
+
}
|
|
335
|
+
function catalogErrorResponseSchemaRef(errors, nameHint, state) {
|
|
336
|
+
const schema = errors.length === 1
|
|
337
|
+
? catalogErrorResponseSchema(errors[0], nameHint, state)
|
|
338
|
+
: {
|
|
339
|
+
oneOf: errors.map((error) => catalogErrorResponseSchema(error, `${nameHint}_${error.key}`, state)),
|
|
340
|
+
};
|
|
341
|
+
if (!state.components.schemas) {
|
|
342
|
+
state.components.schemas = {};
|
|
343
|
+
}
|
|
344
|
+
const schemaName = normalizeSchemaName(nameHint, state);
|
|
345
|
+
if (!state.components.schemas[schemaName]) {
|
|
346
|
+
state.components.schemas[schemaName] = schema;
|
|
347
|
+
}
|
|
348
|
+
return { $ref: `#/components/schemas/${schemaName}` };
|
|
349
|
+
}
|
|
350
|
+
function catalogErrorResponseSchema(error, nameHint, state) {
|
|
351
|
+
return {
|
|
352
|
+
type: "object",
|
|
353
|
+
properties: {
|
|
354
|
+
code: { type: "string", const: error.code },
|
|
355
|
+
message: { type: "string" },
|
|
356
|
+
...(error.details
|
|
357
|
+
? {
|
|
358
|
+
details: schemaToSchemaRef(error.details, `${nameHint}_details`, state, "output"),
|
|
359
|
+
}
|
|
360
|
+
: { details: {} }),
|
|
361
|
+
requestId: { type: "string" },
|
|
362
|
+
},
|
|
363
|
+
required: ["code", "message"],
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
function examplesFromCatalogErrors(errors) {
|
|
367
|
+
if (errors.length === 0)
|
|
368
|
+
return undefined;
|
|
369
|
+
return Object.fromEntries(errors.map((error) => [
|
|
370
|
+
normalizeExampleKey(error.key),
|
|
371
|
+
{
|
|
372
|
+
summary: error.message,
|
|
373
|
+
value: {
|
|
374
|
+
code: error.code,
|
|
375
|
+
message: error.message,
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
]));
|
|
379
|
+
}
|
|
380
|
+
function normalizeExampleKey(key) {
|
|
381
|
+
const normalized = key.replace(/[^A-Za-z0-9._-]/g, "_");
|
|
382
|
+
return normalized || "error";
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Convert a Zod schema to a JSON Schema reference, registering it in components
|
|
386
|
+
*/
|
|
387
|
+
function zodToSchemaRef(schema, nameHint, state, io) {
|
|
388
|
+
// Ensure schemas object exists
|
|
389
|
+
if (!state.components.schemas) {
|
|
390
|
+
state.components.schemas = {};
|
|
391
|
+
}
|
|
392
|
+
const schemaName = normalizeSchemaName(nameHint, state);
|
|
393
|
+
if (!state.components.schemas[schemaName]) {
|
|
394
|
+
const jsonSchema = z.toJSONSchema(schema, {
|
|
395
|
+
target: "draft-2020-12",
|
|
396
|
+
unrepresentable: "any",
|
|
397
|
+
io,
|
|
398
|
+
});
|
|
399
|
+
// Remove $schema as it's not needed in OpenAPI
|
|
400
|
+
delete jsonSchema.$schema;
|
|
401
|
+
state.components.schemas[schemaName] = jsonSchema;
|
|
402
|
+
}
|
|
403
|
+
return { $ref: `#/components/schemas/${schemaName}` };
|
|
404
|
+
}
|
|
405
|
+
function schemaToSchemaRef(schema, nameHint, state, io) {
|
|
406
|
+
if (schema === STANDARD_ERROR_RESPONSE_SCHEMA) {
|
|
407
|
+
return standardErrorResponseSchemaRef(nameHint, state);
|
|
408
|
+
}
|
|
409
|
+
return zodToSchemaRef(schema, nameHint, state, io);
|
|
410
|
+
}
|
|
411
|
+
function standardErrorResponseSchemaRef(nameHint, state) {
|
|
412
|
+
if (!state.components.schemas) {
|
|
413
|
+
state.components.schemas = {};
|
|
414
|
+
}
|
|
415
|
+
const schemaName = normalizeSchemaName(nameHint, state);
|
|
416
|
+
if (!state.components.schemas[schemaName]) {
|
|
417
|
+
state.components.schemas[schemaName] = {
|
|
418
|
+
type: "object",
|
|
419
|
+
properties: {
|
|
420
|
+
code: { type: "string" },
|
|
421
|
+
message: { type: "string" },
|
|
422
|
+
details: {},
|
|
423
|
+
requestId: { type: "string" },
|
|
424
|
+
},
|
|
425
|
+
required: ["code", "message"],
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return { $ref: `#/components/schemas/${schemaName}` };
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Normalize schema name for use in components.
|
|
432
|
+
* Appends a counter suffix only when the base name already exists.
|
|
433
|
+
*/
|
|
434
|
+
function normalizeSchemaName(name, state) {
|
|
435
|
+
const base = name.replace(/[^A-Za-z0-9]/g, "_");
|
|
436
|
+
// Check if base name is already used
|
|
437
|
+
if (!state.components.schemas?.[base]) {
|
|
438
|
+
return base;
|
|
439
|
+
}
|
|
440
|
+
// Find a unique name by appending a counter
|
|
441
|
+
let counter = 1;
|
|
442
|
+
let uniqueName = `${base}_${counter}`;
|
|
443
|
+
while (state.components.schemas[uniqueName]) {
|
|
444
|
+
counter++;
|
|
445
|
+
uniqueName = `${base}_${counter}`;
|
|
446
|
+
}
|
|
447
|
+
return uniqueName;
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema introspection adapter.
|
|
3
|
+
*
|
|
4
|
+
* Abstracts the details of reading metadata from a schema library (e.g. Zod)
|
|
5
|
+
* so that the OpenAPI generator is not directly coupled to `_def` internals.
|
|
6
|
+
*
|
|
7
|
+
* A default Zod implementation is provided via `createZodIntrospector()`.
|
|
8
|
+
* To support a different schema library, implement this interface.
|
|
9
|
+
*/
|
|
10
|
+
export interface SchemaIntrospector {
|
|
11
|
+
/**
|
|
12
|
+
* Extract the shape (field name → field schema) from an object schema.
|
|
13
|
+
* Returns undefined if the schema is not an object type or cannot be inspected.
|
|
14
|
+
*/
|
|
15
|
+
getShape(schema: unknown): Record<string, unknown> | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Extract the user-supplied `.describe()` string from a schema.
|
|
18
|
+
*/
|
|
19
|
+
getDescription(schema: unknown): string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Return true if the schema represents an optional wrapper.
|
|
22
|
+
*/
|
|
23
|
+
isOptional(schema: unknown): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* If the schema is an optional wrapper, return the inner (unwrapped) schema.
|
|
26
|
+
* Otherwise return the original schema unchanged.
|
|
27
|
+
*/
|
|
28
|
+
unwrapOptional(schema: unknown): unknown;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a schema introspector for Zod schemas.
|
|
32
|
+
*
|
|
33
|
+
* This accesses Zod's internal `_def` property, which is a common pattern in
|
|
34
|
+
* Zod ecosystem libraries but may break with major Zod updates. Each helper
|
|
35
|
+
* gracefully returns a safe default if the structure is unexpected.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createZodIntrospector(): SchemaIntrospector;
|
|
38
|
+
//# sourceMappingURL=schema-introspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-introspector.d.ts","sourceRoot":"","sources":["../../src/openapi/schema-introspector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAE/D;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAEpD;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAErC;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAkE1D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a schema introspector for Zod schemas.
|
|
3
|
+
*
|
|
4
|
+
* This accesses Zod's internal `_def` property, which is a common pattern in
|
|
5
|
+
* Zod ecosystem libraries but may break with major Zod updates. Each helper
|
|
6
|
+
* gracefully returns a safe default if the structure is unexpected.
|
|
7
|
+
*/
|
|
8
|
+
export function createZodIntrospector() {
|
|
9
|
+
return {
|
|
10
|
+
getShape(schema) {
|
|
11
|
+
if (!schema || typeof schema !== "object")
|
|
12
|
+
return undefined;
|
|
13
|
+
const schemaDef = schema?._def;
|
|
14
|
+
if (!schemaDef || typeof schemaDef !== "object")
|
|
15
|
+
return undefined;
|
|
16
|
+
if (!("shape" in schemaDef))
|
|
17
|
+
return undefined;
|
|
18
|
+
let shape;
|
|
19
|
+
if (typeof schemaDef.shape === "function") {
|
|
20
|
+
shape = schemaDef.shape();
|
|
21
|
+
}
|
|
22
|
+
else if (typeof schemaDef.shape === "object") {
|
|
23
|
+
shape = schemaDef.shape;
|
|
24
|
+
}
|
|
25
|
+
if (!shape || typeof shape !== "object")
|
|
26
|
+
return undefined;
|
|
27
|
+
return shape;
|
|
28
|
+
},
|
|
29
|
+
getDescription(schema) {
|
|
30
|
+
if (!schema || typeof schema !== "object")
|
|
31
|
+
return undefined;
|
|
32
|
+
const directDescription = schema
|
|
33
|
+
.description;
|
|
34
|
+
if (typeof directDescription === "string") {
|
|
35
|
+
return directDescription;
|
|
36
|
+
}
|
|
37
|
+
const schemaDef = schema?._def;
|
|
38
|
+
if (!schemaDef || typeof schemaDef !== "object")
|
|
39
|
+
return undefined;
|
|
40
|
+
const description = schemaDef.description;
|
|
41
|
+
return typeof description === "string" ? description : undefined;
|
|
42
|
+
},
|
|
43
|
+
isOptional(schema) {
|
|
44
|
+
if (!schema || typeof schema !== "object")
|
|
45
|
+
return false;
|
|
46
|
+
const schemaWithOptional = schema;
|
|
47
|
+
if (typeof schemaWithOptional.isOptional === "function") {
|
|
48
|
+
return schemaWithOptional.isOptional();
|
|
49
|
+
}
|
|
50
|
+
const schemaDef = schema?._def;
|
|
51
|
+
if (!schemaDef || typeof schemaDef !== "object")
|
|
52
|
+
return false;
|
|
53
|
+
const def = schemaDef;
|
|
54
|
+
return def.typeName === "ZodOptional" || def.type === "optional";
|
|
55
|
+
},
|
|
56
|
+
unwrapOptional(schema) {
|
|
57
|
+
const schemaDef = schema?._def;
|
|
58
|
+
const def = schemaDef;
|
|
59
|
+
if (def?.typeName !== "ZodOptional" && def?.type !== "optional") {
|
|
60
|
+
return schema;
|
|
61
|
+
}
|
|
62
|
+
const innerType = def?.innerType;
|
|
63
|
+
return innerType ?? schema;
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=schema-introspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-introspector.js","sourceRoot":"","sources":["../../src/openapi/schema-introspector.ts"],"names":[],"mappings":"AAiCA;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,QAAQ,CAAC,MAAe;YACtB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAE5D,MAAM,SAAS,GAAI,MAAkC,EAAE,IAAI,CAAC;YAC5D,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAElE,IAAI,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YAE9C,IAAI,KAAc,CAAC;YACnB,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC1C,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;iBAAM,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/C,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAE1D,OAAO,KAAgC,CAAC;QAC1C,CAAC;QAED,cAAc,CAAC,MAAe;YAC5B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAE5D,MAAM,iBAAiB,GAAI,MAAoC;iBAC5D,WAAW,CAAC;YACf,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;gBAC1C,OAAO,iBAAiB,CAAC;YAC3B,CAAC;YAED,MAAM,SAAS,GAAI,MAAkC,EAAE,IAAI,CAAC;YAC5D,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAElE,MAAM,WAAW,GAAI,SAAqC,CAAC,WAAW,CAAC;YACvE,OAAO,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,CAAC;QAED,UAAU,CAAC,MAAe;YACxB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAExD,MAAM,kBAAkB,GAAG,MAE1B,CAAC;YACF,IAAI,OAAO,kBAAkB,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACxD,OAAO,kBAAkB,CAAC,UAAU,EAAE,CAAC;YACzC,CAAC;YAED,MAAM,SAAS,GAAI,MAAkC,EAAE,IAAI,CAAC;YAC5D,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAE9D,MAAM,GAAG,GAAG,SAAoC,CAAC;YACjD,OAAO,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC;QACnE,CAAC;QAED,cAAc,CAAC,MAAe;YAC5B,MAAM,SAAS,GAAI,MAAkC,EAAE,IAAI,CAAC;YAC5D,MAAM,GAAG,GAAG,SAAgD,CAAC;YAC7D,IAAI,GAAG,EAAE,QAAQ,KAAK,aAAa,IAAI,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;gBAChE,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,CAAC;YACjC,OAAO,SAAS,IAAI,MAAM,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type ActivityActorType = "anonymous" | "service" | "system" | "user";
|
|
2
|
+
export type AuditOutcome = "success" | "failure";
|
|
3
|
+
export type ActivityMetadataValue = ActivityMetadataValue[] | boolean | null | number | string | {
|
|
4
|
+
[key: string]: ActivityMetadataValue | undefined;
|
|
5
|
+
};
|
|
6
|
+
export type ActivityMetadata = Record<string, ActivityMetadataValue | undefined>;
|
|
7
|
+
export interface ActivityActor {
|
|
8
|
+
type: ActivityActorType;
|
|
9
|
+
id?: string;
|
|
10
|
+
displayName?: string;
|
|
11
|
+
metadata?: ActivityMetadata;
|
|
12
|
+
}
|
|
13
|
+
export interface ActivityTenant {
|
|
14
|
+
id: string;
|
|
15
|
+
slug?: string;
|
|
16
|
+
metadata?: ActivityMetadata;
|
|
17
|
+
}
|
|
18
|
+
export interface ActivityResource {
|
|
19
|
+
type: string;
|
|
20
|
+
id?: string;
|
|
21
|
+
name?: string;
|
|
22
|
+
metadata?: ActivityMetadata;
|
|
23
|
+
}
|
|
24
|
+
export interface AuditLogEntry {
|
|
25
|
+
action: string;
|
|
26
|
+
actor: ActivityActor;
|
|
27
|
+
occurredAt: Date;
|
|
28
|
+
outcome: AuditOutcome;
|
|
29
|
+
metadata?: ActivityMetadata;
|
|
30
|
+
message?: string;
|
|
31
|
+
requestId?: string;
|
|
32
|
+
resource?: ActivityResource;
|
|
33
|
+
tenant?: ActivityTenant;
|
|
34
|
+
traceId?: string;
|
|
35
|
+
}
|
|
36
|
+
export type AuditLogEntryInput = Omit<AuditLogEntry, "occurredAt" | "outcome"> & {
|
|
37
|
+
occurredAt?: Date;
|
|
38
|
+
outcome?: AuditOutcome;
|
|
39
|
+
};
|
|
40
|
+
export interface AuditLogPort {
|
|
41
|
+
record(entry: AuditLogEntryInput): Promise<void> | void;
|
|
42
|
+
}
|
|
43
|
+
export interface MemoryAuditLogPort extends AuditLogPort {
|
|
44
|
+
entries: AuditLogEntry[];
|
|
45
|
+
}
|
|
46
|
+
export interface AuditLogOptions {
|
|
47
|
+
redact?: (entry: AuditLogEntry) => AuditLogEntry;
|
|
48
|
+
}
|
|
49
|
+
export declare function createAnonymousActor(options?: Omit<ActivityActor, "type">): ActivityActor;
|
|
50
|
+
export declare function createServiceActor(id: string, options?: Omit<ActivityActor, "type" | "id">): ActivityActor;
|
|
51
|
+
export declare function createSystemActor(id?: string, options?: Omit<ActivityActor, "type" | "id">): ActivityActor;
|
|
52
|
+
export declare function createUserActor(id: string, options?: Omit<ActivityActor, "type" | "id">): ActivityActor;
|
|
53
|
+
export declare function createTenant(id: string, options?: Omit<ActivityTenant, "id">): ActivityTenant;
|
|
54
|
+
export declare function normalizeAuditLogEntry(entry: AuditLogEntryInput): AuditLogEntry;
|
|
55
|
+
export declare function redactAuditLogEntry(entry: AuditLogEntry): AuditLogEntry;
|
|
56
|
+
export declare function createRedactedAuditLog(audit: AuditLogPort, options?: AuditLogOptions): AuditLogPort;
|
|
57
|
+
export declare function createMemoryAuditLog(entries?: AuditLogEntry[], options?: AuditLogOptions): MemoryAuditLogPort;
|
|
58
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/ports/audit.ts"],"names":[],"mappings":"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"}
|