@jterrazz/test 7.1.0 → 9.0.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/README.md +209 -230
- package/dist/checker.d.ts +1 -0
- package/dist/checker.js +741 -0
- package/dist/index.d.ts +1296 -529
- package/dist/index.js +3303 -1261
- package/dist/intercept.js +129 -290
- package/dist/match.js +153 -0
- package/dist/oxlint.cjs +2931 -0
- package/dist/oxlint.d.cts +150 -0
- package/dist/oxlint.d.ts +150 -0
- package/dist/oxlint.js +2925 -0
- package/package.json +47 -41
- package/dist/chunk.cjs +0 -28
- package/dist/index.cjs +0 -1814
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -734
- package/dist/index.js.map +0 -1
- package/dist/intercept.cjs +0 -313
- package/dist/intercept.cjs.map +0 -1
- package/dist/intercept.d.cts +0 -105
- package/dist/intercept.d.ts +0 -105
- package/dist/intercept.js.map +0 -1
- package/dist/intercept2.cjs +0 -81
- package/dist/intercept2.cjs.map +0 -1
- package/dist/intercept2.js +0 -81
- package/dist/intercept2.js.map +0 -1
- package/dist/mock-of.cjs +0 -32
- package/dist/mock-of.cjs.map +0 -1
- package/dist/mock-of.d.cts +0 -27
- package/dist/mock-of.d.ts +0 -27
- package/dist/mock-of.js +0 -19
- package/dist/mock-of.js.map +0 -1
- package/dist/mock.cjs +0 -4
- package/dist/mock.d.cts +0 -2
- package/dist/mock.d.ts +0 -2
- package/dist/mock.js +0 -2
- package/dist/services.cjs +0 -5
- package/dist/services.d.cts +0 -2
- package/dist/services.d.ts +0 -2
- package/dist/services.js +0 -2
- package/dist/sqlite.adapter.cjs +0 -350
- package/dist/sqlite.adapter.cjs.map +0 -1
- package/dist/sqlite.adapter.d.cts +0 -209
- package/dist/sqlite.adapter.d.ts +0 -209
- package/dist/sqlite.adapter.js +0 -331
- package/dist/sqlite.adapter.js.map +0 -1
- package/dist/types.d.cts +0 -42
- package/dist/types.d.ts +0 -42
package/dist/intercept.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intercept.cjs","names":[],"sources":["../src/builder/common/intercept/adapters/anthropic.ts","../src/builder/common/intercept/adapters/http.ts","../src/builder/common/intercept/adapters/openai.ts"],"sourcesContent":["import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\n\nexport interface AnthropicMessagesFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n}\n\nfunction matchesFilter(body: any, filter: AnthropicMessagesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const system = typeof body?.system === 'string' ? body.system : '';\n if (typeof filter.system === 'string' && !system.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(system)) {\n return false;\n }\n }\n if (filter.user) {\n const userMsg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n const text = typeof userMsg === 'string' ? userMsg : JSON.stringify(userMsg);\n if (typeof filter.user === 'string' && !text.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(text)) {\n return false;\n }\n }\n if (filter.tools) {\n const names = body?.tools?.map((t: any) => t.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n return true;\n}\n\nfunction buildReply(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'msg-test',\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n model: 'claude-sonnet-4-20250514',\n stop_reason: 'end_turn',\n usage: { input_tokens: 10, output_tokens: 10 },\n },\n };\n}\n\n/**\n * Anthropic API intercept helpers.\n */\nexport const anthropic = {\n /**\n * Trigger: match Anthropic messages API requests.\n *\n * @example\n * anthropic.request()\n * anthropic.request({ system: /classify/ })\n */\n request(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return {\n adapter: 'anthropic',\n method: 'POST',\n url: ANTHROPIC_MESSAGES_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n wrap: buildReply,\n };\n },\n\n /** Response: wrap data in Anthropic messages format. */\n reply: buildReply,\n\n /** Response: return an Anthropic error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n type: 'error',\n error: {\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n message: message ?? `Anthropic error (${status})`,\n },\n },\n };\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n\n // Legacy aliases\n /** @deprecated Use anthropic.request() instead. */\n messages(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return anthropic.request(filter);\n },\n /** @deprecated Use anthropic.reply() instead. */\n response: buildReply,\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nfunction wrapJson(data: unknown): InterceptResponse {\n return { status: 200, body: data };\n}\n\n/**\n * Generic HTTP intercept helpers for any URL.\n *\n * @example\n * .intercept(http.get('https://api.example.com/data'), 'http/response.json')\n */\nexport const http = {\n get(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'GET', url, wrap: wrapJson };\n },\n\n post(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'POST', url, wrap: wrapJson };\n },\n\n put(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'PUT', url, wrap: wrapJson };\n },\n\n delete(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'DELETE', url, wrap: wrapJson };\n },\n\n any(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: '*', url, wrap: wrapJson };\n },\n\n /** Response: simple JSON success. */\n json(data: unknown, status = 200): InterceptResponse {\n return { status, body: data };\n },\n\n /** Response: error with message. */\n error(status: number, message?: string): InterceptResponse {\n return { status, body: { error: message ?? `HTTP ${status}` } };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions';\nconst OPENAI_RESPONSES_URL = 'https://api.openai.com/v1/responses';\n\n// ── Chat Completions filters ──\n\nexport interface OpenAIChatFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n temperature?: number;\n}\n\nfunction matchesChatFilter(body: any, filter: OpenAIChatFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const msg = body?.messages?.find((m: any) => m.role === 'system')?.content ?? '';\n if (typeof filter.system === 'string' && !msg.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(msg)) {\n return false;\n }\n }\n if (filter.user) {\n const msg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n if (typeof filter.user === 'string' && !msg.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(msg)) {\n return false;\n }\n }\n if (filter.tools) {\n const names = body?.tools?.map((t: any) => t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n if (filter.temperature !== undefined && body?.temperature !== filter.temperature) {\n return false;\n }\n return true;\n}\n\n// ── Responses API filters ──\n\nexport interface OpenAIResponsesFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n}\n\nfunction matchesResponsesFilter(body: any, filter: OpenAIResponsesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const instructions = body?.instructions ?? '';\n const systemInput = body?.input?.find?.((m: any) => m.role === 'system')?.content ?? '';\n const text = instructions || systemInput;\n if (typeof filter.system === 'string' && !text.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(text)) {\n return false;\n }\n }\n if (filter.user) {\n const msgs = (body?.input ?? [])\n .filter((m: any) => m.role === 'user')\n .map((m: any) =>\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n )\n .join(' ');\n if (typeof filter.user === 'string' && !msgs.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(msgs)) {\n return false;\n }\n }\n if (filter.tools) {\n const names =\n body?.tools?.map((t: any) => t.name ?? t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n return true;\n}\n\n// ── Response builders ──\n\nfunction buildChatReply(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'chatcmpl-test',\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n choices: [{ index: 0, message: { role: 'assistant', content }, finish_reason: 'stop' }],\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n },\n };\n}\n\nfunction buildResponsesReply(data: unknown): InterceptResponse {\n const text = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'resp-test',\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n output: [\n {\n type: 'message',\n id: 'msg-test',\n role: 'assistant',\n content: [{ type: 'output_text', text, annotations: [] }],\n },\n ],\n usage: { input_tokens: 10, output_tokens: 10, total_tokens: 20 },\n },\n };\n}\n\n// ── Public API ──\n\n/**\n * OpenAI API intercept helpers.\n */\nexport const openai = {\n /**\n * Trigger: match Chat Completions API requests.\n *\n * @example\n * openai.request() // any chat call\n * openai.request({ model: 'gpt-4o' }) // specific model\n * openai.request({ system: /classify/ }) // system prompt match\n */\n request(filter?: OpenAIChatFilter): InterceptTrigger {\n return {\n adapter: 'openai',\n method: 'POST',\n url: OPENAI_CHAT_URL,\n match: filter ? (body: unknown) => matchesChatFilter(body, filter) : undefined,\n wrap: buildChatReply,\n };\n },\n\n /**\n * Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.\n * When used with a JSON file, the data is automatically wrapped in the\n * Responses API envelope.\n *\n * @param filter - Optional body filters.\n * @param url - Custom gateway URL (default: api.openai.com).\n *\n * @example\n * openai.agent({ user: /Report Ingestion/ }, GATEWAY)\n */\n agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return {\n adapter: 'openai',\n method: 'POST',\n url: url ?? OPENAI_RESPONSES_URL,\n match: filter ? (body: unknown) => matchesResponsesFilter(body, filter) : undefined,\n wrap: buildResponsesReply,\n };\n },\n\n /**\n * Response: wrap data in Chat Completions format.\n *\n * @example\n * openai.reply({ categories: ['TECH'] })\n */\n reply: buildChatReply,\n\n /** Response: return an OpenAI error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n error: {\n message: message ?? `OpenAI error (${status})`,\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n code: status === 429 ? 'rate_limit_exceeded' : null,\n },\n },\n };\n },\n\n /** Response: return malformed content. */\n malformed(content: string): InterceptResponse {\n return buildChatReply(content);\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n\n // ── Legacy aliases ──\n\n /** @deprecated Use openai.request() instead. */\n chat(filter?: OpenAIChatFilter): InterceptTrigger {\n return openai.request(filter);\n },\n\n /** @deprecated Use openai.reply() instead. */\n response: buildChatReply,\n\n /** @deprecated Use openai.agent() instead. */\n responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return openai.agent(filter, url);\n },\n\n /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */\n responsesResponse: buildResponsesReply,\n};\n"],"mappings":"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"}
|
package/dist/intercept.d.cts
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { n as InterceptResponse, r as InterceptTrigger, t as InterceptEntry } from "./types.cjs";
|
|
2
|
-
|
|
3
|
-
//#region src/builder/common/intercept/adapters/anthropic.d.ts
|
|
4
|
-
interface AnthropicMessagesFilter {
|
|
5
|
-
model?: RegExp | string;
|
|
6
|
-
system?: RegExp | string;
|
|
7
|
-
user?: RegExp | string;
|
|
8
|
-
tools?: string[];
|
|
9
|
-
}
|
|
10
|
-
declare function buildReply(data: unknown): InterceptResponse;
|
|
11
|
-
/**
|
|
12
|
-
* Anthropic API intercept helpers.
|
|
13
|
-
*/
|
|
14
|
-
declare const anthropic: {
|
|
15
|
-
/**
|
|
16
|
-
* Trigger: match Anthropic messages API requests.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* anthropic.request()
|
|
20
|
-
* anthropic.request({ system: /classify/ })
|
|
21
|
-
*/
|
|
22
|
-
request(filter?: AnthropicMessagesFilter): InterceptTrigger; /** Response: wrap data in Anthropic messages format. */
|
|
23
|
-
reply: typeof buildReply; /** Response: return an Anthropic error. */
|
|
24
|
-
error(status: number, message?: string): InterceptResponse; /** Response: simulate a timeout. */
|
|
25
|
-
timeout(): InterceptResponse; /** @deprecated Use anthropic.request() instead. */
|
|
26
|
-
messages(filter?: AnthropicMessagesFilter): InterceptTrigger; /** @deprecated Use anthropic.reply() instead. */
|
|
27
|
-
response: typeof buildReply;
|
|
28
|
-
};
|
|
29
|
-
//#endregion
|
|
30
|
-
//#region src/builder/common/intercept/adapters/http.d.ts
|
|
31
|
-
/**
|
|
32
|
-
* Generic HTTP intercept helpers for any URL.
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* .intercept(http.get('https://api.example.com/data'), 'http/response.json')
|
|
36
|
-
*/
|
|
37
|
-
declare const http: {
|
|
38
|
-
get(url: RegExp | string): InterceptTrigger;
|
|
39
|
-
post(url: RegExp | string): InterceptTrigger;
|
|
40
|
-
put(url: RegExp | string): InterceptTrigger;
|
|
41
|
-
delete(url: RegExp | string): InterceptTrigger;
|
|
42
|
-
any(url: RegExp | string): InterceptTrigger; /** Response: simple JSON success. */
|
|
43
|
-
json(data: unknown, status?: number): InterceptResponse; /** Response: error with message. */
|
|
44
|
-
error(status: number, message?: string): InterceptResponse;
|
|
45
|
-
};
|
|
46
|
-
//#endregion
|
|
47
|
-
//#region src/builder/common/intercept/adapters/openai.d.ts
|
|
48
|
-
interface OpenAIChatFilter {
|
|
49
|
-
model?: RegExp | string;
|
|
50
|
-
system?: RegExp | string;
|
|
51
|
-
user?: RegExp | string;
|
|
52
|
-
tools?: string[];
|
|
53
|
-
temperature?: number;
|
|
54
|
-
}
|
|
55
|
-
interface OpenAIResponsesFilter {
|
|
56
|
-
model?: RegExp | string;
|
|
57
|
-
system?: RegExp | string;
|
|
58
|
-
user?: RegExp | string;
|
|
59
|
-
tools?: string[];
|
|
60
|
-
}
|
|
61
|
-
declare function buildChatReply(data: unknown): InterceptResponse;
|
|
62
|
-
declare function buildResponsesReply(data: unknown): InterceptResponse;
|
|
63
|
-
/**
|
|
64
|
-
* OpenAI API intercept helpers.
|
|
65
|
-
*/
|
|
66
|
-
declare const openai: {
|
|
67
|
-
/**
|
|
68
|
-
* Trigger: match Chat Completions API requests.
|
|
69
|
-
*
|
|
70
|
-
* @example
|
|
71
|
-
* openai.request() // any chat call
|
|
72
|
-
* openai.request({ model: 'gpt-4o' }) // specific model
|
|
73
|
-
* openai.request({ system: /classify/ }) // system prompt match
|
|
74
|
-
*/
|
|
75
|
-
request(filter?: OpenAIChatFilter): InterceptTrigger;
|
|
76
|
-
/**
|
|
77
|
-
* Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.
|
|
78
|
-
* When used with a JSON file, the data is automatically wrapped in the
|
|
79
|
-
* Responses API envelope.
|
|
80
|
-
*
|
|
81
|
-
* @param filter - Optional body filters.
|
|
82
|
-
* @param url - Custom gateway URL (default: api.openai.com).
|
|
83
|
-
*
|
|
84
|
-
* @example
|
|
85
|
-
* openai.agent({ user: /Report Ingestion/ }, GATEWAY)
|
|
86
|
-
*/
|
|
87
|
-
agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger;
|
|
88
|
-
/**
|
|
89
|
-
* Response: wrap data in Chat Completions format.
|
|
90
|
-
*
|
|
91
|
-
* @example
|
|
92
|
-
* openai.reply({ categories: ['TECH'] })
|
|
93
|
-
*/
|
|
94
|
-
reply: typeof buildChatReply; /** Response: return an OpenAI error. */
|
|
95
|
-
error(status: number, message?: string): InterceptResponse; /** Response: return malformed content. */
|
|
96
|
-
malformed(content: string): InterceptResponse; /** Response: simulate a timeout. */
|
|
97
|
-
timeout(): InterceptResponse; /** @deprecated Use openai.request() instead. */
|
|
98
|
-
chat(filter?: OpenAIChatFilter): InterceptTrigger; /** @deprecated Use openai.reply() instead. */
|
|
99
|
-
response: typeof buildChatReply; /** @deprecated Use openai.agent() instead. */
|
|
100
|
-
responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger; /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */
|
|
101
|
-
responsesResponse: typeof buildResponsesReply;
|
|
102
|
-
};
|
|
103
|
-
//#endregion
|
|
104
|
-
export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, http, openai };
|
|
105
|
-
//# sourceMappingURL=intercept.d.cts.map
|
package/dist/intercept.d.ts
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { n as InterceptResponse, r as InterceptTrigger, t as InterceptEntry } from "./types.js";
|
|
2
|
-
|
|
3
|
-
//#region src/builder/common/intercept/adapters/anthropic.d.ts
|
|
4
|
-
interface AnthropicMessagesFilter {
|
|
5
|
-
model?: RegExp | string;
|
|
6
|
-
system?: RegExp | string;
|
|
7
|
-
user?: RegExp | string;
|
|
8
|
-
tools?: string[];
|
|
9
|
-
}
|
|
10
|
-
declare function buildReply(data: unknown): InterceptResponse;
|
|
11
|
-
/**
|
|
12
|
-
* Anthropic API intercept helpers.
|
|
13
|
-
*/
|
|
14
|
-
declare const anthropic: {
|
|
15
|
-
/**
|
|
16
|
-
* Trigger: match Anthropic messages API requests.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* anthropic.request()
|
|
20
|
-
* anthropic.request({ system: /classify/ })
|
|
21
|
-
*/
|
|
22
|
-
request(filter?: AnthropicMessagesFilter): InterceptTrigger; /** Response: wrap data in Anthropic messages format. */
|
|
23
|
-
reply: typeof buildReply; /** Response: return an Anthropic error. */
|
|
24
|
-
error(status: number, message?: string): InterceptResponse; /** Response: simulate a timeout. */
|
|
25
|
-
timeout(): InterceptResponse; /** @deprecated Use anthropic.request() instead. */
|
|
26
|
-
messages(filter?: AnthropicMessagesFilter): InterceptTrigger; /** @deprecated Use anthropic.reply() instead. */
|
|
27
|
-
response: typeof buildReply;
|
|
28
|
-
};
|
|
29
|
-
//#endregion
|
|
30
|
-
//#region src/builder/common/intercept/adapters/http.d.ts
|
|
31
|
-
/**
|
|
32
|
-
* Generic HTTP intercept helpers for any URL.
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* .intercept(http.get('https://api.example.com/data'), 'http/response.json')
|
|
36
|
-
*/
|
|
37
|
-
declare const http: {
|
|
38
|
-
get(url: RegExp | string): InterceptTrigger;
|
|
39
|
-
post(url: RegExp | string): InterceptTrigger;
|
|
40
|
-
put(url: RegExp | string): InterceptTrigger;
|
|
41
|
-
delete(url: RegExp | string): InterceptTrigger;
|
|
42
|
-
any(url: RegExp | string): InterceptTrigger; /** Response: simple JSON success. */
|
|
43
|
-
json(data: unknown, status?: number): InterceptResponse; /** Response: error with message. */
|
|
44
|
-
error(status: number, message?: string): InterceptResponse;
|
|
45
|
-
};
|
|
46
|
-
//#endregion
|
|
47
|
-
//#region src/builder/common/intercept/adapters/openai.d.ts
|
|
48
|
-
interface OpenAIChatFilter {
|
|
49
|
-
model?: RegExp | string;
|
|
50
|
-
system?: RegExp | string;
|
|
51
|
-
user?: RegExp | string;
|
|
52
|
-
tools?: string[];
|
|
53
|
-
temperature?: number;
|
|
54
|
-
}
|
|
55
|
-
interface OpenAIResponsesFilter {
|
|
56
|
-
model?: RegExp | string;
|
|
57
|
-
system?: RegExp | string;
|
|
58
|
-
user?: RegExp | string;
|
|
59
|
-
tools?: string[];
|
|
60
|
-
}
|
|
61
|
-
declare function buildChatReply(data: unknown): InterceptResponse;
|
|
62
|
-
declare function buildResponsesReply(data: unknown): InterceptResponse;
|
|
63
|
-
/**
|
|
64
|
-
* OpenAI API intercept helpers.
|
|
65
|
-
*/
|
|
66
|
-
declare const openai: {
|
|
67
|
-
/**
|
|
68
|
-
* Trigger: match Chat Completions API requests.
|
|
69
|
-
*
|
|
70
|
-
* @example
|
|
71
|
-
* openai.request() // any chat call
|
|
72
|
-
* openai.request({ model: 'gpt-4o' }) // specific model
|
|
73
|
-
* openai.request({ system: /classify/ }) // system prompt match
|
|
74
|
-
*/
|
|
75
|
-
request(filter?: OpenAIChatFilter): InterceptTrigger;
|
|
76
|
-
/**
|
|
77
|
-
* Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.
|
|
78
|
-
* When used with a JSON file, the data is automatically wrapped in the
|
|
79
|
-
* Responses API envelope.
|
|
80
|
-
*
|
|
81
|
-
* @param filter - Optional body filters.
|
|
82
|
-
* @param url - Custom gateway URL (default: api.openai.com).
|
|
83
|
-
*
|
|
84
|
-
* @example
|
|
85
|
-
* openai.agent({ user: /Report Ingestion/ }, GATEWAY)
|
|
86
|
-
*/
|
|
87
|
-
agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger;
|
|
88
|
-
/**
|
|
89
|
-
* Response: wrap data in Chat Completions format.
|
|
90
|
-
*
|
|
91
|
-
* @example
|
|
92
|
-
* openai.reply({ categories: ['TECH'] })
|
|
93
|
-
*/
|
|
94
|
-
reply: typeof buildChatReply; /** Response: return an OpenAI error. */
|
|
95
|
-
error(status: number, message?: string): InterceptResponse; /** Response: return malformed content. */
|
|
96
|
-
malformed(content: string): InterceptResponse; /** Response: simulate a timeout. */
|
|
97
|
-
timeout(): InterceptResponse; /** @deprecated Use openai.request() instead. */
|
|
98
|
-
chat(filter?: OpenAIChatFilter): InterceptTrigger; /** @deprecated Use openai.reply() instead. */
|
|
99
|
-
response: typeof buildChatReply; /** @deprecated Use openai.agent() instead. */
|
|
100
|
-
responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger; /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */
|
|
101
|
-
responsesResponse: typeof buildResponsesReply;
|
|
102
|
-
};
|
|
103
|
-
//#endregion
|
|
104
|
-
export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, http, openai };
|
|
105
|
-
//# sourceMappingURL=intercept.d.ts.map
|
package/dist/intercept.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intercept.js","names":[],"sources":["../src/builder/common/intercept/adapters/anthropic.ts","../src/builder/common/intercept/adapters/http.ts","../src/builder/common/intercept/adapters/openai.ts"],"sourcesContent":["import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\n\nexport interface AnthropicMessagesFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n}\n\nfunction matchesFilter(body: any, filter: AnthropicMessagesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const system = typeof body?.system === 'string' ? body.system : '';\n if (typeof filter.system === 'string' && !system.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(system)) {\n return false;\n }\n }\n if (filter.user) {\n const userMsg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n const text = typeof userMsg === 'string' ? userMsg : JSON.stringify(userMsg);\n if (typeof filter.user === 'string' && !text.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(text)) {\n return false;\n }\n }\n if (filter.tools) {\n const names = body?.tools?.map((t: any) => t.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n return true;\n}\n\nfunction buildReply(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'msg-test',\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n model: 'claude-sonnet-4-20250514',\n stop_reason: 'end_turn',\n usage: { input_tokens: 10, output_tokens: 10 },\n },\n };\n}\n\n/**\n * Anthropic API intercept helpers.\n */\nexport const anthropic = {\n /**\n * Trigger: match Anthropic messages API requests.\n *\n * @example\n * anthropic.request()\n * anthropic.request({ system: /classify/ })\n */\n request(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return {\n adapter: 'anthropic',\n method: 'POST',\n url: ANTHROPIC_MESSAGES_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n wrap: buildReply,\n };\n },\n\n /** Response: wrap data in Anthropic messages format. */\n reply: buildReply,\n\n /** Response: return an Anthropic error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n type: 'error',\n error: {\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n message: message ?? `Anthropic error (${status})`,\n },\n },\n };\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n\n // Legacy aliases\n /** @deprecated Use anthropic.request() instead. */\n messages(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return anthropic.request(filter);\n },\n /** @deprecated Use anthropic.reply() instead. */\n response: buildReply,\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nfunction wrapJson(data: unknown): InterceptResponse {\n return { status: 200, body: data };\n}\n\n/**\n * Generic HTTP intercept helpers for any URL.\n *\n * @example\n * .intercept(http.get('https://api.example.com/data'), 'http/response.json')\n */\nexport const http = {\n get(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'GET', url, wrap: wrapJson };\n },\n\n post(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'POST', url, wrap: wrapJson };\n },\n\n put(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'PUT', url, wrap: wrapJson };\n },\n\n delete(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'DELETE', url, wrap: wrapJson };\n },\n\n any(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: '*', url, wrap: wrapJson };\n },\n\n /** Response: simple JSON success. */\n json(data: unknown, status = 200): InterceptResponse {\n return { status, body: data };\n },\n\n /** Response: error with message. */\n error(status: number, message?: string): InterceptResponse {\n return { status, body: { error: message ?? `HTTP ${status}` } };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions';\nconst OPENAI_RESPONSES_URL = 'https://api.openai.com/v1/responses';\n\n// ── Chat Completions filters ──\n\nexport interface OpenAIChatFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n temperature?: number;\n}\n\nfunction matchesChatFilter(body: any, filter: OpenAIChatFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const msg = body?.messages?.find((m: any) => m.role === 'system')?.content ?? '';\n if (typeof filter.system === 'string' && !msg.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(msg)) {\n return false;\n }\n }\n if (filter.user) {\n const msg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n if (typeof filter.user === 'string' && !msg.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(msg)) {\n return false;\n }\n }\n if (filter.tools) {\n const names = body?.tools?.map((t: any) => t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n if (filter.temperature !== undefined && body?.temperature !== filter.temperature) {\n return false;\n }\n return true;\n}\n\n// ── Responses API filters ──\n\nexport interface OpenAIResponsesFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n}\n\nfunction matchesResponsesFilter(body: any, filter: OpenAIResponsesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const instructions = body?.instructions ?? '';\n const systemInput = body?.input?.find?.((m: any) => m.role === 'system')?.content ?? '';\n const text = instructions || systemInput;\n if (typeof filter.system === 'string' && !text.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(text)) {\n return false;\n }\n }\n if (filter.user) {\n const msgs = (body?.input ?? [])\n .filter((m: any) => m.role === 'user')\n .map((m: any) =>\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n )\n .join(' ');\n if (typeof filter.user === 'string' && !msgs.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(msgs)) {\n return false;\n }\n }\n if (filter.tools) {\n const names =\n body?.tools?.map((t: any) => t.name ?? t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n return true;\n}\n\n// ── Response builders ──\n\nfunction buildChatReply(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'chatcmpl-test',\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n choices: [{ index: 0, message: { role: 'assistant', content }, finish_reason: 'stop' }],\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n },\n };\n}\n\nfunction buildResponsesReply(data: unknown): InterceptResponse {\n const text = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'resp-test',\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n output: [\n {\n type: 'message',\n id: 'msg-test',\n role: 'assistant',\n content: [{ type: 'output_text', text, annotations: [] }],\n },\n ],\n usage: { input_tokens: 10, output_tokens: 10, total_tokens: 20 },\n },\n };\n}\n\n// ── Public API ──\n\n/**\n * OpenAI API intercept helpers.\n */\nexport const openai = {\n /**\n * Trigger: match Chat Completions API requests.\n *\n * @example\n * openai.request() // any chat call\n * openai.request({ model: 'gpt-4o' }) // specific model\n * openai.request({ system: /classify/ }) // system prompt match\n */\n request(filter?: OpenAIChatFilter): InterceptTrigger {\n return {\n adapter: 'openai',\n method: 'POST',\n url: OPENAI_CHAT_URL,\n match: filter ? (body: unknown) => matchesChatFilter(body, filter) : undefined,\n wrap: buildChatReply,\n };\n },\n\n /**\n * Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.\n * When used with a JSON file, the data is automatically wrapped in the\n * Responses API envelope.\n *\n * @param filter - Optional body filters.\n * @param url - Custom gateway URL (default: api.openai.com).\n *\n * @example\n * openai.agent({ user: /Report Ingestion/ }, GATEWAY)\n */\n agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return {\n adapter: 'openai',\n method: 'POST',\n url: url ?? OPENAI_RESPONSES_URL,\n match: filter ? (body: unknown) => matchesResponsesFilter(body, filter) : undefined,\n wrap: buildResponsesReply,\n };\n },\n\n /**\n * Response: wrap data in Chat Completions format.\n *\n * @example\n * openai.reply({ categories: ['TECH'] })\n */\n reply: buildChatReply,\n\n /** Response: return an OpenAI error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n error: {\n message: message ?? `OpenAI error (${status})`,\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n code: status === 429 ? 'rate_limit_exceeded' : null,\n },\n },\n };\n },\n\n /** Response: return malformed content. */\n malformed(content: string): InterceptResponse {\n return buildChatReply(content);\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n\n // ── Legacy aliases ──\n\n /** @deprecated Use openai.request() instead. */\n chat(filter?: OpenAIChatFilter): InterceptTrigger {\n return openai.request(filter);\n },\n\n /** @deprecated Use openai.reply() instead. */\n response: buildChatReply,\n\n /** @deprecated Use openai.agent() instead. */\n responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return openai.agent(filter, url);\n },\n\n /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */\n responsesResponse: buildResponsesReply,\n};\n"],"mappings":"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"}
|
package/dist/intercept2.cjs
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
//#region src/builder/common/intercept/intercept.ts
|
|
2
|
-
let mswModule = null;
|
|
3
|
-
let mswHttp = null;
|
|
4
|
-
async function loadMsw() {
|
|
5
|
-
if (!mswModule) {
|
|
6
|
-
mswModule = await import("msw/node");
|
|
7
|
-
mswHttp = await import("msw");
|
|
8
|
-
}
|
|
9
|
-
return {
|
|
10
|
-
node: mswModule,
|
|
11
|
-
msw: mswHttp
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
let serverInstance = null;
|
|
15
|
-
/**
|
|
16
|
-
* Start the MSW server (once per process).
|
|
17
|
-
*/
|
|
18
|
-
async function ensureInterceptServer() {
|
|
19
|
-
if (serverInstance) return;
|
|
20
|
-
const { node } = await loadMsw();
|
|
21
|
-
serverInstance = node.setupServer();
|
|
22
|
-
serverInstance.listen({ onUnhandledRequest: "bypass" });
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Register intercept entries as MSW handlers. Returns a cleanup function.
|
|
26
|
-
*
|
|
27
|
-
* Each incoming request is matched against all unconsumed entries in order.
|
|
28
|
-
* The first entry whose URL and optional body filter match is consumed.
|
|
29
|
-
* This supports multiple entries for the same URL with different body matchers.
|
|
30
|
-
*/
|
|
31
|
-
async function registerIntercepts(entries) {
|
|
32
|
-
if (entries.length === 0) return () => {};
|
|
33
|
-
await ensureInterceptServer();
|
|
34
|
-
const { msw } = await loadMsw();
|
|
35
|
-
const consumed = Array.from({ length: entries.length }, () => false);
|
|
36
|
-
const urls = /* @__PURE__ */ new Set();
|
|
37
|
-
for (const entry of entries) urls.add(entry.trigger.url);
|
|
38
|
-
const handlers = [];
|
|
39
|
-
for (const url of urls) {
|
|
40
|
-
const methods = /* @__PURE__ */ new Set();
|
|
41
|
-
for (const entry of entries) if (entry.trigger.url === url || String(entry.trigger.url) === String(url)) methods.add(entry.trigger.method);
|
|
42
|
-
for (const method of methods) {
|
|
43
|
-
const handlerFn = method === "*" ? msw.http.all : msw.http[method.toLowerCase()];
|
|
44
|
-
if (!handlerFn) continue;
|
|
45
|
-
const handler = handlerFn(url, async ({ request }) => {
|
|
46
|
-
let body = null;
|
|
47
|
-
let bodyParsed = false;
|
|
48
|
-
for (let i = 0; i < entries.length; i++) {
|
|
49
|
-
if (consumed[i]) continue;
|
|
50
|
-
const entry = entries[i];
|
|
51
|
-
if (entry.trigger.url !== url && String(entry.trigger.url) !== String(url)) continue;
|
|
52
|
-
if (entry.trigger.method !== method && entry.trigger.method !== "*") continue;
|
|
53
|
-
if (entry.trigger.match) {
|
|
54
|
-
if (!bodyParsed) {
|
|
55
|
-
try {
|
|
56
|
-
body = await request.clone().json();
|
|
57
|
-
} catch {}
|
|
58
|
-
bodyParsed = true;
|
|
59
|
-
}
|
|
60
|
-
if (!entry.trigger.match(body)) continue;
|
|
61
|
-
}
|
|
62
|
-
consumed[i] = true;
|
|
63
|
-
if (entry.response.delay) await new Promise((r) => setTimeout(r, entry.response.delay));
|
|
64
|
-
return msw.HttpResponse.json(entry.response.body, {
|
|
65
|
-
status: entry.response.status ?? 200,
|
|
66
|
-
headers: entry.response.headers
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
handlers.push(handler);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
serverInstance.use(...handlers);
|
|
74
|
-
return () => {
|
|
75
|
-
serverInstance.resetHandlers();
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
//#endregion
|
|
79
|
-
exports.registerIntercepts = registerIntercepts;
|
|
80
|
-
|
|
81
|
-
//# sourceMappingURL=intercept2.cjs.map
|
package/dist/intercept2.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intercept2.cjs","names":[],"sources":["../src/builder/common/intercept/intercept.ts"],"sourcesContent":["/**\n * MSW-based intercept server. Manages HTTP interception for spec.run().\n *\n * Intercepts are matched in order — for each incoming request, the first\n * unconsumed entry whose trigger matches (URL + optional body filter) is\n * used and consumed. This supports body-based routing to the same URL.\n */\nimport type { InterceptEntry } from './types.js';\n\nlet mswModule: any = null;\nlet mswHttp: any = null;\n\nasync function loadMsw() {\n if (!mswModule) {\n mswModule = await import('msw/node');\n mswHttp = await import('msw');\n }\n return { node: mswModule, msw: mswHttp! };\n}\n\nlet serverInstance: any = null;\n\n/**\n * Start the MSW server (once per process).\n */\nexport async function ensureInterceptServer(): Promise<void> {\n if (serverInstance) {\n return;\n }\n const { node } = await loadMsw();\n serverInstance = node.setupServer();\n serverInstance.listen({ onUnhandledRequest: 'bypass' });\n}\n\n/**\n * Register intercept entries as MSW handlers. Returns a cleanup function.\n *\n * Each incoming request is matched against all unconsumed entries in order.\n * The first entry whose URL and optional body filter match is consumed.\n * This supports multiple entries for the same URL with different body matchers.\n */\nexport async function registerIntercepts(entries: InterceptEntry[]): Promise<() => void> {\n if (entries.length === 0) {\n return () => {};\n }\n\n await ensureInterceptServer();\n const { msw } = await loadMsw();\n\n // Track which entries have been consumed\n const consumed = Array.from({ length: entries.length }, () => false);\n\n // Collect unique URL patterns to register handlers for\n const urls = new Set<RegExp | string>();\n for (const entry of entries) {\n urls.add(entry.trigger.url);\n }\n\n const handlers: any[] = [];\n\n for (const url of urls) {\n // Collect all methods for this URL\n const methods = new Set<string>();\n for (const entry of entries) {\n if (entry.trigger.url === url || String(entry.trigger.url) === String(url)) {\n methods.add(entry.trigger.method);\n }\n }\n\n for (const method of methods) {\n const handlerFn =\n method === '*' ? msw.http.all : (msw.http as any)[method.toLowerCase()];\n if (!handlerFn) {\n continue;\n }\n\n const handler = handlerFn(url, async ({ request }: { request: Request }) => {\n // Clone body once for all match checks\n let body: unknown = null;\n let bodyParsed = false;\n\n for (let i = 0; i < entries.length; i++) {\n if (consumed[i]) {\n continue;\n }\n\n const entry = entries[i];\n\n // Check URL matches\n if (entry.trigger.url !== url && String(entry.trigger.url) !== String(url)) {\n continue;\n }\n\n // Check method matches\n if (entry.trigger.method !== method && entry.trigger.method !== '*') {\n continue;\n }\n\n // Check body matcher if present\n if (entry.trigger.match) {\n if (!bodyParsed) {\n try {\n body = await request.clone().json();\n } catch {\n // Not JSON\n }\n bodyParsed = true;\n }\n if (!entry.trigger.match(body)) {\n continue;\n }\n }\n\n // Match found — consume and respond\n consumed[i] = true;\n\n if (entry.response.delay) {\n await new Promise((r) => setTimeout(r, entry.response.delay));\n }\n\n return msw.HttpResponse.json(entry.response.body, {\n status: entry.response.status ?? 200,\n headers: entry.response.headers,\n });\n }\n\n // No match — passthrough\n return undefined;\n });\n\n handlers.push(handler);\n }\n }\n\n serverInstance.use(...handlers);\n\n return () => {\n serverInstance.resetHandlers();\n };\n}\n\n/**\n * Stop the MSW server (call in afterAll).\n */\nexport async function stopInterceptServer(): Promise<void> {\n if (serverInstance) {\n serverInstance.close();\n serverInstance = null;\n }\n}\n"],"mappings":";AASA,IAAI,YAAiB;AACrB,IAAI,UAAe;AAEnB,eAAe,UAAU;AACrB,KAAI,CAAC,WAAW;AACZ,cAAY,MAAM,OAAO;AACzB,YAAU,MAAM,OAAO;;AAE3B,QAAO;EAAE,MAAM;EAAW,KAAK;EAAU;;AAG7C,IAAI,iBAAsB;;;;AAK1B,eAAsB,wBAAuC;AACzD,KAAI,eACA;CAEJ,MAAM,EAAE,SAAS,MAAM,SAAS;AAChC,kBAAiB,KAAK,aAAa;AACnC,gBAAe,OAAO,EAAE,oBAAoB,UAAU,CAAC;;;;;;;;;AAU3D,eAAsB,mBAAmB,SAAgD;AACrF,KAAI,QAAQ,WAAW,EACnB,cAAa;AAGjB,OAAM,uBAAuB;CAC7B,MAAM,EAAE,QAAQ,MAAM,SAAS;CAG/B,MAAM,WAAW,MAAM,KAAK,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;CAGpE,MAAM,uBAAO,IAAI,KAAsB;AACvC,MAAK,MAAM,SAAS,QAChB,MAAK,IAAI,MAAM,QAAQ,IAAI;CAG/B,MAAM,WAAkB,EAAE;AAE1B,MAAK,MAAM,OAAO,MAAM;EAEpB,MAAM,0BAAU,IAAI,KAAa;AACjC,OAAK,MAAM,SAAS,QAChB,KAAI,MAAM,QAAQ,QAAQ,OAAO,OAAO,MAAM,QAAQ,IAAI,KAAK,OAAO,IAAI,CACtE,SAAQ,IAAI,MAAM,QAAQ,OAAO;AAIzC,OAAK,MAAM,UAAU,SAAS;GAC1B,MAAM,YACF,WAAW,MAAM,IAAI,KAAK,MAAO,IAAI,KAAa,OAAO,aAAa;AAC1E,OAAI,CAAC,UACD;GAGJ,MAAM,UAAU,UAAU,KAAK,OAAO,EAAE,cAAoC;IAExE,IAAI,OAAgB;IACpB,IAAI,aAAa;AAEjB,SAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,SAAI,SAAS,GACT;KAGJ,MAAM,QAAQ,QAAQ;AAGtB,SAAI,MAAM,QAAQ,QAAQ,OAAO,OAAO,MAAM,QAAQ,IAAI,KAAK,OAAO,IAAI,CACtE;AAIJ,SAAI,MAAM,QAAQ,WAAW,UAAU,MAAM,QAAQ,WAAW,IAC5D;AAIJ,SAAI,MAAM,QAAQ,OAAO;AACrB,UAAI,CAAC,YAAY;AACb,WAAI;AACA,eAAO,MAAM,QAAQ,OAAO,CAAC,MAAM;eAC/B;AAGR,oBAAa;;AAEjB,UAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,CAC1B;;AAKR,cAAS,KAAK;AAEd,SAAI,MAAM,SAAS,MACf,OAAM,IAAI,SAAS,MAAM,WAAW,GAAG,MAAM,SAAS,MAAM,CAAC;AAGjE,YAAO,IAAI,aAAa,KAAK,MAAM,SAAS,MAAM;MAC9C,QAAQ,MAAM,SAAS,UAAU;MACjC,SAAS,MAAM,SAAS;MAC3B,CAAC;;KAKR;AAEF,YAAS,KAAK,QAAQ;;;AAI9B,gBAAe,IAAI,GAAG,SAAS;AAE/B,cAAa;AACT,iBAAe,eAAe"}
|
package/dist/intercept2.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
//#region src/builder/common/intercept/intercept.ts
|
|
2
|
-
let mswModule = null;
|
|
3
|
-
let mswHttp = null;
|
|
4
|
-
async function loadMsw() {
|
|
5
|
-
if (!mswModule) {
|
|
6
|
-
mswModule = await import("msw/node");
|
|
7
|
-
mswHttp = await import("msw");
|
|
8
|
-
}
|
|
9
|
-
return {
|
|
10
|
-
node: mswModule,
|
|
11
|
-
msw: mswHttp
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
let serverInstance = null;
|
|
15
|
-
/**
|
|
16
|
-
* Start the MSW server (once per process).
|
|
17
|
-
*/
|
|
18
|
-
async function ensureInterceptServer() {
|
|
19
|
-
if (serverInstance) return;
|
|
20
|
-
const { node } = await loadMsw();
|
|
21
|
-
serverInstance = node.setupServer();
|
|
22
|
-
serverInstance.listen({ onUnhandledRequest: "bypass" });
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Register intercept entries as MSW handlers. Returns a cleanup function.
|
|
26
|
-
*
|
|
27
|
-
* Each incoming request is matched against all unconsumed entries in order.
|
|
28
|
-
* The first entry whose URL and optional body filter match is consumed.
|
|
29
|
-
* This supports multiple entries for the same URL with different body matchers.
|
|
30
|
-
*/
|
|
31
|
-
async function registerIntercepts(entries) {
|
|
32
|
-
if (entries.length === 0) return () => {};
|
|
33
|
-
await ensureInterceptServer();
|
|
34
|
-
const { msw } = await loadMsw();
|
|
35
|
-
const consumed = Array.from({ length: entries.length }, () => false);
|
|
36
|
-
const urls = /* @__PURE__ */ new Set();
|
|
37
|
-
for (const entry of entries) urls.add(entry.trigger.url);
|
|
38
|
-
const handlers = [];
|
|
39
|
-
for (const url of urls) {
|
|
40
|
-
const methods = /* @__PURE__ */ new Set();
|
|
41
|
-
for (const entry of entries) if (entry.trigger.url === url || String(entry.trigger.url) === String(url)) methods.add(entry.trigger.method);
|
|
42
|
-
for (const method of methods) {
|
|
43
|
-
const handlerFn = method === "*" ? msw.http.all : msw.http[method.toLowerCase()];
|
|
44
|
-
if (!handlerFn) continue;
|
|
45
|
-
const handler = handlerFn(url, async ({ request }) => {
|
|
46
|
-
let body = null;
|
|
47
|
-
let bodyParsed = false;
|
|
48
|
-
for (let i = 0; i < entries.length; i++) {
|
|
49
|
-
if (consumed[i]) continue;
|
|
50
|
-
const entry = entries[i];
|
|
51
|
-
if (entry.trigger.url !== url && String(entry.trigger.url) !== String(url)) continue;
|
|
52
|
-
if (entry.trigger.method !== method && entry.trigger.method !== "*") continue;
|
|
53
|
-
if (entry.trigger.match) {
|
|
54
|
-
if (!bodyParsed) {
|
|
55
|
-
try {
|
|
56
|
-
body = await request.clone().json();
|
|
57
|
-
} catch {}
|
|
58
|
-
bodyParsed = true;
|
|
59
|
-
}
|
|
60
|
-
if (!entry.trigger.match(body)) continue;
|
|
61
|
-
}
|
|
62
|
-
consumed[i] = true;
|
|
63
|
-
if (entry.response.delay) await new Promise((r) => setTimeout(r, entry.response.delay));
|
|
64
|
-
return msw.HttpResponse.json(entry.response.body, {
|
|
65
|
-
status: entry.response.status ?? 200,
|
|
66
|
-
headers: entry.response.headers
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
handlers.push(handler);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
serverInstance.use(...handlers);
|
|
74
|
-
return () => {
|
|
75
|
-
serverInstance.resetHandlers();
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
//#endregion
|
|
79
|
-
export { registerIntercepts };
|
|
80
|
-
|
|
81
|
-
//# sourceMappingURL=intercept2.js.map
|
package/dist/intercept2.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intercept2.js","names":[],"sources":["../src/builder/common/intercept/intercept.ts"],"sourcesContent":["/**\n * MSW-based intercept server. Manages HTTP interception for spec.run().\n *\n * Intercepts are matched in order — for each incoming request, the first\n * unconsumed entry whose trigger matches (URL + optional body filter) is\n * used and consumed. This supports body-based routing to the same URL.\n */\nimport type { InterceptEntry } from './types.js';\n\nlet mswModule: any = null;\nlet mswHttp: any = null;\n\nasync function loadMsw() {\n if (!mswModule) {\n mswModule = await import('msw/node');\n mswHttp = await import('msw');\n }\n return { node: mswModule, msw: mswHttp! };\n}\n\nlet serverInstance: any = null;\n\n/**\n * Start the MSW server (once per process).\n */\nexport async function ensureInterceptServer(): Promise<void> {\n if (serverInstance) {\n return;\n }\n const { node } = await loadMsw();\n serverInstance = node.setupServer();\n serverInstance.listen({ onUnhandledRequest: 'bypass' });\n}\n\n/**\n * Register intercept entries as MSW handlers. Returns a cleanup function.\n *\n * Each incoming request is matched against all unconsumed entries in order.\n * The first entry whose URL and optional body filter match is consumed.\n * This supports multiple entries for the same URL with different body matchers.\n */\nexport async function registerIntercepts(entries: InterceptEntry[]): Promise<() => void> {\n if (entries.length === 0) {\n return () => {};\n }\n\n await ensureInterceptServer();\n const { msw } = await loadMsw();\n\n // Track which entries have been consumed\n const consumed = Array.from({ length: entries.length }, () => false);\n\n // Collect unique URL patterns to register handlers for\n const urls = new Set<RegExp | string>();\n for (const entry of entries) {\n urls.add(entry.trigger.url);\n }\n\n const handlers: any[] = [];\n\n for (const url of urls) {\n // Collect all methods for this URL\n const methods = new Set<string>();\n for (const entry of entries) {\n if (entry.trigger.url === url || String(entry.trigger.url) === String(url)) {\n methods.add(entry.trigger.method);\n }\n }\n\n for (const method of methods) {\n const handlerFn =\n method === '*' ? msw.http.all : (msw.http as any)[method.toLowerCase()];\n if (!handlerFn) {\n continue;\n }\n\n const handler = handlerFn(url, async ({ request }: { request: Request }) => {\n // Clone body once for all match checks\n let body: unknown = null;\n let bodyParsed = false;\n\n for (let i = 0; i < entries.length; i++) {\n if (consumed[i]) {\n continue;\n }\n\n const entry = entries[i];\n\n // Check URL matches\n if (entry.trigger.url !== url && String(entry.trigger.url) !== String(url)) {\n continue;\n }\n\n // Check method matches\n if (entry.trigger.method !== method && entry.trigger.method !== '*') {\n continue;\n }\n\n // Check body matcher if present\n if (entry.trigger.match) {\n if (!bodyParsed) {\n try {\n body = await request.clone().json();\n } catch {\n // Not JSON\n }\n bodyParsed = true;\n }\n if (!entry.trigger.match(body)) {\n continue;\n }\n }\n\n // Match found — consume and respond\n consumed[i] = true;\n\n if (entry.response.delay) {\n await new Promise((r) => setTimeout(r, entry.response.delay));\n }\n\n return msw.HttpResponse.json(entry.response.body, {\n status: entry.response.status ?? 200,\n headers: entry.response.headers,\n });\n }\n\n // No match — passthrough\n return undefined;\n });\n\n handlers.push(handler);\n }\n }\n\n serverInstance.use(...handlers);\n\n return () => {\n serverInstance.resetHandlers();\n };\n}\n\n/**\n * Stop the MSW server (call in afterAll).\n */\nexport async function stopInterceptServer(): Promise<void> {\n if (serverInstance) {\n serverInstance.close();\n serverInstance = null;\n }\n}\n"],"mappings":";AASA,IAAI,YAAiB;AACrB,IAAI,UAAe;AAEnB,eAAe,UAAU;AACrB,KAAI,CAAC,WAAW;AACZ,cAAY,MAAM,OAAO;AACzB,YAAU,MAAM,OAAO;;AAE3B,QAAO;EAAE,MAAM;EAAW,KAAK;EAAU;;AAG7C,IAAI,iBAAsB;;;;AAK1B,eAAsB,wBAAuC;AACzD,KAAI,eACA;CAEJ,MAAM,EAAE,SAAS,MAAM,SAAS;AAChC,kBAAiB,KAAK,aAAa;AACnC,gBAAe,OAAO,EAAE,oBAAoB,UAAU,CAAC;;;;;;;;;AAU3D,eAAsB,mBAAmB,SAAgD;AACrF,KAAI,QAAQ,WAAW,EACnB,cAAa;AAGjB,OAAM,uBAAuB;CAC7B,MAAM,EAAE,QAAQ,MAAM,SAAS;CAG/B,MAAM,WAAW,MAAM,KAAK,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;CAGpE,MAAM,uBAAO,IAAI,KAAsB;AACvC,MAAK,MAAM,SAAS,QAChB,MAAK,IAAI,MAAM,QAAQ,IAAI;CAG/B,MAAM,WAAkB,EAAE;AAE1B,MAAK,MAAM,OAAO,MAAM;EAEpB,MAAM,0BAAU,IAAI,KAAa;AACjC,OAAK,MAAM,SAAS,QAChB,KAAI,MAAM,QAAQ,QAAQ,OAAO,OAAO,MAAM,QAAQ,IAAI,KAAK,OAAO,IAAI,CACtE,SAAQ,IAAI,MAAM,QAAQ,OAAO;AAIzC,OAAK,MAAM,UAAU,SAAS;GAC1B,MAAM,YACF,WAAW,MAAM,IAAI,KAAK,MAAO,IAAI,KAAa,OAAO,aAAa;AAC1E,OAAI,CAAC,UACD;GAGJ,MAAM,UAAU,UAAU,KAAK,OAAO,EAAE,cAAoC;IAExE,IAAI,OAAgB;IACpB,IAAI,aAAa;AAEjB,SAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,SAAI,SAAS,GACT;KAGJ,MAAM,QAAQ,QAAQ;AAGtB,SAAI,MAAM,QAAQ,QAAQ,OAAO,OAAO,MAAM,QAAQ,IAAI,KAAK,OAAO,IAAI,CACtE;AAIJ,SAAI,MAAM,QAAQ,WAAW,UAAU,MAAM,QAAQ,WAAW,IAC5D;AAIJ,SAAI,MAAM,QAAQ,OAAO;AACrB,UAAI,CAAC,YAAY;AACb,WAAI;AACA,eAAO,MAAM,QAAQ,OAAO,CAAC,MAAM;eAC/B;AAGR,oBAAa;;AAEjB,UAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,CAC1B;;AAKR,cAAS,KAAK;AAEd,SAAI,MAAM,SAAS,MACf,OAAM,IAAI,SAAS,MAAM,WAAW,GAAG,MAAM,SAAS,MAAM,CAAC;AAGjE,YAAO,IAAI,aAAa,KAAK,MAAM,SAAS,MAAM;MAC9C,QAAQ,MAAM,SAAS,UAAU;MACjC,SAAS,MAAM,SAAS;MAC3B,CAAC;;KAKR;AAEF,YAAS,KAAK,QAAQ;;;AAI9B,gBAAe,IAAI,GAAG,SAAS;AAE/B,cAAa;AACT,iBAAe,eAAe"}
|
package/dist/mock-of.cjs
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
const require_chunk = require("./chunk.cjs");
|
|
2
|
-
let mockdate = require("mockdate");
|
|
3
|
-
mockdate = require_chunk.__toESM(mockdate, 1);
|
|
4
|
-
let vitest_mock_extended = require("vitest-mock-extended");
|
|
5
|
-
//#region src/mock/mock-of-date.ts
|
|
6
|
-
/**
|
|
7
|
-
* Freeze or reset the global Date for deterministic time-dependent tests.
|
|
8
|
-
* Wraps the `mockdate` package.
|
|
9
|
-
*/
|
|
10
|
-
const mockOfDate = mockdate.default;
|
|
11
|
-
//#endregion
|
|
12
|
-
//#region src/mock/mock-of.ts
|
|
13
|
-
/**
|
|
14
|
-
* Create a deep mock proxy for a given type.
|
|
15
|
-
* Wraps `vitest-mock-extended`'s `mockDeep` for convenient port mocking.
|
|
16
|
-
*/
|
|
17
|
-
const mockOf = vitest_mock_extended.mockDeep;
|
|
18
|
-
//#endregion
|
|
19
|
-
Object.defineProperty(exports, "mockOf", {
|
|
20
|
-
enumerable: true,
|
|
21
|
-
get: function() {
|
|
22
|
-
return mockOf;
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
Object.defineProperty(exports, "mockOfDate", {
|
|
26
|
-
enumerable: true,
|
|
27
|
-
get: function() {
|
|
28
|
-
return mockOfDate;
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=mock-of.cjs.map
|
package/dist/mock-of.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock-of.cjs","names":["MockDatePackage","mockDeep"],"sources":["../src/mock/mock-of-date.ts","../src/mock/mock-of.ts"],"sourcesContent":["import MockDatePackage from 'mockdate';\n\n/** Interface for freezing and resetting the global Date in tests. */\nexport interface MockDatePort {\n /** Restore the real Date object. */\n reset: () => void;\n /** Freeze `Date.now()` and `new Date()` to the given value. */\n set: (date: Date | number | string) => void;\n}\n\n/**\n * Freeze or reset the global Date for deterministic time-dependent tests.\n * Wraps the `mockdate` package.\n */\nexport const mockOfDate: MockDatePort = MockDatePackage;\n","import { type DeepMockProxy, mockDeep } from 'vitest-mock-extended';\n\n/** Factory signature that creates a deep mock proxy for any interface. */\nexport type MockPort = <T>() => DeepMockProxy<T>;\n\n/**\n * Create a deep mock proxy for a given type.\n * Wraps `vitest-mock-extended`'s `mockDeep` for convenient port mocking.\n */\nexport const mockOf: MockPort = mockDeep;\n"],"mappings":";;;;;;;;;AAcA,MAAa,aAA2BA,SAAAA;;;;;;;ACLxC,MAAa,SAAmBC,qBAAAA"}
|
package/dist/mock-of.d.cts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { DeepMockProxy } from "vitest-mock-extended";
|
|
2
|
-
|
|
3
|
-
//#region src/mock/mock-of-date.d.ts
|
|
4
|
-
/** Interface for freezing and resetting the global Date in tests. */
|
|
5
|
-
interface MockDatePort {
|
|
6
|
-
/** Restore the real Date object. */
|
|
7
|
-
reset: () => void;
|
|
8
|
-
/** Freeze `Date.now()` and `new Date()` to the given value. */
|
|
9
|
-
set: (date: Date | number | string) => void;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Freeze or reset the global Date for deterministic time-dependent tests.
|
|
13
|
-
* Wraps the `mockdate` package.
|
|
14
|
-
*/
|
|
15
|
-
declare const mockOfDate: MockDatePort;
|
|
16
|
-
//#endregion
|
|
17
|
-
//#region src/mock/mock-of.d.ts
|
|
18
|
-
/** Factory signature that creates a deep mock proxy for any interface. */
|
|
19
|
-
type MockPort = <T>() => DeepMockProxy<T>;
|
|
20
|
-
/**
|
|
21
|
-
* Create a deep mock proxy for a given type.
|
|
22
|
-
* Wraps `vitest-mock-extended`'s `mockDeep` for convenient port mocking.
|
|
23
|
-
*/
|
|
24
|
-
declare const mockOf: MockPort;
|
|
25
|
-
//#endregion
|
|
26
|
-
export { mockOfDate as i, mockOf as n, MockDatePort as r, MockPort as t };
|
|
27
|
-
//# sourceMappingURL=mock-of.d.cts.map
|
package/dist/mock-of.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { DeepMockProxy } from "vitest-mock-extended";
|
|
2
|
-
|
|
3
|
-
//#region src/mock/mock-of-date.d.ts
|
|
4
|
-
/** Interface for freezing and resetting the global Date in tests. */
|
|
5
|
-
interface MockDatePort {
|
|
6
|
-
/** Restore the real Date object. */
|
|
7
|
-
reset: () => void;
|
|
8
|
-
/** Freeze `Date.now()` and `new Date()` to the given value. */
|
|
9
|
-
set: (date: Date | number | string) => void;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Freeze or reset the global Date for deterministic time-dependent tests.
|
|
13
|
-
* Wraps the `mockdate` package.
|
|
14
|
-
*/
|
|
15
|
-
declare const mockOfDate: MockDatePort;
|
|
16
|
-
//#endregion
|
|
17
|
-
//#region src/mock/mock-of.d.ts
|
|
18
|
-
/** Factory signature that creates a deep mock proxy for any interface. */
|
|
19
|
-
type MockPort = <T>() => DeepMockProxy<T>;
|
|
20
|
-
/**
|
|
21
|
-
* Create a deep mock proxy for a given type.
|
|
22
|
-
* Wraps `vitest-mock-extended`'s `mockDeep` for convenient port mocking.
|
|
23
|
-
*/
|
|
24
|
-
declare const mockOf: MockPort;
|
|
25
|
-
//#endregion
|
|
26
|
-
export { mockOfDate as i, mockOf as n, MockDatePort as r, MockPort as t };
|
|
27
|
-
//# sourceMappingURL=mock-of.d.ts.map
|
package/dist/mock-of.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import MockDatePackage from "mockdate";
|
|
2
|
-
import { mockDeep } from "vitest-mock-extended";
|
|
3
|
-
//#region src/mock/mock-of-date.ts
|
|
4
|
-
/**
|
|
5
|
-
* Freeze or reset the global Date for deterministic time-dependent tests.
|
|
6
|
-
* Wraps the `mockdate` package.
|
|
7
|
-
*/
|
|
8
|
-
const mockOfDate = MockDatePackage;
|
|
9
|
-
//#endregion
|
|
10
|
-
//#region src/mock/mock-of.ts
|
|
11
|
-
/**
|
|
12
|
-
* Create a deep mock proxy for a given type.
|
|
13
|
-
* Wraps `vitest-mock-extended`'s `mockDeep` for convenient port mocking.
|
|
14
|
-
*/
|
|
15
|
-
const mockOf = mockDeep;
|
|
16
|
-
//#endregion
|
|
17
|
-
export { mockOfDate as n, mockOf as t };
|
|
18
|
-
|
|
19
|
-
//# sourceMappingURL=mock-of.js.map
|
package/dist/mock-of.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock-of.js","names":[],"sources":["../src/mock/mock-of-date.ts","../src/mock/mock-of.ts"],"sourcesContent":["import MockDatePackage from 'mockdate';\n\n/** Interface for freezing and resetting the global Date in tests. */\nexport interface MockDatePort {\n /** Restore the real Date object. */\n reset: () => void;\n /** Freeze `Date.now()` and `new Date()` to the given value. */\n set: (date: Date | number | string) => void;\n}\n\n/**\n * Freeze or reset the global Date for deterministic time-dependent tests.\n * Wraps the `mockdate` package.\n */\nexport const mockOfDate: MockDatePort = MockDatePackage;\n","import { type DeepMockProxy, mockDeep } from 'vitest-mock-extended';\n\n/** Factory signature that creates a deep mock proxy for any interface. */\nexport type MockPort = <T>() => DeepMockProxy<T>;\n\n/**\n * Create a deep mock proxy for a given type.\n * Wraps `vitest-mock-extended`'s `mockDeep` for convenient port mocking.\n */\nexport const mockOf: MockPort = mockDeep;\n"],"mappings":";;;;;;;AAcA,MAAa,aAA2B;;;;;;;ACLxC,MAAa,SAAmB"}
|
package/dist/mock.cjs
DELETED
package/dist/mock.d.cts
DELETED
package/dist/mock.d.ts
DELETED
package/dist/mock.js
DELETED
package/dist/services.cjs
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_sqlite_adapter = require("./sqlite.adapter.cjs");
|
|
3
|
-
exports.postgres = require_sqlite_adapter.postgres;
|
|
4
|
-
exports.redis = require_sqlite_adapter.redis;
|
|
5
|
-
exports.sqlite = require_sqlite_adapter.sqlite;
|