@ai-sdk/provider-utils 3.0.32 → 3.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @ai-sdk/provider-utils
2
2
 
3
+ ## 3.0.33
4
+
5
+ ### Patch Changes
6
+
7
+ - 9e8e087: Stop re-exporting `createTestServer` and `TestResponseController` from `@ai-sdk/provider-utils/test` so `ai/test` can load without `msw` or `vitest`. Import these APIs from `@ai-sdk/test-server/with-vitest` instead.
8
+
3
9
  ## 3.0.32
4
10
 
5
11
  ### Patch Changes
package/dist/index.js CHANGED
@@ -753,7 +753,7 @@ function withUserAgentSuffix(headers, ...userAgentSuffixParts) {
753
753
  }
754
754
 
755
755
  // src/version.ts
756
- var VERSION = true ? "3.0.32" : "0.0.0-test";
756
+ var VERSION = true ? "3.0.33" : "0.0.0-test";
757
757
 
758
758
  // src/get-from-api.ts
759
759
  var getOriginalFetch = () => globalThis.fetch;
package/dist/index.mjs CHANGED
@@ -652,7 +652,7 @@ function withUserAgentSuffix(headers, ...userAgentSuffixParts) {
652
652
  }
653
653
 
654
654
  // src/version.ts
655
- var VERSION = true ? "3.0.32" : "0.0.0-test";
655
+ var VERSION = true ? "3.0.33" : "0.0.0-test";
656
656
 
657
657
  // src/get-from-api.ts
658
658
  var getOriginalFetch = () => globalThis.fetch;
@@ -1,5 +1,3 @@
1
- import { JsonBodyType } from 'msw';
2
-
3
1
  declare function convertArrayToAsyncIterable<T>(values: T[]): AsyncIterable<T>;
4
2
 
5
3
  declare function convertArrayToReadableStream<T>(values: T[]): ReadableStream<T>;
@@ -16,73 +14,4 @@ declare function mockId({ prefix, }?: {
16
14
  prefix?: string;
17
15
  }): () => string;
18
16
 
19
- type UrlResponse = {
20
- type: 'json-value';
21
- headers?: Record<string, string>;
22
- body: JsonBodyType;
23
- } | {
24
- type: 'stream-chunks';
25
- headers?: Record<string, string>;
26
- chunks: Array<string>;
27
- } | {
28
- type: 'binary';
29
- headers?: Record<string, string>;
30
- body: Buffer;
31
- } | {
32
- type: 'empty';
33
- headers?: Record<string, string>;
34
- status?: number;
35
- } | {
36
- type: 'error';
37
- headers?: Record<string, string>;
38
- status?: number;
39
- body?: string;
40
- } | {
41
- type: 'controlled-stream';
42
- headers?: Record<string, string>;
43
- controller: TestResponseController;
44
- } | undefined;
45
- type UrlResponseParameter = UrlResponse | UrlResponse[] | ((options: {
46
- callNumber: number;
47
- }) => UrlResponse);
48
- type UrlHandler = {
49
- response: UrlResponseParameter;
50
- };
51
- type UrlHandlers<URLS extends {
52
- [url: string]: {
53
- response?: UrlResponseParameter;
54
- };
55
- }> = {
56
- [url in keyof URLS]: UrlHandler;
57
- };
58
- declare class TestServerCall {
59
- private request;
60
- constructor(request: Request);
61
- get requestBodyJson(): Promise<any>;
62
- get requestBodyMultipart(): Promise<Record<string, any>> | null;
63
- get requestCredentials(): RequestCredentials;
64
- get requestHeaders(): Record<string, string>;
65
- get requestUserAgent(): string | undefined;
66
- get requestUrlSearchParams(): URLSearchParams;
67
- get requestUrl(): string;
68
- get requestMethod(): string;
69
- }
70
- declare function createTestServer<URLS extends {
71
- [url: string]: {
72
- response?: UrlResponseParameter;
73
- };
74
- }>(routes: URLS): {
75
- urls: UrlHandlers<URLS>;
76
- calls: TestServerCall[];
77
- };
78
- declare class TestResponseController {
79
- private readonly transformStream;
80
- private readonly writer;
81
- constructor();
82
- get stream(): ReadableStream;
83
- write(chunk: string): Promise<void>;
84
- error(error: Error): Promise<void>;
85
- close(): Promise<void>;
86
- }
87
-
88
- export { TestResponseController, type UrlHandler, type UrlHandlers, type UrlResponse, convertArrayToAsyncIterable, convertArrayToReadableStream, convertAsyncIterableToArray, convertReadableStreamToArray, convertResponseStreamToArray, createTestServer, isNodeVersion, mockId };
17
+ export { convertArrayToAsyncIterable, convertArrayToReadableStream, convertAsyncIterableToArray, convertReadableStreamToArray, convertResponseStreamToArray, isNodeVersion, mockId };
@@ -1,5 +1,3 @@
1
- import { JsonBodyType } from 'msw';
2
-
3
1
  declare function convertArrayToAsyncIterable<T>(values: T[]): AsyncIterable<T>;
4
2
 
5
3
  declare function convertArrayToReadableStream<T>(values: T[]): ReadableStream<T>;
@@ -16,73 +14,4 @@ declare function mockId({ prefix, }?: {
16
14
  prefix?: string;
17
15
  }): () => string;
18
16
 
19
- type UrlResponse = {
20
- type: 'json-value';
21
- headers?: Record<string, string>;
22
- body: JsonBodyType;
23
- } | {
24
- type: 'stream-chunks';
25
- headers?: Record<string, string>;
26
- chunks: Array<string>;
27
- } | {
28
- type: 'binary';
29
- headers?: Record<string, string>;
30
- body: Buffer;
31
- } | {
32
- type: 'empty';
33
- headers?: Record<string, string>;
34
- status?: number;
35
- } | {
36
- type: 'error';
37
- headers?: Record<string, string>;
38
- status?: number;
39
- body?: string;
40
- } | {
41
- type: 'controlled-stream';
42
- headers?: Record<string, string>;
43
- controller: TestResponseController;
44
- } | undefined;
45
- type UrlResponseParameter = UrlResponse | UrlResponse[] | ((options: {
46
- callNumber: number;
47
- }) => UrlResponse);
48
- type UrlHandler = {
49
- response: UrlResponseParameter;
50
- };
51
- type UrlHandlers<URLS extends {
52
- [url: string]: {
53
- response?: UrlResponseParameter;
54
- };
55
- }> = {
56
- [url in keyof URLS]: UrlHandler;
57
- };
58
- declare class TestServerCall {
59
- private request;
60
- constructor(request: Request);
61
- get requestBodyJson(): Promise<any>;
62
- get requestBodyMultipart(): Promise<Record<string, any>> | null;
63
- get requestCredentials(): RequestCredentials;
64
- get requestHeaders(): Record<string, string>;
65
- get requestUserAgent(): string | undefined;
66
- get requestUrlSearchParams(): URLSearchParams;
67
- get requestUrl(): string;
68
- get requestMethod(): string;
69
- }
70
- declare function createTestServer<URLS extends {
71
- [url: string]: {
72
- response?: UrlResponseParameter;
73
- };
74
- }>(routes: URLS): {
75
- urls: UrlHandlers<URLS>;
76
- calls: TestServerCall[];
77
- };
78
- declare class TestResponseController {
79
- private readonly transformStream;
80
- private readonly writer;
81
- constructor();
82
- get stream(): ReadableStream;
83
- write(chunk: string): Promise<void>;
84
- error(error: Error): Promise<void>;
85
- close(): Promise<void>;
86
- }
87
-
88
- export { TestResponseController, type UrlHandler, type UrlHandlers, type UrlResponse, convertArrayToAsyncIterable, convertArrayToReadableStream, convertAsyncIterableToArray, convertReadableStreamToArray, convertResponseStreamToArray, createTestServer, isNodeVersion, mockId };
17
+ export { convertArrayToAsyncIterable, convertArrayToReadableStream, convertAsyncIterableToArray, convertReadableStreamToArray, convertResponseStreamToArray, isNodeVersion, mockId };
@@ -20,13 +20,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/test/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- TestResponseController: () => TestResponseController,
24
23
  convertArrayToAsyncIterable: () => convertArrayToAsyncIterable,
25
24
  convertArrayToReadableStream: () => convertArrayToReadableStream,
26
25
  convertAsyncIterableToArray: () => convertAsyncIterableToArray,
27
26
  convertReadableStreamToArray: () => convertReadableStreamToArray,
28
27
  convertResponseStreamToArray: () => convertResponseStreamToArray,
29
- createTestServer: () => createTestServer,
30
28
  isNodeVersion: () => isNodeVersion,
31
29
  mockId: () => mockId
32
30
  });
@@ -99,185 +97,13 @@ function mockId({
99
97
  let counter = 0;
100
98
  return () => `${prefix}-${counter++}`;
101
99
  }
102
-
103
- // src/test/test-server.ts
104
- var import_msw = require("msw");
105
- var import_node = require("msw/node");
106
- var import_vitest = require("vitest");
107
- var TestServerCall = class {
108
- constructor(request) {
109
- this.request = request;
110
- }
111
- get requestBodyJson() {
112
- return this.request.text().then(JSON.parse);
113
- }
114
- get requestBodyMultipart() {
115
- return this.request.headers.get("content-type")?.startsWith(
116
- "multipart/form-data"
117
- ) ? (
118
- // For multipart/form-data, return the form data entries as an object
119
- this.request.formData().then((formData) => {
120
- const entries = {};
121
- formData.forEach((value, key) => {
122
- entries[key] = value;
123
- });
124
- return entries;
125
- })
126
- ) : null;
127
- }
128
- get requestCredentials() {
129
- return this.request.credentials;
130
- }
131
- get requestHeaders() {
132
- const requestHeaders = this.request.headers;
133
- const headersObject = {};
134
- requestHeaders.forEach((value, key) => {
135
- if (key.toLowerCase() === "user-agent") return;
136
- headersObject[key] = value;
137
- });
138
- return headersObject;
139
- }
140
- get requestUserAgent() {
141
- return this.request.headers.get("user-agent") ?? void 0;
142
- }
143
- get requestUrlSearchParams() {
144
- return new URL(this.request.url).searchParams;
145
- }
146
- get requestUrl() {
147
- return this.request.url;
148
- }
149
- get requestMethod() {
150
- return this.request.method;
151
- }
152
- };
153
- function createTestServer(routes) {
154
- const originalRoutes = structuredClone(routes);
155
- const mswServer = (0, import_node.setupServer)(
156
- ...Object.entries(routes).map(([url, handler]) => {
157
- return import_msw.http.all(url, ({ request }) => {
158
- const callNumber = calls.length;
159
- calls.push(new TestServerCall(request));
160
- const response = typeof handler.response === "function" ? handler.response({ callNumber }) : Array.isArray(handler.response) ? handler.response[callNumber] : handler.response;
161
- if (response === void 0) {
162
- return import_msw.HttpResponse.json({ error: "Not Found" }, { status: 404 });
163
- }
164
- const handlerType = response.type;
165
- switch (handlerType) {
166
- case "json-value":
167
- return import_msw.HttpResponse.json(response.body, {
168
- status: 200,
169
- headers: {
170
- "Content-Type": "application/json",
171
- ...response.headers
172
- }
173
- });
174
- case "stream-chunks":
175
- return new import_msw.HttpResponse(
176
- convertArrayToReadableStream(response.chunks).pipeThrough(
177
- new TextEncoderStream()
178
- ),
179
- {
180
- status: 200,
181
- headers: {
182
- "Content-Type": "text/event-stream",
183
- "Cache-Control": "no-cache",
184
- Connection: "keep-alive",
185
- ...response.headers
186
- }
187
- }
188
- );
189
- case "controlled-stream": {
190
- if (request.signal) {
191
- request.signal.addEventListener("abort", () => {
192
- response.controller.error(
193
- new DOMException("Aborted", "AbortError")
194
- );
195
- });
196
- }
197
- return new import_msw.HttpResponse(
198
- response.controller.stream.pipeThrough(new TextEncoderStream()),
199
- {
200
- status: 200,
201
- headers: {
202
- "Content-Type": "text/event-stream",
203
- "Cache-Control": "no-cache",
204
- Connection: "keep-alive",
205
- ...response.headers
206
- }
207
- }
208
- );
209
- }
210
- case "binary": {
211
- return import_msw.HttpResponse.arrayBuffer(response.body, {
212
- status: 200,
213
- headers: response.headers
214
- });
215
- }
216
- case "error":
217
- return import_msw.HttpResponse.text(response.body ?? "Error", {
218
- status: response.status ?? 500,
219
- headers: response.headers
220
- });
221
- case "empty":
222
- return new import_msw.HttpResponse(null, {
223
- status: response.status ?? 200
224
- });
225
- default: {
226
- const _exhaustiveCheck = handlerType;
227
- throw new Error(`Unknown response type: ${_exhaustiveCheck}`);
228
- }
229
- }
230
- });
231
- })
232
- );
233
- let calls = [];
234
- (0, import_vitest.beforeAll)(() => {
235
- mswServer.listen();
236
- });
237
- (0, import_vitest.beforeEach)(() => {
238
- mswServer.resetHandlers();
239
- Object.entries(originalRoutes).forEach(([url, handler]) => {
240
- routes[url].response = handler.response;
241
- });
242
- calls = [];
243
- });
244
- (0, import_vitest.afterAll)(() => {
245
- mswServer.close();
246
- });
247
- return {
248
- urls: routes,
249
- get calls() {
250
- return calls;
251
- }
252
- };
253
- }
254
- var TestResponseController = class {
255
- constructor() {
256
- this.transformStream = new TransformStream();
257
- this.writer = this.transformStream.writable.getWriter();
258
- }
259
- get stream() {
260
- return this.transformStream.readable;
261
- }
262
- async write(chunk) {
263
- await this.writer.write(chunk);
264
- }
265
- async error(error) {
266
- await this.writer.abort(error);
267
- }
268
- async close() {
269
- await this.writer.close();
270
- }
271
- };
272
100
  // Annotate the CommonJS export names for ESM import in node:
273
101
  0 && (module.exports = {
274
- TestResponseController,
275
102
  convertArrayToAsyncIterable,
276
103
  convertArrayToReadableStream,
277
104
  convertAsyncIterableToArray,
278
105
  convertReadableStreamToArray,
279
106
  convertResponseStreamToArray,
280
- createTestServer,
281
107
  isNodeVersion,
282
108
  mockId
283
109
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/test/index.ts","../../src/test/convert-array-to-async-iterable.ts","../../src/test/convert-array-to-readable-stream.ts","../../src/test/convert-async-iterable-to-array.ts","../../src/test/convert-readable-stream-to-array.ts","../../src/test/convert-response-stream-to-array.ts","../../src/test/is-node-version.ts","../../src/test/mock-id.ts","../../src/test/test-server.ts"],"sourcesContent":["export * from './convert-array-to-async-iterable';\nexport * from './convert-array-to-readable-stream';\nexport * from './convert-async-iterable-to-array';\nexport * from './convert-readable-stream-to-array';\nexport * from './convert-response-stream-to-array';\nexport * from './is-node-version';\nexport * from './mock-id';\nexport * from './test-server';\n","export function convertArrayToAsyncIterable<T>(values: T[]): AsyncIterable<T> {\n return {\n async *[Symbol.asyncIterator]() {\n for (const value of values) {\n yield value;\n }\n },\n };\n}\n","export function convertArrayToReadableStream<T>(\n values: T[],\n): ReadableStream<T> {\n return new ReadableStream({\n start(controller) {\n try {\n for (const value of values) {\n controller.enqueue(value);\n }\n } finally {\n controller.close();\n }\n },\n });\n}\n","export async function convertAsyncIterableToArray<T>(\n iterable: AsyncIterable<T>,\n): Promise<T[]> {\n const result: T[] = [];\n for await (const item of iterable) {\n result.push(item);\n }\n return result;\n}\n","export async function convertReadableStreamToArray<T>(\n stream: ReadableStream<T>,\n): Promise<T[]> {\n const reader = stream.getReader();\n const result: T[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n result.push(value);\n }\n\n return result;\n}\n","import { convertReadableStreamToArray } from './convert-readable-stream-to-array';\n\nexport async function convertResponseStreamToArray(\n response: Response,\n): Promise<string[]> {\n return convertReadableStreamToArray(\n response.body!.pipeThrough(new TextDecoderStream()),\n );\n}\n","export function isNodeVersion(version: number) {\n const nodeMajorVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n return nodeMajorVersion === version;\n}\n","export function mockId({\n prefix = 'id',\n}: {\n prefix?: string;\n} = {}): () => string {\n let counter = 0;\n return () => `${prefix}-${counter++}`;\n}\n","import { type JsonBodyType, http, HttpResponse } from 'msw';\nimport { setupServer } from 'msw/node';\nimport { convertArrayToReadableStream } from './convert-array-to-readable-stream';\nimport { beforeAll, beforeEach, afterAll } from 'vitest';\n\nexport type UrlResponse =\n | {\n type: 'json-value';\n headers?: Record<string, string>;\n body: JsonBodyType;\n }\n | {\n type: 'stream-chunks';\n headers?: Record<string, string>;\n chunks: Array<string>;\n }\n | {\n type: 'binary';\n headers?: Record<string, string>;\n body: Buffer;\n }\n | {\n type: 'empty';\n headers?: Record<string, string>;\n status?: number;\n }\n | {\n type: 'error';\n headers?: Record<string, string>;\n status?: number;\n body?: string;\n }\n | {\n type: 'controlled-stream';\n headers?: Record<string, string>;\n controller: TestResponseController;\n }\n | undefined;\n\ntype UrlResponseParameter =\n | UrlResponse\n | UrlResponse[]\n | ((options: { callNumber: number }) => UrlResponse);\n\nexport type UrlHandler = {\n response: UrlResponseParameter;\n};\n\nexport type UrlHandlers<\n URLS extends {\n [url: string]: {\n response?: UrlResponseParameter;\n };\n },\n> = {\n [url in keyof URLS]: UrlHandler;\n};\n\nclass TestServerCall {\n constructor(private request: Request) {}\n\n get requestBodyJson() {\n return this.request!.text().then(JSON.parse);\n }\n\n get requestBodyMultipart() {\n return this.request!.headers.get('content-type')?.startsWith(\n 'multipart/form-data',\n )\n ? // For multipart/form-data, return the form data entries as an object\n this.request!.formData().then(formData => {\n const entries: Record<string, any> = {};\n formData.forEach((value, key) => {\n entries[key] = value;\n });\n return entries;\n })\n : null;\n }\n\n get requestCredentials() {\n return this.request!.credentials;\n }\n\n get requestHeaders() {\n const requestHeaders = this.request!.headers;\n\n // convert headers to object for easier comparison\n const headersObject: Record<string, string> = {};\n requestHeaders.forEach((value, key) => {\n if (key.toLowerCase() === 'user-agent') return;\n headersObject[key] = value;\n });\n\n return headersObject;\n }\n\n get requestUserAgent(): string | undefined {\n return this.request!.headers.get('user-agent') ?? undefined;\n }\n\n get requestUrlSearchParams() {\n return new URL(this.request!.url).searchParams;\n }\n\n get requestUrl() {\n return this.request!.url;\n }\n\n get requestMethod() {\n return this.request!.method;\n }\n}\n\nexport function createTestServer<\n URLS extends {\n [url: string]: {\n response?: UrlResponseParameter;\n };\n },\n>(\n routes: URLS,\n): {\n urls: UrlHandlers<URLS>;\n calls: TestServerCall[];\n} {\n const originalRoutes = structuredClone(routes); // deep copy\n\n const mswServer = setupServer(\n ...Object.entries(routes).map(([url, handler]) => {\n return http.all(url, ({ request }) => {\n const callNumber = calls.length;\n\n calls.push(new TestServerCall(request));\n\n const response =\n typeof handler.response === 'function'\n ? handler.response({ callNumber })\n : Array.isArray(handler.response)\n ? handler.response[callNumber]\n : handler.response;\n\n if (response === undefined) {\n return HttpResponse.json({ error: 'Not Found' }, { status: 404 });\n }\n\n const handlerType = response.type;\n\n switch (handlerType) {\n case 'json-value':\n return HttpResponse.json(response.body, {\n status: 200,\n headers: {\n 'Content-Type': 'application/json',\n ...response.headers,\n },\n });\n\n case 'stream-chunks':\n return new HttpResponse(\n convertArrayToReadableStream(response.chunks).pipeThrough(\n new TextEncoderStream(),\n ),\n {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n ...response.headers,\n },\n },\n );\n\n case 'controlled-stream': {\n if (request.signal) {\n request.signal.addEventListener('abort', () => {\n response.controller.error(\n new DOMException('Aborted', 'AbortError'),\n );\n });\n }\n\n return new HttpResponse(\n response.controller.stream.pipeThrough(new TextEncoderStream()),\n {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n ...response.headers,\n },\n },\n );\n }\n\n case 'binary': {\n return HttpResponse.arrayBuffer(response.body, {\n status: 200,\n headers: response.headers,\n });\n }\n\n case 'error':\n return HttpResponse.text(response.body ?? 'Error', {\n status: response.status ?? 500,\n headers: response.headers,\n });\n\n case 'empty':\n return new HttpResponse(null, {\n status: response.status ?? 200,\n });\n\n default: {\n const _exhaustiveCheck: never = handlerType;\n throw new Error(`Unknown response type: ${_exhaustiveCheck}`);\n }\n }\n });\n }),\n );\n\n let calls: TestServerCall[] = [];\n\n beforeAll(() => {\n mswServer.listen();\n });\n\n beforeEach(() => {\n mswServer.resetHandlers();\n\n // set the responses back to the original values\n Object.entries(originalRoutes).forEach(([url, handler]) => {\n routes[url].response = handler.response;\n });\n\n calls = [];\n });\n\n afterAll(() => {\n mswServer.close();\n });\n\n return {\n urls: routes as UrlHandlers<URLS>,\n get calls() {\n return calls;\n },\n };\n}\n\nexport class TestResponseController {\n private readonly transformStream: TransformStream;\n private readonly writer: WritableStreamDefaultWriter;\n\n constructor() {\n this.transformStream = new TransformStream();\n this.writer = this.transformStream.writable.getWriter();\n }\n\n get stream(): ReadableStream {\n return this.transformStream.readable;\n }\n\n async write(chunk: string): Promise<void> {\n await this.writer.write(chunk);\n }\n\n async error(error: Error): Promise<void> {\n await this.writer.abort(error);\n }\n\n async close(): Promise<void> {\n await this.writer.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,4BAA+B,QAA+B;AAC5E,SAAO;AAAA,IACL,QAAQ,OAAO,aAAa,IAAI;AAC9B,iBAAW,SAAS,QAAQ;AAC1B,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;ACRO,SAAS,6BACd,QACmB;AACnB,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,YAAY;AAChB,UAAI;AACF,mBAAW,SAAS,QAAQ;AAC1B,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF,UAAE;AACA,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACdA,eAAsB,4BACpB,UACc;AACd,QAAM,SAAc,CAAC;AACrB,mBAAiB,QAAQ,UAAU;AACjC,WAAO,KAAK,IAAI;AAAA,EAClB;AACA,SAAO;AACT;;;ACRA,eAAsB,6BACpB,QACc;AACd,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,SAAc,CAAC;AAErB,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AACV,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;;;ACXA,eAAsB,6BACpB,UACmB;AACnB,SAAO;AAAA,IACL,SAAS,KAAM,YAAY,IAAI,kBAAkB,CAAC;AAAA,EACpD;AACF;;;ACRO,SAAS,cAAc,SAAiB;AAC7C,QAAM,mBAAmB,SAAS,QAAQ,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAC5E,SAAO,qBAAqB;AAC9B;;;ACHO,SAAS,OAAO;AAAA,EACrB,SAAS;AACX,IAEI,CAAC,GAAiB;AACpB,MAAI,UAAU;AACd,SAAO,MAAM,GAAG,MAAM,IAAI,SAAS;AACrC;;;ACPA,iBAAsD;AACtD,kBAA4B;AAE5B,oBAAgD;AAuDhD,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAoB,SAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEvC,IAAI,kBAAkB;AACpB,WAAO,KAAK,QAAS,KAAK,EAAE,KAAK,KAAK,KAAK;AAAA,EAC7C;AAAA,EAEA,IAAI,uBAAuB;AACzB,WAAO,KAAK,QAAS,QAAQ,IAAI,cAAc,GAAG;AAAA,MAChD;AAAA,IACF;AAAA;AAAA,MAEI,KAAK,QAAS,SAAS,EAAE,KAAK,cAAY;AACxC,cAAM,UAA+B,CAAC;AACtC,iBAAS,QAAQ,CAAC,OAAO,QAAQ;AAC/B,kBAAQ,GAAG,IAAI;AAAA,QACjB,CAAC;AACD,eAAO;AAAA,MACT,CAAC;AAAA,QACD;AAAA,EACN;AAAA,EAEA,IAAI,qBAAqB;AACvB,WAAO,KAAK,QAAS;AAAA,EACvB;AAAA,EAEA,IAAI,iBAAiB;AACnB,UAAM,iBAAiB,KAAK,QAAS;AAGrC,UAAM,gBAAwC,CAAC;AAC/C,mBAAe,QAAQ,CAAC,OAAO,QAAQ;AACrC,UAAI,IAAI,YAAY,MAAM,aAAc;AACxC,oBAAc,GAAG,IAAI;AAAA,IACvB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,mBAAuC;AACzC,WAAO,KAAK,QAAS,QAAQ,IAAI,YAAY,KAAK;AAAA,EACpD;AAAA,EAEA,IAAI,yBAAyB;AAC3B,WAAO,IAAI,IAAI,KAAK,QAAS,GAAG,EAAE;AAAA,EACpC;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,QAAS;AAAA,EACvB;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,QAAS;AAAA,EACvB;AACF;AAEO,SAAS,iBAOd,QAIA;AACA,QAAM,iBAAiB,gBAAgB,MAAM;AAE7C,QAAM,gBAAY;AAAA,IAChB,GAAG,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,OAAO,MAAM;AAChD,aAAO,gBAAK,IAAI,KAAK,CAAC,EAAE,QAAQ,MAAM;AACpC,cAAM,aAAa,MAAM;AAEzB,cAAM,KAAK,IAAI,eAAe,OAAO,CAAC;AAEtC,cAAM,WACJ,OAAO,QAAQ,aAAa,aACxB,QAAQ,SAAS,EAAE,WAAW,CAAC,IAC/B,MAAM,QAAQ,QAAQ,QAAQ,IAC5B,QAAQ,SAAS,UAAU,IAC3B,QAAQ;AAEhB,YAAI,aAAa,QAAW;AAC1B,iBAAO,wBAAa,KAAK,EAAE,OAAO,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,QAClE;AAEA,cAAM,cAAc,SAAS;AAE7B,gBAAQ,aAAa;AAAA,UACnB,KAAK;AACH,mBAAO,wBAAa,KAAK,SAAS,MAAM;AAAA,cACtC,QAAQ;AAAA,cACR,SAAS;AAAA,gBACP,gBAAgB;AAAA,gBAChB,GAAG,SAAS;AAAA,cACd;AAAA,YACF,CAAC;AAAA,UAEH,KAAK;AACH,mBAAO,IAAI;AAAA,cACT,6BAA6B,SAAS,MAAM,EAAE;AAAA,gBAC5C,IAAI,kBAAkB;AAAA,cACxB;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,kBACP,gBAAgB;AAAA,kBAChB,iBAAiB;AAAA,kBACjB,YAAY;AAAA,kBACZ,GAAG,SAAS;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UAEF,KAAK,qBAAqB;AACxB,gBAAI,QAAQ,QAAQ;AAClB,sBAAQ,OAAO,iBAAiB,SAAS,MAAM;AAC7C,yBAAS,WAAW;AAAA,kBAClB,IAAI,aAAa,WAAW,YAAY;AAAA,gBAC1C;AAAA,cACF,CAAC;AAAA,YACH;AAEA,mBAAO,IAAI;AAAA,cACT,SAAS,WAAW,OAAO,YAAY,IAAI,kBAAkB,CAAC;AAAA,cAC9D;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,kBACP,gBAAgB;AAAA,kBAChB,iBAAiB;AAAA,kBACjB,YAAY;AAAA,kBACZ,GAAG,SAAS;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UAEA,KAAK,UAAU;AACb,mBAAO,wBAAa,YAAY,SAAS,MAAM;AAAA,cAC7C,QAAQ;AAAA,cACR,SAAS,SAAS;AAAA,YACpB,CAAC;AAAA,UACH;AAAA,UAEA,KAAK;AACH,mBAAO,wBAAa,KAAK,SAAS,QAAQ,SAAS;AAAA,cACjD,QAAQ,SAAS,UAAU;AAAA,cAC3B,SAAS,SAAS;AAAA,YACpB,CAAC;AAAA,UAEH,KAAK;AACH,mBAAO,IAAI,wBAAa,MAAM;AAAA,cAC5B,QAAQ,SAAS,UAAU;AAAA,YAC7B,CAAC;AAAA,UAEH,SAAS;AACP,kBAAM,mBAA0B;AAChC,kBAAM,IAAI,MAAM,0BAA0B,gBAAgB,EAAE;AAAA,UAC9D;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,QAA0B,CAAC;AAE/B,+BAAU,MAAM;AACd,cAAU,OAAO;AAAA,EACnB,CAAC;AAED,gCAAW,MAAM;AACf,cAAU,cAAc;AAGxB,WAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,KAAK,OAAO,MAAM;AACzD,aAAO,GAAG,EAAE,WAAW,QAAQ;AAAA,IACjC,CAAC;AAED,YAAQ,CAAC;AAAA,EACX,CAAC;AAED,8BAAS,MAAM;AACb,cAAU,MAAM;AAAA,EAClB,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,yBAAN,MAA6B;AAAA,EAIlC,cAAc;AACZ,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,SAAK,SAAS,KAAK,gBAAgB,SAAS,UAAU;AAAA,EACxD;AAAA,EAEA,IAAI,SAAyB;AAC3B,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA,EAEA,MAAM,MAAM,OAA8B;AACxC,UAAM,KAAK,OAAO,MAAM,KAAK;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAM,OAA6B;AACvC,UAAM,KAAK,OAAO,MAAM,KAAK;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,OAAO,MAAM;AAAA,EAC1B;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/test/index.ts","../../src/test/convert-array-to-async-iterable.ts","../../src/test/convert-array-to-readable-stream.ts","../../src/test/convert-async-iterable-to-array.ts","../../src/test/convert-readable-stream-to-array.ts","../../src/test/convert-response-stream-to-array.ts","../../src/test/is-node-version.ts","../../src/test/mock-id.ts"],"sourcesContent":["export * from './convert-array-to-async-iterable';\nexport * from './convert-array-to-readable-stream';\nexport * from './convert-async-iterable-to-array';\nexport * from './convert-readable-stream-to-array';\nexport * from './convert-response-stream-to-array';\nexport * from './is-node-version';\nexport * from './mock-id';\n","export function convertArrayToAsyncIterable<T>(values: T[]): AsyncIterable<T> {\n return {\n async *[Symbol.asyncIterator]() {\n for (const value of values) {\n yield value;\n }\n },\n };\n}\n","export function convertArrayToReadableStream<T>(\n values: T[],\n): ReadableStream<T> {\n return new ReadableStream({\n start(controller) {\n try {\n for (const value of values) {\n controller.enqueue(value);\n }\n } finally {\n controller.close();\n }\n },\n });\n}\n","export async function convertAsyncIterableToArray<T>(\n iterable: AsyncIterable<T>,\n): Promise<T[]> {\n const result: T[] = [];\n for await (const item of iterable) {\n result.push(item);\n }\n return result;\n}\n","export async function convertReadableStreamToArray<T>(\n stream: ReadableStream<T>,\n): Promise<T[]> {\n const reader = stream.getReader();\n const result: T[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n result.push(value);\n }\n\n return result;\n}\n","import { convertReadableStreamToArray } from './convert-readable-stream-to-array';\n\nexport async function convertResponseStreamToArray(\n response: Response,\n): Promise<string[]> {\n return convertReadableStreamToArray(\n response.body!.pipeThrough(new TextDecoderStream()),\n );\n}\n","export function isNodeVersion(version: number) {\n const nodeMajorVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n return nodeMajorVersion === version;\n}\n","export function mockId({\n prefix = 'id',\n}: {\n prefix?: string;\n} = {}): () => string {\n let counter = 0;\n return () => `${prefix}-${counter++}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,4BAA+B,QAA+B;AAC5E,SAAO;AAAA,IACL,QAAQ,OAAO,aAAa,IAAI;AAC9B,iBAAW,SAAS,QAAQ;AAC1B,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;ACRO,SAAS,6BACd,QACmB;AACnB,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,YAAY;AAChB,UAAI;AACF,mBAAW,SAAS,QAAQ;AAC1B,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF,UAAE;AACA,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACdA,eAAsB,4BACpB,UACc;AACd,QAAM,SAAc,CAAC;AACrB,mBAAiB,QAAQ,UAAU;AACjC,WAAO,KAAK,IAAI;AAAA,EAClB;AACA,SAAO;AACT;;;ACRA,eAAsB,6BACpB,QACc;AACd,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,SAAc,CAAC;AAErB,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AACV,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;;;ACXA,eAAsB,6BACpB,UACmB;AACnB,SAAO;AAAA,IACL,SAAS,KAAM,YAAY,IAAI,kBAAkB,CAAC;AAAA,EACpD;AACF;;;ACRO,SAAS,cAAc,SAAiB;AAC7C,QAAM,mBAAmB,SAAS,QAAQ,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAC5E,SAAO,qBAAqB;AAC9B;;;ACHO,SAAS,OAAO;AAAA,EACrB,SAAS;AACX,IAEI,CAAC,GAAiB;AACpB,MAAI,UAAU;AACd,SAAO,MAAM,GAAG,MAAM,IAAI,SAAS;AACrC;","names":[]}
@@ -65,184 +65,12 @@ function mockId({
65
65
  let counter = 0;
66
66
  return () => `${prefix}-${counter++}`;
67
67
  }
68
-
69
- // src/test/test-server.ts
70
- import { http, HttpResponse } from "msw";
71
- import { setupServer } from "msw/node";
72
- import { beforeAll, beforeEach, afterAll } from "vitest";
73
- var TestServerCall = class {
74
- constructor(request) {
75
- this.request = request;
76
- }
77
- get requestBodyJson() {
78
- return this.request.text().then(JSON.parse);
79
- }
80
- get requestBodyMultipart() {
81
- return this.request.headers.get("content-type")?.startsWith(
82
- "multipart/form-data"
83
- ) ? (
84
- // For multipart/form-data, return the form data entries as an object
85
- this.request.formData().then((formData) => {
86
- const entries = {};
87
- formData.forEach((value, key) => {
88
- entries[key] = value;
89
- });
90
- return entries;
91
- })
92
- ) : null;
93
- }
94
- get requestCredentials() {
95
- return this.request.credentials;
96
- }
97
- get requestHeaders() {
98
- const requestHeaders = this.request.headers;
99
- const headersObject = {};
100
- requestHeaders.forEach((value, key) => {
101
- if (key.toLowerCase() === "user-agent") return;
102
- headersObject[key] = value;
103
- });
104
- return headersObject;
105
- }
106
- get requestUserAgent() {
107
- return this.request.headers.get("user-agent") ?? void 0;
108
- }
109
- get requestUrlSearchParams() {
110
- return new URL(this.request.url).searchParams;
111
- }
112
- get requestUrl() {
113
- return this.request.url;
114
- }
115
- get requestMethod() {
116
- return this.request.method;
117
- }
118
- };
119
- function createTestServer(routes) {
120
- const originalRoutes = structuredClone(routes);
121
- const mswServer = setupServer(
122
- ...Object.entries(routes).map(([url, handler]) => {
123
- return http.all(url, ({ request }) => {
124
- const callNumber = calls.length;
125
- calls.push(new TestServerCall(request));
126
- const response = typeof handler.response === "function" ? handler.response({ callNumber }) : Array.isArray(handler.response) ? handler.response[callNumber] : handler.response;
127
- if (response === void 0) {
128
- return HttpResponse.json({ error: "Not Found" }, { status: 404 });
129
- }
130
- const handlerType = response.type;
131
- switch (handlerType) {
132
- case "json-value":
133
- return HttpResponse.json(response.body, {
134
- status: 200,
135
- headers: {
136
- "Content-Type": "application/json",
137
- ...response.headers
138
- }
139
- });
140
- case "stream-chunks":
141
- return new HttpResponse(
142
- convertArrayToReadableStream(response.chunks).pipeThrough(
143
- new TextEncoderStream()
144
- ),
145
- {
146
- status: 200,
147
- headers: {
148
- "Content-Type": "text/event-stream",
149
- "Cache-Control": "no-cache",
150
- Connection: "keep-alive",
151
- ...response.headers
152
- }
153
- }
154
- );
155
- case "controlled-stream": {
156
- if (request.signal) {
157
- request.signal.addEventListener("abort", () => {
158
- response.controller.error(
159
- new DOMException("Aborted", "AbortError")
160
- );
161
- });
162
- }
163
- return new HttpResponse(
164
- response.controller.stream.pipeThrough(new TextEncoderStream()),
165
- {
166
- status: 200,
167
- headers: {
168
- "Content-Type": "text/event-stream",
169
- "Cache-Control": "no-cache",
170
- Connection: "keep-alive",
171
- ...response.headers
172
- }
173
- }
174
- );
175
- }
176
- case "binary": {
177
- return HttpResponse.arrayBuffer(response.body, {
178
- status: 200,
179
- headers: response.headers
180
- });
181
- }
182
- case "error":
183
- return HttpResponse.text(response.body ?? "Error", {
184
- status: response.status ?? 500,
185
- headers: response.headers
186
- });
187
- case "empty":
188
- return new HttpResponse(null, {
189
- status: response.status ?? 200
190
- });
191
- default: {
192
- const _exhaustiveCheck = handlerType;
193
- throw new Error(`Unknown response type: ${_exhaustiveCheck}`);
194
- }
195
- }
196
- });
197
- })
198
- );
199
- let calls = [];
200
- beforeAll(() => {
201
- mswServer.listen();
202
- });
203
- beforeEach(() => {
204
- mswServer.resetHandlers();
205
- Object.entries(originalRoutes).forEach(([url, handler]) => {
206
- routes[url].response = handler.response;
207
- });
208
- calls = [];
209
- });
210
- afterAll(() => {
211
- mswServer.close();
212
- });
213
- return {
214
- urls: routes,
215
- get calls() {
216
- return calls;
217
- }
218
- };
219
- }
220
- var TestResponseController = class {
221
- constructor() {
222
- this.transformStream = new TransformStream();
223
- this.writer = this.transformStream.writable.getWriter();
224
- }
225
- get stream() {
226
- return this.transformStream.readable;
227
- }
228
- async write(chunk) {
229
- await this.writer.write(chunk);
230
- }
231
- async error(error) {
232
- await this.writer.abort(error);
233
- }
234
- async close() {
235
- await this.writer.close();
236
- }
237
- };
238
68
  export {
239
- TestResponseController,
240
69
  convertArrayToAsyncIterable,
241
70
  convertArrayToReadableStream,
242
71
  convertAsyncIterableToArray,
243
72
  convertReadableStreamToArray,
244
73
  convertResponseStreamToArray,
245
- createTestServer,
246
74
  isNodeVersion,
247
75
  mockId
248
76
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/test/convert-array-to-async-iterable.ts","../../src/test/convert-array-to-readable-stream.ts","../../src/test/convert-async-iterable-to-array.ts","../../src/test/convert-readable-stream-to-array.ts","../../src/test/convert-response-stream-to-array.ts","../../src/test/is-node-version.ts","../../src/test/mock-id.ts","../../src/test/test-server.ts"],"sourcesContent":["export function convertArrayToAsyncIterable<T>(values: T[]): AsyncIterable<T> {\n return {\n async *[Symbol.asyncIterator]() {\n for (const value of values) {\n yield value;\n }\n },\n };\n}\n","export function convertArrayToReadableStream<T>(\n values: T[],\n): ReadableStream<T> {\n return new ReadableStream({\n start(controller) {\n try {\n for (const value of values) {\n controller.enqueue(value);\n }\n } finally {\n controller.close();\n }\n },\n });\n}\n","export async function convertAsyncIterableToArray<T>(\n iterable: AsyncIterable<T>,\n): Promise<T[]> {\n const result: T[] = [];\n for await (const item of iterable) {\n result.push(item);\n }\n return result;\n}\n","export async function convertReadableStreamToArray<T>(\n stream: ReadableStream<T>,\n): Promise<T[]> {\n const reader = stream.getReader();\n const result: T[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n result.push(value);\n }\n\n return result;\n}\n","import { convertReadableStreamToArray } from './convert-readable-stream-to-array';\n\nexport async function convertResponseStreamToArray(\n response: Response,\n): Promise<string[]> {\n return convertReadableStreamToArray(\n response.body!.pipeThrough(new TextDecoderStream()),\n );\n}\n","export function isNodeVersion(version: number) {\n const nodeMajorVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n return nodeMajorVersion === version;\n}\n","export function mockId({\n prefix = 'id',\n}: {\n prefix?: string;\n} = {}): () => string {\n let counter = 0;\n return () => `${prefix}-${counter++}`;\n}\n","import { type JsonBodyType, http, HttpResponse } from 'msw';\nimport { setupServer } from 'msw/node';\nimport { convertArrayToReadableStream } from './convert-array-to-readable-stream';\nimport { beforeAll, beforeEach, afterAll } from 'vitest';\n\nexport type UrlResponse =\n | {\n type: 'json-value';\n headers?: Record<string, string>;\n body: JsonBodyType;\n }\n | {\n type: 'stream-chunks';\n headers?: Record<string, string>;\n chunks: Array<string>;\n }\n | {\n type: 'binary';\n headers?: Record<string, string>;\n body: Buffer;\n }\n | {\n type: 'empty';\n headers?: Record<string, string>;\n status?: number;\n }\n | {\n type: 'error';\n headers?: Record<string, string>;\n status?: number;\n body?: string;\n }\n | {\n type: 'controlled-stream';\n headers?: Record<string, string>;\n controller: TestResponseController;\n }\n | undefined;\n\ntype UrlResponseParameter =\n | UrlResponse\n | UrlResponse[]\n | ((options: { callNumber: number }) => UrlResponse);\n\nexport type UrlHandler = {\n response: UrlResponseParameter;\n};\n\nexport type UrlHandlers<\n URLS extends {\n [url: string]: {\n response?: UrlResponseParameter;\n };\n },\n> = {\n [url in keyof URLS]: UrlHandler;\n};\n\nclass TestServerCall {\n constructor(private request: Request) {}\n\n get requestBodyJson() {\n return this.request!.text().then(JSON.parse);\n }\n\n get requestBodyMultipart() {\n return this.request!.headers.get('content-type')?.startsWith(\n 'multipart/form-data',\n )\n ? // For multipart/form-data, return the form data entries as an object\n this.request!.formData().then(formData => {\n const entries: Record<string, any> = {};\n formData.forEach((value, key) => {\n entries[key] = value;\n });\n return entries;\n })\n : null;\n }\n\n get requestCredentials() {\n return this.request!.credentials;\n }\n\n get requestHeaders() {\n const requestHeaders = this.request!.headers;\n\n // convert headers to object for easier comparison\n const headersObject: Record<string, string> = {};\n requestHeaders.forEach((value, key) => {\n if (key.toLowerCase() === 'user-agent') return;\n headersObject[key] = value;\n });\n\n return headersObject;\n }\n\n get requestUserAgent(): string | undefined {\n return this.request!.headers.get('user-agent') ?? undefined;\n }\n\n get requestUrlSearchParams() {\n return new URL(this.request!.url).searchParams;\n }\n\n get requestUrl() {\n return this.request!.url;\n }\n\n get requestMethod() {\n return this.request!.method;\n }\n}\n\nexport function createTestServer<\n URLS extends {\n [url: string]: {\n response?: UrlResponseParameter;\n };\n },\n>(\n routes: URLS,\n): {\n urls: UrlHandlers<URLS>;\n calls: TestServerCall[];\n} {\n const originalRoutes = structuredClone(routes); // deep copy\n\n const mswServer = setupServer(\n ...Object.entries(routes).map(([url, handler]) => {\n return http.all(url, ({ request }) => {\n const callNumber = calls.length;\n\n calls.push(new TestServerCall(request));\n\n const response =\n typeof handler.response === 'function'\n ? handler.response({ callNumber })\n : Array.isArray(handler.response)\n ? handler.response[callNumber]\n : handler.response;\n\n if (response === undefined) {\n return HttpResponse.json({ error: 'Not Found' }, { status: 404 });\n }\n\n const handlerType = response.type;\n\n switch (handlerType) {\n case 'json-value':\n return HttpResponse.json(response.body, {\n status: 200,\n headers: {\n 'Content-Type': 'application/json',\n ...response.headers,\n },\n });\n\n case 'stream-chunks':\n return new HttpResponse(\n convertArrayToReadableStream(response.chunks).pipeThrough(\n new TextEncoderStream(),\n ),\n {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n ...response.headers,\n },\n },\n );\n\n case 'controlled-stream': {\n if (request.signal) {\n request.signal.addEventListener('abort', () => {\n response.controller.error(\n new DOMException('Aborted', 'AbortError'),\n );\n });\n }\n\n return new HttpResponse(\n response.controller.stream.pipeThrough(new TextEncoderStream()),\n {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n ...response.headers,\n },\n },\n );\n }\n\n case 'binary': {\n return HttpResponse.arrayBuffer(response.body, {\n status: 200,\n headers: response.headers,\n });\n }\n\n case 'error':\n return HttpResponse.text(response.body ?? 'Error', {\n status: response.status ?? 500,\n headers: response.headers,\n });\n\n case 'empty':\n return new HttpResponse(null, {\n status: response.status ?? 200,\n });\n\n default: {\n const _exhaustiveCheck: never = handlerType;\n throw new Error(`Unknown response type: ${_exhaustiveCheck}`);\n }\n }\n });\n }),\n );\n\n let calls: TestServerCall[] = [];\n\n beforeAll(() => {\n mswServer.listen();\n });\n\n beforeEach(() => {\n mswServer.resetHandlers();\n\n // set the responses back to the original values\n Object.entries(originalRoutes).forEach(([url, handler]) => {\n routes[url].response = handler.response;\n });\n\n calls = [];\n });\n\n afterAll(() => {\n mswServer.close();\n });\n\n return {\n urls: routes as UrlHandlers<URLS>,\n get calls() {\n return calls;\n },\n };\n}\n\nexport class TestResponseController {\n private readonly transformStream: TransformStream;\n private readonly writer: WritableStreamDefaultWriter;\n\n constructor() {\n this.transformStream = new TransformStream();\n this.writer = this.transformStream.writable.getWriter();\n }\n\n get stream(): ReadableStream {\n return this.transformStream.readable;\n }\n\n async write(chunk: string): Promise<void> {\n await this.writer.write(chunk);\n }\n\n async error(error: Error): Promise<void> {\n await this.writer.abort(error);\n }\n\n async close(): Promise<void> {\n await this.writer.close();\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/test/convert-array-to-async-iterable.ts","../../src/test/convert-array-to-readable-stream.ts","../../src/test/convert-async-iterable-to-array.ts","../../src/test/convert-readable-stream-to-array.ts","../../src/test/convert-response-stream-to-array.ts","../../src/test/is-node-version.ts","../../src/test/mock-id.ts"],"sourcesContent":["export function convertArrayToAsyncIterable<T>(values: T[]): AsyncIterable<T> {\n return {\n async *[Symbol.asyncIterator]() {\n for (const value of values) {\n yield value;\n }\n },\n };\n}\n","export function convertArrayToReadableStream<T>(\n values: T[],\n): ReadableStream<T> {\n return new ReadableStream({\n start(controller) {\n try {\n for (const value of values) {\n controller.enqueue(value);\n }\n } finally {\n controller.close();\n }\n },\n });\n}\n","export async function convertAsyncIterableToArray<T>(\n iterable: AsyncIterable<T>,\n): Promise<T[]> {\n const result: T[] = [];\n for await (const item of iterable) {\n result.push(item);\n }\n return result;\n}\n","export async function convertReadableStreamToArray<T>(\n stream: ReadableStream<T>,\n): Promise<T[]> {\n const reader = stream.getReader();\n const result: T[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n result.push(value);\n }\n\n return result;\n}\n","import { convertReadableStreamToArray } from './convert-readable-stream-to-array';\n\nexport async function convertResponseStreamToArray(\n response: Response,\n): Promise<string[]> {\n return convertReadableStreamToArray(\n response.body!.pipeThrough(new TextDecoderStream()),\n );\n}\n","export function isNodeVersion(version: number) {\n const nodeMajorVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n return nodeMajorVersion === version;\n}\n","export function mockId({\n prefix = 'id',\n}: {\n prefix?: string;\n} = {}): () => string {\n let counter = 0;\n return () => `${prefix}-${counter++}`;\n}\n"],"mappings":";AAAO,SAAS,4BAA+B,QAA+B;AAC5E,SAAO;AAAA,IACL,QAAQ,OAAO,aAAa,IAAI;AAC9B,iBAAW,SAAS,QAAQ;AAC1B,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;ACRO,SAAS,6BACd,QACmB;AACnB,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,YAAY;AAChB,UAAI;AACF,mBAAW,SAAS,QAAQ;AAC1B,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF,UAAE;AACA,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACdA,eAAsB,4BACpB,UACc;AACd,QAAM,SAAc,CAAC;AACrB,mBAAiB,QAAQ,UAAU;AACjC,WAAO,KAAK,IAAI;AAAA,EAClB;AACA,SAAO;AACT;;;ACRA,eAAsB,6BACpB,QACc;AACd,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,SAAc,CAAC;AAErB,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AACV,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;;;ACXA,eAAsB,6BACpB,UACmB;AACnB,SAAO;AAAA,IACL,SAAS,KAAM,YAAY,IAAI,kBAAkB,CAAC;AAAA,EACpD;AACF;;;ACRO,SAAS,cAAc,SAAiB;AAC7C,QAAM,mBAAmB,SAAS,QAAQ,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAC5E,SAAO,qBAAqB;AAC9B;;;ACHO,SAAS,OAAO;AAAA,EACrB,SAAS;AACX,IAEI,CAAC,GAAiB;AACpB,MAAI,UAAU;AACd,SAAO,MAAM,GAAG,MAAM,IAAI,SAAS;AACrC;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/provider-utils",
3
- "version": "3.0.32",
3
+ "version": "3.0.33",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -33,7 +33,6 @@
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "20.17.24",
36
- "msw": "2.7.0",
37
36
  "tsup": "^8",
38
37
  "typescript": "5.8.3",
39
38
  "zod": "3.25.76",