@apifuse/provider-sdk 2.1.0-beta.9 → 2.2.0-beta.10

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.
Files changed (263) hide show
  1. package/AUTHORING.md +240 -0
  2. package/CHANGELOG.md +93 -0
  3. package/README.md +26 -10
  4. package/SUBMISSION.md +11 -12
  5. package/bin/apifuse-check.ts +44 -59
  6. package/bin/apifuse-create.ts +1 -1
  7. package/bin/apifuse-dev.ts +27 -52
  8. package/bin/apifuse-pack-check.ts +36 -0
  9. package/bin/apifuse-pack-smoke.ts +22 -81
  10. package/bin/apifuse-pack-types.ts +266 -0
  11. package/bin/apifuse-perf.ts +45 -127
  12. package/bin/apifuse-record.ts +53 -70
  13. package/bin/apifuse-submit-check.ts +2177 -353
  14. package/bin/apifuse-sync-assets.ts +117 -0
  15. package/bin/apifuse.ts +1 -1
  16. package/bin/submit-check-delimited-text.ts +50 -0
  17. package/bin/submit-check-xml-semantics.ts +204 -0
  18. package/bin/submit-check-xml.ts +134 -0
  19. package/dist/auth-turn/auth-turn.v1.schema.json +89 -0
  20. package/dist/auth-turn/fixtures/invalid/empty-kind.json +4 -0
  21. package/dist/auth-turn/fixtures/invalid/expires-at-not-string.json +5 -0
  22. package/dist/auth-turn/fixtures/invalid/missing-kind.json +3 -0
  23. package/dist/auth-turn/fixtures/invalid/missing-turn-id.json +3 -0
  24. package/dist/auth-turn/fixtures/invalid/timing-unknown-field.json +7 -0
  25. package/dist/auth-turn/fixtures/invalid/turn-id-snake-case.json +4 -0
  26. package/dist/auth-turn/fixtures/invalid/unknown-top-level-field.json +5 -0
  27. package/dist/auth-turn/fixtures/valid/abort.json +8 -0
  28. package/dist/auth-turn/fixtures/valid/challenge.json +17 -0
  29. package/dist/auth-turn/fixtures/valid/complete.json +13 -0
  30. package/dist/auth-turn/fixtures/valid/form.json +14 -0
  31. package/dist/auth-turn/fixtures/valid/message.json +13 -0
  32. package/dist/auth-turn/fixtures/valid/multi_choice.json +15 -0
  33. package/dist/auth-turn/fixtures/valid/pending.json +5 -0
  34. package/dist/auth-turn/fixtures/valid/poll.json +9 -0
  35. package/dist/auth-turn/fixtures/valid/redirect.json +16 -0
  36. package/dist/auth-turn/fixtures/valid/retry.json +8 -0
  37. package/dist/auth-turn/fixtures/valid/unknown-kind.json +7 -0
  38. package/dist/auth-turn/index.d.ts +195 -0
  39. package/dist/auth-turn/index.js +133 -0
  40. package/dist/auth.d.ts +76 -0
  41. package/dist/auth.js +427 -0
  42. package/dist/ceremonies/index.d.ts +1 -1
  43. package/dist/ceremonies/index.js +14 -48
  44. package/dist/cli/commands.d.ts +1 -1
  45. package/dist/cli/commands.js +8 -0
  46. package/dist/cli/create.d.ts +3 -0
  47. package/dist/cli/create.js +47 -33
  48. package/dist/cli/prompt-assets.d.ts +80 -0
  49. package/dist/cli/prompt-assets.js +743 -0
  50. package/dist/cli/templates/provider/.agents/skills/fixtures-and-recording/SKILL.md.tpl +58 -0
  51. package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +65 -0
  52. package/dist/cli/templates/provider/.agents/skills/normalization-standards/SKILL.md.tpl +57 -0
  53. package/dist/cli/templates/provider/.agents/skills/pagination-and-counts/SKILL.md.tpl +52 -0
  54. package/dist/cli/templates/provider/.agents/skills/upstream-contract-verification/SKILL.md.tpl +45 -0
  55. package/dist/cli/templates/provider/.agents/skills/upstream-notes/README.md.tpl +13 -0
  56. package/dist/cli/templates/provider/.dockerignore.tpl +22 -0
  57. package/dist/cli/templates/provider/.gitignore.tpl +22 -0
  58. package/dist/cli/templates/provider/AGENTS.md.tpl +96 -0
  59. package/dist/cli/templates/provider/Dockerfile.tpl +7 -0
  60. package/dist/cli/templates/provider/README.md.tpl +163 -0
  61. package/dist/cli/templates/provider/dev.ts.tpl +5 -0
  62. package/dist/cli/templates/provider/domain/README.md.tpl +3 -0
  63. package/dist/cli/templates/provider/index.test.ts.tpl +13 -0
  64. package/dist/cli/templates/provider/index.ts.tpl +15 -0
  65. package/dist/cli/templates/provider/mappers/README.md.tpl +3 -0
  66. package/dist/cli/templates/provider/meta.ts.tpl +7 -0
  67. package/dist/cli/templates/provider/operations/index.ts.tpl +5 -0
  68. package/dist/cli/templates/provider/operations/ping.ts.tpl +24 -0
  69. package/dist/cli/templates/provider/schemas/ping.ts.tpl +24 -0
  70. package/dist/cli/templates/provider/start.ts.tpl +5 -0
  71. package/dist/cli/templates/provider/upstream/README.md.tpl +3 -0
  72. package/dist/config/loader.d.ts +149 -8
  73. package/dist/config/loader.js +378 -89
  74. package/dist/contract-serialization.d.ts +2 -2
  75. package/dist/contract-serialization.js +3 -6
  76. package/dist/contract-types.d.ts +2 -2
  77. package/dist/contract.d.ts +3 -3
  78. package/dist/contract.js +5 -6
  79. package/dist/define.d.ts +13 -1
  80. package/dist/define.js +245 -178
  81. package/dist/dev.d.ts +1 -1
  82. package/dist/dev.js +1 -1
  83. package/dist/errors.d.ts +4 -1
  84. package/dist/errors.js +48 -0
  85. package/dist/i18n/catalog.d.ts +2 -2
  86. package/dist/i18n/catalog.js +4 -10
  87. package/dist/i18n/index.d.ts +2 -2
  88. package/dist/i18n/index.js +2 -2
  89. package/dist/i18n/keys.d.ts +2 -2
  90. package/dist/index.d.ts +44 -41
  91. package/dist/index.js +39 -36
  92. package/dist/lint.d.ts +1 -0
  93. package/dist/lint.js +35 -15
  94. package/dist/provider.d.ts +11 -9
  95. package/dist/provider.js +9 -8
  96. package/dist/public-schema-field-lint.d.ts +1 -1
  97. package/dist/recipes/gov-api.js +1 -1
  98. package/dist/runtime/auth-flow.d.ts +1 -1
  99. package/dist/runtime/auth-flow.js +4 -2
  100. package/dist/runtime/browser.d.ts +1 -1
  101. package/dist/runtime/browser.js +214 -25
  102. package/dist/runtime/cache.d.ts +1 -1
  103. package/dist/runtime/cache.js +4 -8
  104. package/dist/runtime/choice.d.ts +1 -1
  105. package/dist/runtime/choice.js +31 -35
  106. package/dist/runtime/credential.d.ts +1 -1
  107. package/dist/runtime/credential.js +1 -1
  108. package/dist/runtime/env.d.ts +1 -1
  109. package/dist/runtime/executor.d.ts +1 -1
  110. package/dist/runtime/executor.js +15 -3
  111. package/dist/runtime/http.d.ts +2 -2
  112. package/dist/runtime/http.js +160 -344
  113. package/dist/runtime/insights.d.ts +1 -1
  114. package/dist/runtime/insights.js +6 -13
  115. package/dist/runtime/instrumentation.d.ts +2 -2
  116. package/dist/runtime/instrumentation.js +56 -19
  117. package/dist/runtime/keyring.js +1 -1
  118. package/dist/runtime/namespace.js +1 -1
  119. package/dist/runtime/otlp.d.ts +1 -1
  120. package/dist/runtime/perf.d.ts +1 -1
  121. package/dist/runtime/provider.d.ts +1 -1
  122. package/dist/runtime/provider.js +1 -2
  123. package/dist/runtime/proxy-errors.d.ts +1 -1
  124. package/dist/runtime/proxy-errors.js +9 -7
  125. package/dist/runtime/proxy-nodemaven.d.ts +35 -0
  126. package/dist/runtime/proxy-nodemaven.js +128 -0
  127. package/dist/runtime/proxy-retry-policy.d.ts +40 -0
  128. package/dist/runtime/proxy-retry-policy.js +326 -0
  129. package/dist/runtime/proxy-telemetry.d.ts +2 -1
  130. package/dist/runtime/proxy-telemetry.js +55 -52
  131. package/dist/runtime/redis.d.ts +1 -1
  132. package/dist/runtime/redis.js +2 -4
  133. package/dist/runtime/request-options.d.ts +1 -1
  134. package/dist/runtime/secrets.d.ts +27 -0
  135. package/dist/runtime/secrets.js +51 -0
  136. package/dist/runtime/state.d.ts +2 -2
  137. package/dist/runtime/state.js +15 -4
  138. package/dist/runtime/stealth.d.ts +7 -4
  139. package/dist/runtime/stealth.js +257 -215
  140. package/dist/runtime/stt.d.ts +1 -1
  141. package/dist/runtime/stt.js +11 -15
  142. package/dist/runtime/trace.d.ts +2 -2
  143. package/dist/runtime/trace.js +2 -4
  144. package/dist/runtime/waterfall.d.ts +1 -1
  145. package/dist/schema.d.ts +1 -1
  146. package/dist/schema.js +7 -15
  147. package/dist/serve.d.ts +1 -1
  148. package/dist/serve.js +1 -1
  149. package/dist/server/index.d.ts +7 -3
  150. package/dist/server/index.js +6 -2
  151. package/dist/server/self-test-input-tokens.d.ts +1 -0
  152. package/dist/server/self-test-input-tokens.js +37 -0
  153. package/dist/server/self-test-redaction.d.ts +20 -0
  154. package/dist/server/self-test-redaction.js +70 -0
  155. package/dist/server/self-test-token.d.ts +30 -0
  156. package/dist/server/self-test-token.js +50 -0
  157. package/dist/server/self-test.d.ts +199 -0
  158. package/dist/server/self-test.js +1113 -0
  159. package/dist/server/serve.d.ts +14 -3
  160. package/dist/server/serve.js +135 -64
  161. package/dist/server/types.d.ts +10 -9
  162. package/dist/server/types.js +3 -7
  163. package/dist/stealth/profiles.d.ts +1 -1
  164. package/dist/stealth/profiles.js +5 -14
  165. package/dist/stream.d.ts +1 -1
  166. package/dist/testing/index.d.ts +2 -2
  167. package/dist/testing/index.js +2 -2
  168. package/dist/testing/run.d.ts +1 -1
  169. package/dist/testing/run.js +12 -15
  170. package/dist/types.d.ts +237 -1
  171. package/dist/user-input.d.ts +30 -0
  172. package/dist/user-input.js +66 -0
  173. package/package.json +16 -5
  174. package/src/auth-turn/auth-turn.v1.schema.json +89 -0
  175. package/src/auth-turn/fixtures/invalid/empty-kind.json +4 -0
  176. package/src/auth-turn/fixtures/invalid/expires-at-not-string.json +5 -0
  177. package/src/auth-turn/fixtures/invalid/missing-kind.json +3 -0
  178. package/src/auth-turn/fixtures/invalid/missing-turn-id.json +3 -0
  179. package/src/auth-turn/fixtures/invalid/timing-unknown-field.json +7 -0
  180. package/src/auth-turn/fixtures/invalid/turn-id-snake-case.json +4 -0
  181. package/src/auth-turn/fixtures/invalid/unknown-top-level-field.json +5 -0
  182. package/src/auth-turn/fixtures/valid/abort.json +8 -0
  183. package/src/auth-turn/fixtures/valid/challenge.json +17 -0
  184. package/src/auth-turn/fixtures/valid/complete.json +13 -0
  185. package/src/auth-turn/fixtures/valid/form.json +14 -0
  186. package/src/auth-turn/fixtures/valid/message.json +13 -0
  187. package/src/auth-turn/fixtures/valid/multi_choice.json +15 -0
  188. package/src/auth-turn/fixtures/valid/pending.json +5 -0
  189. package/src/auth-turn/fixtures/valid/poll.json +9 -0
  190. package/src/auth-turn/fixtures/valid/redirect.json +16 -0
  191. package/src/auth-turn/fixtures/valid/retry.json +8 -0
  192. package/src/auth-turn/fixtures/valid/unknown-kind.json +7 -0
  193. package/src/auth-turn/index.ts +177 -0
  194. package/src/auth.ts +728 -0
  195. package/src/ceremonies/index.ts +33 -121
  196. package/src/cli/commands.ts +10 -0
  197. package/src/cli/create.ts +69 -99
  198. package/src/cli/prompt-assets.ts +865 -0
  199. package/src/cli/templates/provider/.agents/skills/fixtures-and-recording/SKILL.md.tpl +58 -0
  200. package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +65 -0
  201. package/src/cli/templates/provider/.agents/skills/normalization-standards/SKILL.md.tpl +57 -0
  202. package/src/cli/templates/provider/.agents/skills/pagination-and-counts/SKILL.md.tpl +52 -0
  203. package/src/cli/templates/provider/.agents/skills/upstream-contract-verification/SKILL.md.tpl +45 -0
  204. package/src/cli/templates/provider/.agents/skills/upstream-notes/README.md.tpl +13 -0
  205. package/src/cli/templates/provider/AGENTS.md.tpl +96 -0
  206. package/src/cli/templates/provider/README.md.tpl +7 -4
  207. package/src/config/loader.ts +543 -208
  208. package/src/contract-serialization.ts +5 -11
  209. package/src/contract-types.ts +2 -2
  210. package/src/contract.ts +13 -28
  211. package/src/define.ts +397 -528
  212. package/src/dev.ts +4 -9
  213. package/src/errors.ts +58 -5
  214. package/src/i18n/catalog.ts +10 -32
  215. package/src/i18n/index.ts +2 -2
  216. package/src/i18n/keys.ts +5 -11
  217. package/src/index.ts +64 -41
  218. package/src/lint.ts +122 -159
  219. package/src/provider.ts +40 -9
  220. package/src/public-schema-field-lint.ts +7 -33
  221. package/src/recipes/gov-api.ts +2 -5
  222. package/src/runtime/auth-flow.ts +6 -6
  223. package/src/runtime/browser.ts +320 -151
  224. package/src/runtime/cache.ts +20 -67
  225. package/src/runtime/choice.ts +79 -132
  226. package/src/runtime/credential.ts +2 -2
  227. package/src/runtime/env.ts +1 -1
  228. package/src/runtime/executor.ts +23 -20
  229. package/src/runtime/http.ts +216 -539
  230. package/src/runtime/insights.ts +15 -53
  231. package/src/runtime/instrumentation.ts +78 -65
  232. package/src/runtime/keyring.ts +7 -19
  233. package/src/runtime/namespace.ts +2 -7
  234. package/src/runtime/otlp.ts +12 -23
  235. package/src/runtime/perf.ts +1 -1
  236. package/src/runtime/provider.ts +4 -9
  237. package/src/runtime/proxy-errors.ts +29 -42
  238. package/src/runtime/proxy-nodemaven.ts +178 -0
  239. package/src/runtime/proxy-retry-policy.ts +469 -0
  240. package/src/runtime/proxy-telemetry.ts +79 -77
  241. package/src/runtime/redis.ts +4 -12
  242. package/src/runtime/request-options.ts +4 -13
  243. package/src/runtime/secrets.ts +64 -0
  244. package/src/runtime/state.ts +41 -110
  245. package/src/runtime/stealth.ts +331 -369
  246. package/src/runtime/stt.ts +38 -94
  247. package/src/runtime/trace.ts +14 -44
  248. package/src/runtime/waterfall.ts +5 -18
  249. package/src/schema.ts +23 -84
  250. package/src/serve.ts +1 -1
  251. package/src/server/index.ts +44 -3
  252. package/src/server/self-test-input-tokens.ts +46 -0
  253. package/src/server/self-test-redaction.ts +97 -0
  254. package/src/server/self-test-token.ts +70 -0
  255. package/src/server/self-test.ts +1450 -0
  256. package/src/server/serve.ts +206 -216
  257. package/src/server/types.ts +7 -19
  258. package/src/stealth/profiles.ts +10 -26
  259. package/src/stream.ts +8 -19
  260. package/src/testing/index.ts +2 -2
  261. package/src/testing/run.ts +24 -64
  262. package/src/types.ts +274 -1
  263. package/src/user-input.ts +118 -0
@@ -1,13 +1,8 @@
1
1
  import { z } from "zod";
2
2
 
3
- import { HttpRetryPreset } from "../types";
3
+ import { HttpRetryPreset } from "../types.js";
4
4
 
5
- export const ConnectionModeSchema = z.enum([
6
- "oauth2",
7
- "credentials",
8
- "platform-managed",
9
- "none",
10
- ]);
5
+ export const ConnectionModeSchema = z.enum(["oauth2", "credentials", "platform-managed", "none"]);
11
6
 
12
7
  export const OperationConnectionSchema = z.object({
13
8
  id: z.string(),
@@ -21,6 +16,7 @@ export const OperationConnectionSchema = z.object({
21
16
  export const OperationRequestSchema = z.object({
22
17
  requestId: z.string(),
23
18
  input: z.record(z.string(), z.unknown()),
19
+ connectionId: z.string().optional(),
24
20
  connection: OperationConnectionSchema.optional(),
25
21
  headers: z.record(z.string(), z.string()).optional(),
26
22
  trace: z.record(z.string(), z.string()).optional(),
@@ -98,18 +94,10 @@ export const AuthFlowErrorResponseSchema = OperationErrorResponseSchema;
98
94
  export type ConnectionMode = z.infer<typeof ConnectionModeSchema>;
99
95
  export type OperationConnection = z.infer<typeof OperationConnectionSchema>;
100
96
  export type OperationRequest = z.infer<typeof OperationRequestSchema>;
101
- export type OperationSuccessResponse = z.infer<
102
- typeof OperationSuccessResponseSchema
103
- >;
104
- export type OperationErrorResponse = z.infer<
105
- typeof OperationErrorResponseSchema
106
- >;
107
- export type OperationResponse =
108
- | OperationSuccessResponse
109
- | OperationErrorResponse;
97
+ export type OperationSuccessResponse = z.infer<typeof OperationSuccessResponseSchema>;
98
+ export type OperationErrorResponse = z.infer<typeof OperationErrorResponseSchema>;
99
+ export type OperationResponse = OperationSuccessResponse | OperationErrorResponse;
110
100
  export type AuthFlowRequest = z.infer<typeof AuthFlowRequestSchema>;
111
- export type AuthFlowSuccessResponse = z.infer<
112
- typeof AuthFlowSuccessResponseSchema
113
- >;
101
+ export type AuthFlowSuccessResponse = z.infer<typeof AuthFlowSuccessResponseSchema>;
114
102
  export type AuthFlowErrorResponse = z.infer<typeof AuthFlowErrorResponseSchema>;
115
103
  export type AuthFlowResponse = AuthFlowSuccessResponse | AuthFlowErrorResponse;
@@ -1,5 +1,5 @@
1
- import { SDKError } from "../errors";
2
- import type { StealthPlatform, StealthProfile } from "../types";
1
+ import { SDKError } from "../errors.js";
2
+ import type { StealthPlatform, StealthProfile } from "../types.js";
3
3
 
4
4
  type StealthProfileDefinition = Omit<StealthProfile, "name" | "platform"> & {
5
5
  platform: StealthPlatform;
@@ -81,10 +81,7 @@ const FIREFOX_JA3 =
81
81
  const SAFARI_JA3 =
82
82
  "771,4865-4866-4867-49196-49195-52393-49200-49199-49188-49192-159-158-107-103-57-51-157-156-61-60-53-47-255,0-23-65281-10-11-16-5-13-18-51-45-43-27,29-23-24-25,0";
83
83
 
84
- function createProfile(
85
- name: string,
86
- definition: StealthProfileDefinition,
87
- ): StealthProfile {
84
+ function createProfile(name: string, definition: StealthProfileDefinition): StealthProfile {
88
85
  return {
89
86
  name,
90
87
  platform: definition.platform,
@@ -93,12 +90,8 @@ function createProfile(
93
90
  tlsClientIdentifier: definition.tlsClientIdentifier,
94
91
  ja3: definition.ja3,
95
92
  ja4: definition.ja4,
96
- h2Settings: definition.h2Settings
97
- ? { ...definition.h2Settings }
98
- : undefined,
99
- headerOrder: definition.headerOrder
100
- ? [...definition.headerOrder]
101
- : undefined,
93
+ h2Settings: definition.h2Settings ? { ...definition.h2Settings } : undefined,
94
+ headerOrder: definition.headerOrder ? [...definition.headerOrder] : undefined,
102
95
  };
103
96
  }
104
97
 
@@ -108,8 +101,7 @@ function extractBrowserMajorVersion(profile: StealthProfile): string {
108
101
  return chromeVersion;
109
102
  }
110
103
 
111
- const identifierVersion =
112
- profile.tlsClientIdentifier?.match(/(\d+)(?!.*\d)/)?.[1];
104
+ const identifierVersion = profile.tlsClientIdentifier?.match(/(\d+)(?!.*\d)/)?.[1];
113
105
  if (identifierVersion) {
114
106
  return identifierVersion;
115
107
  }
@@ -132,9 +124,7 @@ function toPlatformHeaderValue(platform: StealthPlatform): string {
132
124
  }
133
125
  }
134
126
 
135
- export function generateLayer2Headers(
136
- profile: StealthProfile,
137
- ): Record<string, string> {
127
+ export function generateLayer2Headers(profile: StealthProfile): Record<string, string> {
138
128
  const headers: Record<string, string> = {
139
129
  "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8",
140
130
  };
@@ -143,16 +133,13 @@ export function generateLayer2Headers(
143
133
  const majorVersion = extractBrowserMajorVersion(profile);
144
134
 
145
135
  if (identifier.startsWith("chrome_") || identifier.startsWith("edge_")) {
146
- const isEdge =
147
- identifier.startsWith("edge_") || /\bEdg\//.test(profile.userAgent);
136
+ const isEdge = identifier.startsWith("edge_") || /\bEdg\//.test(profile.userAgent);
148
137
  headers["Sec-Ch-Ua"] = isEdge
149
138
  ? `"Chromium";v="${majorVersion}", "Microsoft Edge";v="${majorVersion}", "Not)A;Brand";v="99"`
150
139
  : `"Chromium";v="${majorVersion}", "Google Chrome";v="${majorVersion}", "Not)A;Brand";v="99"`;
151
140
  headers["Sec-Ch-Ua-Platform"] = toPlatformHeaderValue(profile.platform);
152
141
  headers["Sec-Ch-Ua-Mobile"] =
153
- profile.platform === "android" || profile.platform === "ios"
154
- ? "?1"
155
- : "?0";
142
+ profile.platform === "android" || profile.platform === "ios" ? "?1" : "?0";
156
143
  }
157
144
 
158
145
  return headers;
@@ -301,8 +288,5 @@ export function getStealthProfile(name: string): StealthProfile {
301
288
  }
302
289
 
303
290
  export function listStealthProfiles(): string[] {
304
- return [
305
- ...Object.keys(STEALTH_PROFILES),
306
- ...Object.keys(STEALTH_PROFILE_ALIASES),
307
- ];
291
+ return [...Object.keys(STEALTH_PROFILES), ...Object.keys(STEALTH_PROFILE_ALIASES)];
308
292
  }
package/src/stream.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { SseMessage } from "./types";
1
+ import type { SseMessage } from "./types.js";
2
2
 
3
3
  export interface SseEvent<TData = unknown> {
4
4
  event: string;
@@ -61,8 +61,7 @@ export function done<TData>(
61
61
 
62
62
  export function encodeSseEvent(input: SseEvent): string {
63
63
  const lines: string[] = [];
64
- if (input.id !== undefined)
65
- lines.push(`id: ${sseFieldValue(input.id, "id")}`);
64
+ if (input.id !== undefined) lines.push(`id: ${sseFieldValue(input.id, "id")}`);
66
65
  if (input.event) lines.push(`event: ${sseFieldValue(input.event, "event")}`);
67
66
  if (input.retry !== undefined) {
68
67
  if (!Number.isInteger(input.retry) || input.retry < 0) {
@@ -70,8 +69,7 @@ export function encodeSseEvent(input: SseEvent): string {
70
69
  }
71
70
  lines.push(`retry: ${input.retry}`);
72
71
  }
73
- const data =
74
- typeof input.data === "string" ? input.data : JSON.stringify(input.data);
72
+ const data = typeof input.data === "string" ? input.data : JSON.stringify(input.data);
75
73
  for (const line of data.split(/\r?\n/)) {
76
74
  lines.push(`data: ${line}`);
77
75
  }
@@ -85,9 +83,7 @@ function sseFieldValue(value: string, field: "event" | "id"): string {
85
83
  return value;
86
84
  }
87
85
 
88
- export async function* readableBytes(
89
- body: ReadableStream<Uint8Array>,
90
- ): AsyncIterable<Uint8Array> {
86
+ export async function* readableBytes(body: ReadableStream<Uint8Array>): AsyncIterable<Uint8Array> {
91
87
  const reader = body.getReader();
92
88
  try {
93
89
  for (;;) {
@@ -100,9 +96,7 @@ export async function* readableBytes(
100
96
  }
101
97
  }
102
98
 
103
- export async function* readableTextChunks(
104
- body: ReadableStream<Uint8Array>,
105
- ): AsyncIterable<string> {
99
+ export async function* readableTextChunks(body: ReadableStream<Uint8Array>): AsyncIterable<string> {
106
100
  const decoder = new TextDecoder();
107
101
  for await (const chunk of readableBytes(body)) {
108
102
  yield decoder.decode(chunk, { stream: true });
@@ -111,9 +105,7 @@ export async function* readableTextChunks(
111
105
  if (tail) yield tail;
112
106
  }
113
107
 
114
- export async function* readableLines(
115
- body: ReadableStream<Uint8Array>,
116
- ): AsyncIterable<string> {
108
+ export async function* readableLines(body: ReadableStream<Uint8Array>): AsyncIterable<string> {
117
109
  let buffer = "";
118
110
  for await (const chunk of readableTextChunks(body)) {
119
111
  buffer += chunk;
@@ -121,8 +113,7 @@ export async function* readableLines(
121
113
  const index = buffer.search(/\r?\n/);
122
114
  if (index < 0) break;
123
115
  const line = buffer.slice(0, index);
124
- const newlineLength =
125
- buffer[index] === "\r" && buffer[index + 1] === "\n" ? 2 : 1;
116
+ const newlineLength = buffer[index] === "\r" && buffer[index + 1] === "\n" ? 2 : 1;
126
117
  buffer = buffer.slice(index + newlineLength);
127
118
  yield line;
128
119
  }
@@ -150,9 +141,7 @@ function parseJson<T>(data: string): T {
150
141
  return JSON.parse(data);
151
142
  }
152
143
 
153
- export async function* parseSseStream(
154
- body: ReadableStream<Uint8Array>,
155
- ): AsyncIterable<SseMessage> {
144
+ export async function* parseSseStream(body: ReadableStream<Uint8Array>): AsyncIterable<SseMessage> {
156
145
  let eventName = "message";
157
146
  let dataLines: string[] = [];
158
147
  let id: string | undefined;
@@ -1,2 +1,2 @@
1
- export { describeTransform, snapshotTransform, toMatchShape } from "./helpers";
2
- export { runStandardTests } from "./run";
1
+ export { describeTransform, snapshotTransform, toMatchShape } from "./helpers.js";
2
+ export { runStandardTests } from "./run.js";
@@ -1,28 +1,23 @@
1
1
  import { describe, expect, it } from "bun:test";
2
2
 
3
- import { createProviderCache } from "../runtime/cache";
4
- import { createTestProviderChoiceContext } from "../runtime/choice";
5
- import { createMemoryProviderRuntimeState } from "../runtime/state";
6
- import { createUnsupportedSttClient } from "../runtime/stt";
7
- import { safeParseSchemaSync } from "../schema";
3
+ import { createProviderCache } from "../runtime/cache.js";
4
+ import { createTestProviderChoiceContext } from "../runtime/choice.js";
5
+ import { createMemoryProviderRuntimeState } from "../runtime/state.js";
6
+ import { createUnsupportedSttClient } from "../runtime/stt.js";
7
+ import { safeParseSchemaSync } from "../schema.js";
8
8
  import type {
9
9
  AuthMode,
10
10
  CredentialContext,
11
11
  HttpResponse,
12
12
  ProviderContext,
13
13
  ProviderDefinition,
14
- } from "../types";
14
+ } from "../types.js";
15
15
 
16
16
  // Mirrors CONNECTOR_ID_REGEX in ../define.ts, which defineProvider() enforces.
17
17
  // A single lowercase segment (no hyphen) is a valid id, so the trailing group
18
18
  // is optional (`*`), matching providers like `kakaomap`, `kstartup`, `triple`.
19
19
  const CONNECTOR_ID_REGEX = /^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$/;
20
- const VALID_AUTH_MODES = [
21
- "none",
22
- "platform-managed",
23
- "credentials",
24
- "oauth2",
25
- ] as const;
20
+ const VALID_AUTH_MODES = ["none", "platform-managed", "credentials", "oauth2"] as const;
26
21
  const UPDATE_SNAPSHOT_ARGS = new Set(["-u", "--update-snapshots"]);
27
22
 
28
23
  export interface StandardTestsManifest {
@@ -118,9 +113,7 @@ function inferFixtureDir(providerId: string): string {
118
113
  .find((file) => file !== undefined);
119
114
 
120
115
  if (testFile) {
121
- const pathname = testFile.startsWith("file://")
122
- ? new URL(testFile).pathname
123
- : testFile;
116
+ const pathname = testFile.startsWith("file://") ? new URL(testFile).pathname : testFile;
124
117
  return `${pathname.replace(/\/[^/]+$/, "")}/../__fixtures__`;
125
118
  }
126
119
 
@@ -128,13 +121,18 @@ function inferFixtureDir(providerId: string): string {
128
121
  }
129
122
 
130
123
  function jsonResponse(data: unknown): HttpResponse {
124
+ const body = JSON.stringify(data);
125
+ const bodyBytes = new TextEncoder().encode(body);
131
126
  return {
132
127
  status: 200,
133
128
  ok: true,
134
129
  headers: {},
135
130
  data,
136
131
  json: async <_T = unknown>() => JSON.parse(JSON.stringify(data)),
137
- text: async () => JSON.stringify(data),
132
+ text: async () => body,
133
+ arrayBuffer: async () =>
134
+ bodyBytes.buffer.slice(bodyBytes.byteOffset, bodyBytes.byteOffset + bodyBytes.byteLength),
135
+ bytes: async () => bodyBytes.slice(0),
138
136
  };
139
137
  }
140
138
 
@@ -176,16 +174,14 @@ function createSnapshotContext(rawFixture: unknown): ProviderContext {
176
174
  engine: "playwright-stealth",
177
175
  newPage: async () => unsupported("ctx.browser.newPage"),
178
176
  rawPage: async () => unsupported("ctx.browser.rawPage"),
179
- withIsolatedContext: async () =>
180
- unsupported("ctx.browser.withIsolatedContext"),
177
+ withIsolatedContext: async () => unsupported("ctx.browser.withIsolatedContext"),
181
178
  solveChallenge: async () => unsupported("ctx.browser.solveChallenge"),
182
179
  },
183
180
  trace: {
184
181
  span: async (_name, fn) => fn(),
185
182
  },
186
183
  auth: {
187
- requestField: async (name) =>
188
- unsupported(`ctx.auth.requestField(${name})`),
184
+ requestField: async (name) => unsupported(`ctx.auth.requestField(${name})`),
189
185
  },
190
186
  stt: createUnsupportedSttClient(
191
187
  "Standard test snapshot context does not support ctx.stt.transcribe",
@@ -284,11 +280,7 @@ function parseSchemaFixture(
284
280
  operationName,
285
281
  fieldName,
286
282
  fixture,
287
- safeParseSchemaSync(
288
- schema,
289
- fixture,
290
- `operations.${operationName}.fixtures.${fieldName}`,
291
- ),
283
+ safeParseSchemaSync(schema, fixture, `operations.${operationName}.fixtures.${fieldName}`),
292
284
  );
293
285
  }
294
286
 
@@ -314,40 +306,20 @@ export function runStandardTests(
314
306
 
315
307
  for (const [operationName, op] of operations) {
316
308
  if (op.fixtures?.request !== undefined) {
317
- parseSchemaFixture(
318
- operationName,
319
- "request",
320
- op.input,
321
- op.fixtures.request,
322
- );
309
+ parseSchemaFixture(operationName, "request", op.input, op.fixtures.request);
323
310
  }
324
311
 
325
312
  if (op.fixtures?.response !== undefined) {
326
- parseSchemaFixture(
327
- operationName,
328
- "response",
329
- op.output,
330
- op.fixtures.response,
331
- );
313
+ parseSchemaFixture(operationName, "response", op.output, op.fixtures.response);
332
314
  }
333
315
 
334
316
  if (isFixtureEnvelope(rawFixture)) {
335
317
  if (rawFixture.request !== undefined) {
336
- parseSchemaFixture(
337
- operationName,
338
- "request",
339
- op.input,
340
- rawFixture.request,
341
- );
318
+ parseSchemaFixture(operationName, "request", op.input, rawFixture.request);
342
319
  }
343
320
 
344
321
  if (rawFixture.response !== undefined) {
345
- parseSchemaFixture(
346
- operationName,
347
- "response",
348
- op.output,
349
- rawFixture.response,
350
- );
322
+ parseSchemaFixture(operationName, "response", op.output, rawFixture.response);
351
323
  }
352
324
  }
353
325
  }
@@ -403,21 +375,11 @@ export function runStandardTests(
403
375
  it("operation schemas can parse fixture data", () => {
404
376
  for (const [operationName, op] of operations) {
405
377
  if (op.fixtures?.request !== undefined && op.input) {
406
- parseSchemaFixture(
407
- operationName,
408
- "request",
409
- op.input,
410
- op.fixtures.request,
411
- );
378
+ parseSchemaFixture(operationName, "request", op.input, op.fixtures.request);
412
379
  }
413
380
 
414
381
  if (op.fixtures?.response !== undefined && op.output) {
415
- parseSchemaFixture(
416
- operationName,
417
- "response",
418
- op.output,
419
- op.fixtures.response,
420
- );
382
+ parseSchemaFixture(operationName, "response", op.output, op.fixtures.response);
421
383
  }
422
384
 
423
385
  expect(operationName).toBeTruthy();
@@ -463,9 +425,7 @@ export function runStandardTests(
463
425
  await Bun.write(snapshotPath, serialized);
464
426
  }
465
427
 
466
- const expected: unknown = JSON.parse(
467
- await Bun.file(snapshotPath).text(),
468
- );
428
+ const expected: unknown = JSON.parse(await Bun.file(snapshotPath).text());
469
429
  expect(actual).toEqual(expected);
470
430
  });
471
431
  }