stitchkit 0.37.0 → 0.38.0
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/dist/browser/client-url.d.ts +11 -0
- package/dist/browser/client-url.d.ts.map +1 -0
- package/dist/browser/client.d.ts +16 -4
- package/dist/browser/client.d.ts.map +1 -1
- package/dist/browser/http.d.ts +5 -1
- package/dist/browser/http.d.ts.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/contract/define.d.ts +75 -1
- package/dist/contract/define.d.ts.map +1 -1
- package/dist/contract/index.d.ts +1 -1
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/contract/index.js +1 -1
- package/dist/{index-xq45akyd.js → index-bgdd42pt.js} +1 -1
- package/dist/{index-s6yhmg1k.js → index-n5t4gnfz.js} +3 -1
- package/dist/{index-4pvtq6h2.js → index-p3kwf73n.js} +84 -23
- package/dist/{index-g3jrbd0z.js → index-x4wbc8sz.js} +28 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +147 -114
- package/dist/node.js +2 -2
- package/dist/observability/index.js +1 -1
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/implement.d.ts.map +1 -1
- package/dist/server/index.js +19 -5
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/response-metadata.d.ts +9 -0
- package/dist/server/response-metadata.d.ts.map +1 -0
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/types.d.ts +10 -2
- package/dist/server/types.d.ts.map +1 -1
- package/dist/tools/mount.d.ts.map +1 -1
- package/dist/tools/remote.d.ts.map +1 -1
- package/dist/tools.js +128 -114
- package/llms-full.txt +165 -10
- package/package.json +1 -1
- /package/dist/{index-e497hxcy.js → index-mzx0an0s.js} +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EndpointDef } from '../contract';
|
|
2
|
+
import type { ContractClientConfig } from './client';
|
|
3
|
+
export interface ClientRequestPlan {
|
|
4
|
+
relativeUrl: string;
|
|
5
|
+
remainingArgs: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
/** Plan the complete request URL and body/form fields without executing I/O. */
|
|
8
|
+
export declare function planClientRequest<K extends string>(endpoint: EndpointDef, contractPrefix: string, args: Record<string, unknown>, config?: ContractClientConfig<K>): ClientRequestPlan;
|
|
9
|
+
/** Join a configured absolute or relative base with a planner-owned relative URL. */
|
|
10
|
+
export declare function joinClientBaseUrl(baseUrl: string, relativeUrl: string): string;
|
|
11
|
+
//# sourceMappingURL=client-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-url.d.ts","sourceRoot":"","sources":["../../src/browser/client-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,oBAAoB,EAAkB,MAAM,UAAU,CAAC;AAIrE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AA4HD,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAChD,QAAQ,EAAE,WAAW,EACrB,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,iBAAiB,CAenB;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAI9E"}
|
package/dist/browser/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ContractDef, EndpointDef, ScopedHttpClient,
|
|
1
|
+
import type { ContractDef, EndpointDef, ScopedHttpClient, ScopedUrlBuilder } from '../contract';
|
|
2
2
|
import { type HttpClient as HttpAdapter } from './http';
|
|
3
3
|
/** Config for the built-in fetch client — used when no `HttpClient` is passed. */
|
|
4
4
|
export interface ClientConfig {
|
|
@@ -14,6 +14,10 @@ export interface ClientConfig {
|
|
|
14
14
|
export type ScopedKeys<K extends string> = [K] extends [never] ? unknown : {
|
|
15
15
|
[P in K]: string;
|
|
16
16
|
};
|
|
17
|
+
/** The declared keys available to a dynamic path-prefix callback. */
|
|
18
|
+
export type PathPrefixArgs<K extends string> = {
|
|
19
|
+
[P in K]: string;
|
|
20
|
+
};
|
|
17
21
|
/**
|
|
18
22
|
* Per-contract client tweaks — a dynamic URL `pathPrefix` and the keys it
|
|
19
23
|
* consumes. List the consumed keys in `stripPrefixKeys` (e.g. `['tenantId']`)
|
|
@@ -21,7 +25,7 @@ export type ScopedKeys<K extends string> = [K] extends [never] ? unknown : {
|
|
|
21
25
|
* no hand-written scoped-client wrapper.
|
|
22
26
|
*/
|
|
23
27
|
export interface ContractClientConfig<K extends string = never> {
|
|
24
|
-
pathPrefix?: string | ((args:
|
|
28
|
+
pathPrefix?: string | ((args: PathPrefixArgs<K>) => string);
|
|
25
29
|
stripPrefixKeys?: readonly K[];
|
|
26
30
|
}
|
|
27
31
|
/**
|
|
@@ -36,7 +40,15 @@ export declare function createClient<T extends Record<string, EndpointDef>, cons
|
|
|
36
40
|
* from a `name → contract` registry. Each key keeps its own client type, so
|
|
37
41
|
* the project lists its contracts once and gets the whole typed API.
|
|
38
42
|
*/
|
|
39
|
-
export declare function createClients<T extends Record<string, ContractDef<Record<string, EndpointDef>, string
|
|
40
|
-
[
|
|
43
|
+
export declare function createClients<T extends Record<string, ContractDef<Record<string, EndpointDef>, string>>, const K extends string = never>(contracts: T, configOrClient: ClientConfig | HttpAdapter, contractConfig?: ContractClientConfig<K>): {
|
|
44
|
+
[P in keyof T]: ScopedHttpClient<T[P]['endpoints'], ScopedKeys<K>>;
|
|
45
|
+
};
|
|
46
|
+
/** Base URL source for synchronous contract URL builders. */
|
|
47
|
+
export interface UrlBuilderConfig {
|
|
48
|
+
baseUrl: string;
|
|
49
|
+
}
|
|
50
|
+
export declare function createUrlBuilder<T extends Record<string, EndpointDef>, const K extends string = never>(contract: ContractDef<T, string>, source: UrlBuilderConfig, contractConfig?: ContractClientConfig<K>): ScopedUrlBuilder<T, ScopedKeys<K>>;
|
|
51
|
+
export declare function createUrlBuilders<T extends Record<string, ContractDef<Record<string, EndpointDef>, string>>, const K extends string = never>(contracts: T, source: UrlBuilderConfig, contractConfig?: ContractClientConfig<K>): {
|
|
52
|
+
[P in keyof T]: ScopedUrlBuilder<T[P]['endpoints'], ScopedKeys<K>>;
|
|
41
53
|
};
|
|
42
54
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"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"}
|
package/dist/browser/http.d.ts
CHANGED
|
@@ -87,11 +87,15 @@ export interface HttpClient {
|
|
|
87
87
|
/** Clear the logged-out flag — call after a successful re-login. */
|
|
88
88
|
resetLogoutState(): void;
|
|
89
89
|
}
|
|
90
|
+
/** A framework-created HTTP client that can also seed contract URL builders. */
|
|
91
|
+
export interface ConfiguredHttpClient extends HttpClient {
|
|
92
|
+
readonly baseUrl: string;
|
|
93
|
+
}
|
|
90
94
|
/**
|
|
91
95
|
* Create a Ky-based `HttpClient` — the transport `createClient` builds on.
|
|
92
96
|
* Handles cookie auth, SSR cookie forwarding, error parsing into `ApiError`, a
|
|
93
97
|
* `401 → unauthorized` event stream, and safe transport retry.
|
|
94
98
|
*/
|
|
95
|
-
export declare function createHttpClient(config: HttpClientConfig):
|
|
99
|
+
export declare function createHttpClient(config: HttpClientConfig): ConfiguredHttpClient;
|
|
96
100
|
export {};
|
|
97
101
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/browser/http.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/browser/http.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -4,10 +4,10 @@ import {
|
|
|
4
4
|
emitResult,
|
|
5
5
|
parseCliArgs,
|
|
6
6
|
pollUntilDone
|
|
7
|
-
} from "./index-
|
|
7
|
+
} from "./index-n5t4gnfz.js";
|
|
8
8
|
import"./index-frfyw9fa.js";
|
|
9
9
|
import"./index-x3fcszf8.js";
|
|
10
|
-
import"./index-
|
|
10
|
+
import"./index-mzx0an0s.js";
|
|
11
11
|
export {
|
|
12
12
|
pollUntilDone,
|
|
13
13
|
parseCliArgs,
|
|
@@ -2,6 +2,18 @@ import type { ZodType, z } from 'zod';
|
|
|
2
2
|
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
3
3
|
export declare const ALL_TRANSPORTS: readonly ['HTTP', 'MCP', 'AGENT', 'CLI'];
|
|
4
4
|
export type Transport = (typeof ALL_TRANSPORTS)[number];
|
|
5
|
+
/** Successful HTTP statuses that may be declared by a typed-data endpoint. */
|
|
6
|
+
export type HttpSuccessStatus = 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226;
|
|
7
|
+
/** Successful statuses that permit a response body. */
|
|
8
|
+
export type BodyHttpSuccessStatus = Exclude<HttpSuccessStatus, 204 | 205>;
|
|
9
|
+
/** Static HTTP response metadata declared in a contract. */
|
|
10
|
+
export interface EndpointResponseMeta {
|
|
11
|
+
status?: HttpSuccessStatus;
|
|
12
|
+
}
|
|
13
|
+
/** Per-request outbound metadata available only to a `responseMeta` handler. */
|
|
14
|
+
export interface ResponseMetadata {
|
|
15
|
+
headers: Headers;
|
|
16
|
+
}
|
|
5
17
|
/**
|
|
6
18
|
* The transport tag on `ctx.source`. The four built-ins keep autocomplete, but
|
|
7
19
|
* the union is **open** (`string & {}`) so a bring-your-own transport — e.g. a
|
|
@@ -12,6 +24,11 @@ export type Transport = (typeof ALL_TRANSPORTS)[number];
|
|
|
12
24
|
export type TransportSource = 'http' | 'mcp' | 'agent' | 'cli' | (string & {});
|
|
13
25
|
interface EndpointDefBase {
|
|
14
26
|
method: HttpMethod;
|
|
27
|
+
/**
|
|
28
|
+
* Route under the contract prefix. Named segments (`/:id`) are exposed through
|
|
29
|
+
* `params`; a terminal `/*` additionally exposes the slash-joined remainder as
|
|
30
|
+
* `params['*']` and matches an empty remainder.
|
|
31
|
+
*/
|
|
15
32
|
path: string;
|
|
16
33
|
desc: string;
|
|
17
34
|
scope?: string;
|
|
@@ -101,6 +118,7 @@ interface HttpOnlyEndpointDef extends EndpointDefBase {
|
|
|
101
118
|
toolName?: never;
|
|
102
119
|
rawResponse?: never;
|
|
103
120
|
rawBody?: never;
|
|
121
|
+
responseMeta?: never;
|
|
104
122
|
}
|
|
105
123
|
interface ToolEndpointDef extends EndpointDefBase {
|
|
106
124
|
toolName?: string;
|
|
@@ -111,6 +129,7 @@ interface ToolEndpointDef extends EndpointDefBase {
|
|
|
111
129
|
annotations?: EndpointToolAnnotations;
|
|
112
130
|
rawResponse?: never;
|
|
113
131
|
rawBody?: never;
|
|
132
|
+
responseMeta?: never;
|
|
114
133
|
}
|
|
115
134
|
/** A validated JSON endpoint that also retains the original decoded body text. */
|
|
116
135
|
interface RawBodyEndpointDef extends EndpointDefBase {
|
|
@@ -123,6 +142,50 @@ interface RawBodyEndpointDef extends EndpointDefBase {
|
|
|
123
142
|
ui?: never;
|
|
124
143
|
annotations?: never;
|
|
125
144
|
expose?: readonly ['HTTP'];
|
|
145
|
+
responseMeta?: never;
|
|
146
|
+
}
|
|
147
|
+
interface ResponseMetaEndpointDefBase extends EndpointDefBase {
|
|
148
|
+
responseMeta: EndpointResponseMeta;
|
|
149
|
+
rawResponse?: never;
|
|
150
|
+
toolName?: never;
|
|
151
|
+
ui?: never;
|
|
152
|
+
annotations?: never;
|
|
153
|
+
contentType?: never;
|
|
154
|
+
expose?: readonly ['HTTP'];
|
|
155
|
+
}
|
|
156
|
+
/** HTTP-only typed data with a declared body-capable success status. */
|
|
157
|
+
interface ResponseMetaDataEndpointDef extends ResponseMetaEndpointDefBase {
|
|
158
|
+
output: ZodType<unknown>;
|
|
159
|
+
responseMeta: {
|
|
160
|
+
status?: BodyHttpSuccessStatus;
|
|
161
|
+
};
|
|
162
|
+
rawBody?: never;
|
|
163
|
+
}
|
|
164
|
+
/** HTTP-only empty response; bodyless 204/205 statuses are legal here. */
|
|
165
|
+
interface ResponseMetaEmptyEndpointDef extends ResponseMetaEndpointDefBase {
|
|
166
|
+
output?: never;
|
|
167
|
+
responseMeta: EndpointResponseMeta;
|
|
168
|
+
rawBody?: never;
|
|
169
|
+
}
|
|
170
|
+
/** Response metadata composed with validated raw JSON retention. */
|
|
171
|
+
interface ResponseMetaRawBodyDataEndpointDef extends ResponseMetaEndpointDefBase {
|
|
172
|
+
method: 'POST' | 'PUT' | 'PATCH';
|
|
173
|
+
input: ZodType<unknown>;
|
|
174
|
+
output: ZodType<unknown>;
|
|
175
|
+
responseMeta: {
|
|
176
|
+
status?: BodyHttpSuccessStatus;
|
|
177
|
+
};
|
|
178
|
+
rawBody: true;
|
|
179
|
+
multipart?: never;
|
|
180
|
+
}
|
|
181
|
+
/** Empty response metadata composed with validated raw JSON retention. */
|
|
182
|
+
interface ResponseMetaRawBodyEmptyEndpointDef extends ResponseMetaEndpointDefBase {
|
|
183
|
+
method: 'POST' | 'PUT' | 'PATCH';
|
|
184
|
+
input: ZodType<unknown>;
|
|
185
|
+
output?: never;
|
|
186
|
+
responseMeta: EndpointResponseMeta;
|
|
187
|
+
rawBody: true;
|
|
188
|
+
multipart?: never;
|
|
126
189
|
}
|
|
127
190
|
/**
|
|
128
191
|
* An endpoint whose handler returns the **`Response` itself** instead of data —
|
|
@@ -171,8 +234,9 @@ interface RawResponseEndpointDef extends EndpointDefBase {
|
|
|
171
234
|
annotations?: never;
|
|
172
235
|
/** Redundant but allowed, so `expose: ['HTTP']` survives a migration. */
|
|
173
236
|
expose?: readonly ['HTTP'];
|
|
237
|
+
responseMeta?: never;
|
|
174
238
|
}
|
|
175
|
-
export type EndpointDef = HttpOnlyEndpointDef | ToolEndpointDef | RawBodyEndpointDef | RawResponseEndpointDef;
|
|
239
|
+
export type EndpointDef = HttpOnlyEndpointDef | ToolEndpointDef | RawBodyEndpointDef | ResponseMetaDataEndpointDef | ResponseMetaEmptyEndpointDef | ResponseMetaRawBodyDataEndpointDef | ResponseMetaRawBodyEmptyEndpointDef | RawResponseEndpointDef;
|
|
176
240
|
export interface ContractMeta<TScope extends string = string> {
|
|
177
241
|
prefix: string;
|
|
178
242
|
scope?: TScope;
|
|
@@ -308,5 +372,15 @@ export type ScopedHttpClient<C extends Record<string, EndpointDef>, Extra> = {
|
|
|
308
372
|
[K in keyof C as ExposesHttp<C[K]> extends true ? K : never]: ScopedEndpointFn<C[K], Extra>;
|
|
309
373
|
};
|
|
310
374
|
export type TypedHttpClient<C extends Record<string, EndpointDef>> = ScopedHttpClient<C, unknown>;
|
|
375
|
+
type IsUrlBuildable<E> = E extends {
|
|
376
|
+
method: 'GET';
|
|
377
|
+
} ? E extends {
|
|
378
|
+
multipart: string;
|
|
379
|
+
} ? false : ExposesHttp<E> : false;
|
|
380
|
+
export type ScopedUrlFn<E, Extra> = [keyof ArgsWith<E, Extra>] extends [never] ? () => string : (args: ArgsWith<E, Extra>) => string;
|
|
381
|
+
export type ScopedUrlBuilder<C extends Record<string, EndpointDef>, Extra> = {
|
|
382
|
+
[K in keyof C as IsUrlBuildable<C[K]> extends true ? K : never]: ScopedUrlFn<C[K], Extra>;
|
|
383
|
+
};
|
|
384
|
+
export type TypedUrlBuilder<C extends Record<string, EndpointDef>> = ScopedUrlBuilder<C, unknown>;
|
|
311
385
|
export {};
|
|
312
386
|
//# sourceMappingURL=define.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/contract/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAEtC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,eAAO,MAAM,cAAc,YAAI,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AACvE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE/E,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,UAAU,CAAC,EAAE,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;CAC3C;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kFAAkF;IAClF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,mBAAoB,SAAQ,eAAe;IACnD,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/contract/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAEtC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,eAAO,MAAM,cAAc,YAAI,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AACvE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE1F,uDAAuD;AACvD,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;AAE1E,4DAA4D;AAC5D,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE/E,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,UAAU,CAAC,EAAE,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;CAC3C;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kFAAkF;IAClF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,mBAAoB,SAAQ,eAAe;IACnD,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB;AAED,UAAU,eAAgB,SAAQ,eAAe;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC9B,oEAAoE;IACpE,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,yEAAyE;IACzE,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB;AAED,kFAAkF;AAClF,UAAU,kBAAmB,SAAQ,eAAe;IAClD,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB;AAED,UAAU,2BAA4B,SAAQ,eAAe;IAC3D,YAAY,EAAE,oBAAoB,CAAC;IACnC,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,wEAAwE;AACxE,UAAU,2BAA4B,SAAQ,2BAA2B;IACvE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,YAAY,EAAE;QAAE,MAAM,CAAC,EAAE,qBAAqB,CAAA;KAAE,CAAC;IACjD,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,0EAA0E;AAC1E,UAAU,4BAA6B,SAAQ,2BAA2B;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,EAAE,oBAAoB,CAAC;IACnC,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,oEAAoE;AACpE,UAAU,kCAAmC,SAAQ,2BAA2B;IAC9E,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,YAAY,EAAE;QAAE,MAAM,CAAC,EAAE,qBAAqB,CAAA;KAAE,CAAC;IACjD,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB;AAED,0EAA0E;AAC1E,UAAU,mCAAoC,SAAQ,2BAA2B;IAC/E,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,EAAE,oBAAoB,CAAC;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,UAAU,sBAAuB,SAAQ,eAAe;IACtD;;;;OAIG;IACH,WAAW,EAAE,IAAI,CAAC;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,IAAI,CAAC;IACf;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,6DAA6D;IAC7D,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,6DAA6D;IAC7D,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,yEAAyE;IACzE,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GACnB,mBAAmB,GACnB,eAAe,GACf,kBAAkB,GAClB,2BAA2B,GAC3B,4BAA4B,GAC5B,kCAAkC,GAClC,mCAAmC,GACnC,sBAAsB,CAAC;AAE3B,MAAM,WAAW,YAAY,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAW,CAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnE,MAAM,SAAS,MAAM,GAAG,MAAM;IAE9B,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACxE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EACxD,SAAS,EAAE,CAAC,GACX,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5B,wBAAgB,cAAc,CAC5B,MAAM,SAAS,MAAM,EACrB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAE3C,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EACvE,SAAS,EAAE,CAAC,GACX,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAsI1B;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACjD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAQrC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,MAAM,WAAW,cAAc,CAAC,OAAO,GAAG,SAAS,EAAE,MAAM,GAAG,SAAS;IACrE,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB;+DAC2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAYtE,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,cAAc,CAAC;AAElD,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GACnE;KAAG,CAAC,IAAI,CAAC,GAAG,aAAa;CAAE,GAC3B,OAAO,CAAC;AAEZ,KAAK,YAAY,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAClD,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAC5B,aAAa,CAAC,CAAC,CAAC,CAAC;AAEnB;;;;GAIG;AACH,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,WAAW,EAAE,IAAI,CAAA;CAAE,GACpD,QAAQ,GACR,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GACxC,CAAC,GACD,SAAS,CAAC;AAEhB,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAC/D,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAChC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1D,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI;KAC9D,CAAC,IAAI,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACjC,CAAC;AAEF,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,MAAM,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAC5D,MAAM,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAChC,IAAI,GACJ,KAAK,GACP,IAAI,CAAC;AAST,KAAK,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAElD,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAC/E,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAChC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7D,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,IAAI;KAC1E,CAAC,IAAI,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;CAC5F,CAAC;AAIF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,gBAAgB,CACnF,CAAC,EACD,OAAO,CACR,CAAC;AAEF,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,MAAM,EAAE,KAAK,CAAA;CAAE,GAChD,CAAC,SAAS;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAC7B,KAAK,GACL,WAAW,CAAC,CAAC,CAAC,GAChB,KAAK,CAAC;AAEV,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAC1E,MAAM,MAAM,GACZ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,MAAM,CAAC;AAEzC,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,IAAI;KAC1E,CAAC,IAAI,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;CAC1F,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,gBAAgB,CACnF,CAAC,EACD,OAAO,CACR,CAAC"}
|
package/dist/contract/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ALL_TRANSPORTS, type ContractDef, type ContractMeta, defineContract, type EndpointDef, type EndpointFn, type EndpointToolAnnotations, type EndpointUiMeta, type FileDescriptor, type HandlerContext, type HttpMethod, type MultipartFile, type RuntimeContext, type ScopedEndpointFn, type ScopedHttpClient, type Transport, type TransportSource, type TypedClient, type TypedHttpClient, } from './define';
|
|
1
|
+
export { ALL_TRANSPORTS, type BodyHttpSuccessStatus, type ContractDef, type ContractMeta, defineContract, type EndpointDef, type EndpointFn, type EndpointResponseMeta, type EndpointToolAnnotations, type EndpointUiMeta, type FileDescriptor, type HandlerContext, type HttpMethod, type HttpSuccessStatus, type MultipartFile, type ResponseMetadata, type RuntimeContext, type ScopedEndpointFn, type ScopedHttpClient, type ScopedUrlBuilder, type ScopedUrlFn, type Transport, type TransportSource, type TypedClient, type TypedHttpClient, type TypedUrlBuilder, } from './define';
|
|
2
2
|
export { AppError, appError, badRequest, conflict, type ErrorEnvelope, forbidden, isStitchErrorCode, notFound, rateLimited, STITCH_ERROR_STATUS, type StitchErrorCode, unauthorized, } from './errors';
|
|
3
3
|
export { type DefinedErrors, defineErrors, type ErrorThrower, } from './errors-factory';
|
|
4
4
|
export { createContractFactory, type ScopedDefineContract } from './factory';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,KAAK,aAAa,EAClB,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,aAAa,EAClB,YAAY,EACZ,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE7E,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,SAAS,EACd,eAAe,GAChB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,KAAK,aAAa,EAClB,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,aAAa,EAClB,YAAY,EACZ,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE7E,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,SAAS,EACd,eAAe,GAChB,MAAM,cAAc,CAAC"}
|
package/dist/contract/index.js
CHANGED
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
runWithRequestContext,
|
|
15
15
|
safeJsonParse,
|
|
16
16
|
validateHandlerOutput
|
|
17
|
-
} from "./index-
|
|
17
|
+
} from "./index-mzx0an0s.js";
|
|
18
18
|
|
|
19
19
|
// src/tools/coerce.ts
|
|
20
20
|
import { z } from "zod";
|
|
@@ -848,6 +848,8 @@ function collectTools(service, transport, config = {}) {
|
|
|
848
848
|
continue;
|
|
849
849
|
if (method.rawBody)
|
|
850
850
|
continue;
|
|
851
|
+
if (method.responseMeta)
|
|
852
|
+
continue;
|
|
851
853
|
if (method.rawResponse)
|
|
852
854
|
continue;
|
|
853
855
|
const name = method.toolName ?? toToolName(service.name, methodName);
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
setRequestError,
|
|
28
28
|
typedEntries,
|
|
29
29
|
validateHandlerOutput
|
|
30
|
-
} from "./index-
|
|
30
|
+
} from "./index-mzx0an0s.js";
|
|
31
31
|
|
|
32
32
|
// src/server/multipart.ts
|
|
33
33
|
var DEFAULT_MAX_UPLOAD_BYTES = 25 * 1024 * 1024;
|
|
@@ -128,10 +128,16 @@ function joinPath(...parts) {
|
|
|
128
128
|
return `/${joined}`;
|
|
129
129
|
}
|
|
130
130
|
function matchSegments(patternSegments, requestSegments) {
|
|
131
|
-
|
|
131
|
+
const wildcard = patternSegments.at(-1) === "*";
|
|
132
|
+
const prefixLength = wildcard ? patternSegments.length - 1 : patternSegments.length;
|
|
133
|
+
if (wildcard) {
|
|
134
|
+
if (requestSegments.length < prefixLength)
|
|
135
|
+
return null;
|
|
136
|
+
} else if (patternSegments.length !== requestSegments.length) {
|
|
132
137
|
return null;
|
|
138
|
+
}
|
|
133
139
|
const params = {};
|
|
134
|
-
for (const [i, pattern] of patternSegments.entries()) {
|
|
140
|
+
for (const [i, pattern] of patternSegments.slice(0, prefixLength).entries()) {
|
|
135
141
|
const actual = requestSegments[i];
|
|
136
142
|
if (actual === undefined)
|
|
137
143
|
return null;
|
|
@@ -141,8 +147,18 @@ function matchSegments(patternSegments, requestSegments) {
|
|
|
141
147
|
return null;
|
|
142
148
|
}
|
|
143
149
|
}
|
|
150
|
+
if (wildcard) {
|
|
151
|
+
params["*"] = requestSegments.slice(prefixLength).map(decodeURIComponent).join("/");
|
|
152
|
+
}
|
|
144
153
|
return params;
|
|
145
154
|
}
|
|
155
|
+
function segmentRank(segment) {
|
|
156
|
+
if (segment === "*")
|
|
157
|
+
return 2;
|
|
158
|
+
if (segment?.startsWith(":"))
|
|
159
|
+
return 1;
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
146
162
|
function buildRouteMap(groups) {
|
|
147
163
|
const map = new Map;
|
|
148
164
|
for (const { prefix, service, hooks } of groups) {
|
|
@@ -161,10 +177,9 @@ function buildRouteMap(groups) {
|
|
|
161
177
|
entries.sort((a, b) => {
|
|
162
178
|
const len = Math.min(a.segments.length, b.segments.length);
|
|
163
179
|
for (let i = 0;i < len; i++) {
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
return aIsParam ? 1 : -1;
|
|
180
|
+
const rankDifference = segmentRank(a.segments[i]) - segmentRank(b.segments[i]);
|
|
181
|
+
if (rankDifference !== 0)
|
|
182
|
+
return rankDifference;
|
|
168
183
|
}
|
|
169
184
|
return a.segments.length - b.segments.length;
|
|
170
185
|
});
|
|
@@ -221,7 +236,13 @@ function findShadowedRoutes(routeMap, rawRoutes) {
|
|
|
221
236
|
const shadowed = [];
|
|
222
237
|
for (const [httpMethod, entries] of routeMap) {
|
|
223
238
|
for (const entry of entries) {
|
|
224
|
-
const probe = `/${entry.segments.map((
|
|
239
|
+
const probe = `/${entry.segments.map((segment) => {
|
|
240
|
+
if (segment.startsWith(":"))
|
|
241
|
+
return "__param__";
|
|
242
|
+
if (segment === "*")
|
|
243
|
+
return "__wildcard__";
|
|
244
|
+
return segment;
|
|
245
|
+
}).join("/")}`;
|
|
225
246
|
const match = matchRawRoute(rawRoutes, httpMethod, probe);
|
|
226
247
|
if (!match)
|
|
227
248
|
continue;
|
|
@@ -240,17 +261,11 @@ function matchRawRoute(rawRoutes, httpMethod, pathname) {
|
|
|
240
261
|
if (route.method !== "ALL" && route.method !== httpMethod)
|
|
241
262
|
continue;
|
|
242
263
|
if (route.path.endsWith("/*")) {
|
|
243
|
-
const
|
|
264
|
+
const routeSegs = route.path.split("/").filter(Boolean);
|
|
244
265
|
const pathSegs = pathname.split("/").filter(Boolean);
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
if (params) {
|
|
249
|
-
return {
|
|
250
|
-
route,
|
|
251
|
-
params: { ...params, "*": pathSegs.slice(prefixSegs.length).join("/") }
|
|
252
|
-
};
|
|
253
|
-
}
|
|
266
|
+
const params = matchSegments(routeSegs, pathSegs);
|
|
267
|
+
if (params)
|
|
268
|
+
return { route, params };
|
|
254
269
|
continue;
|
|
255
270
|
}
|
|
256
271
|
if (route.path.includes("/:")) {
|
|
@@ -608,6 +623,39 @@ function collectExtraLogFields(config, req, url, outcome) {
|
|
|
608
623
|
return { fields, enrichKeys };
|
|
609
624
|
}
|
|
610
625
|
|
|
626
|
+
// src/server/response-metadata.ts
|
|
627
|
+
var RESERVED_HEADERS = new Set(["content-type", "content-length", "x-request-id"]);
|
|
628
|
+
function hasGetSetCookie(headers) {
|
|
629
|
+
return "getSetCookie" in headers && typeof headers.getSetCookie === "function";
|
|
630
|
+
}
|
|
631
|
+
function isReservedHeader(name) {
|
|
632
|
+
const normalized = name.toLowerCase();
|
|
633
|
+
return RESERVED_HEADERS.has(normalized) || normalized.startsWith("access-control-");
|
|
634
|
+
}
|
|
635
|
+
function createResponseMetadata() {
|
|
636
|
+
return { headers: new Headers };
|
|
637
|
+
}
|
|
638
|
+
function applyResponseMetadata(target, metadata, endpointIdentity) {
|
|
639
|
+
if (!metadata)
|
|
640
|
+
return;
|
|
641
|
+
for (const [name] of metadata.headers) {
|
|
642
|
+
if (isReservedHeader(name)) {
|
|
643
|
+
throw new Error(`${endpointIdentity} cannot set framework-owned response header "${name}"`);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
const preservesSetCookie = hasGetSetCookie(metadata.headers);
|
|
647
|
+
for (const [name, value] of metadata.headers) {
|
|
648
|
+
if (name.toLowerCase() === "set-cookie" && preservesSetCookie)
|
|
649
|
+
continue;
|
|
650
|
+
target.append(name, value);
|
|
651
|
+
}
|
|
652
|
+
if (preservesSetCookie) {
|
|
653
|
+
for (const cookie of metadata.headers.getSetCookie()) {
|
|
654
|
+
target.append("Set-Cookie", cookie);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
|
|
611
659
|
// src/server/create.ts
|
|
612
660
|
function createHandler(config) {
|
|
613
661
|
const { cors, hooks, logging = false, trustProxy = false } = config;
|
|
@@ -793,6 +841,9 @@ function createHandler(config) {
|
|
|
793
841
|
if (groupHooks?.beforeHandle) {
|
|
794
842
|
await groupHooks.beforeHandle(ctx, method);
|
|
795
843
|
}
|
|
844
|
+
const responseMetadata = method.responseMeta ? createResponseMetadata() : undefined;
|
|
845
|
+
if (responseMetadata)
|
|
846
|
+
ctx.response = responseMetadata;
|
|
796
847
|
let result = await method.handler(ctx);
|
|
797
848
|
if (method.rawResponse) {
|
|
798
849
|
if (!(result instanceof Response)) {
|
|
@@ -824,13 +875,22 @@ function createHandler(config) {
|
|
|
824
875
|
}
|
|
825
876
|
result = checked.data;
|
|
826
877
|
}
|
|
878
|
+
const responseStatus = method.responseMeta?.status ?? (result === undefined || result === null ? 204 : 200);
|
|
879
|
+
if (method.outputSchema && (responseStatus === 204 || responseStatus === 205)) {
|
|
880
|
+
throw new AppError("INTERNAL_SERVER_ERROR", `${method.serviceName}.${method.key} cannot combine output with bodyless status ${responseStatus}`, 500);
|
|
881
|
+
}
|
|
882
|
+
if (result !== undefined && result !== null && (responseStatus === 204 || responseStatus === 205)) {
|
|
883
|
+
throw new AppError("INTERNAL_SERVER_ERROR", `${method.serviceName}.${method.key} produced data for bodyless status ${responseStatus}`, 500);
|
|
884
|
+
}
|
|
885
|
+
const responseHeaders = new Headers(corsHeaders2(cors, req));
|
|
886
|
+
applyResponseMetadata(responseHeaders, responseMetadata, `${method.serviceName}.${method.key}`);
|
|
827
887
|
if (result === undefined || result === null) {
|
|
828
|
-
const empty = new Response(null, { status:
|
|
829
|
-
logDone(
|
|
888
|
+
const empty = new Response(null, { status: responseStatus, headers: responseHeaders });
|
|
889
|
+
logDone(responseStatus);
|
|
830
890
|
return empty;
|
|
831
891
|
}
|
|
832
|
-
const body = json(result,
|
|
833
|
-
logDone(
|
|
892
|
+
const body = Response.json(result, { status: responseStatus, headers: responseHeaders });
|
|
893
|
+
logDone(responseStatus);
|
|
834
894
|
return body;
|
|
835
895
|
} catch (err) {
|
|
836
896
|
return respondError(err, ctx, method);
|
|
@@ -923,7 +983,7 @@ function implement(contract, handlers) {
|
|
|
923
983
|
serviceName: contract.meta.prefix,
|
|
924
984
|
key: String(key),
|
|
925
985
|
toolName: "toolName" in endpoint ? endpoint.toolName : undefined,
|
|
926
|
-
expose: endpoint.rawResponse || endpoint.rawBody ? HTTP_ONLY : endpoint.expose,
|
|
986
|
+
expose: endpoint.rawResponse || endpoint.rawBody || endpoint.responseMeta ? HTTP_ONLY : endpoint.expose,
|
|
927
987
|
scope: endpoint.scope ?? groupScope,
|
|
928
988
|
paramsSchema: endpoint.params,
|
|
929
989
|
inputSchema: endpoint.input,
|
|
@@ -937,6 +997,7 @@ function implement(contract, handlers) {
|
|
|
937
997
|
meta: mergeMeta(contract.meta.meta, endpoint.meta),
|
|
938
998
|
rawResponse: endpoint.rawResponse,
|
|
939
999
|
rawBody: endpoint.rawBody,
|
|
1000
|
+
responseMeta: endpoint.responseMeta,
|
|
940
1001
|
contentType: "contentType" in endpoint ? endpoint.contentType : undefined,
|
|
941
1002
|
handler: (ctx) => typedHandler(ctx)
|
|
942
1003
|
};
|
|
@@ -17,6 +17,8 @@ function defineContract(meta, endpoints) {
|
|
|
17
17
|
assertRawEndpoint(meta.prefix, key, ep);
|
|
18
18
|
if (ep.rawBody)
|
|
19
19
|
assertRawBodyEndpoint(meta.prefix, key, ep);
|
|
20
|
+
if ("responseMeta" in ep)
|
|
21
|
+
assertResponseMetaEndpoint(meta.prefix, key, ep);
|
|
20
22
|
if (!("toolName" in ep) || !ep.toolName)
|
|
21
23
|
continue;
|
|
22
24
|
const transports = new Set(ep.expose ? ep.expose.filter((t) => t !== "HTTP") : ["MCP", "AGENT"]);
|
|
@@ -74,6 +76,32 @@ function assertRawBodyEndpoint(prefix, key, ep) {
|
|
|
74
76
|
throw new Error(`${where} is HTTP-only — remove ${nonHttp.join(", ")} from expose`);
|
|
75
77
|
}
|
|
76
78
|
}
|
|
79
|
+
function assertResponseMetaEndpoint(prefix, key, ep) {
|
|
80
|
+
const where = `Contract "${prefix}": responseMeta endpoint "${key}"`;
|
|
81
|
+
if (!ep.responseMeta || typeof ep.responseMeta !== "object") {
|
|
82
|
+
throw new Error(`${where} must declare responseMeta as an object`);
|
|
83
|
+
}
|
|
84
|
+
const status = ep.responseMeta.status;
|
|
85
|
+
if (status !== undefined && (!Number.isSafeInteger(status) || status < 200 || status > 299)) {
|
|
86
|
+
throw new Error(`${where} status must be a successful 2xx integer, received ${status}`);
|
|
87
|
+
}
|
|
88
|
+
if (ep.output && (status === 204 || status === 205)) {
|
|
89
|
+
throw new Error(`${where} cannot combine output with bodyless status ${status}`);
|
|
90
|
+
}
|
|
91
|
+
if (ep.rawResponse)
|
|
92
|
+
throw new Error(`${where} cannot also be a rawResponse endpoint`);
|
|
93
|
+
if ("toolName" in ep && ep.toolName)
|
|
94
|
+
throw new Error(`${where} cannot set a toolName`);
|
|
95
|
+
if ("ui" in ep && ep.ui)
|
|
96
|
+
throw new Error(`${where} cannot set MCP ui metadata`);
|
|
97
|
+
if ("annotations" in ep && ep.annotations) {
|
|
98
|
+
throw new Error(`${where} cannot set MCP annotations`);
|
|
99
|
+
}
|
|
100
|
+
const nonHttp = (ep.expose ?? []).filter((transport) => transport !== "HTTP");
|
|
101
|
+
if (nonHttp.length > 0) {
|
|
102
|
+
throw new Error(`${where} is HTTP-only — remove ${nonHttp.join(", ")} from expose`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
77
105
|
// src/contract/errors.ts
|
|
78
106
|
var APP_ERROR_BRAND = Symbol.for("stitchkit.AppError");
|
|
79
107
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { type ClientConfig, type ContractClientConfig, createClient, createClients, } from './browser/client';
|
|
2
|
-
export { ApiError, type ApiEvent, type ApiEventListener, createHttpClient, type HeaderProvider, type HttpClient, type HttpClientConfig, type RequestOptions, } from './browser/http';
|
|
1
|
+
export { type ClientConfig, type ContractClientConfig, createClient, createClients, createUrlBuilder, createUrlBuilders, type PathPrefixArgs, type UrlBuilderConfig, } from './browser/client';
|
|
2
|
+
export { ApiError, type ApiEvent, type ApiEventListener, type ConfiguredHttpClient, createHttpClient, type HeaderProvider, type HttpClient, type HttpClientConfig, type RequestOptions, } from './browser/http';
|
|
3
3
|
export type { SocketEventMap, SocketIOClient, SocketIOClientConfig, } from './browser/socket-io';
|
|
4
4
|
export { createSocketIOClient } from './browser/socket-io';
|
|
5
5
|
export { type ParseSSEOptions, parseSSE } from './browser/stream';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,YAAY,EACZ,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,QAAQ,EACR,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClE,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,YAAY,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC"}
|