@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,211 @@
|
|
|
1
|
+
// @zmdb/web — incremental response compression (epic #564, issue #568).
|
|
2
|
+
//
|
|
3
|
+
// Application compression is the fallback for deployments without a proxy or
|
|
4
|
+
// CDN. It is intentionally limited to the cross-runtime CompressionStream
|
|
5
|
+
// formats: gzip and deflate, never Node-only brotli.
|
|
6
|
+
const DEFAULT_MIN_BYTES = 1024;
|
|
7
|
+
const DEFAULT_TYPES = Object.freeze([
|
|
8
|
+
'text/*',
|
|
9
|
+
'application/json',
|
|
10
|
+
'application/javascript',
|
|
11
|
+
'application/xml',
|
|
12
|
+
'application/xhtml+xml',
|
|
13
|
+
'image/svg+xml',
|
|
14
|
+
'*+json',
|
|
15
|
+
'*+xml',
|
|
16
|
+
]);
|
|
17
|
+
const CODINGS = ['gzip', 'deflate'];
|
|
18
|
+
/** Negotiate and incrementally compress one response. */
|
|
19
|
+
export function compress(response, ctx, options = {}) {
|
|
20
|
+
const headers = withVary(response.headers);
|
|
21
|
+
const existing = header(headers, 'content-encoding');
|
|
22
|
+
if (existing !== undefined) {
|
|
23
|
+
return replaceResponse(response, response.status, response.body, headers);
|
|
24
|
+
}
|
|
25
|
+
const negotiated = negotiate(header(ctx.headers, 'accept-encoding'));
|
|
26
|
+
if (negotiated.coding === undefined && !negotiated.identityAllowed) {
|
|
27
|
+
return replaceResponse(response, 406, { kind: 'text', value: '' }, withoutHeader(headers, 'content-length'));
|
|
28
|
+
}
|
|
29
|
+
if (negotiated.coding === undefined ||
|
|
30
|
+
response.status < 200 ||
|
|
31
|
+
response.status === 204 ||
|
|
32
|
+
response.status === 304 ||
|
|
33
|
+
ctx.method.toUpperCase() === 'HEAD' ||
|
|
34
|
+
!compressibleType(header(headers, 'content-type'), options.types ?? DEFAULT_TYPES) ||
|
|
35
|
+
belowThreshold(response.body, options.minBytes ?? DEFAULT_MIN_BYTES) ||
|
|
36
|
+
options.skip?.(response, ctx) === true) {
|
|
37
|
+
return replaceResponse(response, response.status, response.body, headers);
|
|
38
|
+
}
|
|
39
|
+
// BREACH: do not compress a body that combines a long-lived secret with
|
|
40
|
+
// attacker-controlled text. The framework cannot infer either fact; skip()
|
|
41
|
+
// is the explicit per-response veto.
|
|
42
|
+
const source = bodyStream(response.body);
|
|
43
|
+
const value = source.pipeThrough(new CompressionStream(negotiated.coding));
|
|
44
|
+
const compressedHeaders = {
|
|
45
|
+
...withoutHeader(headers, 'content-length'),
|
|
46
|
+
'content-encoding': negotiated.coding,
|
|
47
|
+
};
|
|
48
|
+
return replaceResponse(response, response.status, { kind: 'stream', value, length: undefined }, compressedHeaders);
|
|
49
|
+
}
|
|
50
|
+
/** The middleware form is deliberately a thin wrapper around the pure function. */
|
|
51
|
+
export function compressionInterceptor(options = {}) {
|
|
52
|
+
return {
|
|
53
|
+
async intercept(ctx, next) {
|
|
54
|
+
const result = await next();
|
|
55
|
+
return isWebResponse(result) ? compress(result, ctx, options) : result;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function negotiate(value) {
|
|
60
|
+
if (value === undefined) {
|
|
61
|
+
return { coding: undefined, identityAllowed: true };
|
|
62
|
+
}
|
|
63
|
+
const qualities = new Map();
|
|
64
|
+
for (const item of value.split(',')) {
|
|
65
|
+
const parts = item.split(';');
|
|
66
|
+
const coding = (parts.shift() ?? '').trim().toLowerCase();
|
|
67
|
+
if (coding.length === 0) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
let quality = 1;
|
|
71
|
+
for (const parameter of parts) {
|
|
72
|
+
const separator = parameter.indexOf('=');
|
|
73
|
+
if (separator === -1 || parameter.slice(0, separator).trim().toLowerCase() !== 'q') {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
quality = parseQuality(parameter.slice(separator + 1).trim());
|
|
77
|
+
}
|
|
78
|
+
const previous = qualities.get(coding);
|
|
79
|
+
qualities.set(coding, previous === 0 || quality === 0 ? 0 : Math.max(previous ?? 0, quality));
|
|
80
|
+
}
|
|
81
|
+
const wildcard = qualities.get('*');
|
|
82
|
+
let selected;
|
|
83
|
+
let selectedQuality = 0;
|
|
84
|
+
for (const coding of CODINGS) {
|
|
85
|
+
const quality = qualities.get(coding) ?? wildcard ?? 0;
|
|
86
|
+
if (quality > selectedQuality) {
|
|
87
|
+
selected = coding;
|
|
88
|
+
selectedQuality = quality;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const explicitIdentity = qualities.get('identity');
|
|
92
|
+
const identityAllowed = explicitIdentity === undefined ? wildcard !== 0 : explicitIdentity > 0;
|
|
93
|
+
return { coding: selectedQuality > 0 ? selected : undefined, identityAllowed };
|
|
94
|
+
}
|
|
95
|
+
function parseQuality(value) {
|
|
96
|
+
if (!/^(?:0(?:\.\d{0,3})?|1(?:\.0{0,3})?)$/.test(value)) {
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
return Number(value);
|
|
100
|
+
}
|
|
101
|
+
function compressibleType(contentType, allowed) {
|
|
102
|
+
if (contentType === undefined) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
const mediaType = contentType.split(';', 1)[0]?.trim().toLowerCase() ?? '';
|
|
106
|
+
for (const entry of allowed) {
|
|
107
|
+
const pattern = entry.trim().toLowerCase();
|
|
108
|
+
if (pattern === mediaType) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
if (pattern.endsWith('/*') && mediaType.startsWith(pattern.slice(0, -1))) {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
if (pattern.startsWith('*+') && mediaType.endsWith(pattern.slice(1))) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
function belowThreshold(body, minimum) {
|
|
121
|
+
switch (body.kind) {
|
|
122
|
+
case 'text':
|
|
123
|
+
return new TextEncoder().encode(body.value).byteLength < minimum;
|
|
124
|
+
case 'bytes':
|
|
125
|
+
return body.value.byteLength < minimum;
|
|
126
|
+
case 'stream':
|
|
127
|
+
return body.length !== undefined && body.length < minimum;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function bodyStream(body) {
|
|
131
|
+
if (body.kind === 'stream') {
|
|
132
|
+
return body.value;
|
|
133
|
+
}
|
|
134
|
+
const chunk = body.kind === 'text' ? new TextEncoder().encode(body.value) : body.value;
|
|
135
|
+
return new ReadableStream({
|
|
136
|
+
start(controller) {
|
|
137
|
+
controller.enqueue(chunk);
|
|
138
|
+
controller.close();
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function withVary(headers) {
|
|
143
|
+
const existing = header(headers, 'vary');
|
|
144
|
+
const values = existing === undefined
|
|
145
|
+
? []
|
|
146
|
+
: existing
|
|
147
|
+
.split(',')
|
|
148
|
+
.map(value => value.trim())
|
|
149
|
+
.filter(value => value.length > 0);
|
|
150
|
+
if (!values.some(value => value.toLowerCase() === 'accept-encoding')) {
|
|
151
|
+
values.push('accept-encoding');
|
|
152
|
+
}
|
|
153
|
+
return { ...withoutHeader(headers, 'vary'), vary: values.join(', ') };
|
|
154
|
+
}
|
|
155
|
+
function withoutHeader(headers, unwanted) {
|
|
156
|
+
let found = false;
|
|
157
|
+
for (const name of Object.keys(headers)) {
|
|
158
|
+
if (name.toLowerCase() === unwanted) {
|
|
159
|
+
found = true;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (!found) {
|
|
164
|
+
return headers;
|
|
165
|
+
}
|
|
166
|
+
const result = {};
|
|
167
|
+
for (const name of Object.keys(headers)) {
|
|
168
|
+
if (name.toLowerCase() !== unwanted) {
|
|
169
|
+
result[name] = headers[name] ?? '';
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
function header(headers, wanted) {
|
|
175
|
+
for (const name of Object.keys(headers)) {
|
|
176
|
+
if (name.toLowerCase() === wanted) {
|
|
177
|
+
return headers[name];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Clone every own property descriptor before replacing the public response
|
|
184
|
+
* fields. This preserves the pipeline's non-enumerable response marker without
|
|
185
|
+
* exporting or duplicating that private symbol.
|
|
186
|
+
*/
|
|
187
|
+
function replaceResponse(response, status, body, headers) {
|
|
188
|
+
const clone = Object.create(Object.getPrototypeOf(response));
|
|
189
|
+
Object.defineProperties(clone, Object.getOwnPropertyDescriptors(response));
|
|
190
|
+
Object.defineProperties(clone, {
|
|
191
|
+
status: { configurable: true, enumerable: true, value: status, writable: true },
|
|
192
|
+
body: { configurable: true, enumerable: true, value: body, writable: true },
|
|
193
|
+
headers: { configurable: true, enumerable: true, value: headers, writable: true },
|
|
194
|
+
});
|
|
195
|
+
return clone;
|
|
196
|
+
}
|
|
197
|
+
function isWebResponse(value) {
|
|
198
|
+
if (typeof value !== 'object' || value === null) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
const status = Reflect.get(value, 'status');
|
|
202
|
+
const headers = Reflect.get(value, 'headers');
|
|
203
|
+
const body = Reflect.get(value, 'body');
|
|
204
|
+
return (typeof status === 'number' &&
|
|
205
|
+
typeof headers === 'object' &&
|
|
206
|
+
headers !== null &&
|
|
207
|
+
typeof body === 'object' &&
|
|
208
|
+
body !== null &&
|
|
209
|
+
typeof Reflect.get(body, 'kind') === 'string');
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compression/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { RequestData } from '@zmdb/app/data';
|
|
2
|
+
import type { Span } from '@zmdb/app/observability';
|
|
3
|
+
/**
|
|
4
|
+
* Derive a params object from a route path string. Each `:name` segment becomes
|
|
5
|
+
* a required `string` property. Static paths yield an empty object type.
|
|
6
|
+
*
|
|
7
|
+
* PathParams<'/users/:id/posts/:postId'> = { id: string; postId: string }
|
|
8
|
+
*/
|
|
9
|
+
export type PathParams<Path extends string> = Path extends `${string}:${infer Param}/${infer Rest}` ? {
|
|
10
|
+
[K in Param | keyof PathParams<`/${Rest}`>]: string;
|
|
11
|
+
} : Path extends `${string}:${infer Param}` ? {
|
|
12
|
+
[K in Param]: string;
|
|
13
|
+
} : Record<never, string>;
|
|
14
|
+
/** Query string values: a single string or a repeated-key array. */
|
|
15
|
+
export type QueryValues = Record<string, string | readonly string[]>;
|
|
16
|
+
/**
|
|
17
|
+
* The single argument a handler receives. Stage 3 has no parameter decorators,
|
|
18
|
+
* so params/body/query/headers arrive on one strongly-typed context object.
|
|
19
|
+
*/
|
|
20
|
+
export interface Ctx<Params extends Record<string, string> = Record<never, string>, Body = unknown, Query extends QueryValues = Record<never, string>> extends RequestData {
|
|
21
|
+
readonly params: Params;
|
|
22
|
+
readonly body: Body;
|
|
23
|
+
readonly query: Query;
|
|
24
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
25
|
+
readonly method: string;
|
|
26
|
+
readonly path: string;
|
|
27
|
+
readonly span?: Span;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A handler signature bound to a route path: `ctx.params` is exactly
|
|
31
|
+
* `PathParams<Path>`, so reading an undeclared param is a compile error and no
|
|
32
|
+
* `as` is ever needed to type params.
|
|
33
|
+
*/
|
|
34
|
+
export type HandlerFor<Path extends string, Body = unknown, Query extends QueryValues = Record<never, string>, Result = unknown> = (ctx: Ctx<PathParams<Path>, Body, Query>) => Result | Promise<Result>;
|
|
35
|
+
/**
|
|
36
|
+
* A route pattern with its `:param` slots resolved. Build one per route at
|
|
37
|
+
* registration time with {@link compilePattern} and match many requests against
|
|
38
|
+
* it with {@link matchCompiled}.
|
|
39
|
+
*/
|
|
40
|
+
export interface CompiledPattern {
|
|
41
|
+
/** The pattern this was built from, for diagnostics. */
|
|
42
|
+
readonly pattern: string;
|
|
43
|
+
/** Non-empty segment count — the bucket a request path must share to match. */
|
|
44
|
+
readonly segmentCount: number;
|
|
45
|
+
/** Static text per segment; `null` marks a `:param` slot. */
|
|
46
|
+
readonly literals: readonly (string | null)[];
|
|
47
|
+
/** Param names in slot order, parallel to the `null`s in {@link literals}. */
|
|
48
|
+
readonly names: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
/** Resolve a route pattern's segments and `:param` slots. Call once per route. */
|
|
51
|
+
export declare function compilePattern(pattern: string): CompiledPattern;
|
|
52
|
+
/** Count a path's non-empty segments, so leading/trailing slashes don't count. */
|
|
53
|
+
export declare function countSegments(path: string): number;
|
|
54
|
+
/**
|
|
55
|
+
* Match a concrete `path` against an already-{@link compilePattern}ed route.
|
|
56
|
+
* Returns the params on a match, or `undefined` on a segment-count or static
|
|
57
|
+
* mismatch. A pattern with no params allocates nothing and yields a shared
|
|
58
|
+
* frozen empty object; one with params allocates the params object and one
|
|
59
|
+
* string per param, and nothing else.
|
|
60
|
+
*/
|
|
61
|
+
export declare function matchCompiled(compiled: CompiledPattern, path: string): Record<string, string> | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Match a concrete `path` against a route `pattern` and extract its params.
|
|
64
|
+
* Returns the params record on a match (a shared frozen empty object when the
|
|
65
|
+
* pattern has no params), or `undefined` when the segment counts differ or a
|
|
66
|
+
* static segment mismatches.
|
|
67
|
+
*
|
|
68
|
+
* This compiles `pattern` on every call, which is the right trade only for
|
|
69
|
+
* one-off matches. A dispatcher matching many requests against a fixed route
|
|
70
|
+
* table should hoist {@link compilePattern} to registration and call
|
|
71
|
+
* {@link matchCompiled} per request — see `../pipeline`.
|
|
72
|
+
*/
|
|
73
|
+
export declare function extractParams(pattern: string, path: string): Record<string, string> | undefined;
|
|
74
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,MAAM,UAAU,CAAC,IAAI,SAAS,MAAM,IAAI,IAAI,SAAS,GAAG,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,GAC/F;KAAG,CAAC,IAAI,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM;CAAE,GACvD,IAAI,SAAS,GAAG,MAAM,IAAI,MAAM,KAAK,EAAE,GACrC;KAAG,CAAC,IAAI,KAAK,GAAG,MAAM;CAAE,GACxB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAE5B,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC;AAErE;;;GAGG;AACH,MAAM,WAAW,GAAG,CAClB,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAC7D,IAAI,GAAG,OAAO,EACd,KAAK,SAAS,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CACjD,SAAQ,WAAW;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,CACpB,IAAI,SAAS,MAAM,EACnB,IAAI,GAAG,OAAO,EACd,KAAK,SAAS,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EACjD,MAAM,GAAG,OAAO,IACd,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAY1E;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9C,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAQD,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAa/D;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAmCzG;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAE/F"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// @zmdb/web — typed request context + compile-time path-param derivation
|
|
2
|
+
// (epic #257, spec ./SPEC.md). Pure types + one small runtime helper. No `as`,
|
|
3
|
+
// no reflection.
|
|
4
|
+
// A route pattern is a compile-time constant, but the path it is matched against
|
|
5
|
+
// is not. Splitting the *pattern* per request — which is what a `split`-based
|
|
6
|
+
// matcher does — re-derives a known answer on every call, and the intermediate
|
|
7
|
+
// arrays are garbage the collector then has to chase. So patterns are resolved
|
|
8
|
+
// once, at registration, into the shape below, and matching walks the request
|
|
9
|
+
// path by character index rather than materializing it as an array.
|
|
10
|
+
const SLASH = 47; // '/'
|
|
11
|
+
const COLON = 58; // ':'
|
|
12
|
+
// A match against a pattern with no params has no per-request state, so every
|
|
13
|
+
// such match can share one object. It is frozen because sharing a mutable one
|
|
14
|
+
// would let a handler's write leak into unrelated requests; `Ctx.params` is
|
|
15
|
+
// declared `readonly`, so freezing only makes the runtime agree with the types.
|
|
16
|
+
const EMPTY_PARAMS = Object.freeze({});
|
|
17
|
+
/** Resolve a route pattern's segments and `:param` slots. Call once per route. */
|
|
18
|
+
export function compilePattern(pattern) {
|
|
19
|
+
const literals = [];
|
|
20
|
+
const names = [];
|
|
21
|
+
for (const segment of pattern.split('/')) {
|
|
22
|
+
if (segment.length === 0)
|
|
23
|
+
continue;
|
|
24
|
+
if (segment.charCodeAt(0) === COLON) {
|
|
25
|
+
literals.push(null);
|
|
26
|
+
names.push(segment.slice(1));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
literals.push(segment);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { pattern, segmentCount: literals.length, literals, names };
|
|
33
|
+
}
|
|
34
|
+
/** Count a path's non-empty segments, so leading/trailing slashes don't count. */
|
|
35
|
+
export function countSegments(path) {
|
|
36
|
+
let count = 0;
|
|
37
|
+
let i = 0;
|
|
38
|
+
while (i < path.length) {
|
|
39
|
+
while (i < path.length && path.charCodeAt(i) === SLASH)
|
|
40
|
+
i += 1;
|
|
41
|
+
if (i >= path.length)
|
|
42
|
+
break;
|
|
43
|
+
count += 1;
|
|
44
|
+
while (i < path.length && path.charCodeAt(i) !== SLASH)
|
|
45
|
+
i += 1;
|
|
46
|
+
}
|
|
47
|
+
return count;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Match a concrete `path` against an already-{@link compilePattern}ed route.
|
|
51
|
+
* Returns the params on a match, or `undefined` on a segment-count or static
|
|
52
|
+
* mismatch. A pattern with no params allocates nothing and yields a shared
|
|
53
|
+
* frozen empty object; one with params allocates the params object and one
|
|
54
|
+
* string per param, and nothing else.
|
|
55
|
+
*/
|
|
56
|
+
export function matchCompiled(compiled, path) {
|
|
57
|
+
const { literals, names, segmentCount } = compiled;
|
|
58
|
+
let params;
|
|
59
|
+
let segment = 0;
|
|
60
|
+
let nameIndex = 0;
|
|
61
|
+
let i = 0;
|
|
62
|
+
while (i < path.length) {
|
|
63
|
+
while (i < path.length && path.charCodeAt(i) === SLASH)
|
|
64
|
+
i += 1;
|
|
65
|
+
if (i >= path.length)
|
|
66
|
+
break;
|
|
67
|
+
if (segment === segmentCount)
|
|
68
|
+
return undefined; // path is longer
|
|
69
|
+
let end = path.indexOf('/', i);
|
|
70
|
+
if (end === -1)
|
|
71
|
+
end = path.length;
|
|
72
|
+
const literal = literals[segment];
|
|
73
|
+
// `segment < segmentCount` and `segmentCount === literals.length`, so the
|
|
74
|
+
// index is always in range and `undefined` is unreachable — only `null`, the
|
|
75
|
+
// param marker, actually reaches this branch. `names[nameIndex]` is likewise
|
|
76
|
+
// present: `compilePattern` pushed one name per `null` in `literals`, and
|
|
77
|
+
// this walk visits them in that same order.
|
|
78
|
+
if (literal === null || literal === undefined) {
|
|
79
|
+
params ??= {};
|
|
80
|
+
params[names[nameIndex] ?? ''] = path.slice(i, end);
|
|
81
|
+
nameIndex += 1;
|
|
82
|
+
}
|
|
83
|
+
else if (!literalMatches(literal, path, i, end)) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
segment += 1;
|
|
87
|
+
i = end;
|
|
88
|
+
}
|
|
89
|
+
if (segment !== segmentCount)
|
|
90
|
+
return undefined; // path is shorter
|
|
91
|
+
return params ?? EMPTY_PARAMS;
|
|
92
|
+
}
|
|
93
|
+
// Compare a static segment against path[from, to) without slicing out a
|
|
94
|
+
// substring just to throw it away.
|
|
95
|
+
function literalMatches(literal, path, from, to) {
|
|
96
|
+
if (literal.length !== to - from)
|
|
97
|
+
return false;
|
|
98
|
+
for (let k = 0; k < literal.length; k += 1) {
|
|
99
|
+
if (literal.charCodeAt(k) !== path.charCodeAt(from + k))
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Match a concrete `path` against a route `pattern` and extract its params.
|
|
106
|
+
* Returns the params record on a match (a shared frozen empty object when the
|
|
107
|
+
* pattern has no params), or `undefined` when the segment counts differ or a
|
|
108
|
+
* static segment mismatches.
|
|
109
|
+
*
|
|
110
|
+
* This compiles `pattern` on every call, which is the right trade only for
|
|
111
|
+
* one-off matches. A dispatcher matching many requests against a fixed route
|
|
112
|
+
* table should hoist {@link compilePattern} to registration and call
|
|
113
|
+
* {@link matchCompiled} per request — see `../pipeline`.
|
|
114
|
+
*/
|
|
115
|
+
export function extractParams(pattern, path) {
|
|
116
|
+
return matchCompiled(compilePattern(pattern), path);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ClientResponseError } from '@zmdb/client';
|
|
2
|
+
import type { CallOptions, ClientOptions } from '@zmdb/client';
|
|
3
|
+
export type PatchAccountsAccountIdPathAccountId = string;
|
|
4
|
+
export type PatchAccountsAccountIdQueryInclude = readonly (string)[];
|
|
5
|
+
export type PatchAccountsAccountIdQueryDryRun = boolean;
|
|
6
|
+
export type PatchAccountsAccountIdHeaderRequestId = string;
|
|
7
|
+
export type PatchAccountsAccountIdCookieSession = string;
|
|
8
|
+
type PatchAccountsAccountIdRequestBodyUpdateAccountBody = {
|
|
9
|
+
readonly displayName: string;
|
|
10
|
+
readonly metadata: Readonly<Record<string, unknown>> | null;
|
|
11
|
+
};
|
|
12
|
+
export type PatchAccountsAccountIdRequestBody = PatchAccountsAccountIdRequestBodyUpdateAccountBody;
|
|
13
|
+
export interface PatchAccountsAccountIdInput {
|
|
14
|
+
readonly path: {
|
|
15
|
+
readonly accountId: PatchAccountsAccountIdPathAccountId;
|
|
16
|
+
};
|
|
17
|
+
readonly query?: {
|
|
18
|
+
readonly include?: PatchAccountsAccountIdQueryInclude | undefined;
|
|
19
|
+
readonly dryRun?: PatchAccountsAccountIdQueryDryRun | undefined;
|
|
20
|
+
};
|
|
21
|
+
readonly headers?: {
|
|
22
|
+
readonly requestId?: PatchAccountsAccountIdHeaderRequestId | undefined;
|
|
23
|
+
};
|
|
24
|
+
readonly cookies: {
|
|
25
|
+
readonly session: PatchAccountsAccountIdCookieSession;
|
|
26
|
+
};
|
|
27
|
+
readonly body: PatchAccountsAccountIdRequestBody;
|
|
28
|
+
}
|
|
29
|
+
export type PatchAccountsAccountIdResponse200HeaderEtag = string;
|
|
30
|
+
export interface PatchAccountsAccountIdResponse200Headers {
|
|
31
|
+
readonly etag: PatchAccountsAccountIdResponse200HeaderEtag;
|
|
32
|
+
}
|
|
33
|
+
type PatchAccountsAccountIdResponse200Response200BodyAccount = {
|
|
34
|
+
readonly id: string;
|
|
35
|
+
readonly displayName: string;
|
|
36
|
+
};
|
|
37
|
+
export type PatchAccountsAccountIdResponse200Response200Body = PatchAccountsAccountIdResponse200Response200BodyAccount;
|
|
38
|
+
type PatchAccountsAccountIdResponse202Response202BodyAcceptedUpdate = {
|
|
39
|
+
readonly jobId: string;
|
|
40
|
+
};
|
|
41
|
+
export type PatchAccountsAccountIdResponse202Response202Body = PatchAccountsAccountIdResponse202Response202BodyAcceptedUpdate;
|
|
42
|
+
type PatchAccountsAccountIdResponse404Response404BodyProblem = {
|
|
43
|
+
readonly code: string;
|
|
44
|
+
readonly message: string;
|
|
45
|
+
};
|
|
46
|
+
export type PatchAccountsAccountIdResponse404Response404Body = PatchAccountsAccountIdResponse404Response404BodyProblem;
|
|
47
|
+
export type PatchAccountsAccountIdResult = {
|
|
48
|
+
readonly status: 200;
|
|
49
|
+
readonly body: PatchAccountsAccountIdResponse200Response200Body;
|
|
50
|
+
readonly headers: PatchAccountsAccountIdResponse200Headers;
|
|
51
|
+
} | {
|
|
52
|
+
readonly status: 202;
|
|
53
|
+
readonly body: PatchAccountsAccountIdResponse202Response202Body;
|
|
54
|
+
readonly headers: Readonly<Record<never, never>>;
|
|
55
|
+
} | {
|
|
56
|
+
readonly status: 204;
|
|
57
|
+
readonly body: void;
|
|
58
|
+
readonly headers: Readonly<Record<never, never>>;
|
|
59
|
+
};
|
|
60
|
+
export type PatchAccountsAccountIdError = ClientResponseError<404, PatchAccountsAccountIdResponse404Response404Body, Readonly<Record<never, never>>>;
|
|
61
|
+
export declare function isPatchAccountsAccountIdError(error: unknown): error is PatchAccountsAccountIdError;
|
|
62
|
+
export type PatchAccountsAccountIdCallOptions = CallOptions & {
|
|
63
|
+
readonly version?: "1" | "2";
|
|
64
|
+
};
|
|
65
|
+
export interface ApiClient {
|
|
66
|
+
patch_accounts_accountId(input: PatchAccountsAccountIdInput, options?: PatchAccountsAccountIdCallOptions): Promise<PatchAccountsAccountIdResult>;
|
|
67
|
+
}
|
|
68
|
+
export declare function createApiClient(options: ClientOptions): ApiClient;
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=http-client.generated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.generated.d.ts","sourceRoot":"","sources":["../../../src/contract/__fixtures__/http-client.generated.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,mBAAmB,EAAgH,MAAM,cAAc,CAAC;AAErL,OAAO,KAAK,EAAE,WAAW,EAAiB,aAAa,EAAqD,MAAM,cAAc,CAAC;AAcjI,MAAM,MAAM,mCAAmC,GAAG,MAAM,CAAC;AAEzD,MAAM,MAAM,kCAAkC,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAErE,MAAM,MAAM,iCAAiC,GAAG,OAAO,CAAC;AAExD,MAAM,MAAM,qCAAqC,GAAG,MAAM,CAAC;AAE3D,MAAM,MAAM,mCAAmC,GAAG,MAAM,CAAC;AAEzD,KAAK,kDAAkD,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;CAAE,CAAC;AAEzJ,MAAM,MAAM,iCAAiC,GAAG,kDAAkD,CAAC;AAEnG,MAAM,WAAW,2BAA2B;IAAG,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,mCAAmC,CAAC;KAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,kCAAkC,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,iCAAiC,GAAG,SAAS,CAAC;KAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,qCAAqC,GAAG,SAAS,CAAC;KAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,mCAAmC,CAAC;KAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,iCAAiC,CAAC;CAAE;AAEvf,MAAM,MAAM,2CAA2C,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,wCAAwC;IAAG,QAAQ,CAAC,IAAI,EAAE,2CAA2C,CAAC;CAAE;AAEzH,KAAK,uDAAuD,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAAE,CAAC;AAEtH,MAAM,MAAM,gDAAgD,GAAG,uDAAuD,CAAC;AAEvH,KAAK,8DAA8D,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAAE,CAAC;AAElG,MAAM,MAAM,gDAAgD,GAAG,8DAA8D,CAAC;AAE9H,KAAK,uDAAuD,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAAE,CAAC;AAEpH,MAAM,MAAM,gDAAgD,GAAG,uDAAuD,CAAC;AAEvH,MAAM,MAAM,4BAA4B,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gDAAgD,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,wCAAwC,CAAC;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gDAAgD,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;CAAE,CAAC;AAEpb,MAAM,MAAM,2BAA2B,GAAG,mBAAmB,CAAC,GAAG,EAAE,gDAAgD,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAErJ,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,2BAA2B,CAAqI;AAExO,MAAM,MAAM,iCAAiC,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;CAAE,CAAC;AAchG,MAAM,WAAW,SAAS;IAAsB,wBAAwB,CAAC,KAAK,EAAE,2BAA2B,EAAE,OAAO,CAAC,EAAE,iCAAiC,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;CAAE;AAEnM,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,CAAoW"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// @generated by zmdb http-client; contract-format=1; generator=1.0.0
|
|
2
|
+
import { ClientRequestError, ClientResponseError, ResponseValidationError, createClientRuntime, prepareClientBody, stringifyClientScalar, substituteClientPath } from '@zmdb/client';
|
|
3
|
+
function _zmdbClientIssues0(_v, _p, _o) { if (!(typeof _v === "object" && _v !== null && !Array.isArray(_v))) {
|
|
4
|
+
_zmdbClientIssue(_o, _p, "object", _v);
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
if (!(typeof _v.etag === "string"))
|
|
8
|
+
_zmdbClientIssue(_o, _p + ".etag", "string", _v.etag);
|
|
9
|
+
} }
|
|
10
|
+
function _zmdbClientIssue(out, path, expected, value) { out.push({ path, expected, value, message: "expected " + expected }); }
|
|
11
|
+
function _zmdbClientCheckAccount1(_v) { return typeof _v === "object" && _v !== null && !Array.isArray(_v) && (typeof _v.id === "string") && (typeof _v.displayName === "string"); }
|
|
12
|
+
function _zmdbClientIssues2(_v, _p, _o) { _zmdbClientIssuesAccount3(_v, _p, _o); }
|
|
13
|
+
function _zmdbClientIssuesAccount3(_v, _p, _o) { if (!(typeof _v === "object" && _v !== null && !Array.isArray(_v))) {
|
|
14
|
+
_zmdbClientIssue(_o, _p, "Account", _v);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
if (!(typeof _v.id === "string"))
|
|
18
|
+
_zmdbClientIssue(_o, _p + ".id", "string", _v.id);
|
|
19
|
+
if (!(typeof _v.displayName === "string"))
|
|
20
|
+
_zmdbClientIssue(_o, _p + ".displayName", "string", _v.displayName);
|
|
21
|
+
} }
|
|
22
|
+
function _zmdbClientCheckAcceptedUpdate4(_v) { return typeof _v === "object" && _v !== null && !Array.isArray(_v) && (typeof _v.jobId === "string"); }
|
|
23
|
+
function _zmdbClientIssues5(_v, _p, _o) { _zmdbClientIssuesAcceptedUpdate6(_v, _p, _o); }
|
|
24
|
+
function _zmdbClientIssuesAcceptedUpdate6(_v, _p, _o) { if (!(typeof _v === "object" && _v !== null && !Array.isArray(_v))) {
|
|
25
|
+
_zmdbClientIssue(_o, _p, "AcceptedUpdate", _v);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
if (!(typeof _v.jobId === "string"))
|
|
29
|
+
_zmdbClientIssue(_o, _p + ".jobId", "string", _v.jobId);
|
|
30
|
+
} }
|
|
31
|
+
function _zmdbClientCheckProblem7(_v) { return typeof _v === "object" && _v !== null && !Array.isArray(_v) && (typeof _v.code === "string") && (typeof _v.message === "string"); }
|
|
32
|
+
function _zmdbClientIssues8(_v, _p, _o) { _zmdbClientIssuesProblem9(_v, _p, _o); }
|
|
33
|
+
function _zmdbClientIssuesProblem9(_v, _p, _o) { if (!(typeof _v === "object" && _v !== null && !Array.isArray(_v))) {
|
|
34
|
+
_zmdbClientIssue(_o, _p, "Problem", _v);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
if (!(typeof _v.code === "string"))
|
|
38
|
+
_zmdbClientIssue(_o, _p + ".code", "string", _v.code);
|
|
39
|
+
if (!(typeof _v.message === "string"))
|
|
40
|
+
_zmdbClientIssue(_o, _p + ".message", "string", _v.message);
|
|
41
|
+
} }
|
|
42
|
+
export function isPatchAccountsAccountIdError(error) { return error instanceof ClientResponseError && error.operationId === "patch_accounts_accountId" && [404].includes(error.status); }
|
|
43
|
+
function _decodePatchAccountsAccountIdResponse200Headers(headers) { const value = { etag: headers["etag"] }; const result = ((() => { if ((typeof value === "object" && value !== null && !Array.isArray(value) && (typeof value.etag === "string")))
|
|
44
|
+
return { success: true, data: value }; const _e = []; _zmdbClientIssues0(value, "input", _e); return { success: false, errors: _e }; })()); return result.success ? { ok: true, value: result.data } : { ok: false, issues: result.errors }; }
|
|
45
|
+
function _decodePatchAccountsAccountIdResponse200Response200Body(wire) { const value = wire; const result = ((() => { if ((_zmdbClientCheckAccount1(value)))
|
|
46
|
+
return { success: true, data: value }; const _e = []; _zmdbClientIssues2(value, "input", _e); return { success: false, errors: _e }; })()); return result.success ? { ok: true, value: result.data } : { ok: false, issues: result.errors }; }
|
|
47
|
+
function _decodePatchAccountsAccountIdResponse202Response202Body(wire) { const value = wire; const result = ((() => { if ((_zmdbClientCheckAcceptedUpdate4(value)))
|
|
48
|
+
return { success: true, data: value }; const _e = []; _zmdbClientIssues5(value, "input", _e); return { success: false, errors: _e }; })()); return result.success ? { ok: true, value: result.data } : { ok: false, issues: result.errors }; }
|
|
49
|
+
function _decodePatchAccountsAccountIdResponse404Response404Body(wire) { const value = wire; const result = ((() => { if ((_zmdbClientCheckProblem7(value)))
|
|
50
|
+
return { success: true, data: value }; const _e = []; _zmdbClientIssues8(value, "input", _e); return { success: false, errors: _e }; })()); return result.success ? { ok: true, value: result.data } : { ok: false, issues: result.errors }; }
|
|
51
|
+
// operation patch_accounts_accountId
|
|
52
|
+
const _operationPatchAccountsAccountId = Object.freeze({ abi: 1, operationId: "patch_accounts_accountId", method: "PATCH", security: [{ "bearerAuth": [] }, { "apiKeyAuth": [] }], schemes: { "apiKeyAuth": { "in": "header", "name": "x-api-key", "type": "apiKey" }, "bearerAuth": { "scheme": "bearer", "type": "http" } }, version: { "default": "1", "kind": "header", "values": ["1", "2"] }, prepare(input, version) { let path = "/accounts/:accountId"; const query = []; const headers = {}; const cookies = []; path = substituteClientPath(path, "accountId", input.path.accountId); if (input.query?.include !== undefined) {
|
|
53
|
+
for (const value of input.query?.include)
|
|
54
|
+
query.push({ name: "include", value: stringifyClientScalar(value) });
|
|
55
|
+
} if (input.query?.dryRun !== undefined)
|
|
56
|
+
query.push({ name: "dry-run", value: stringifyClientScalar(input.query?.dryRun) }); if (input.headers?.requestId !== undefined)
|
|
57
|
+
headers["x-request-id"] = stringifyClientScalar(input.headers?.requestId); if (input.cookies.session !== undefined)
|
|
58
|
+
cookies.push({ name: "session", value: stringifyClientScalar(input.cookies.session) }); headers["accept-version"] = version ?? "1"; headers.accept = "application/json, application/problem+json"; const body = prepareClientBody("json", input.body); headers['content-type'] = "application/json"; return { path, query, headers, cookies, ...(body === undefined ? {} : { body }) }; }, async read(response, version) { switch (response.status) {
|
|
59
|
+
case 200: {
|
|
60
|
+
const decodedHeaders = _decodePatchAccountsAccountIdResponse200Headers(response.headers);
|
|
61
|
+
if (!decodedHeaders.ok)
|
|
62
|
+
throw new ResponseValidationError("patch_accounts_accountId", 200, decodedHeaders.issues);
|
|
63
|
+
const headers = decodedHeaders.value;
|
|
64
|
+
const body = await response.body.json("application/json", _decodePatchAccountsAccountIdResponse200Response200Body);
|
|
65
|
+
return { status: 200, body, headers };
|
|
66
|
+
}
|
|
67
|
+
case 202: {
|
|
68
|
+
const headers = {};
|
|
69
|
+
const body = await response.body.json("application/json", _decodePatchAccountsAccountIdResponse202Response202Body);
|
|
70
|
+
return { status: 202, body, headers };
|
|
71
|
+
}
|
|
72
|
+
case 204: {
|
|
73
|
+
const headers = {};
|
|
74
|
+
await response.body.empty();
|
|
75
|
+
const body = undefined;
|
|
76
|
+
return { status: 204, body, headers };
|
|
77
|
+
}
|
|
78
|
+
case 404: {
|
|
79
|
+
const headers = {};
|
|
80
|
+
const body = await response.body.json("application/problem+json", _decodePatchAccountsAccountIdResponse404Response404Body);
|
|
81
|
+
throw new ClientResponseError("patch_accounts_accountId", 404, body, headers);
|
|
82
|
+
}
|
|
83
|
+
default: return response.unexpectedStatus();
|
|
84
|
+
} } });
|
|
85
|
+
export function createApiClient(options) { const runtime = createClientRuntime(options); function _callPatchAccountsAccountId(input, callOptions) { return runtime.call(_operationPatchAccountsAccountId, input, callOptions); } return { patch_accounts_accountId: _callPatchAccountsAccountId }; }
|
|
86
|
+
//# sourceMappingURL=http-client.generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.generated.js","sourceRoot":"","sources":["../../../src/contract/__fixtures__/http-client.generated.ts"],"names":[],"mappings":"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"}
|