@zmdb/web 1.0.0-beta.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/LICENSE +674 -0
- package/README.md +49 -0
- package/dist/app/bridge.d.ts +12 -0
- package/dist/app/bridge.d.ts.map +1 -0
- package/dist/app/bridge.js +16 -0
- package/dist/app/bridge.js.map +1 -0
- package/dist/app/index.d.ts +23 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +47 -0
- package/dist/app/index.js.map +1 -0
- package/dist/bench/index.d.ts +68 -0
- package/dist/bench/index.d.ts.map +1 -0
- package/dist/bench/index.js +250 -0
- package/dist/bench/index.js.map +1 -0
- package/dist/compression/index.d.ts +13 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/index.js +211 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/context/index.d.ts +74 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +118 -0
- package/dist/context/index.js.map +1 -0
- package/dist/contract/__fixtures__/http-client.generated.d.ts +70 -0
- package/dist/contract/__fixtures__/http-client.generated.d.ts.map +1 -0
- package/dist/contract/__fixtures__/http-client.generated.js +86 -0
- package/dist/contract/__fixtures__/http-client.generated.js.map +1 -0
- package/dist/contract/__fixtures__/http-convergence.d.ts +396 -0
- package/dist/contract/__fixtures__/http-convergence.d.ts.map +1 -0
- package/dist/contract/__fixtures__/http-convergence.js +425 -0
- package/dist/contract/__fixtures__/http-convergence.js.map +1 -0
- package/dist/contract/compiler/client.d.ts +12 -0
- package/dist/contract/compiler/client.d.ts.map +1 -0
- package/dist/contract/compiler/client.js +1293 -0
- package/dist/contract/compiler/client.js.map +1 -0
- package/dist/contract/compiler/index.d.ts +18 -0
- package/dist/contract/compiler/index.d.ts.map +1 -0
- package/dist/contract/compiler/index.js +1058 -0
- package/dist/contract/compiler/index.js.map +1 -0
- package/dist/contract/index.d.ts +237 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +22 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/csrf/index.d.ts +15 -0
- package/dist/csrf/index.d.ts.map +1 -0
- package/dist/csrf/index.js +218 -0
- package/dist/csrf/index.js.map +1 -0
- package/dist/data/index.d.ts +35 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +58 -0
- package/dist/data/index.js.map +1 -0
- package/dist/devtools/index.d.ts +74 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/index.js +552 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/dto-pipes/index.d.ts +45 -0
- package/dist/dto-pipes/index.d.ts.map +1 -0
- package/dist/dto-pipes/index.js +78 -0
- package/dist/dto-pipes/index.js.map +1 -0
- package/dist/gateways/index.d.ts +31 -0
- package/dist/gateways/index.d.ts.map +1 -0
- package/dist/gateways/index.js +138 -0
- package/dist/gateways/index.js.map +1 -0
- package/dist/health/index.d.ts +20 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +148 -0
- package/dist/health/index.js.map +1 -0
- package/dist/http-token.d.ts +2 -0
- package/dist/http-token.d.ts.map +1 -0
- package/dist/http-token.js +21 -0
- package/dist/http-token.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/index.d.ts +11 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +39 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/middleware/errors.d.ts +14 -0
- package/dist/middleware/errors.d.ts.map +1 -0
- package/dist/middleware/errors.js +18 -0
- package/dist/middleware/errors.js.map +1 -0
- package/dist/middleware/index.d.ts +46 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +64 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/modules/__fixtures__/large-graph.d.ts +239 -0
- package/dist/modules/__fixtures__/large-graph.d.ts.map +1 -0
- package/dist/modules/__fixtures__/large-graph.js +483 -0
- package/dist/modules/__fixtures__/large-graph.js.map +1 -0
- package/dist/openapi/__fixtures__/entities.d.ts +8 -0
- package/dist/openapi/__fixtures__/entities.d.ts.map +1 -0
- package/dist/openapi/__fixtures__/entities.js +4 -0
- package/dist/openapi/__fixtures__/entities.js.map +1 -0
- package/dist/openapi/__fixtures__/openapi-tools.fixture.d.ts +38 -0
- package/dist/openapi/__fixtures__/openapi-tools.fixture.d.ts.map +1 -0
- package/dist/openapi/__fixtures__/openapi-tools.fixture.js +172 -0
- package/dist/openapi/__fixtures__/openapi-tools.fixture.js.map +1 -0
- package/dist/openapi/__fixtures__/route-schemas.d.ts +2 -0
- package/dist/openapi/__fixtures__/route-schemas.d.ts.map +1 -0
- package/dist/openapi/__fixtures__/route-schemas.js +17 -0
- package/dist/openapi/__fixtures__/route-schemas.js.map +1 -0
- package/dist/openapi/index.d.ts +61 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +314 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/pipeline/guards.d.ts +9 -0
- package/dist/pipeline/guards.d.ts.map +1 -0
- package/dist/pipeline/guards.js +11 -0
- package/dist/pipeline/guards.js.map +1 -0
- package/dist/pipeline/index.d.ts +141 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +1624 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/routing/index.d.ts +40 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +162 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/static/index.d.ts +14 -0
- package/dist/static/index.d.ts.map +1 -0
- package/dist/static/index.js +348 -0
- package/dist/static/index.js.map +1 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +32 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/traced-router.d.ts +5 -0
- package/dist/traced-router.d.ts.map +1 -0
- package/dist/traced-router.js +6 -0
- package/dist/traced-router.js.map +1 -0
- package/dist/upload/index.d.ts +28 -0
- package/dist/upload/index.d.ts.map +1 -0
- package/dist/upload/index.js +410 -0
- package/dist/upload/index.js.map +1 -0
- package/dist/versioning/index.d.ts +35 -0
- package/dist/versioning/index.d.ts.map +1 -0
- package/dist/versioning/index.js +66 -0
- package/dist/versioning/index.js.map +1 -0
- package/dist/versioning/runtime.d.ts +5 -0
- package/dist/versioning/runtime.d.ts.map +1 -0
- package/dist/versioning/runtime.js +34 -0
- package/dist/versioning/runtime.js.map +1 -0
- package/package.json +143 -0
- package/src/app/bridge.ts +39 -0
- package/src/app/index.ts +76 -0
- package/src/bench/index.ts +329 -0
- package/src/compression/index.ts +255 -0
- package/src/context/index.ts +181 -0
- package/src/contract/__fixtures__/http-client.generated.ts +73 -0
- package/src/contract/__fixtures__/http-client.generated.ts.map +1 -0
- package/src/contract/__fixtures__/http-convergence.ts +564 -0
- package/src/contract/compiler/client.ts +1518 -0
- package/src/contract/compiler/index.ts +1457 -0
- package/src/contract/index.ts +266 -0
- package/src/csrf/index.ts +264 -0
- package/src/data/index.ts +65 -0
- package/src/devtools/index.ts +727 -0
- package/src/dto-pipes/index.ts +93 -0
- package/src/gateways/index.ts +180 -0
- package/src/health/index.ts +198 -0
- package/src/http-token.ts +22 -0
- package/src/index.ts +167 -0
- package/src/integrations/index.ts +50 -0
- package/src/middleware/errors.ts +17 -0
- package/src/middleware/index.ts +108 -0
- package/src/modules/__fixtures__/large-graph.ts +540 -0
- package/src/openapi/__fixtures__/entities.ts +19 -0
- package/src/openapi/__fixtures__/openapi-tools.fixture.ts +212 -0
- package/src/openapi/__fixtures__/route-schemas.ts +27 -0
- package/src/openapi/index.ts +483 -0
- package/src/pipeline/guards.ts +23 -0
- package/src/pipeline/index.ts +2041 -0
- package/src/routing/index.ts +201 -0
- package/src/static/index.ts +443 -0
- package/src/testing/index.ts +58 -0
- package/src/traced-router.ts +8 -0
- package/src/upload/index.ts +489 -0
- package/src/versioning/index.ts +106 -0
- package/src/versioning/runtime.ts +38 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { assert } from '@zmdb/validator';
|
|
2
|
+
export const listUsersTool = {
|
|
3
|
+
spec: {
|
|
4
|
+
name: 'list_users',
|
|
5
|
+
parameters: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {},
|
|
8
|
+
required: [],
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
request: {
|
|
12
|
+
method: 'GET',
|
|
13
|
+
path: '/users',
|
|
14
|
+
pathParameters: [],
|
|
15
|
+
queryParameters: [],
|
|
16
|
+
bodyParameters: [],
|
|
17
|
+
hasBody: false,
|
|
18
|
+
},
|
|
19
|
+
validate: (input) => assert(input),
|
|
20
|
+
};
|
|
21
|
+
export const postUsersTool = {
|
|
22
|
+
spec: {
|
|
23
|
+
name: 'post_users',
|
|
24
|
+
parameters: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
createdAt: {
|
|
28
|
+
format: 'date-time',
|
|
29
|
+
type: 'string',
|
|
30
|
+
},
|
|
31
|
+
email: {
|
|
32
|
+
maxLength: 255,
|
|
33
|
+
type: 'string',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: ['email'],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
request: {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
path: '/users',
|
|
42
|
+
pathParameters: [],
|
|
43
|
+
queryParameters: [],
|
|
44
|
+
bodyParameters: ['createdAt', 'email'],
|
|
45
|
+
hasBody: true,
|
|
46
|
+
},
|
|
47
|
+
validate: (input) => assert(input),
|
|
48
|
+
};
|
|
49
|
+
export const getUsersHealthTool = {
|
|
50
|
+
spec: {
|
|
51
|
+
name: 'get_users_health',
|
|
52
|
+
parameters: {
|
|
53
|
+
type: 'object',
|
|
54
|
+
properties: {},
|
|
55
|
+
required: [],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
request: {
|
|
59
|
+
method: 'GET',
|
|
60
|
+
path: '/users/health',
|
|
61
|
+
pathParameters: [],
|
|
62
|
+
queryParameters: [],
|
|
63
|
+
bodyParameters: [],
|
|
64
|
+
hasBody: false,
|
|
65
|
+
},
|
|
66
|
+
validate: (input) => assert(input),
|
|
67
|
+
};
|
|
68
|
+
export const deleteUsersIdTool = {
|
|
69
|
+
spec: {
|
|
70
|
+
name: 'delete_users_id',
|
|
71
|
+
parameters: {
|
|
72
|
+
type: 'object',
|
|
73
|
+
properties: {
|
|
74
|
+
id: {
|
|
75
|
+
type: 'string',
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
required: ['id'],
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
request: {
|
|
82
|
+
method: 'DELETE',
|
|
83
|
+
path: '/users/{id}',
|
|
84
|
+
pathParameters: ['id'],
|
|
85
|
+
queryParameters: [],
|
|
86
|
+
bodyParameters: [],
|
|
87
|
+
hasBody: false,
|
|
88
|
+
},
|
|
89
|
+
validate: (input) => assert(input),
|
|
90
|
+
};
|
|
91
|
+
export const getUsersIdTool = {
|
|
92
|
+
spec: {
|
|
93
|
+
name: 'get_users_id',
|
|
94
|
+
parameters: {
|
|
95
|
+
type: 'object',
|
|
96
|
+
properties: {
|
|
97
|
+
id: {
|
|
98
|
+
type: 'string',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
required: ['id'],
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
request: {
|
|
105
|
+
method: 'GET',
|
|
106
|
+
path: '/users/{id}',
|
|
107
|
+
pathParameters: ['id'],
|
|
108
|
+
queryParameters: [],
|
|
109
|
+
bodyParameters: [],
|
|
110
|
+
hasBody: false,
|
|
111
|
+
},
|
|
112
|
+
validate: (input) => assert(input),
|
|
113
|
+
};
|
|
114
|
+
export const postUsersIdRolesTool = {
|
|
115
|
+
spec: {
|
|
116
|
+
name: 'post_users_id_roles',
|
|
117
|
+
parameters: {
|
|
118
|
+
type: 'object',
|
|
119
|
+
properties: {
|
|
120
|
+
id: {
|
|
121
|
+
type: 'string',
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
required: ['id'],
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
request: {
|
|
128
|
+
method: 'POST',
|
|
129
|
+
path: '/users/{id}/roles',
|
|
130
|
+
pathParameters: ['id'],
|
|
131
|
+
queryParameters: [],
|
|
132
|
+
bodyParameters: [],
|
|
133
|
+
hasBody: false,
|
|
134
|
+
},
|
|
135
|
+
validate: (input) => assert(input),
|
|
136
|
+
};
|
|
137
|
+
export const putUsersIdRolesRoleIdTool = {
|
|
138
|
+
spec: {
|
|
139
|
+
name: 'put_users_id_roles_roleId',
|
|
140
|
+
parameters: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
properties: {
|
|
143
|
+
id: {
|
|
144
|
+
type: 'string',
|
|
145
|
+
},
|
|
146
|
+
roleId: {
|
|
147
|
+
type: 'string',
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
required: ['id', 'roleId'],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
request: {
|
|
154
|
+
method: 'PUT',
|
|
155
|
+
path: '/users/{id}/roles/{roleId}',
|
|
156
|
+
pathParameters: ['id', 'roleId'],
|
|
157
|
+
queryParameters: [],
|
|
158
|
+
bodyParameters: [],
|
|
159
|
+
hasBody: false,
|
|
160
|
+
},
|
|
161
|
+
validate: (input) => assert(input),
|
|
162
|
+
};
|
|
163
|
+
export const openApiTools = {
|
|
164
|
+
list_users: listUsersTool,
|
|
165
|
+
post_users: postUsersTool,
|
|
166
|
+
get_users_health: getUsersHealthTool,
|
|
167
|
+
delete_users_id: deleteUsersIdTool,
|
|
168
|
+
get_users_id: getUsersIdTool,
|
|
169
|
+
post_users_id_roles: postUsersIdRolesTool,
|
|
170
|
+
put_users_id_roles_roleId: putUsersIdRolesRoleIdTool,
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=openapi-tools.fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-tools.fixture.js","sourceRoot":"","sources":["../../../src/openapi/__fixtures__/openapi-tools.fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-schemas.d.ts","sourceRoot":"","sources":["../../../src/openapi/__fixtures__/route-schemas.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// One operation's request and response documents, asked for by type.
|
|
2
|
+
//
|
|
3
|
+
// `generated-schemas.spec.ts` runs the build transform over this file and puts the
|
|
4
|
+
// resulting documents into one method-specific HttpContractIR operation. The OpenAPI
|
|
5
|
+
// renderer receives only that IR; it never sees this declaration or reflects the types.
|
|
6
|
+
//
|
|
7
|
+
// `documents` is declared rather than defined so assignability is checked while the
|
|
8
|
+
// emitted values stay available to the spec, which supplies the function at evaluation.
|
|
9
|
+
import {} from '@zmdb/schema/derive';
|
|
10
|
+
import { toJsonSchema } from '@zmdb/schema/openapi';
|
|
11
|
+
documents({
|
|
12
|
+
// The create body: no `id`, because the database makes it, and `createdAt` optional,
|
|
13
|
+
// because it has a default. Both facts come from the type.
|
|
14
|
+
body: toJsonSchema(),
|
|
15
|
+
response: toJsonSchema(),
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=route-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-schemas.js","sourceRoot":"","sources":["../../../src/openapi/__fixtures__/route-schemas.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,mFAAmF;AACnF,qFAAqF;AACrF,wFAAwF;AACxF,EAAE;AACF,oFAAoF;AACpF,wFAAwF;AAExF,OAAO,EAAgC,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAyB,MAAM,sBAAsB,CAAC;AAW3E,SAAS,CAAC;IACR,qFAAqF;IACrF,2DAA2D;IAC3D,IAAI,EAAE,YAAY,EAAmB;IACrC,QAAQ,EAAE,YAAY,EAAiB;CACxC,CAAC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { HttpContractIR, JsonValue, SecurityRequirement, SecurityScheme } from '../contract/index.js';
|
|
2
|
+
export type { AuthorizationCodeFlow, ClientCredentialsFlow, ImplicitFlow, OAuthFlow, OAuthFlows, PasswordFlow, SecurityRequirement, SecurityScheme, } from '../contract/index.js';
|
|
3
|
+
export type JsonSchema = Readonly<Record<string, JsonValue>>;
|
|
4
|
+
export interface OpenApiRenderOptions {
|
|
5
|
+
readonly info?: {
|
|
6
|
+
readonly title: string;
|
|
7
|
+
readonly version: string;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
interface OpenApiParameter {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly in: 'path' | 'query' | 'header' | 'cookie';
|
|
13
|
+
readonly required: boolean;
|
|
14
|
+
readonly style: 'simple' | 'form';
|
|
15
|
+
readonly explode: boolean;
|
|
16
|
+
readonly allowReserved?: false;
|
|
17
|
+
readonly schema: JsonSchema;
|
|
18
|
+
}
|
|
19
|
+
interface OpenApiHeader {
|
|
20
|
+
readonly required: boolean;
|
|
21
|
+
readonly schema: JsonSchema;
|
|
22
|
+
readonly description?: string;
|
|
23
|
+
}
|
|
24
|
+
interface OpenApiMedia {
|
|
25
|
+
readonly schema: JsonSchema;
|
|
26
|
+
}
|
|
27
|
+
type OpenApiContent = Record<string, OpenApiMedia>;
|
|
28
|
+
interface OpenApiResponse {
|
|
29
|
+
readonly description: string;
|
|
30
|
+
readonly headers?: Record<string, OpenApiHeader>;
|
|
31
|
+
readonly content?: OpenApiContent;
|
|
32
|
+
}
|
|
33
|
+
interface OpenApiRequestBody {
|
|
34
|
+
readonly required: boolean;
|
|
35
|
+
readonly content: OpenApiContent;
|
|
36
|
+
}
|
|
37
|
+
interface OpenApiOperation {
|
|
38
|
+
readonly operationId: string;
|
|
39
|
+
readonly parameters?: readonly OpenApiParameter[];
|
|
40
|
+
readonly requestBody?: OpenApiRequestBody;
|
|
41
|
+
readonly responses: Record<string, OpenApiResponse>;
|
|
42
|
+
readonly security: readonly SecurityRequirement[];
|
|
43
|
+
readonly deprecated?: true;
|
|
44
|
+
}
|
|
45
|
+
type PathItem = Record<string, OpenApiOperation>;
|
|
46
|
+
export interface OpenApiDocument {
|
|
47
|
+
readonly openapi: '3.1.0';
|
|
48
|
+
readonly info: {
|
|
49
|
+
readonly title: string;
|
|
50
|
+
readonly version: string;
|
|
51
|
+
};
|
|
52
|
+
readonly paths: Record<string, PathItem>;
|
|
53
|
+
readonly components?: {
|
|
54
|
+
readonly securitySchemes: Readonly<Record<string, SecurityScheme>>;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Project one serialisable HTTP contract into an OpenAPI 3.1 document. */
|
|
58
|
+
export declare function toOpenApi(contract: HttpContractIR, options?: OpenApiRenderOptions): OpenApiDocument;
|
|
59
|
+
/** Return a handler that serves one prebuilt document by identity. */
|
|
60
|
+
export declare function serveOpenApi(doc: OpenApiDocument): () => OpenApiDocument;
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
// @zmdb/web/openapi — deterministic HttpContractIR to OpenAPI 3.1 projection.
|
|
2
|
+
//
|
|
3
|
+
// Contract collection and TypeIR projection happen in @zmdb/web/contract/compiler.
|
|
4
|
+
// This module reads only serialisable operation data and the precomputed `openApi`
|
|
5
|
+
// documents attached to type IDs.
|
|
6
|
+
const METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
|
|
7
|
+
const FIXED_BODY_SCHEMAS = {
|
|
8
|
+
text: { type: 'string' },
|
|
9
|
+
bytes: { type: 'string', format: 'binary' },
|
|
10
|
+
stream: { type: 'string', format: 'binary' },
|
|
11
|
+
};
|
|
12
|
+
function contractError(field, problem) {
|
|
13
|
+
return new Error(`OpenAPI contract at ${field}: ${problem}`);
|
|
14
|
+
}
|
|
15
|
+
function operationError(operationId, field, problem) {
|
|
16
|
+
return new Error(`OpenAPI contract ${operationId} at ${field}: ${problem}`);
|
|
17
|
+
}
|
|
18
|
+
function openApiPath(path) {
|
|
19
|
+
const parameters = [];
|
|
20
|
+
const value = path.replace(/:([^/]+)/g, (_match, name) => {
|
|
21
|
+
parameters.push(name);
|
|
22
|
+
return `{${name}}`;
|
|
23
|
+
});
|
|
24
|
+
return { value, parameters };
|
|
25
|
+
}
|
|
26
|
+
function sameStrings(left, right) {
|
|
27
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
28
|
+
}
|
|
29
|
+
function sameStringSets(left, right) {
|
|
30
|
+
if (left.length !== right.length)
|
|
31
|
+
return false;
|
|
32
|
+
const expected = right.toSorted();
|
|
33
|
+
return left.toSorted().every((value, index) => value === expected[index]);
|
|
34
|
+
}
|
|
35
|
+
function schemaFor(contract, operation, field, typeId) {
|
|
36
|
+
const schema = contract.types[typeId]?.openApi;
|
|
37
|
+
if (schema === undefined) {
|
|
38
|
+
throw operationError(operation.operationId, field, `references missing typeId "${typeId}"`);
|
|
39
|
+
}
|
|
40
|
+
return schema;
|
|
41
|
+
}
|
|
42
|
+
function schemaForBody(contract, operation, field, body) {
|
|
43
|
+
if ('typeId' in body) {
|
|
44
|
+
return schemaFor(contract, operation, `${field}.typeId`, body.typeId);
|
|
45
|
+
}
|
|
46
|
+
return FIXED_BODY_SCHEMAS[body.kind];
|
|
47
|
+
}
|
|
48
|
+
function parameterFor(contract, operation, parameter, index) {
|
|
49
|
+
const field = `parameters.${String(index)}`;
|
|
50
|
+
const schema = schemaFor(contract, operation, `${field}.typeId`, parameter.typeId);
|
|
51
|
+
switch (parameter.in) {
|
|
52
|
+
case 'path':
|
|
53
|
+
if (!parameter.required) {
|
|
54
|
+
throw operationError(operation.operationId, `${field}.required`, 'a path parameter must be required');
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
name: parameter.name,
|
|
58
|
+
in: 'path',
|
|
59
|
+
required: true,
|
|
60
|
+
style: 'simple',
|
|
61
|
+
explode: false,
|
|
62
|
+
allowReserved: false,
|
|
63
|
+
schema,
|
|
64
|
+
};
|
|
65
|
+
case 'query':
|
|
66
|
+
return {
|
|
67
|
+
name: parameter.name,
|
|
68
|
+
in: 'query',
|
|
69
|
+
required: parameter.required,
|
|
70
|
+
style: 'form',
|
|
71
|
+
explode: true,
|
|
72
|
+
allowReserved: false,
|
|
73
|
+
schema,
|
|
74
|
+
};
|
|
75
|
+
case 'header':
|
|
76
|
+
return {
|
|
77
|
+
name: parameter.name,
|
|
78
|
+
in: 'header',
|
|
79
|
+
required: parameter.required,
|
|
80
|
+
style: 'simple',
|
|
81
|
+
explode: false,
|
|
82
|
+
schema,
|
|
83
|
+
};
|
|
84
|
+
case 'cookie':
|
|
85
|
+
return {
|
|
86
|
+
name: parameter.name,
|
|
87
|
+
in: 'cookie',
|
|
88
|
+
required: parameter.required,
|
|
89
|
+
style: 'form',
|
|
90
|
+
explode: true,
|
|
91
|
+
schema,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function assertVersionValues(operation) {
|
|
96
|
+
const version = operation.version;
|
|
97
|
+
if (version.kind !== 'header' && version.kind !== 'media-type')
|
|
98
|
+
return;
|
|
99
|
+
if (version.values.length === 0) {
|
|
100
|
+
throw operationError(operation.operationId, 'version.values', 'must contain at least one version');
|
|
101
|
+
}
|
|
102
|
+
if (new Set(version.values).size !== version.values.length) {
|
|
103
|
+
throw operationError(operation.operationId, 'version.values', 'contains a duplicate version');
|
|
104
|
+
}
|
|
105
|
+
if (!version.values.includes(version.default)) {
|
|
106
|
+
throw operationError(operation.operationId, 'version.default', `"${version.default}" is not one of the declared values`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function versionParameter(operation) {
|
|
110
|
+
const version = operation.version;
|
|
111
|
+
if (version.kind !== 'header')
|
|
112
|
+
return undefined;
|
|
113
|
+
return {
|
|
114
|
+
name: version.name,
|
|
115
|
+
in: 'header',
|
|
116
|
+
required: false,
|
|
117
|
+
style: 'simple',
|
|
118
|
+
explode: false,
|
|
119
|
+
schema: { type: 'string', enum: [...version.values], default: version.default },
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function contentForBody(contract, operation, field, body) {
|
|
123
|
+
if (body.kind === 'empty')
|
|
124
|
+
return undefined;
|
|
125
|
+
return { [body.mediaType]: { schema: schemaForBody(contract, operation, field, body) } };
|
|
126
|
+
}
|
|
127
|
+
function contentForResponse(contract, operation, response, field) {
|
|
128
|
+
if (operation.version.kind !== 'media-type') {
|
|
129
|
+
if (response.versions !== undefined) {
|
|
130
|
+
throw operationError(operation.operationId, `${field}.versions`, 'is present on a response that does not use media-type versioning');
|
|
131
|
+
}
|
|
132
|
+
return contentForBody(contract, operation, `${field}.body`, response.body);
|
|
133
|
+
}
|
|
134
|
+
const versions = response.versions;
|
|
135
|
+
if (versions !== undefined && !sameStringSets(Object.keys(versions), operation.version.values)) {
|
|
136
|
+
throw operationError(operation.operationId, `${field}.versions`, `must declare exactly [${operation.version.values.join(', ')}]`);
|
|
137
|
+
}
|
|
138
|
+
const content = {};
|
|
139
|
+
for (const value of operation.version.values) {
|
|
140
|
+
const body = versions?.[value] ?? response.body;
|
|
141
|
+
if (body.kind === 'empty')
|
|
142
|
+
continue;
|
|
143
|
+
const mediaType = `${body.mediaType}; ${operation.version.key}=${value}`;
|
|
144
|
+
if (content[mediaType] !== undefined) {
|
|
145
|
+
throw operationError(operation.operationId, `${field}.versions.${value}`, `duplicates media type "${mediaType}"`);
|
|
146
|
+
}
|
|
147
|
+
content[mediaType] = {
|
|
148
|
+
schema: schemaForBody(contract, operation, `${field}.versions.${value}`, body),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return Object.keys(content).length === 0 ? undefined : content;
|
|
152
|
+
}
|
|
153
|
+
function responseFor(contract, operation, response, index) {
|
|
154
|
+
const field = `responses.${String(index)}`;
|
|
155
|
+
if (!Number.isInteger(response.status) || response.status < 200 || response.status > 599) {
|
|
156
|
+
throw operationError(operation.operationId, `${field}.status`, 'must be an integer from 200 through 599');
|
|
157
|
+
}
|
|
158
|
+
const names = new Set();
|
|
159
|
+
const headers = {};
|
|
160
|
+
for (const [headerIndex, header] of response.headers.entries()) {
|
|
161
|
+
const key = header.name.toLowerCase();
|
|
162
|
+
if (names.has(key)) {
|
|
163
|
+
throw operationError(operation.operationId, `${field}.headers.${String(headerIndex)}.name`, `duplicates response header "${header.name}"`);
|
|
164
|
+
}
|
|
165
|
+
names.add(key);
|
|
166
|
+
headers[header.name] = {
|
|
167
|
+
required: header.required,
|
|
168
|
+
schema: schemaFor(contract, operation, `${field}.headers.${String(headerIndex)}.typeId`, header.typeId),
|
|
169
|
+
...(header.description === undefined ? {} : { description: header.description }),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const content = contentForResponse(contract, operation, response, field);
|
|
173
|
+
return {
|
|
174
|
+
description: response.description,
|
|
175
|
+
...(Object.keys(headers).length === 0 ? {} : { headers }),
|
|
176
|
+
...(content === undefined ? {} : { content }),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function securityFor(contract, operation) {
|
|
180
|
+
return operation.security.map((requirement, index) => {
|
|
181
|
+
const canonical = {};
|
|
182
|
+
for (const scheme of Object.keys(requirement).toSorted()) {
|
|
183
|
+
if (contract.securitySchemes[scheme] === undefined) {
|
|
184
|
+
throw operationError(operation.operationId, `security.${String(index)}.${scheme}`, 'references an undeclared scheme');
|
|
185
|
+
}
|
|
186
|
+
canonical[scheme] = [...(requirement[scheme] ?? [])];
|
|
187
|
+
}
|
|
188
|
+
return canonical;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function projectOperation(contract, operation) {
|
|
192
|
+
if (operation.operationId.length === 0) {
|
|
193
|
+
throw operationError('<empty>', 'operationId', 'must not be empty');
|
|
194
|
+
}
|
|
195
|
+
if (!METHODS.has(operation.method)) {
|
|
196
|
+
throw operationError(operation.operationId, 'method', `"${operation.method}" is not supported`);
|
|
197
|
+
}
|
|
198
|
+
if (!operation.path.startsWith('/')) {
|
|
199
|
+
throw operationError(operation.operationId, 'path', 'must start with "/"');
|
|
200
|
+
}
|
|
201
|
+
if (operation.responses.length === 0) {
|
|
202
|
+
throw operationError(operation.operationId, 'responses', 'must contain at least one exact status');
|
|
203
|
+
}
|
|
204
|
+
assertVersionValues(operation);
|
|
205
|
+
const projectedPath = openApiPath(operation.path);
|
|
206
|
+
const pathParameters = operation.parameters
|
|
207
|
+
.filter(parameter => parameter.in === 'path')
|
|
208
|
+
.map(parameter => parameter.name);
|
|
209
|
+
if (!sameStrings(projectedPath.parameters, pathParameters)) {
|
|
210
|
+
throw operationError(operation.operationId, 'path', `placeholders [${projectedPath.parameters.join(', ')}] do not match path parameters ` +
|
|
211
|
+
`[${pathParameters.join(', ')}]`);
|
|
212
|
+
}
|
|
213
|
+
const wireNames = new Set();
|
|
214
|
+
const parameters = operation.parameters.map((parameter, index) => {
|
|
215
|
+
const wireKey = `${parameter.in}\u0000${parameter.in === 'header' ? parameter.name.toLowerCase() : parameter.name}`;
|
|
216
|
+
if (wireNames.has(wireKey)) {
|
|
217
|
+
throw operationError(operation.operationId, `parameters.${String(index)}.name`, `duplicates ${parameter.in} parameter "${parameter.name}"`);
|
|
218
|
+
}
|
|
219
|
+
wireNames.add(wireKey);
|
|
220
|
+
return parameterFor(contract, operation, parameter, index);
|
|
221
|
+
});
|
|
222
|
+
const version = versionParameter(operation);
|
|
223
|
+
if (version !== undefined) {
|
|
224
|
+
const wireKey = `header\u0000${version.name.toLowerCase()}`;
|
|
225
|
+
if (wireNames.has(wireKey)) {
|
|
226
|
+
throw operationError(operation.operationId, 'version.name', `duplicates header parameter "${version.name}"`);
|
|
227
|
+
}
|
|
228
|
+
parameters.push(version);
|
|
229
|
+
}
|
|
230
|
+
let requestBody;
|
|
231
|
+
if (operation.requestBody !== undefined) {
|
|
232
|
+
const content = contentForBody(contract, operation, 'requestBody', operation.requestBody);
|
|
233
|
+
if (content === undefined) {
|
|
234
|
+
throw operationError(operation.operationId, 'requestBody.kind', 'cannot be empty');
|
|
235
|
+
}
|
|
236
|
+
requestBody = { required: operation.requestBody.required, content };
|
|
237
|
+
}
|
|
238
|
+
const responses = {};
|
|
239
|
+
for (const [index, response] of operation.responses.toSorted((left, right) => left.status - right.status).entries()) {
|
|
240
|
+
const status = String(response.status);
|
|
241
|
+
if (responses[status] !== undefined) {
|
|
242
|
+
throw operationError(operation.operationId, `responses.${String(index)}.status`, `duplicates status ${status}`);
|
|
243
|
+
}
|
|
244
|
+
responses[status] = responseFor(contract, operation, response, index);
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
operationId: operation.operationId,
|
|
248
|
+
path: projectedPath.value,
|
|
249
|
+
method: operation.method.toLowerCase(),
|
|
250
|
+
value: {
|
|
251
|
+
operationId: operation.operationId,
|
|
252
|
+
...(parameters.length === 0 ? {} : { parameters }),
|
|
253
|
+
...(requestBody === undefined ? {} : { requestBody }),
|
|
254
|
+
responses,
|
|
255
|
+
security: securityFor(contract, operation),
|
|
256
|
+
...(operation.deprecated ? { deprecated: true } : {}),
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function sortedSecuritySchemes(schemes) {
|
|
261
|
+
const sorted = {};
|
|
262
|
+
for (const name of Object.keys(schemes).toSorted()) {
|
|
263
|
+
const scheme = schemes[name];
|
|
264
|
+
if (scheme !== undefined)
|
|
265
|
+
sorted[name] = scheme;
|
|
266
|
+
}
|
|
267
|
+
return sorted;
|
|
268
|
+
}
|
|
269
|
+
/** Project one serialisable HTTP contract into an OpenAPI 3.1 document. */
|
|
270
|
+
export function toOpenApi(contract, options = {}) {
|
|
271
|
+
if (contract.format !== 1) {
|
|
272
|
+
throw contractError('format', `unsupported HttpContractIR format ${String(contract.format)}`);
|
|
273
|
+
}
|
|
274
|
+
if (!Array.isArray(contract.operations)) {
|
|
275
|
+
throw contractError('operations', 'must be an array');
|
|
276
|
+
}
|
|
277
|
+
const projected = contract.operations
|
|
278
|
+
.map(operation => projectOperation(contract, operation))
|
|
279
|
+
.toSorted((left, right) => {
|
|
280
|
+
if (left.path !== right.path)
|
|
281
|
+
return left.path.localeCompare(right.path);
|
|
282
|
+
if (left.method !== right.method)
|
|
283
|
+
return left.method.localeCompare(right.method);
|
|
284
|
+
return left.operationId.localeCompare(right.operationId);
|
|
285
|
+
});
|
|
286
|
+
const operationIds = new Set();
|
|
287
|
+
const routes = new Map();
|
|
288
|
+
const paths = {};
|
|
289
|
+
for (const operation of projected) {
|
|
290
|
+
if (operationIds.has(operation.operationId)) {
|
|
291
|
+
throw operationError(operation.operationId, 'operationId', 'appears more than once');
|
|
292
|
+
}
|
|
293
|
+
operationIds.add(operation.operationId);
|
|
294
|
+
const routeKey = `${operation.method}\u0000${operation.path}`;
|
|
295
|
+
const previous = routes.get(routeKey);
|
|
296
|
+
if (previous !== undefined) {
|
|
297
|
+
throw operationError(operation.operationId, 'method/path', `${operation.method.toUpperCase()} ${operation.path} overlaps operation ${previous}`);
|
|
298
|
+
}
|
|
299
|
+
routes.set(routeKey, operation.operationId);
|
|
300
|
+
const item = paths[operation.path] ?? {};
|
|
301
|
+
item[operation.method] = operation.value;
|
|
302
|
+
paths[operation.path] = item;
|
|
303
|
+
}
|
|
304
|
+
const info = options.info ?? { title: '@zmdb/web API', version: '0.0.0' };
|
|
305
|
+
const securitySchemes = sortedSecuritySchemes(contract.securitySchemes);
|
|
306
|
+
return Object.keys(securitySchemes).length === 0
|
|
307
|
+
? { openapi: '3.1.0', info, paths }
|
|
308
|
+
: { openapi: '3.1.0', info, paths, components: { securitySchemes } };
|
|
309
|
+
}
|
|
310
|
+
/** Return a handler that serves one prebuilt document by identity. */
|
|
311
|
+
export function serveOpenApi(doc) {
|
|
312
|
+
return () => doc;
|
|
313
|
+
}
|
|
314
|
+
//# 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,9 @@
|
|
|
1
|
+
import type { Guard } from '../middleware/index.js';
|
|
2
|
+
/** Guard instances applied before every route, or every route on one controller. */
|
|
3
|
+
export interface GuardRegistry {
|
|
4
|
+
readonly app?: readonly Guard[];
|
|
5
|
+
readonly controllers?: Readonly<Record<string, readonly Guard[]>>;
|
|
6
|
+
}
|
|
7
|
+
/** Resolve the effective guard chain in runtime order: app, controller, route. */
|
|
8
|
+
export declare function resolveGuards(registry: GuardRegistry | undefined, controllerName: string, routeGuards?: readonly Guard[]): readonly Guard[];
|
|
9
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/pipeline/guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC;CACnE;AAID,kFAAkF;AAClF,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,cAAc,EAAE,MAAM,EACtB,WAAW,GAAE,SAAS,KAAK,EAAc,GACxC,SAAS,KAAK,EAAE,CAOlB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const NO_GUARDS = [];
|
|
2
|
+
/** Resolve the effective guard chain in runtime order: app, controller, route. */
|
|
3
|
+
export function resolveGuards(registry, controllerName, routeGuards = NO_GUARDS) {
|
|
4
|
+
const appGuards = registry?.app ?? NO_GUARDS;
|
|
5
|
+
const controllerGuards = registry?.controllers?.[controllerName] ?? NO_GUARDS;
|
|
6
|
+
if (appGuards.length === 0 && controllerGuards.length === 0) {
|
|
7
|
+
return routeGuards;
|
|
8
|
+
}
|
|
9
|
+
return [...appGuards, ...controllerGuards, ...routeGuards];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/pipeline/guards.ts"],"names":[],"mappings":"AAQA,MAAM,SAAS,GAAqB,EAAE,CAAC;AAEvC,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAC3B,QAAmC,EACnC,cAAsB,EACtB,WAAW,GAAqB,SAAS;IAEzC,MAAM,SAAS,GAAG,QAAQ,EAAE,GAAG,IAAI,SAAS,CAAC;IAC7C,MAAM,gBAAgB,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;IAC9E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,gBAAgB,EAAE,GAAG,WAAW,CAAC,CAAC;AAC7D,CAAC"}
|