@useairfoil/effect-vcr 0.4.2 → 0.4.4

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 (34) hide show
  1. package/README.md +15 -5
  2. package/dist/{cassette-store-CnXX5OLB.js → cassette-store-BF9e0rz3.js} +5 -7
  3. package/dist/cassette-store-BF9e0rz3.js.map +1 -0
  4. package/dist/{cassette-store-BunkvLoV.d.ts → cassette-store-BMtcjh5h.d.ts} +29 -5
  5. package/dist/cassette-store.d.ts +2 -2
  6. package/dist/cassette-store.js +2 -1
  7. package/dist/{file-system-cassette-store-LXpwwrw3.d.ts → file-system-cassette-store-ClYAuH7U.d.ts} +3 -3
  8. package/dist/{file-system-cassette-store-zWkrhhlO.js → file-system-cassette-store-CyOsu3z5.js} +3 -3
  9. package/dist/{file-system-cassette-store-zWkrhhlO.js.map → file-system-cassette-store-CyOsu3z5.js.map} +1 -1
  10. package/dist/file-system-cassette-store.d.ts +3 -3
  11. package/dist/file-system-cassette-store.js +4 -3
  12. package/dist/index.d.ts +5 -5
  13. package/dist/index.js +6 -6
  14. package/dist/types-DMuz_JGd.js +45 -0
  15. package/dist/types-DMuz_JGd.js.map +1 -0
  16. package/dist/types-XZehMu_v.d.ts +138 -0
  17. package/dist/types.d.ts +2 -2
  18. package/dist/types.js +2 -2
  19. package/dist/{vcr-http-client-BaMxQun5.js → vcr-http-client-Ba0WYPV9.js} +143 -66
  20. package/dist/vcr-http-client-Ba0WYPV9.js.map +1 -0
  21. package/dist/{vcr-http-client-aedmnq0C.d.ts → vcr-http-client-BveeoOoW.d.ts} +4 -4
  22. package/dist/vcr-http-client.d.ts +3 -3
  23. package/dist/vcr-http-client.js +4 -3
  24. package/dist/{vitest-state-BOynp4Va.js → vitest-state-CiW5dzXZ.js} +1 -1
  25. package/dist/{vitest-state-BOynp4Va.js.map → vitest-state-CiW5dzXZ.js.map} +1 -1
  26. package/package.json +6 -5
  27. package/src/cassette-store.ts +15 -11
  28. package/src/sanitize.ts +166 -48
  29. package/src/types.ts +40 -26
  30. package/src/vcr-http-client.ts +33 -30
  31. package/dist/cassette-store-CnXX5OLB.js.map +0 -1
  32. package/dist/types-BsuPrIpu.js +0 -1
  33. package/dist/types-DWwkMzxG.d.ts +0 -85
  34. package/dist/vcr-http-client-BaMxQun5.js.map +0 -1
package/README.md CHANGED
@@ -103,6 +103,8 @@ type VcrConfig = {
103
103
  readonly responseHeaders?: ReadonlyArray<string>;
104
104
  readonly requestBodyKeys?: ReadonlyArray<string>;
105
105
  readonly responseBodyKeys?: ReadonlyArray<string>;
106
+ readonly requestBodyReplacements?: Readonly<Record<string, string | number | boolean | null>>;
107
+ readonly responseBodyReplacements?: Readonly<Record<string, string | number | boolean | null>>;
106
108
  };
107
109
  readonly matchIgnore?: {
108
110
  readonly requestHeaders?: ReadonlyArray<string>;
@@ -124,9 +126,11 @@ type VcrConfig = {
124
126
  - `replay`: only serve from cassette; missing entries fail
125
127
  - `auto`: replay if the cassette exists, otherwise record; when `CI=true`, missing cassettes fail instead of recording
126
128
  - `redact`
127
- - remove sensitive headers or JSON body keys before writing to disk
129
+ - remove sensitive headers or JSON and URL-encoded body keys before writing to disk
130
+ - replace body values with safe placeholders when the field must remain available during replay
131
+ - request fields redacted here are also ignored when building cassette keys
128
132
  - `matchIgnore`
129
- - ignore request headers or JSON body keys when computing the request lookup key
133
+ - ignore request headers or JSON and URL-encoded body keys when computing the request lookup key
130
134
  - `match`
131
135
  - custom request matcher for advanced lookup behavior
132
136
 
@@ -156,11 +160,14 @@ Typical usage:
156
160
  const vcrLayer = VcrHttpClient.layer({
157
161
  vcrName: "shopify-products",
158
162
  mode: "auto",
159
- matchIgnore: {
160
- requestHeaders: ["x-shopify-access-token", "authorization"],
161
- },
162
163
  redact: {
163
164
  requestHeaders: ["x-shopify-access-token", "authorization"],
165
+ requestBodyReplacements: {
166
+ client_secret: "client-secret-placeholder",
167
+ },
168
+ responseBodyReplacements: {
169
+ access_token: "access-token-placeholder",
170
+ },
164
171
  },
165
172
  });
166
173
  ```
@@ -168,6 +175,9 @@ const vcrLayer = VcrHttpClient.layer({
168
175
  Use `matchIgnore` when a request field should not affect cassette identity.
169
176
 
170
177
  Use `redact` when a field should never be written to disk.
178
+ Replacement values are useful for fields such as access tokens that a replayed
179
+ response must still contain. If body redaction changes the encoded length, the VCR
180
+ also removes and ignores the stale `content-length` header.
171
181
 
172
182
  ## Runtime configuration
173
183
 
@@ -1,5 +1,6 @@
1
1
  import { t as __export } from "./chunk-Bp6m_JJh.js";
2
- import { Context, Data, DateTime, Effect } from "effect";
2
+ import { t as CassetteFileSchema } from "./types-DMuz_JGd.js";
3
+ import { Context, Data, DateTime, Effect, Schema } from "effect";
3
4
 
4
5
  //#region src/cassette-store.ts
5
6
  var cassette_store_exports = /* @__PURE__ */ __export({
@@ -43,18 +44,15 @@ const toStoreError = (operation, path, cause, message) => new CassetteStoreError
43
44
  message
44
45
  });
45
46
  /**
46
- * Parses cassette JSON and maps invalid JSON to a store error.
47
+ * Parses cassette JSON and maps invalid JSON or an invalid cassette shape to a store error.
47
48
  */
48
49
  const parseCassette = (content, path) => Effect.try({
49
50
  try: () => JSON.parse(content),
50
51
  catch: (error) => toStoreError("load", path, error, "Invalid JSON")
51
- }).pipe(Effect.flatMap((parsed) => {
52
- if (!parsed || typeof parsed !== "object" || !("exports" in parsed)) return Effect.fail(toStoreError("load", path, void 0, "Invalid cassette file format"));
53
- return Effect.succeed(parsed);
54
- }));
52
+ }).pipe(Effect.flatMap((parsed) => Schema.decodeUnknownEffect(CassetteFileSchema)(parsed).pipe(Effect.mapError((error) => toStoreError("load", path, error, "Invalid cassette file format")))));
55
53
  /** Creates a `CassetteStore` implementation that uses the given `impl` object. */
56
54
  const make = (impl) => CassetteStore.of({ ...impl });
57
55
 
58
56
  //#endregion
59
57
  export { createEmptyCassetteFile as a, toStoreError as c, createEmptyCassette as i, CassetteStoreError as n, make as o, cassette_store_exports as r, parseCassette as s, CassetteStore as t };
60
- //# sourceMappingURL=cassette-store-CnXX5OLB.js.map
58
+ //# sourceMappingURL=cassette-store-BF9e0rz3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cassette-store-BF9e0rz3.js","names":[],"sources":["../src/cassette-store.ts"],"sourcesContent":["import { Context, Data, DateTime, Effect, Schema } from \"effect\";\n\nimport { CassetteFileSchema, type Cassette, type CassetteFile } from \"./types\";\n\nexport type CassetteStoreOperation = \"exists\" | \"load\" | \"save\" | \"loadOrInit\" | \"resolveRoot\";\n\n/**\n * Storage contract for VCR cassettes.\n *\n */\nexport interface CassetteStoreService {\n /** Returns true if a cassette with the given name exists. */\n readonly exists: (name: string) => Effect.Effect<boolean, CassetteStoreError>;\n\n /** Loads a cassette by name, returning a `CassetteFile` if found. */\n readonly load: (name: string) => Effect.Effect<CassetteFile, CassetteStoreError>;\n\n /** Saves a cassette by name, overwriting any existing cassette with the same name. */\n readonly save: (name: string, content: CassetteFile) => Effect.Effect<void, CassetteStoreError>;\n\n /** Loads a cassette by name, initializing a new empty cassette if not found. */\n readonly loadOrInit: (name: string) => Effect.Effect<CassetteFile, CassetteStoreError>;\n}\n\n/**\n * Effect service tag for the cassette store.\n */\nexport class CassetteStore extends Context.Service<CassetteStore, CassetteStoreService>()(\n \"@useairfoil/effect-vcr/CassetteStore\",\n) {}\n\n/**\n * Creates a new empty cassette with a timestamp and format version.\n */\nexport const createEmptyCassette = Effect.fnUntraced(function* (): Effect.fn.Return<Cassette> {\n const now = yield* DateTime.now;\n return {\n meta: {\n createdAt: DateTime.formatIso(now),\n version: \"1\",\n },\n entries: {},\n };\n});\n\nexport const createEmptyCassetteFile = (): Effect.Effect<CassetteFile> =>\n Effect.map(createEmptyCassette(), (cassette) => ({\n exports: { default: cassette },\n }));\n\n/**\n * Structured error for cassette persistence operations.\n *\n * `operation` indicates which store function failed.\n * `path` is the file or directory path that was targeted.\n */\nexport class CassetteStoreError extends Data.TaggedError(\"CassetteStoreError\")<{\n readonly operation: CassetteStoreOperation;\n readonly path: string;\n readonly message?: string;\n readonly cause?: unknown;\n}> {}\n\nexport const toStoreError = (\n operation: CassetteStoreOperation,\n path: string,\n cause?: unknown,\n message?: string,\n) =>\n new CassetteStoreError({\n operation,\n path,\n cause,\n message,\n });\n\n/**\n * Parses cassette JSON and maps invalid JSON or an invalid cassette shape to a store error.\n */\nexport const parseCassette = (\n content: string,\n path: string,\n): Effect.Effect<CassetteFile, CassetteStoreError> =>\n Effect.try({\n try: () => JSON.parse(content) as unknown,\n catch: (error) => toStoreError(\"load\", path, error, \"Invalid JSON\"),\n }).pipe(\n Effect.flatMap((parsed) =>\n Schema.decodeUnknownEffect(CassetteFileSchema)(parsed).pipe(\n Effect.mapError((error) =>\n toStoreError(\"load\", path, error, \"Invalid cassette file format\"),\n ),\n ),\n ),\n );\n\n/** Creates a `CassetteStore` implementation that uses the given `impl` object. */\nexport const make = (impl: CassetteStoreService): CassetteStoreService =>\n CassetteStore.of({ ...impl });\n"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,IAAa,gBAAb,cAAmC,QAAQ,SAA8C,CACvF,uCACD,CAAC;;;;AAKF,MAAa,sBAAsB,OAAO,WAAW,aAAyC;CAC5F,MAAM,MAAM,OAAO,SAAS;AAC5B,QAAO;EACL,MAAM;GACJ,WAAW,SAAS,UAAU,IAAI;GAClC,SAAS;GACV;EACD,SAAS,EAAE;EACZ;EACD;AAEF,MAAa,gCACX,OAAO,IAAI,qBAAqB,GAAG,cAAc,EAC/C,SAAS,EAAE,SAAS,UAAU,EAC/B,EAAE;;;;;;;AAQL,IAAa,qBAAb,cAAwC,KAAK,YAAY,qBAAqB,CAK3E;AAEH,MAAa,gBACX,WACA,MACA,OACA,YAEA,IAAI,mBAAmB;CACrB;CACA;CACA;CACA;CACD,CAAC;;;;AAKJ,MAAa,iBACX,SACA,SAEA,OAAO,IAAI;CACT,WAAW,KAAK,MAAM,QAAQ;CAC9B,QAAQ,UAAU,aAAa,QAAQ,MAAM,OAAO,eAAe;CACpE,CAAC,CAAC,KACD,OAAO,SAAS,WACd,OAAO,oBAAoB,mBAAmB,CAAC,OAAO,CAAC,KACrD,OAAO,UAAU,UACf,aAAa,QAAQ,MAAM,OAAO,+BAA+B,CAClE,CACF,CACF,CACF;;AAGH,MAAa,QAAQ,SACnB,cAAc,GAAG,EAAE,GAAG,MAAM,CAAC"}
@@ -1,4 +1,4 @@
1
- import { n as CassetteFile, t as Cassette } from "./types-DWwkMzxG.js";
1
+ import { n as CassetteFile } from "./types-XZehMu_v.js";
2
2
  import { Context, Effect } from "effect";
3
3
  import * as effect_Types0 from "effect/Types";
4
4
  import * as effect_Cause0 from "effect/Cause";
@@ -30,7 +30,31 @@ declare class CassetteStore extends CassetteStore_base {}
30
30
  /**
31
31
  * Creates a new empty cassette with a timestamp and format version.
32
32
  */
33
- declare const createEmptyCassette: () => Effect.Effect<Cassette, never, never>;
33
+ declare const createEmptyCassette: () => Effect.Effect<{
34
+ readonly meta: {
35
+ readonly createdAt: string;
36
+ readonly version: string;
37
+ };
38
+ readonly entries: {
39
+ readonly [x: string]: {
40
+ readonly request: {
41
+ readonly method: string;
42
+ readonly url: string;
43
+ readonly headers?: {
44
+ readonly [x: string]: string;
45
+ } | undefined;
46
+ readonly body?: string | undefined;
47
+ };
48
+ readonly response: {
49
+ readonly body: string;
50
+ readonly status: number;
51
+ readonly headers?: {
52
+ readonly [x: string]: string;
53
+ } | undefined;
54
+ };
55
+ };
56
+ };
57
+ }, never, never>;
34
58
  declare const createEmptyCassetteFile: () => Effect.Effect<CassetteFile>;
35
59
  declare const CassetteStoreError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
36
60
  readonly _tag: "CassetteStoreError";
@@ -49,11 +73,11 @@ declare class CassetteStoreError extends CassetteStoreError_base<{
49
73
  }> {}
50
74
  declare const toStoreError: (operation: CassetteStoreOperation, path: string, cause?: unknown, message?: string) => CassetteStoreError;
51
75
  /**
52
- * Parses cassette JSON and maps invalid JSON to a store error.
76
+ * Parses cassette JSON and maps invalid JSON or an invalid cassette shape to a store error.
53
77
  */
54
- declare const parseCassette: (content: string, path: string) => Effect.Effect<CassetteFile, CassetteStoreError, never>;
78
+ declare const parseCassette: (content: string, path: string) => Effect.Effect<CassetteFile, CassetteStoreError>;
55
79
  /** Creates a `CassetteStore` implementation that uses the given `impl` object. */
56
80
  declare const make: (impl: CassetteStoreService) => CassetteStoreService;
57
81
  //#endregion
58
82
  export { cassette_store_d_exports as a, make as c, CassetteStoreService as i, parseCassette as l, CassetteStoreError as n, createEmptyCassette as o, CassetteStoreOperation as r, createEmptyCassetteFile as s, CassetteStore as t, toStoreError as u };
59
- //# sourceMappingURL=cassette-store-BunkvLoV.d.ts.map
83
+ //# sourceMappingURL=cassette-store-BMtcjh5h.d.ts.map
@@ -1,3 +1,3 @@
1
- import "./types-DWwkMzxG.js";
2
- import { c as make, i as CassetteStoreService, l as parseCassette, n as CassetteStoreError, o as createEmptyCassette, r as CassetteStoreOperation, s as createEmptyCassetteFile, t as CassetteStore, u as toStoreError } from "./cassette-store-BunkvLoV.js";
1
+ import "./types-XZehMu_v.js";
2
+ import { c as make, i as CassetteStoreService, l as parseCassette, n as CassetteStoreError, o as createEmptyCassette, r as CassetteStoreOperation, s as createEmptyCassetteFile, t as CassetteStore, u as toStoreError } from "./cassette-store-BMtcjh5h.js";
3
3
  export { CassetteStore, CassetteStoreError, CassetteStoreOperation, CassetteStoreService, createEmptyCassette, createEmptyCassetteFile, make, parseCassette, toStoreError };
@@ -1,3 +1,4 @@
1
- import { a as createEmptyCassetteFile, c as toStoreError, i as createEmptyCassette, n as CassetteStoreError, o as make, s as parseCassette, t as CassetteStore } from "./cassette-store-CnXX5OLB.js";
1
+ import "./types-DMuz_JGd.js";
2
+ import { a as createEmptyCassetteFile, c as toStoreError, i as createEmptyCassette, n as CassetteStoreError, o as make, s as parseCassette, t as CassetteStore } from "./cassette-store-BF9e0rz3.js";
2
3
 
3
4
  export { CassetteStore, CassetteStoreError, createEmptyCassette, createEmptyCassetteFile, make, parseCassette, toStoreError };
@@ -1,4 +1,4 @@
1
- import { n as CassetteStoreError, t as CassetteStore } from "./cassette-store-BunkvLoV.js";
1
+ import { n as CassetteStoreError, t as CassetteStore } from "./cassette-store-BMtcjh5h.js";
2
2
  import { FileSystem, Layer, Path } from "effect";
3
3
 
4
4
  //#region src/file-system-cassette-store.d.ts
@@ -13,7 +13,7 @@ type FileSystemCassetteStoreConfig = {
13
13
  *
14
14
  * Requires a platform FileSystem layer (Node/Bun) to be provided by the user.
15
15
  */
16
- declare const layer: (config?: FileSystemCassetteStoreConfig) => Layer.Layer<CassetteStore, CassetteStoreError, Path.Path | FileSystem.FileSystem>;
16
+ declare const layer: (config?: FileSystemCassetteStoreConfig) => Layer.Layer<CassetteStore, CassetteStoreError, FileSystem.FileSystem | Path.Path>;
17
17
  //#endregion
18
18
  export { file_system_cassette_store_d_exports as n, layer as r, FileSystemCassetteStoreConfig as t };
19
- //# sourceMappingURL=file-system-cassette-store-LXpwwrw3.d.ts.map
19
+ //# sourceMappingURL=file-system-cassette-store-ClYAuH7U.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { t as __export } from "./chunk-Bp6m_JJh.js";
2
- import { a as createEmptyCassetteFile, c as toStoreError, o as make, s as parseCassette, t as CassetteStore } from "./cassette-store-CnXX5OLB.js";
3
- import { t as getVitestState } from "./vitest-state-BOynp4Va.js";
2
+ import { a as createEmptyCassetteFile, c as toStoreError, o as make, s as parseCassette, t as CassetteStore } from "./cassette-store-BF9e0rz3.js";
3
+ import { t as getVitestState } from "./vitest-state-CiW5dzXZ.js";
4
4
  import { Effect, FileSystem, Layer, Path } from "effect";
5
5
 
6
6
  //#region src/file-system-cassette-store.ts
@@ -39,4 +39,4 @@ const layer = (config = {}) => Layer.effect(CassetteStore)(Effect.gen(function*
39
39
 
40
40
  //#endregion
41
41
  export { layer as n, file_system_cassette_store_exports as t };
42
- //# sourceMappingURL=file-system-cassette-store-zWkrhhlO.js.map
42
+ //# sourceMappingURL=file-system-cassette-store-CyOsu3z5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-system-cassette-store-zWkrhhlO.js","names":["CassetteStore.CassetteStore","rootDir: string","CassetteStore.toStoreError","CassetteStore.parseCassette","CassetteStore.createEmptyCassetteFile","CassetteStore.make"],"sources":["../src/file-system-cassette-store.ts"],"sourcesContent":["import { Effect, Layer, FileSystem, Path } from \"effect\";\n\nimport type { CassetteFile } from \"./types\";\n\nimport * as CassetteStore from \"./cassette-store\";\nimport { getVitestState } from \"./vitest-state\";\n\nexport type FileSystemCassetteStoreConfig = {\n readonly cassetteDir?: string;\n};\n\n/**\n * FileSystem-backed cassette store.\n *\n * Requires a platform FileSystem layer (Node/Bun) to be provided by the user.\n */\nexport const layer = (config: FileSystemCassetteStoreConfig = {}) =>\n Layer.effect(CassetteStore.CassetteStore)(\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n let rootDir: string;\n if (config.cassetteDir) {\n rootDir = config.cassetteDir;\n } else {\n const { testPath } = getVitestState();\n if (!testPath) {\n return yield* Effect.fail(\n CassetteStore.toStoreError(\n \"resolveRoot\",\n \"__cassettes__\",\n undefined,\n \"VCR cassette directory could not be inferred. Provide cassetteDir when not running in Vitest.\",\n ),\n );\n }\n const testFolder = path.dirname(testPath);\n rootDir = path.join(testFolder, \"__cassettes__\");\n }\n\n const fullPath = (name: string) => path.join(rootDir, name);\n\n const load = (name: string) =>\n fs.readFileString(fullPath(name)).pipe(\n Effect.mapError((error) => CassetteStore.toStoreError(\"load\", name, error)),\n Effect.flatMap((content) => CassetteStore.parseCassette(content, name)),\n );\n\n const save = (name: string, cassette: CassetteFile) => {\n const filePath = fullPath(name);\n const dir = path.dirname(filePath);\n const ensureDir =\n dir === \"\"\n ? Effect.void\n : fs\n .makeDirectory(dir, { recursive: true })\n .pipe(Effect.mapError((error) => CassetteStore.toStoreError(\"save\", dir, error)));\n return ensureDir.pipe(\n Effect.andThen(\n fs\n .writeFileString(filePath, JSON.stringify(cassette, null, 2))\n .pipe(Effect.mapError((error) => CassetteStore.toStoreError(\"save\", name, error))),\n ),\n );\n };\n\n const loadOrInit = (name: string) =>\n fs.exists(fullPath(name)).pipe(\n Effect.mapError((error) => CassetteStore.toStoreError(\"loadOrInit\", name, error)),\n Effect.flatMap((exists) =>\n exists\n ? load(name)\n : CassetteStore.createEmptyCassetteFile().pipe(\n Effect.tap((cassette) => save(name, cassette)),\n ),\n ),\n );\n\n return CassetteStore.make({\n exists: (name: string) =>\n fs\n .exists(fullPath(name))\n .pipe(Effect.mapError((error) => CassetteStore.toStoreError(\"exists\", name, error))),\n load,\n save,\n loadOrInit,\n });\n }),\n );\n"],"mappings":";;;;;;;;;;;;AAgBA,MAAa,SAAS,SAAwC,EAAE,KAC9D,MAAM,OAAOA,cAA4B,CACvC,OAAO,IAAI,aAAa;CACtB,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CAEzB,IAAIC;AACJ,KAAI,OAAO,YACT,WAAU,OAAO;MACZ;EACL,MAAM,EAAE,aAAa,gBAAgB;AACrC,MAAI,CAAC,SACH,QAAO,OAAO,OAAO,KACnBC,aACE,eACA,iBACA,QACA,gGACD,CACF;EAEH,MAAM,aAAa,KAAK,QAAQ,SAAS;AACzC,YAAU,KAAK,KAAK,YAAY,gBAAgB;;CAGlD,MAAM,YAAY,SAAiB,KAAK,KAAK,SAAS,KAAK;CAE3D,MAAM,QAAQ,SACZ,GAAG,eAAe,SAAS,KAAK,CAAC,CAAC,KAChC,OAAO,UAAU,UAAUA,aAA2B,QAAQ,MAAM,MAAM,CAAC,EAC3E,OAAO,SAAS,YAAYC,cAA4B,SAAS,KAAK,CAAC,CACxE;CAEH,MAAM,QAAQ,MAAc,aAA2B;EACrD,MAAM,WAAW,SAAS,KAAK;EAC/B,MAAM,MAAM,KAAK,QAAQ,SAAS;AAOlC,UALE,QAAQ,KACJ,OAAO,OACP,GACG,cAAc,KAAK,EAAE,WAAW,MAAM,CAAC,CACvC,KAAK,OAAO,UAAU,UAAUD,aAA2B,QAAQ,KAAK,MAAM,CAAC,CAAC,EACxE,KACf,OAAO,QACL,GACG,gBAAgB,UAAU,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC,CAC5D,KAAK,OAAO,UAAU,UAAUA,aAA2B,QAAQ,MAAM,MAAM,CAAC,CAAC,CACrF,CACF;;CAGH,MAAM,cAAc,SAClB,GAAG,OAAO,SAAS,KAAK,CAAC,CAAC,KACxB,OAAO,UAAU,UAAUA,aAA2B,cAAc,MAAM,MAAM,CAAC,EACjF,OAAO,SAAS,WACd,SACI,KAAK,KAAK,GACVE,yBAAuC,CAAC,KACtC,OAAO,KAAK,aAAa,KAAK,MAAM,SAAS,CAAC,CAC/C,CACN,CACF;AAEH,QAAOC,KAAmB;EACxB,SAAS,SACP,GACG,OAAO,SAAS,KAAK,CAAC,CACtB,KAAK,OAAO,UAAU,UAAUH,aAA2B,UAAU,MAAM,MAAM,CAAC,CAAC;EACxF;EACA;EACA;EACD,CAAC;EACF,CACH"}
1
+ {"version":3,"file":"file-system-cassette-store-CyOsu3z5.js","names":["CassetteStore.CassetteStore","rootDir: string","CassetteStore.toStoreError","CassetteStore.parseCassette","CassetteStore.createEmptyCassetteFile","CassetteStore.make"],"sources":["../src/file-system-cassette-store.ts"],"sourcesContent":["import { Effect, Layer, FileSystem, Path } from \"effect\";\n\nimport type { CassetteFile } from \"./types\";\n\nimport * as CassetteStore from \"./cassette-store\";\nimport { getVitestState } from \"./vitest-state\";\n\nexport type FileSystemCassetteStoreConfig = {\n readonly cassetteDir?: string;\n};\n\n/**\n * FileSystem-backed cassette store.\n *\n * Requires a platform FileSystem layer (Node/Bun) to be provided by the user.\n */\nexport const layer = (config: FileSystemCassetteStoreConfig = {}) =>\n Layer.effect(CassetteStore.CassetteStore)(\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n let rootDir: string;\n if (config.cassetteDir) {\n rootDir = config.cassetteDir;\n } else {\n const { testPath } = getVitestState();\n if (!testPath) {\n return yield* Effect.fail(\n CassetteStore.toStoreError(\n \"resolveRoot\",\n \"__cassettes__\",\n undefined,\n \"VCR cassette directory could not be inferred. Provide cassetteDir when not running in Vitest.\",\n ),\n );\n }\n const testFolder = path.dirname(testPath);\n rootDir = path.join(testFolder, \"__cassettes__\");\n }\n\n const fullPath = (name: string) => path.join(rootDir, name);\n\n const load = (name: string) =>\n fs.readFileString(fullPath(name)).pipe(\n Effect.mapError((error) => CassetteStore.toStoreError(\"load\", name, error)),\n Effect.flatMap((content) => CassetteStore.parseCassette(content, name)),\n );\n\n const save = (name: string, cassette: CassetteFile) => {\n const filePath = fullPath(name);\n const dir = path.dirname(filePath);\n const ensureDir =\n dir === \"\"\n ? Effect.void\n : fs\n .makeDirectory(dir, { recursive: true })\n .pipe(Effect.mapError((error) => CassetteStore.toStoreError(\"save\", dir, error)));\n return ensureDir.pipe(\n Effect.andThen(\n fs\n .writeFileString(filePath, JSON.stringify(cassette, null, 2))\n .pipe(Effect.mapError((error) => CassetteStore.toStoreError(\"save\", name, error))),\n ),\n );\n };\n\n const loadOrInit = (name: string) =>\n fs.exists(fullPath(name)).pipe(\n Effect.mapError((error) => CassetteStore.toStoreError(\"loadOrInit\", name, error)),\n Effect.flatMap((exists) =>\n exists\n ? load(name)\n : CassetteStore.createEmptyCassetteFile().pipe(\n Effect.tap((cassette) => save(name, cassette)),\n ),\n ),\n );\n\n return CassetteStore.make({\n exists: (name: string) =>\n fs\n .exists(fullPath(name))\n .pipe(Effect.mapError((error) => CassetteStore.toStoreError(\"exists\", name, error))),\n load,\n save,\n loadOrInit,\n });\n }),\n );\n"],"mappings":";;;;;;;;;;;;AAgBA,MAAa,SAAS,SAAwC,EAAE,KAC9D,MAAM,OAAOA,cAA4B,CACvC,OAAO,IAAI,aAAa;CACtB,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CAEzB,IAAIC;AACJ,KAAI,OAAO,YACT,WAAU,OAAO;MACZ;EACL,MAAM,EAAE,aAAa,gBAAgB;AACrC,MAAI,CAAC,SACH,QAAO,OAAO,OAAO,KACnBC,aACE,eACA,iBACA,QACA,gGACD,CACF;EAEH,MAAM,aAAa,KAAK,QAAQ,SAAS;AACzC,YAAU,KAAK,KAAK,YAAY,gBAAgB;;CAGlD,MAAM,YAAY,SAAiB,KAAK,KAAK,SAAS,KAAK;CAE3D,MAAM,QAAQ,SACZ,GAAG,eAAe,SAAS,KAAK,CAAC,CAAC,KAChC,OAAO,UAAU,UAAUA,aAA2B,QAAQ,MAAM,MAAM,CAAC,EAC3E,OAAO,SAAS,YAAYC,cAA4B,SAAS,KAAK,CAAC,CACxE;CAEH,MAAM,QAAQ,MAAc,aAA2B;EACrD,MAAM,WAAW,SAAS,KAAK;EAC/B,MAAM,MAAM,KAAK,QAAQ,SAAS;AAOlC,UALE,QAAQ,KACJ,OAAO,OACP,GACG,cAAc,KAAK,EAAE,WAAW,MAAM,CAAC,CACvC,KAAK,OAAO,UAAU,UAAUD,aAA2B,QAAQ,KAAK,MAAM,CAAC,CAAC,EACxE,KACf,OAAO,QACL,GACG,gBAAgB,UAAU,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC,CAC5D,KAAK,OAAO,UAAU,UAAUA,aAA2B,QAAQ,MAAM,MAAM,CAAC,CAAC,CACrF,CACF;;CAGH,MAAM,cAAc,SAClB,GAAG,OAAO,SAAS,KAAK,CAAC,CAAC,KACxB,OAAO,UAAU,UAAUA,aAA2B,cAAc,MAAM,MAAM,CAAC,EACjF,OAAO,SAAS,WACd,SACI,KAAK,KAAK,GACVE,yBAAuC,CAAC,KACtC,OAAO,KAAK,aAAa,KAAK,MAAM,SAAS,CAAC,CAC/C,CACN,CACF;AAEH,QAAOC,KAAmB;EACxB,SAAS,SACP,GACG,OAAO,SAAS,KAAK,CAAC,CACtB,KAAK,OAAO,UAAU,UAAUH,aAA2B,UAAU,MAAM,MAAM,CAAC,CAAC;EACxF;EACA;EACA;EACD,CAAC;EACF,CACH"}
@@ -1,4 +1,4 @@
1
- import "./types-DWwkMzxG.js";
2
- import "./cassette-store-BunkvLoV.js";
3
- import { r as layer, t as FileSystemCassetteStoreConfig } from "./file-system-cassette-store-LXpwwrw3.js";
1
+ import "./types-XZehMu_v.js";
2
+ import "./cassette-store-BMtcjh5h.js";
3
+ import { r as layer, t as FileSystemCassetteStoreConfig } from "./file-system-cassette-store-ClYAuH7U.js";
4
4
  export { FileSystemCassetteStoreConfig, layer };
@@ -1,5 +1,6 @@
1
- import "./cassette-store-CnXX5OLB.js";
2
- import "./vitest-state-BOynp4Va.js";
3
- import { n as layer } from "./file-system-cassette-store-zWkrhhlO.js";
1
+ import "./types-DMuz_JGd.js";
2
+ import "./cassette-store-BF9e0rz3.js";
3
+ import "./vitest-state-CiW5dzXZ.js";
4
+ import { n as layer } from "./file-system-cassette-store-CyOsu3z5.js";
4
5
 
5
6
  export { layer };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { a as VcrMode, i as VcrEntry, n as CassetteFile, o as VcrRequest, r as VcrConfig, s as VcrResponse, t as Cassette } from "./types-DWwkMzxG.js";
2
- import { a as cassette_store_d_exports } from "./cassette-store-BunkvLoV.js";
3
- import { n as file_system_cassette_store_d_exports } from "./file-system-cassette-store-LXpwwrw3.js";
4
- import { r as vcr_http_client_d_exports } from "./vcr-http-client-aedmnq0C.js";
5
- export { Cassette, CassetteFile, cassette_store_d_exports as CassetteStore, file_system_cassette_store_d_exports as FileSystemCassetteStore, VcrConfig, VcrEntry, vcr_http_client_d_exports as VcrHttpClient, VcrMode, VcrRequest, VcrResponse };
1
+ import { a as VcrConfig, c as VcrMode, d as VcrRequestSchema, f as VcrResponse, i as CassetteSchema, l as VcrRedactedValue, n as CassetteFile, o as VcrEntry, p as VcrResponseSchema, r as CassetteFileSchema, s as VcrEntrySchema, t as Cassette, u as VcrRequest } from "./types-XZehMu_v.js";
2
+ import { a as cassette_store_d_exports } from "./cassette-store-BMtcjh5h.js";
3
+ import { n as file_system_cassette_store_d_exports } from "./file-system-cassette-store-ClYAuH7U.js";
4
+ import { r as vcr_http_client_d_exports } from "./vcr-http-client-BveeoOoW.js";
5
+ export { Cassette, CassetteFile, CassetteFileSchema, CassetteSchema, cassette_store_d_exports as CassetteStore, file_system_cassette_store_d_exports as FileSystemCassetteStore, VcrConfig, VcrEntry, VcrEntrySchema, vcr_http_client_d_exports as VcrHttpClient, VcrMode, VcrRedactedValue, VcrRequest, VcrRequestSchema, VcrResponse, VcrResponseSchema };
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { r as cassette_store_exports } from "./cassette-store-CnXX5OLB.js";
2
- import "./vitest-state-BOynp4Va.js";
3
- import { t as file_system_cassette_store_exports } from "./file-system-cassette-store-zWkrhhlO.js";
4
- import { r as vcr_http_client_exports } from "./vcr-http-client-BaMxQun5.js";
5
- import "./types-BsuPrIpu.js";
1
+ import { a as VcrResponseSchema, i as VcrRequestSchema, n as CassetteSchema, r as VcrEntrySchema, t as CassetteFileSchema } from "./types-DMuz_JGd.js";
2
+ import { r as cassette_store_exports } from "./cassette-store-BF9e0rz3.js";
3
+ import "./vitest-state-CiW5dzXZ.js";
4
+ import { t as file_system_cassette_store_exports } from "./file-system-cassette-store-CyOsu3z5.js";
5
+ import { r as vcr_http_client_exports } from "./vcr-http-client-Ba0WYPV9.js";
6
6
 
7
- export { cassette_store_exports as CassetteStore, file_system_cassette_store_exports as FileSystemCassetteStore, vcr_http_client_exports as VcrHttpClient };
7
+ export { CassetteFileSchema, CassetteSchema, cassette_store_exports as CassetteStore, file_system_cassette_store_exports as FileSystemCassetteStore, VcrEntrySchema, vcr_http_client_exports as VcrHttpClient, VcrRequestSchema, VcrResponseSchema };
@@ -0,0 +1,45 @@
1
+ import { Schema } from "effect";
2
+
3
+ //#region src/types.ts
4
+ /**
5
+ * Serialized request shape stored in a cassette.
6
+ */
7
+ const VcrRequestSchema = Schema.Struct({
8
+ method: Schema.String,
9
+ url: Schema.String,
10
+ headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),
11
+ body: Schema.optional(Schema.String)
12
+ });
13
+ /**
14
+ * Serialized response shape stored in a cassette.
15
+ */
16
+ const VcrResponseSchema = Schema.Struct({
17
+ status: Schema.Number,
18
+ body: Schema.String,
19
+ headers: Schema.optional(Schema.Record(Schema.String, Schema.String))
20
+ });
21
+ /**
22
+ * A single request/response pair keyed in the cassette.
23
+ */
24
+ const VcrEntrySchema = Schema.Struct({
25
+ request: VcrRequestSchema,
26
+ response: VcrResponseSchema
27
+ });
28
+ /**
29
+ * Cassette file format.
30
+ */
31
+ const CassetteSchema = Schema.Struct({
32
+ meta: Schema.Struct({
33
+ createdAt: Schema.String,
34
+ version: Schema.String
35
+ }),
36
+ entries: Schema.Record(Schema.String, VcrEntrySchema)
37
+ });
38
+ /**
39
+ * Cassette file format with multiple exports.
40
+ */
41
+ const CassetteFileSchema = Schema.Struct({ exports: Schema.Record(Schema.String, CassetteSchema) });
42
+
43
+ //#endregion
44
+ export { VcrResponseSchema as a, VcrRequestSchema as i, CassetteSchema as n, VcrEntrySchema as r, CassetteFileSchema as t };
45
+ //# sourceMappingURL=types-DMuz_JGd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DMuz_JGd.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\n/**\n * VCR operating mode.\n * - record: always call the live client and persist.\n * - replay: serve only from cassette, fail if missing.\n * - auto: replay if cassette exists, otherwise record (fail in CI).\n */\nexport type VcrMode = \"record\" | \"replay\" | \"auto\";\n\n/**\n * Safe scalar value written in place of a sensitive body field.\n */\nexport type VcrRedactedValue = string | number | boolean | null;\n\n/**\n * Serialized request shape stored in a cassette.\n */\nexport const VcrRequestSchema = Schema.Struct({\n method: Schema.String,\n url: Schema.String,\n headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n body: Schema.optional(Schema.String),\n});\nexport type VcrRequest = Schema.Schema.Type<typeof VcrRequestSchema>;\n\n/**\n * Serialized response shape stored in a cassette.\n */\nexport const VcrResponseSchema = Schema.Struct({\n status: Schema.Number,\n body: Schema.String,\n headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n});\nexport type VcrResponse = Schema.Schema.Type<typeof VcrResponseSchema>;\n\n/**\n * A single request/response pair keyed in the cassette.\n */\nexport const VcrEntrySchema = Schema.Struct({\n request: VcrRequestSchema,\n response: VcrResponseSchema,\n});\nexport type VcrEntry = Schema.Schema.Type<typeof VcrEntrySchema>;\n\n/**\n * Cassette file format.\n */\nexport const CassetteSchema = Schema.Struct({\n meta: Schema.Struct({\n createdAt: Schema.String,\n version: Schema.String,\n }),\n entries: Schema.Record(Schema.String, VcrEntrySchema),\n});\nexport type Cassette = Schema.Schema.Type<typeof CassetteSchema>;\n\n/**\n * Cassette file format with multiple exports.\n */\nexport const CassetteFileSchema = Schema.Struct({\n exports: Schema.Record(Schema.String, CassetteSchema),\n});\nexport type CassetteFile = Schema.Schema.Type<typeof CassetteFileSchema>;\n\n/**\n * VCR configuration.\n */\nexport type VcrConfig = {\n readonly vcrName?: string;\n /**\n * Cassette file name or basename.\n *\n * `users` resolves to `users.cassette`.\n * `users.cassette` is preserved as-is.\n */\n readonly cassetteName?: string;\n readonly mode?: VcrMode;\n /**\n * Remove or replace sensitive data before writing to disk.\n */\n readonly redact?: {\n readonly requestHeaders?: ReadonlyArray<string>;\n readonly responseHeaders?: ReadonlyArray<string>;\n readonly requestBodyKeys?: ReadonlyArray<string>;\n readonly responseBodyKeys?: ReadonlyArray<string>;\n readonly requestBodyReplacements?: Readonly<Record<string, VcrRedactedValue>>;\n readonly responseBodyReplacements?: Readonly<Record<string, VcrRedactedValue>>;\n };\n /**\n * Ignore fields when computing the request key for replay matching.\n */\n readonly matchIgnore?: {\n readonly requestHeaders?: ReadonlyArray<string>;\n readonly requestBodyKeys?: ReadonlyArray<string>;\n };\n /**\n * Custom matcher to override key-based lookup.\n */\n readonly match?: (request: VcrRequest, entry: VcrEntry) => boolean;\n};\n"],"mappings":";;;;;;AAkBA,MAAa,mBAAmB,OAAO,OAAO;CAC5C,QAAQ,OAAO;CACf,KAAK,OAAO;CACZ,SAAS,OAAO,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;CACrE,MAAM,OAAO,SAAS,OAAO,OAAO;CACrC,CAAC;;;;AAMF,MAAa,oBAAoB,OAAO,OAAO;CAC7C,QAAQ,OAAO;CACf,MAAM,OAAO;CACb,SAAS,OAAO,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;CACtE,CAAC;;;;AAMF,MAAa,iBAAiB,OAAO,OAAO;CAC1C,SAAS;CACT,UAAU;CACX,CAAC;;;;AAMF,MAAa,iBAAiB,OAAO,OAAO;CAC1C,MAAM,OAAO,OAAO;EAClB,WAAW,OAAO;EAClB,SAAS,OAAO;EACjB,CAAC;CACF,SAAS,OAAO,OAAO,OAAO,QAAQ,eAAe;CACtD,CAAC;;;;AAMF,MAAa,qBAAqB,OAAO,OAAO,EAC9C,SAAS,OAAO,OAAO,OAAO,QAAQ,eAAe,EACtD,CAAC"}
@@ -0,0 +1,138 @@
1
+ import { Schema } from "effect";
2
+
3
+ //#region src/types.d.ts
4
+
5
+ /**
6
+ * VCR operating mode.
7
+ * - record: always call the live client and persist.
8
+ * - replay: serve only from cassette, fail if missing.
9
+ * - auto: replay if cassette exists, otherwise record (fail in CI).
10
+ */
11
+ type VcrMode = "record" | "replay" | "auto";
12
+ /**
13
+ * Safe scalar value written in place of a sensitive body field.
14
+ */
15
+ type VcrRedactedValue = string | number | boolean | null;
16
+ /**
17
+ * Serialized request shape stored in a cassette.
18
+ */
19
+ declare const VcrRequestSchema: Schema.Struct<{
20
+ readonly method: Schema.String;
21
+ readonly url: Schema.String;
22
+ readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
23
+ readonly body: Schema.optional<Schema.String>;
24
+ }>;
25
+ type VcrRequest = Schema.Schema.Type<typeof VcrRequestSchema>;
26
+ /**
27
+ * Serialized response shape stored in a cassette.
28
+ */
29
+ declare const VcrResponseSchema: Schema.Struct<{
30
+ readonly status: Schema.Number;
31
+ readonly body: Schema.String;
32
+ readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
33
+ }>;
34
+ type VcrResponse = Schema.Schema.Type<typeof VcrResponseSchema>;
35
+ /**
36
+ * A single request/response pair keyed in the cassette.
37
+ */
38
+ declare const VcrEntrySchema: Schema.Struct<{
39
+ readonly request: Schema.Struct<{
40
+ readonly method: Schema.String;
41
+ readonly url: Schema.String;
42
+ readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
43
+ readonly body: Schema.optional<Schema.String>;
44
+ }>;
45
+ readonly response: Schema.Struct<{
46
+ readonly status: Schema.Number;
47
+ readonly body: Schema.String;
48
+ readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
49
+ }>;
50
+ }>;
51
+ type VcrEntry = Schema.Schema.Type<typeof VcrEntrySchema>;
52
+ /**
53
+ * Cassette file format.
54
+ */
55
+ declare const CassetteSchema: Schema.Struct<{
56
+ readonly meta: Schema.Struct<{
57
+ readonly createdAt: Schema.String;
58
+ readonly version: Schema.String;
59
+ }>;
60
+ readonly entries: Schema.$Record<Schema.String, Schema.Struct<{
61
+ readonly request: Schema.Struct<{
62
+ readonly method: Schema.String;
63
+ readonly url: Schema.String;
64
+ readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
65
+ readonly body: Schema.optional<Schema.String>;
66
+ }>;
67
+ readonly response: Schema.Struct<{
68
+ readonly status: Schema.Number;
69
+ readonly body: Schema.String;
70
+ readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
71
+ }>;
72
+ }>>;
73
+ }>;
74
+ type Cassette = Schema.Schema.Type<typeof CassetteSchema>;
75
+ /**
76
+ * Cassette file format with multiple exports.
77
+ */
78
+ declare const CassetteFileSchema: Schema.Struct<{
79
+ readonly exports: Schema.$Record<Schema.String, Schema.Struct<{
80
+ readonly meta: Schema.Struct<{
81
+ readonly createdAt: Schema.String;
82
+ readonly version: Schema.String;
83
+ }>;
84
+ readonly entries: Schema.$Record<Schema.String, Schema.Struct<{
85
+ readonly request: Schema.Struct<{
86
+ readonly method: Schema.String;
87
+ readonly url: Schema.String;
88
+ readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
89
+ readonly body: Schema.optional<Schema.String>;
90
+ }>;
91
+ readonly response: Schema.Struct<{
92
+ readonly status: Schema.Number;
93
+ readonly body: Schema.String;
94
+ readonly headers: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
95
+ }>;
96
+ }>>;
97
+ }>>;
98
+ }>;
99
+ type CassetteFile = Schema.Schema.Type<typeof CassetteFileSchema>;
100
+ /**
101
+ * VCR configuration.
102
+ */
103
+ type VcrConfig = {
104
+ readonly vcrName?: string;
105
+ /**
106
+ * Cassette file name or basename.
107
+ *
108
+ * `users` resolves to `users.cassette`.
109
+ * `users.cassette` is preserved as-is.
110
+ */
111
+ readonly cassetteName?: string;
112
+ readonly mode?: VcrMode;
113
+ /**
114
+ * Remove or replace sensitive data before writing to disk.
115
+ */
116
+ readonly redact?: {
117
+ readonly requestHeaders?: ReadonlyArray<string>;
118
+ readonly responseHeaders?: ReadonlyArray<string>;
119
+ readonly requestBodyKeys?: ReadonlyArray<string>;
120
+ readonly responseBodyKeys?: ReadonlyArray<string>;
121
+ readonly requestBodyReplacements?: Readonly<Record<string, VcrRedactedValue>>;
122
+ readonly responseBodyReplacements?: Readonly<Record<string, VcrRedactedValue>>;
123
+ };
124
+ /**
125
+ * Ignore fields when computing the request key for replay matching.
126
+ */
127
+ readonly matchIgnore?: {
128
+ readonly requestHeaders?: ReadonlyArray<string>;
129
+ readonly requestBodyKeys?: ReadonlyArray<string>;
130
+ };
131
+ /**
132
+ * Custom matcher to override key-based lookup.
133
+ */
134
+ readonly match?: (request: VcrRequest, entry: VcrEntry) => boolean;
135
+ };
136
+ //#endregion
137
+ export { VcrConfig as a, VcrMode as c, VcrRequestSchema as d, VcrResponse as f, CassetteSchema as i, VcrRedactedValue as l, CassetteFile as n, VcrEntry as o, VcrResponseSchema as p, CassetteFileSchema as r, VcrEntrySchema as s, Cassette as t, VcrRequest as u };
138
+ //# sourceMappingURL=types-XZehMu_v.d.ts.map
package/dist/types.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as VcrMode, i as VcrEntry, n as CassetteFile, o as VcrRequest, r as VcrConfig, s as VcrResponse, t as Cassette } from "./types-DWwkMzxG.js";
2
- export { Cassette, CassetteFile, VcrConfig, VcrEntry, VcrMode, VcrRequest, VcrResponse };
1
+ import { a as VcrConfig, c as VcrMode, d as VcrRequestSchema, f as VcrResponse, i as CassetteSchema, l as VcrRedactedValue, n as CassetteFile, o as VcrEntry, p as VcrResponseSchema, r as CassetteFileSchema, s as VcrEntrySchema, t as Cassette, u as VcrRequest } from "./types-XZehMu_v.js";
2
+ export { Cassette, CassetteFile, CassetteFileSchema, CassetteSchema, VcrConfig, VcrEntry, VcrEntrySchema, VcrMode, VcrRedactedValue, VcrRequest, VcrRequestSchema, VcrResponse, VcrResponseSchema };
package/dist/types.js CHANGED
@@ -1,3 +1,3 @@
1
- import "./types-BsuPrIpu.js";
1
+ import { a as VcrResponseSchema, i as VcrRequestSchema, n as CassetteSchema, r as VcrEntrySchema, t as CassetteFileSchema } from "./types-DMuz_JGd.js";
2
2
 
3
- export { };
3
+ export { CassetteFileSchema, CassetteSchema, VcrEntrySchema, VcrRequestSchema, VcrResponseSchema };