@shirudo/ddd-kit 1.0.1 → 1.2.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 +21 -18
- package/dist/aggregate-DclYgG_D.d.ts +662 -0
- package/dist/http.d.ts +2 -2
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +715 -652
- package/dist/index.js +1059 -112
- package/dist/index.js.map +1 -1
- package/dist/testing.d.ts +251 -0
- package/dist/testing.js +793 -0
- package/dist/testing.js.map +1 -0
- package/dist/utils.d.ts +16 -4
- package/dist/utils.js +158 -53
- package/dist/utils.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/array/is-built-in.ts","../src/utils/array/deep-equal.ts","../src/testing/repository-contract.ts"],"names":["tagA","tagB","len"],"mappings":"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","file":"testing.js","sourcesContent":["/**\n * Set of `Object.prototype.toString.call(x)` tags that the library treats\n * as built-in atomic types. Members of this set are compared/cloned by\n * reference (or with type-specific logic) rather than walked structurally.\n *\n * Detection is tag-based, since `Object.prototype.toString` gives the same\n * answer across realms (an iframe's `Date` has the same tag as the main\n * window's `Date`), and then brand-verified via internal-slot probes,\n * because `Symbol.toStringTag` lets any plain object claim a built-in tag.\n * The previous strategy also checked `globalThis[name] === constructor`\n * and a `proto !== Object.prototype` heuristic; both broke for cross-realm\n * objects and the latter additionally misclassified ordinary user classes\n * as built-ins.\n */\nconst BUILT_IN_TAGS: ReadonlySet<string> = new Set([\n\t\"[object Date]\",\n\t\"[object RegExp]\",\n\t\"[object Map]\",\n\t\"[object Set]\",\n\t\"[object WeakMap]\",\n\t\"[object WeakSet]\",\n\t\"[object Promise]\",\n\t\"[object Error]\",\n\t\"[object Boolean]\",\n\t\"[object Number]\",\n\t\"[object String]\",\n\t\"[object ArrayBuffer]\",\n\t\"[object SharedArrayBuffer]\",\n\t\"[object DataView]\",\n]);\n\n// Intrinsic probes for brand verification. Each one reads an internal slot\n// and throws a TypeError when `this` is not a genuine instance, the only\n// check a plain object cannot spoof via `Symbol.toStringTag`. Captured once\n// so a tampered prototype cannot redirect the probe later.\nfunction intrinsicGetter(\n\tproto: object,\n\tprop: string,\n): (this: unknown) => unknown {\n\tconst get = Object.getOwnPropertyDescriptor(proto, prop)?.get;\n\t// Spec-guaranteed accessors on intrinsic prototypes: unreachable\n\t// unless the environment itself is broken.\n\tif (!get) throw new Error(`missing intrinsic getter for ${prop}`);\n\treturn get;\n}\n\nconst dateGetTime = Date.prototype.getTime;\nconst mapSizeGet = intrinsicGetter(Map.prototype, \"size\");\nconst setSizeGet = intrinsicGetter(Set.prototype, \"size\");\nconst weakMapHas = WeakMap.prototype.has;\nconst weakSetHas = WeakSet.prototype.has;\nconst dataViewByteLengthGet = intrinsicGetter(DataView.prototype, \"byteLength\");\nconst arrayBufferByteLengthGet = intrinsicGetter(\n\tArrayBuffer.prototype,\n\t\"byteLength\",\n);\nconst regExpSourceGet = intrinsicGetter(RegExp.prototype, \"source\");\nconst booleanValueOf = Boolean.prototype.valueOf;\nconst numberValueOf = Number.prototype.valueOf;\nconst stringValueOf = String.prototype.valueOf;\nconst PROBE_KEY = {};\n\n/**\n * Tags that `deepEqual` compares BY REFERENCE (its unhandled-built-in\n * fallback) and that `deepOmit` must therefore ALIAS rather than clone:\n * a clone would break `deepEqualExcept(x, x)` reflexivity. Single source\n * of truth so the two modules cannot drift: if `deepEqual` ever learns a\n * by-value comparison for one of these, remove it here and add a clone\n * case in `deepOmit`'s `cloneBuiltIn` in the same change.\n */\nexport const REFERENCE_COMPARED_TAGS: ReadonlySet<string> = new Set([\n\t\"[object Error]\",\n\t\"[object ArrayBuffer]\",\n\t\"[object SharedArrayBuffer]\",\n\t\"[object Promise]\",\n\t\"[object WeakMap]\",\n\t\"[object WeakSet]\",\n]);\n\n/**\n * Verifies that `obj` genuinely is the type its tag claims, via an\n * internal-slot probe. Tags without a cheap probe (Promise, Error,\n * SharedArrayBuffer) are trusted: their downstream handling is\n * reference-based and cannot crash on a spoofed object.\n */\nfunction hasBrand(obj: object, tag: string): boolean {\n\ttry {\n\t\tswitch (tag) {\n\t\t\tcase \"[object Date]\":\n\t\t\t\tdateGetTime.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object RegExp]\":\n\t\t\t\tregExpSourceGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Map]\":\n\t\t\t\tmapSizeGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Set]\":\n\t\t\t\tsetSizeGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object WeakMap]\":\n\t\t\t\tweakMapHas.call(obj, PROBE_KEY);\n\t\t\t\treturn true;\n\t\t\tcase \"[object WeakSet]\":\n\t\t\t\tweakSetHas.call(obj, PROBE_KEY);\n\t\t\t\treturn true;\n\t\t\tcase \"[object DataView]\":\n\t\t\t\tdataViewByteLengthGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object ArrayBuffer]\":\n\t\t\t\tarrayBufferByteLengthGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Boolean]\":\n\t\t\t\tbooleanValueOf.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Number]\":\n\t\t\t\tnumberValueOf.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object String]\":\n\t\t\t\tstringValueOf.call(obj);\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Returns `true` when `obj` is a built-in JavaScript type that should be\n * treated atomically (compared/cloned as a unit, not walked structurally).\n * Cross-realm safe, and brand-verified: a plain object spoofing a built-in\n * tag via `Symbol.toStringTag` returns `false` and is walked structurally\n * like any other plain object instead of crashing type-specific code.\n *\n * @param obj - The object to classify\n * @param tag - The result of `Object.prototype.toString.call(obj)`, passed\n * in so callers that already computed it don't pay twice\n */\nexport function isBuiltInObject(obj: object, tag: string): boolean {\n\t// ArrayBuffer views (DataView + all TypedArrays, present and future)\n\t// carry an unforgeable internal slot, the strongest brand check.\n\tif (ArrayBuffer.isView(obj)) return true;\n\t// A built-in-looking TypedArray tag WITHOUT the view brand is spoofed.\n\tif (tag.endsWith(\"Array]\")) return false;\n\treturn BUILT_IN_TAGS.has(tag) && hasBrand(obj, tag);\n}\n","import { isBuiltInObject } from \"./is-built-in\";\n\nconst objProto = Object.prototype;\nconst objToString = objProto.toString;\nconst objHasOwn = objProto.hasOwnProperty;\n\n/**\n * SameValueZero: `===` plus NaN-equals-NaN (and `+0 === -0`, unlike\n * `Object.is`). The numeric semantics `deepEqual` documents for primitives,\n * applied consistently inside TypedArrays, Dates and Number wrappers.\n */\nfunction sameValueZero(a: unknown, b: unknown): boolean {\n\treturn (\n\t\ta === b || (Number.isNaN(a as number) && Number.isNaN(b as number))\n\t);\n}\n\n/**\n * Performs a deep equality check between two values.\n *\n * This function compares values recursively, handling:\n * - Primitives (with special handling for NaN)\n * - Arrays (nested arrays supported)\n * - Objects (plain objects and class instances)\n * - TypedArrays (Uint8Array, Int32Array, etc.)\n * - DataView\n * - Maps and Sets\n * - Dates and RegExp\n * - Wrapper objects (Boolean, Number, String)\n * - Circular references (detected and handled)\n *\n * @param a - The first value to compare\n * @param b - The second value to compare\n * @returns `true` if the values are deeply equal, `false` otherwise\n *\n * @example\n * ```ts\n * deepEqual([1, 2, 3], [1, 2, 3]); // true\n * deepEqual({ a: 1, b: [2, 3] }, { a: 1, b: [2, 3] }); // true\n * deepEqual(NaN, NaN); // true\n * deepEqual([1, 2], [1, 2, 3]); // false\n * ```\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n\treturn deepEqualInner(a, b, new WeakMap<object, WeakSet<object>>());\n}\n\n/**\n * Visited pair tracker for cycle detection. The cache is a pair-set:\n * for every left-hand object we keep the set of right-hand objects we\n * have already paired it with. Encountering an already-known pair returns\n * the cycle hypothesis (assume equal); a new (a, b') pair with b' ≠ any\n * previously cached b for that a is walked normally. The previous shape\n * (`WeakMap<object, object>`) could only remember one B per A, which\n * could short-circuit unrelated comparisons that happened to revisit the\n * same A with a different B.\n */\ntype VisitedPairs = WeakMap<object, WeakSet<object>>;\n\n/**\n * Internal recursive function for deep equality comparison.\n *\n * @internal\n */\nfunction deepEqualInner(\n\ta: unknown,\n\tb: unknown,\n\tvisited: VisitedPairs,\n): boolean {\n\t// 1. Fast path: reference equality\n\tif (a === b) return true;\n\n\tconst typeA = typeof a;\n\tconst typeB = typeof b;\n\n\t// 2. If one is not an object → primitive / function\n\tif (typeA !== \"object\" || a === null || typeB !== \"object\" || b === null) {\n\t\t// Special case: NaN should be equal\n\t\tif (typeA === \"number\" && typeB === \"number\") {\n\t\t\treturn Number.isNaN(a as number) && Number.isNaN(b as number);\n\t\t}\n\t\t// Everything else is directly unequal with !== (including functions)\n\t\treturn false;\n\t}\n\n\t// From here on: both are non-null objects\n\n\tconst objA = a as object;\n\tconst objB = b as object;\n\n\t// 3. Cycles: already seen this exact (a, b) pair?\n\tlet cachedBs = visited.get(objA);\n\tif (cachedBs?.has(objB)) {\n\t\t// Cycle hypothesis: pretend equal so the walk can terminate. If the\n\t\t// structure is actually unequal elsewhere, a different recursive\n\t\t// branch will surface the mismatch.\n\t\treturn true;\n\t}\n\tif (!cachedBs) {\n\t\tcachedBs = new WeakSet();\n\t\tvisited.set(objA, cachedBs);\n\t}\n\tcachedBs.add(objB);\n\n\t// 4. Handle Typed Arrays / DataView first\n\tif (ArrayBuffer.isView(objA) || ArrayBuffer.isView(objB)) {\n\t\tif (!ArrayBuffer.isView(objA) || !ArrayBuffer.isView(objB)) return false;\n\n\t\tconst tagA = objToString.call(objA);\n\t\tconst tagB = objToString.call(objB);\n\t\tif (tagA !== tagB) return false;\n\n\t\t// DataView: compare byte by byte\n\t\tif (tagA === \"[object DataView]\") {\n\t\t\tconst viewA = objA as DataView;\n\t\t\tconst viewB = objB as DataView;\n\t\t\tif (viewA.byteLength !== viewB.byteLength) return false;\n\n\t\t\tconst len = viewA.byteLength;\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tif (viewA.getUint8(i) !== viewB.getUint8(i)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t// Typed Arrays: element by element (length + numeric index access are\n\t\t// part of the TypedArray contract; the indexed read is sound).\n\t\tconst arrA = objA as unknown as Record<number, unknown> & { length: number };\n\t\tconst arrB = objB as unknown as Record<number, unknown> & { length: number };\n\n\t\tconst len = arrA.length;\n\t\tif (len !== arrB.length) return false;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tif (!sameValueZero(arrA[i], arrB[i])) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// 5. Arrays: `Array.isArray` is brand-based and immune to\n\t// `Symbol.toStringTag` spoofing (a spoofed tag would otherwise route a\n\t// real array away from element comparison, or a plain object into it).\n\tif (Array.isArray(objA) || Array.isArray(objB)) {\n\t\tif (!Array.isArray(objA) || !Array.isArray(objB)) return false;\n\t\tconst arrA = objA as unknown[];\n\t\tconst arrB = objB as unknown[];\n\t\tconst len = arrA.length;\n\t\tif (len !== arrB.length) return false;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tif (!deepEqualInner(arrA[i], arrB[i], visited)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// 6. Tag-based type detection (robust across realms), brand-verified:\n\t// a plain object spoofing a built-in tag is compared as a plain object\n\t// instead of crashing type-specific code below.\n\tconst tagA = objToString.call(objA);\n\tconst tagB = objToString.call(objB);\n\tif (tagA !== tagB) return false;\n\n\tconst builtInA = isBuiltInObject(objA, tagA);\n\tconst builtInB = isBuiltInObject(objB, tagB);\n\t// A genuine built-in never equals a spoofed lookalike.\n\tif (builtInA !== builtInB) return false;\n\n\tif (!builtInA) {\n\t\treturn comparePlainObjects(objA, objB, visited);\n\t}\n\n\tswitch (tagA) {\n\t\tcase \"[object Map]\": {\n\t\t\tconst mapA = objA as Map<unknown, unknown>;\n\t\t\tconst mapB = objB as Map<unknown, unknown>;\n\n\t\t\tif (mapA.size !== mapB.size) return false;\n\n\t\t\tfor (const [key, valA] of mapA) {\n\t\t\t\t// Map keys according to JS semantics: reference / SameValueZero\n\t\t\t\tif (!mapB.has(key)) return false;\n\t\t\t\tconst valB = mapB.get(key);\n\t\t\t\tif (!deepEqualInner(valA, valB, visited)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Set]\": {\n\t\t\tconst setA = objA as Set<unknown>;\n\t\t\tconst setB = objB as Set<unknown>;\n\n\t\t\tif (setA.size !== setB.size) return false;\n\n\t\t\t// Set elements: same reference (JS semantics)\n\t\t\tfor (const value of setA) {\n\t\t\t\tif (!setB.has(value)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Date]\": {\n\t\t\t// SameValueZero so two invalid Dates (getTime() === NaN) compare\n\t\t\t// equal, matching the primitive NaN semantics.\n\t\t\treturn sameValueZero((objA as Date).getTime(), (objB as Date).getTime());\n\t\t}\n\n\t\tcase \"[object RegExp]\": {\n\t\t\tconst regA = objA as RegExp;\n\t\t\tconst regB = objB as RegExp;\n\t\t\treturn regA.source === regB.source && regA.flags === regB.flags;\n\t\t}\n\n\t\tcase \"[object Boolean]\":\n\t\tcase \"[object Number]\":\n\t\tcase \"[object String]\": {\n\t\t\t// Wrapper objects (new Boolean/Number/String); SameValueZero so\n\t\t\t// two NaN Number wrappers compare equal.\n\t\t\treturn sameValueZero(\n\t\t\t\t(objA as { valueOf(): unknown }).valueOf(),\n\t\t\t\t(objB as { valueOf(): unknown }).valueOf(),\n\t\t\t);\n\t\t}\n\n\t\tdefault: {\n\t\t\t// Unhandled but brand-trusted built-ins: compared by reference.\n\t\t\t// Their internal structure is unknown, and this keeps new\n\t\t\t// built-ins from falling through to plain-object comparison.\n\t\t\t// This branch IS the REFERENCE_COMPARED_TAGS contract exported\n\t\t\t// from is-built-in.ts (and consumed by deepOmit's cloneBuiltIn):\n\t\t\t// adding a by-value case above means removing the tag there.\n\t\t\treturn objA === objB;\n\t\t}\n\t}\n}\n\n/**\n * Plain / custom objects: compare own enumerable string keys + own symbol\n * keys and their values. Used both as the final fallback and for objects\n * whose built-in-looking tag failed brand verification.\n */\nfunction comparePlainObjects(\n\tobjA: object,\n\tobjB: object,\n\tvisited: VisitedPairs,\n): boolean {\n\tconst recA = objA as Record<string | symbol, unknown>;\n\tconst recB = objB as Record<string | symbol, unknown>;\n\n\tconst stringKeysA = Object.keys(objA);\n\tconst stringKeysB = Object.keys(objB);\n\tif (stringKeysA.length !== stringKeysB.length) return false;\n\n\tconst symbolKeysA = Object.getOwnPropertySymbols(objA);\n\tconst symbolKeysB = Object.getOwnPropertySymbols(objB);\n\tif (symbolKeysA.length !== symbolKeysB.length) return false;\n\n\t// Build the B-side symbol set once; the previous impl rebuilt the\n\t// array and ran .includes per key, which was quadratic.\n\tconst symbolKeysBSet = new Set<symbol>(symbolKeysB);\n\n\tfor (const key of stringKeysA) {\n\t\tif (!objHasOwn.call(objB, key)) return false;\n\t}\n\tfor (const key of symbolKeysA) {\n\t\tif (!symbolKeysBSet.has(key)) return false;\n\t}\n\n\tfor (const key of stringKeysA) {\n\t\tif (!deepEqualInner(recA[key], recB[key], visited)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tfor (const key of symbolKeysA) {\n\t\tif (!deepEqualInner(recA[key], recB[key], visited)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n","import type { IAggregateRoot } from \"../aggregate/aggregate\";\nimport type { AnyDomainEvent } from \"../aggregate/domain-event\";\nimport type { Id } from \"../core/id\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\n\n/**\n * The repository surface the contract suite exercises: the minimal\n * structural subset of the canonical `IUnitOfWorkRepository` (exported\n * from the main entry) that the tests need. `getById` is typed over\n * the aggregate's own branded id (`TAgg[\"id\"]`), so concrete adapters\n * — including arrow-function-property style repositories, which are\n * checked contravariantly — match without casts.\n */\nexport interface ContractRepository<\n\tTAgg extends IAggregateRoot<Id<string>, AnyDomainEvent>,\n> {\n\tgetById(id: TAgg[\"id\"]): Promise<TAgg | null>;\n\tsave(aggregate: TAgg): Promise<void>;\n\tdelete(aggregate: TAgg): Promise<void>;\n}\n\n/**\n * One isolated test environment: fresh storage, fresh outbox. The\n * suite creates one per test via {@link RepositoryContractHarness} and\n * tears it down afterwards (a teardown failure never masks an\n * in-flight contract violation).\n */\nexport interface RepositoryContractEnvironment<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n> {\n\t/**\n\t * Execute one unit of work against the adapter under test: open the\n\t * transaction, hand the suite a tx-bound repository, commit on\n\t * resolve, roll back on throw, and run the post-commit lifecycle\n\t * (event harvest into the outbox, `markPersisted`). Wire this\n\t * through your real `UnitOfWork` / `withCommit` setup — the commit\n\t * boundary IS part of what the suite proves.\n\t */\n\trun<R>(\n\t\twork: (ctx: { repository: ContractRepository<TAgg> }) => Promise<R>,\n\t): Promise<R>;\n\n\t/**\n\t * All events currently persisted in the outbox (committed writes\n\t * only — a rolled-back transaction's events must not appear here).\n\t */\n\tcommittedOutboxEvents(): Promise<ReadonlyArray<Evt>>;\n\n\t/** Release connections, drop schemas, etc. Called in a finally. */\n\tteardown?(): Promise<void>;\n}\n\n/**\n * What an adapter supplies to run the contract suite.\n *\n * The harness MUST provide isolation per environment (fresh\n * tables/keyspace or a truncate) — tests assume they see only their\n * own writes. **For SQL/ORM adapters this must run against a real\n * database** (testcontainers or equivalent), not an in-memory fake:\n * the mandatory two-writer test proves YOUR `WHERE version = ?`\n * predicate, and an in-memory stand-in proves only itself.\n *\n * Optional capabilities widen the suite: tests for an absent\n * capability come back **marked `skipped`** with a `run()` that\n * rejects loudly — bind them with `it.skip` so the gap stays visible\n * in every report (see {@link RepositoryContractTest}); a naive\n * binding fails instead of green-no-op'ing. Capabilities are captured\n * once at suite creation. Provide every capability your adapter can\n * support — each one closes a real OCC hole.\n */\nexport interface RepositoryContractHarness<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n> {\n\tcreateEnvironment(): Promise<RepositoryContractEnvironment<TAgg, Evt>>;\n\n\t/**\n\t * A brand-new aggregate (never persisted, unique id,\n\t * `persistedVersion === undefined`).\n\t */\n\tcreateAggregate(): TAgg;\n\n\t/**\n\t * Apply exactly ONE version-bumping domain mutation that records at\n\t * least one domain event (a `commit()`-style state change). The\n\t * suite relies on the +1-per-call arithmetic and on the event for\n\t * its outbox assertions.\n\t */\n\tmutate(aggregate: TAgg): void;\n\n\t/**\n\t * Optional: a version-bumping mutation whose state is deep-equal to\n\t * the previous state (`setState({...state}, true)`). Enables the\n\t * version-only-change-still-persists test — the skip-save/OCC-desync\n\t * trap.\n\t */\n\tmutateVersionOnly?(aggregate: TAgg): void;\n\n\t/**\n\t * Optional: a mutation that changes ONLY a child collection (a\n\t * non-root-row `changedKeys` entry). Enables the\n\t * child-change-bumps-root-version test for partial-write\n\t * repositories.\n\t */\n\tmutateChildCollection?(aggregate: TAgg): void;\n\n\t/**\n\t * Optional: construct a NEW (never-persisted) aggregate instance\n\t * carrying a SPECIFIC id. Enables TWO tests: deletion-is-final-\n\t * across-instances (resurrection via a factory after delete) and\n\t * the duplicate-insert test (see\n\t * {@link insertsAreDuplicateChecked} to opt out of the latter\n\t * independently).\n\t */\n\tcreateAggregateWithId?(id: TAgg[\"id\"]): TAgg;\n\n\t/**\n\t * Semantic opt-OUT (default `true`): whether `save()`'s INSERT path\n\t * rejects an existing id with `DuplicateAggregateError` (mapping the\n\t * driver's unique-violation — Postgres `23505`, MySQL `1062`, SQLite\n\t * `SQLITE_CONSTRAINT_UNIQUE`). This is the near-mandatory contract:\n\t * `save()` is insert-or-update, never upsert — create-idempotency\n\t * belongs in the USE CASE (load, then decide), not in the save path.\n\t * Set `false` ONLY for a deliberately upserting adapter\n\t * (idempotent-create design); the duplicate-insert test is then\n\t * reported as skipped under this capability name, without costing\n\t * the deletion-finality coverage that `createAggregateWithId` also\n\t * gates.\n\t */\n\tinsertsAreDuplicateChecked?: boolean;\n\n\t/**\n\t * Optional: a plain-data projection of the aggregate's persisted\n\t * state, compared with deep equality. Enables the mandatory test's\n\t * state assertion (without it, only the version and the outbox are\n\t * compared — an adapter whose predicate guards the version write\n\t * but not the state write would slip through).\n\t *\n\t * **The projection must be roundtrip-stable**: it compares a\n\t * DB-reloaded aggregate against an in-memory one, so normalize\n\t * anything your store changes in transit — dates to ISO strings at\n\t * your store's precision (MySQL DATETIME truncates millis), no\n\t * `undefined`-valued keys (JSON columns drop them), decimals/bigints\n\t * to one consistent representation. A mismatch here fails the\n\t * mandatory test; the message names the projection as a suspect.\n\t */\n\tsnapshotState?(aggregate: TAgg): unknown;\n\n\t/**\n\t * Optional flag: declare it when your `delete(aggregate)` runs an\n\t * OCC predicate (`DELETE … WHERE id = ? AND version = ?`). Enables\n\t * the stale-delete conflict test. Unpredicated deletes are\n\t * last-write-wins by construction — acceptable for GC-style\n\t * cleanup, rarely for user-initiated deletion of contended\n\t * aggregates (see the repository guide).\n\t */\n\tdeletesAreVersionChecked?: boolean;\n}\n\n/**\n * One named contract test; `run` rejects with a descriptive Error on\n * violation. When the harness lacks the capability a test needs, the\n * entry is still returned with {@link skipped} set and a `run` that\n * REJECTS with an explanatory error: bind it with your runner's skip\n * (`(test.skipped ? it.skip : it)(test.name, test.run)`) so the gap is\n * visible in every test report — a missing capability must never look\n * like green coverage, and a naive binding that ignores `skipped`\n * fails loud instead of passing silently.\n */\nexport interface RepositoryContractTest {\n\tname: string;\n\trun: () => Promise<void>;\n\t/** Present when the harness lacks the capability this test needs. */\n\tskipped?: { capability: string };\n}\n\n/**\n * The repository contract test suite: the proof that an adapter\n * actually delivers the guarantees the kit's Unit of Work documents.\n *\n * The kit is ORM-agnostic — the OCC version predicate lives in YOUR\n * repository's SQL. That makes optimistic concurrency a **repository\n * contract, not a kit guarantee**: the kit ships the boundary, the\n * `persistedVersion` baseline, `ConcurrencyConflictError`, and this\n * suite; your adapter must pass it. An adapter that has not passed the\n * suite (against a real database, for SQL adapters) has not\n * demonstrated OCC.\n *\n * Framework-agnostic: assertions throw plain `Error`s, so the suite\n * binds to vitest, jest, or `node:test` the same way:\n *\n * ```ts\n * import { describe, it } from \"vitest\";\n * import { createRepositoryContractTests } from \"@shirudo/ddd-kit/testing\";\n *\n * const harness: RepositoryContractHarness<Order, OrderEvent> = {\n * createEnvironment: async () => {\n * const schema = await provisionTestSchema(); // testcontainers etc.\n * const uowDeps = {\n * scope: schema.scope,\n * outbox: schema.outbox,\n * repositories: {\n * orders: (tx, session) => new DrizzleOrderRepository(tx, session),\n * },\n * };\n * return {\n * run: (work) =>\n * new UnitOfWork(uowDeps).run(({ repositories }) =>\n * work({ repository: repositories.orders })),\n * committedOutboxEvents: () => schema.readOutboxEvents(),\n * teardown: () => schema.drop(),\n * };\n * },\n * createAggregate: () => Order.draft(orderIds.next()),\n * mutate: (order) => order.changeNote(`note-${counter++}`), // ONE bump + event\n * // provide every optional capability your adapter supports:\n * createAggregateWithId: (id) => Order.draft(id),\n * snapshotState: (order) => normalizeForRoundtrip(order.state),\n * deletesAreVersionChecked: true,\n * };\n *\n * describe(\"DrizzleOrderRepository: repository contract\", () => {\n * for (const test of createRepositoryContractTests(harness)) {\n * (test.skipped ? it.skip : it)(test.name, test.run);\n * }\n * });\n * ```\n *\n * **`env.run` must provide unit-of-work semantics.** Three core tests\n * (identity-map sameness, getById-null-after-delete, deletion\n * finality) exercise the session machinery — `session.identityMap`,\n * the `isDeleted` probe, the deleted-gate. Wiring `run` through the\n * kit's `UnitOfWork` gives you all of it; a hand-rolled `withCommit`\n * wiring must provide equivalents or those tests will fail. A\n * `withCommit`-only setup that deliberately makes no identity-map /\n * deletion-finality claims is outside this suite's scope — the suite\n * is the compliance bar for unit-of-work repositories.\n *\n * **Error matching is by NAME along the `cause` chain, not by\n * `instanceof`.** The suite ships in its own bundle entry; comparing\n * class identity would spuriously fail whenever the adapter's errors\n * come from a different copy of the kit (the main entry's bundle, or a\n * second installed version). `error.name === \"ConcurrencyConflictError\"`\n * anywhere in the chain is the contract.\n *\n * **What each test proves.** The OCC, routing, rollback, and outbox\n * tests prove YOUR adapter's SQL and transaction wiring. The\n * identity-map, deletion-finality, and event-lifecycle tests prove\n * your READ-PATH and unit-of-work WIRING (they exercise kit-provided\n * machinery — `session.identityMap`, the deleted-gate, `withCommit`'s\n * harvest — and fail when your repository bypasses or mis-wires it).\n * A deletion-finality failure usually means a missing\n * `identityMap.isDeleted` check or an `enrollSaved` placed after the\n * row write, not a broken DELETE statement.\n *\n * **Known limitation: no truly concurrent runs.** The mandatory\n * two-writer test is deliberately sequential-deterministic — writer B\n * loads, writer A loads/mutates/commits, then B commits its stale\n * instance. The stale `persistedVersion` baseline travels with B's\n * instance, so the version predicate is exercised exactly as in a true\n * race, without depending on lock timing, pool sizes, or\n * engine-specific blocking. The flip side: lock interaction is NOT\n * covered — a `SELECT … FOR UPDATE`-style repository that blocks\n * instead of conflicting, or a SERIALIZABLE engine surfacing raw\n * serialization failures (Postgres 40001) your adapter must map to\n * `ConcurrencyConflictError`, needs adapter-specific tests on top of\n * this suite.\n */\nexport function createRepositoryContractTests<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n>(harness: RepositoryContractHarness<TAgg, Evt>): RepositoryContractTest[] {\n\ttype Env = RepositoryContractEnvironment<TAgg, Evt>;\n\n\tasync function withEnvironment(\n\t\tbody: (env: Env) => Promise<void>,\n\t): Promise<void> {\n\t\tconst env = await harness.createEnvironment();\n\t\tlet bodyFailed = false;\n\t\tlet bodyError: unknown;\n\t\ttry {\n\t\t\tawait body(env);\n\t\t} catch (error) {\n\t\t\tbodyFailed = true;\n\t\t\tbodyError = error;\n\t\t}\n\t\ttry {\n\t\t\tawait env.teardown?.();\n\t\t} catch (teardownError) {\n\t\t\t// A teardown failure (dropping a schema on an aborted pool)\n\t\t\t// must never REPLACE the contract-violation diagnostic that is\n\t\t\t// the suite's entire value. Only surface it when the body\n\t\t\t// itself succeeded.\n\t\t\tif (!bodyFailed) {\n\t\t\t\tthrow teardownError;\n\t\t\t}\n\t\t}\n\t\tif (bodyFailed) {\n\t\t\tthrow bodyError;\n\t\t}\n\t}\n\n\t/** Load with a contract diagnostic instead of a bare TypeError downstream. */\n\tasync function loadOrFail(\n\t\trepository: ContractRepository<TAgg>,\n\t\tid: TAgg[\"id\"],\n\t): Promise<TAgg> {\n\t\tconst loaded = await repository.getById(id);\n\t\tassert(\n\t\t\tloaded !== null,\n\t\t\t`getById(${String(id)}) returned null for an aggregate that must exist - broken hydration or a write that did not commit`,\n\t\t);\n\t\treturn loaded;\n\t}\n\n\t/** Seed one aggregate with a single committed mutation; returns it persisted. */\n\tasync function seed(env: Env): Promise<TAgg> {\n\t\tconst aggregate = harness.createAggregate();\n\t\tharness.mutate(aggregate);\n\t\tawait env.run(async ({ repository }) => {\n\t\t\tawait repository.save(aggregate);\n\t\t});\n\t\treturn aggregate;\n\t}\n\n\tasync function reload(env: Env, id: TAgg[\"id\"]): Promise<TAgg> {\n\t\treturn env.run(({ repository }) => loadOrFail(repository, id));\n\t}\n\n\tfunction captureRejection(promise: Promise<unknown>): Promise<unknown> {\n\t\treturn promise.then(\n\t\t\t() => undefined,\n\t\t\t(error: unknown) => error,\n\t\t);\n\t}\n\n\t// Sorted: eventIds are unique, so this is a multiset comparison. The\n\t// environment contract guarantees WHICH events are persisted, not the\n\t// order a `SELECT` without `ORDER BY` happens to return them in.\n\tconst eventIds = (events: ReadonlyArray<Evt>): string[] =>\n\t\tevents.map((event) => event.eventId).sort();\n\n\t// Capabilities are captured ONCE at suite creation: a harness mutated\n\t// between createRepositoryContractTests() and the run must not flip a\n\t// test's behavior mid-flight.\n\tconst snapshotState = harness.snapshotState;\n\tconst mutateVersionOnly = harness.mutateVersionOnly;\n\tconst mutateChildCollection = harness.mutateChildCollection;\n\tconst createAggregateWithId = harness.createAggregateWithId;\n\tconst deletesAreVersionChecked = harness.deletesAreVersionChecked === true;\n\t// Semantic opt-OUT, default true (the contract is near-mandatory).\n\tconst insertsAreDuplicateChecked =\n\t\tharness.insertsAreDuplicateChecked !== false;\n\n\tfunction skippedTest(name: string, capability: string): RepositoryContractTest {\n\t\treturn {\n\t\t\tname,\n\t\t\tskipped: { capability },\n\t\t\trun: async () => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Repository contract test skipped: harness capability '${capability}' is not provided. ` +\n\t\t\t\t\t\t`Bind skipped tests with it.skip ((test.skipped ? it.skip : it)(test.name, test.run)) ` +\n\t\t\t\t\t\t`or provide the capability - each one closes a real OCC hole.`,\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n\n\tconst tests: RepositoryContractTest[] = [\n\t\t{\n\t\t\tname: \"MANDATORY two-writer conflict: the stale writer throws ConcurrencyConflictError and persists nothing\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\tconst seedEvents = await env.committedOutboxEvents();\n\t\t\t\t\tconst seedEventIds = new Set(seedEvents.map((e) => e.eventId));\n\n\t\t\t\t\t// Writer B loads first - its persistedVersion baseline is\n\t\t\t\t\t// now fixed at the pre-conflict version.\n\t\t\t\t\tconst staleB = await reload(env, seeded.id);\n\n\t\t\t\t\t// Writer A loads the same version, mutates, commits.\n\t\t\t\t\tconst committedA = await env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst a = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\tharness.mutate(a);\n\t\t\t\t\t\tawait repository.save(a);\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t});\n\t\t\t\t\tconst outboxAfterA = await env.committedOutboxEvents();\n\t\t\t\t\tassert(\n\t\t\t\t\t\toutboxAfterA.length > seedEvents.length,\n\t\t\t\t\t\t\"writer A's events must reach the outbox on commit\",\n\t\t\t\t\t);\n\t\t\t\t\t// Writer A's NEW events must carry A's ACTUAL committed\n\t\t\t\t\t// version - not merely some number. A wrong value here\n\t\t\t\t\t// (hardcoded, schema version, persistedVersion) would\n\t\t\t\t\t// poison every consumer's ordering/idempotency watermark.\n\t\t\t\t\tconst newSinceSeed = outboxAfterA.filter(\n\t\t\t\t\t\t(event) => !seedEventIds.has(event.eventId),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tnewSinceSeed.length > 0 &&\n\t\t\t\t\t\t\tnewSinceSeed.every(\n\t\t\t\t\t\t\t\t(event) => event.aggregateVersion === committedA.version,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t`writer A's committed outbox events must carry aggregateVersion === ${committedA.version} (A's commit version). ` +\n\t\t\t\t\t\t\t`Suspect #1: your outbox read-back (committedOutboxEvents) reconstructs events from an explicit column list ` +\n\t\t\t\t\t\t\t`and drops or string-types the aggregateVersion field. Suspect #2: a hand-rolled orchestration that does not ` +\n\t\t\t\t\t\t\t`stamp aggregateVersion = aggregate.version at harvest (withCommit does this automatically).`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Writer B mutates its stale instance and tries to commit.\n\t\t\t\t\tharness.mutate(staleB);\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tawait repository.save(staleB);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\t\"the second writer's commit must reject - it committed on a stale version instead (OCC predicate missing?)\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"ConcurrencyConflictError\"),\n\t\t\t\t\t\t`the second writer's rejection must be (or wrap, via the cause chain) ConcurrencyConflictError; got: ${describeError(rejection)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Final persisted state equals writer A's.\n\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\tcommittedA.version,\n\t\t\t\t\t\t\"the persisted version must equal writer A's committed version\",\n\t\t\t\t\t);\n\t\t\t\t\tif (snapshotState) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, final),\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, committedA),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\"the persisted STATE must equal writer A's. Two suspects: \" +\n\t\t\t\t\t\t\t\t\"(a) a predicate that guards only the version write lets the stale writer's state survive; \" +\n\t\t\t\t\t\t\t\t\"(b) your snapshotState projection is not roundtrip-stable (date precision, undefined-valued keys, decimal representation) - see its JSDoc\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Outbox contains exactly the events it contained after A's\n\t\t\t\t\t// commit - same records, not merely the same count.\n\t\t\t\t\tconst outboxFinal = await env.committedOutboxEvents();\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(eventIds(outboxFinal), eventIds(outboxAfterA)),\n\t\t\t\t\t\t\"the outbox must contain exactly the winning writer's events (compared by eventId) - nothing from the stale writer, nothing replaced\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"insert routing: a never-persisted aggregate INSERTs even after pre-save mutations\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\t\tassert(\n\t\t\t\t\t\taggregate.persistedVersion === undefined,\n\t\t\t\t\t\t\"harness contract: createAggregate() must return a never-persisted aggregate (persistedVersion === undefined)\",\n\t\t\t\t\t);\n\t\t\t\t\t// Mutate BEFORE the first save: version moves past zero in\n\t\t\t\t\t// memory while no row exists. Routing on version === 0\n\t\t\t\t\t// would attempt an UPDATE that affects zero rows.\n\t\t\t\t\tharness.mutate(aggregate);\n\t\t\t\t\tharness.mutate(aggregate);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t});\n\n\t\t\t\t\tconst loaded = await reload(env, aggregate.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tloaded.version,\n\t\t\t\t\t\taggregate.version,\n\t\t\t\t\t\t\"the INSERT must persist the in-memory version (route on persistedVersion === undefined, not version === 0)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"update writes the in-memory version and predicates on persistedVersion\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\tconst baseline = seeded.version;\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\tharness.mutate(loaded);\n\t\t\t\t\t\tharness.mutate(loaded);\n\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t});\n\n\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\tbaseline + 2,\n\t\t\t\t\t\t\"two mutations must persist as baseline + 2 (version is a mutation sequence)\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.persistedVersion,\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\t\"a reloaded aggregate's persistedVersion must equal its version\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rollback persists nothing: state, version, and outbox untouched\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\tconst versionBefore = seeded.version;\n\t\t\t\t\tconst outboxBefore = (await env.committedOutboxEvents()).length;\n\t\t\t\t\tconst probe = new Error(\"contract rollback probe\");\n\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\tharness.mutate(loaded);\n\t\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t\t\tthrow probe;\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\t\"a throwing unit of work must reject\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\tversionBefore,\n\t\t\t\t\t\t\"a rolled-back write must not change the persisted version\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.committedOutboxEvents()).length,\n\t\t\t\t\t\toutboxBefore,\n\t\t\t\t\t\t\"a rolled-back transaction must not leave events in the outbox\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"identity map: two getById calls in one unit of work return the same instance\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst first = await repository.getById(seeded.id);\n\t\t\t\t\t\tconst second = await repository.getById(seeded.id);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tfirst !== null && first === second,\n\t\t\t\t\t\t\t\"repeated loads within one unit of work must return the SAME instance (identity map) - distinct instances double-harvest events\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"delete: getById returns null in the same unit of work and after the commit\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\tawait repository.delete(loaded);\n\t\t\t\t\t\tconst probe = await repository.getById(seeded.id);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tprobe === null,\n\t\t\t\t\t\t\t\"after delete, getById in the SAME unit of work must return null (isDeleted check), even if the physical delete is deferred\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst probe = await repository.getById(seeded.id);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tprobe === null,\n\t\t\t\t\t\t\t\"after the deleting unit of work committed, the aggregate must be gone\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"deletion is final: saving the deleted aggregate in the same unit of work throws AggregateDeletedError\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\tharness.mutate(loaded);\n\t\t\t\t\t\t\tawait repository.delete(loaded);\n\t\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"AggregateDeletedError\"),\n\t\t\t\t\t\t`save-after-delete must reject with (or wrap) AggregateDeletedError; got: ${describeError(rejection)}. ` +\n\t\t\t\t\t\t\t`If you see ConcurrencyConflictError here instead, your save() probably enrolls AFTER the row write - enroll first.`,\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"events are cleared after a committed unit of work and kept after a rollback\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst committed = harness.createAggregate();\n\t\t\t\t\tharness.mutate(committed);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tcommitted.pendingEvents.length > 0,\n\t\t\t\t\t\t\"harness contract: mutate() must record at least one domain event\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(committed);\n\t\t\t\t\t});\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tcommitted.pendingEvents.length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"pending events must be cleared after a successful commit\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst rolledBack = harness.createAggregate();\n\t\t\t\t\tharness.mutate(rolledBack);\n\t\t\t\t\tconst pendingBefore = rolledBack.pendingEvents.length;\n\t\t\t\t\tawait captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tawait repository.save(rolledBack);\n\t\t\t\t\t\t\tthrow new Error(\"contract rollback probe\");\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\trolledBack.pendingEvents.length,\n\t\t\t\t\t\tpendingBefore,\n\t\t\t\t\t\t\"pending events must survive a rollback (so a fresh load + retry can re-emit them)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"persistedVersion syncs only after a successful commit\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t// Re-saving the SAME instance after the rollback is the\n\t\t\t\t\t// documented carve-out from \"don't reuse aggregates after a\n\t\t\t\t\t// rollback\": a NEVER-persisted aggregate has no row and its\n\t\t\t\t\t// baseline is still undefined, so there is nothing to\n\t\t\t\t\t// reload - retrying its first save is the only path.\n\t\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\t\tharness.mutate(aggregate);\n\n\t\t\t\t\tawait captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t\t\tthrow new Error(\"contract rollback probe\");\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\taggregate.persistedVersion === undefined,\n\t\t\t\t\t\t\"a rolled-back first save must leave persistedVersion undefined (the aggregate is still unpersisted)\",\n\t\t\t\t\t);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t});\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\taggregate.persistedVersion,\n\t\t\t\t\t\taggregate.version,\n\t\t\t\t\t\t\"after a successful commit, persistedVersion must equal version (markPersisted ran)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t];\n\n\t// Capability-gated tests: when the harness lacks the capability, the\n\t// entry is returned WITH `skipped` set and a loudly-rejecting run() -\n\t// the gap stays visible in every test report (it.skip) and a naive\n\t// binding fails instead of green-no-op'ing.\n\ttests.push(\n\t\tmutateVersionOnly\n\t\t\t? {\n\t\t\t\t\tname: \"version-only change still persists (skip-save must not desync the OCC baseline)\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\t\t\tconst baseline = seeded.version;\n\n\t\t\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\t\tmutateVersionOnly.call(harness, loaded);\n\t\t\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\t\t\tbaseline + 1,\n\t\t\t\t\t\t\t\t\"a version-only change (empty changedKeys, bumped version) must still be persisted - skipping it desyncs persistedVersion and produces false ConcurrencyConflictErrors later\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"version-only change still persists (skip-save must not desync the OCC baseline)\",\n\t\t\t\t\t\"mutateVersionOnly\",\n\t\t\t\t),\n\t);\n\ttests.push(\n\t\tmutateChildCollection\n\t\t\t? {\n\t\t\t\t\tname: \"a child-collection-only change bumps the persisted root version\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\t\t\tconst baseline = seeded.version;\n\n\t\t\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\t\tmutateChildCollection.call(harness, loaded);\n\t\t\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tfinal.version > baseline,\n\t\t\t\t\t\t\t\t\"a child-collection-only change must advance the persisted ROOT version - otherwise concurrent writers interleave with collection writes undetected\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"a child-collection-only change bumps the persisted root version\",\n\t\t\t\t\t\"mutateChildCollection\",\n\t\t\t\t),\n\t);\n\ttests.push(\n\t\tcreateAggregateWithId\n\t\t\t? {\n\t\t\t\t\tname: \"deletion is final across instances: a re-created aggregate with the same id cannot be saved\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\t\t\tawait repository.delete(loaded);\n\t\t\t\t\t\t\t\t\tconst resurrected = createAggregateWithId.call(\n\t\t\t\t\t\t\t\t\t\tharness,\n\t\t\t\t\t\t\t\t\t\tseeded.id,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tharness.mutate(resurrected);\n\t\t\t\t\t\t\t\t\tawait repository.save(resurrected);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"AggregateDeletedError\"),\n\t\t\t\t\t\t\t\t`saving a re-created instance of a deleted aggregate must reject with (or wrap) AggregateDeletedError; got: ${describeError(rejection)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"deletion is final across instances: a re-created aggregate with the same id cannot be saved\",\n\t\t\t\t\t\"createAggregateWithId\",\n\t\t\t\t),\n\t);\n\ttests.push(\n\t\tcreateAggregateWithId && insertsAreDuplicateChecked\n\t\t\t? {\n\t\t\t\t\tname: \"duplicate insert: a second never-persisted aggregate with an existing id throws DuplicateAggregateError\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\t\t\t// A second NEVER-persisted instance with the same id:\n\t\t\t\t\t\t\t// two concurrent creators racing on a business-derived\n\t\t\t\t\t\t\t// id, or an id-generator collision. The INSERT must\n\t\t\t\t\t\t\t// surface as the kit's error class, not a raw driver\n\t\t\t\t\t\t\t// error. Mutated TWICE so its version differs from the\n\t\t\t\t\t\t\t// seeded row's - a clobbering insert is then visible\n\t\t\t\t\t\t\t// in the version check below even without a state\n\t\t\t\t\t\t\t// snapshot.\n\t\t\t\t\t\t\tconst duplicate = createAggregateWithId.call(\n\t\t\t\t\t\t\t\tharness,\n\t\t\t\t\t\t\t\tseeded.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tharness.mutate(duplicate);\n\t\t\t\t\t\t\tharness.mutate(duplicate);\n\t\t\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\t\tawait repository.save(duplicate);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"DuplicateAggregateError\"),\n\t\t\t\t\t\t\t\t`inserting a second aggregate with an existing id must reject with (or wrap) DuplicateAggregateError - ` +\n\t\t\t\t\t\t\t\t\t`map your driver's unique-violation signal (Postgres 23505, MySQL 1062, SQLite SQLITE_CONSTRAINT_UNIQUE) ` +\n\t\t\t\t\t\t\t\t\t`instead of letting the raw driver error escape; got: ${describeError(rejection)}`,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// The existing row is untouched by the rejected insert:\n\t\t\t\t\t\t\t// version AND (capability permitting) state.\n\t\t\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\t\t\tseeded.version,\n\t\t\t\t\t\t\t\t\"the existing row must be untouched by the rejected duplicate insert - a duplicate check that fires AFTER the write (or outside the transaction) clobbers the existing row\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (snapshotState) {\n\t\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\t\t\t\tsnapshotState.call(harness, final),\n\t\t\t\t\t\t\t\t\t\tsnapshotState.call(harness, seeded),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\"the existing row's STATE must be untouched by the rejected duplicate insert\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"duplicate insert: a second never-persisted aggregate with an existing id throws DuplicateAggregateError\",\n\t\t\t\t\t// Name the capability that is actually missing: the\n\t\t\t\t\t// mechanical one (cannot build the duplicate) or the\n\t\t\t\t\t// semantic opt-out (deliberately upserting adapter).\n\t\t\t\t\tcreateAggregateWithId\n\t\t\t\t\t\t? \"insertsAreDuplicateChecked\"\n\t\t\t\t\t\t: \"createAggregateWithId\",\n\t\t\t\t),\n\t);\n\ttests.push(\n\t\tdeletesAreVersionChecked\n\t\t\t? {\n\t\t\t\t\tname: \"stale delete conflicts: deleting from a stale instance throws ConcurrencyConflictError\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\t\t\t// Writer B loads, writer A commits an update, B deletes\n\t\t\t\t\t\t\t// from its stale baseline - the predicated DELETE must\n\t\t\t\t\t\t\t// affect zero rows and conflict, not destroy A's write.\n\t\t\t\t\t\t\tconst staleB = await reload(env, seeded.id);\n\t\t\t\t\t\t\tconst versionAfterA = await env.run(\n\t\t\t\t\t\t\t\tasync ({ repository }) => {\n\t\t\t\t\t\t\t\t\tconst a = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\t\t\tharness.mutate(a);\n\t\t\t\t\t\t\t\t\tawait repository.save(a);\n\t\t\t\t\t\t\t\t\treturn a.version;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\t\tawait repository.delete(staleB);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"ConcurrencyConflictError\"),\n\t\t\t\t\t\t\t\t`a stale delete must reject with (or wrap) ConcurrencyConflictError; got: ${describeError(rejection)} - an unpredicated DELETE silently destroys the concurrent writer's update`,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// A's write survived - load nullable on purpose: the\n\t\t\t\t\t\t\t// rejected delete must not have destroyed the row.\n\t\t\t\t\t\t\tconst final = await env.run(({ repository }) =>\n\t\t\t\t\t\t\t\trepository.getById(seeded.id),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tfinal !== null,\n\t\t\t\t\t\t\t\t\"the row must still exist after the stale delete was rejected - the predicate must PREVENT the destructive delete, not merely report it\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\t\t\tversionAfterA,\n\t\t\t\t\t\t\t\t\"the surviving row must carry writer A's version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"stale delete conflicts: deleting from a stale instance throws ConcurrencyConflictError\",\n\t\t\t\t\t\"deletesAreVersionChecked\",\n\t\t\t\t),\n\t);\n\n\treturn tests;\n}\n\nfunction assert(condition: boolean, message: string): asserts condition {\n\tif (!condition) {\n\t\tthrow new Error(`Repository contract violated: ${message}`);\n\t}\n}\n\nfunction assertEqual(\n\tactual: unknown,\n\texpected: unknown,\n\tmessage: string,\n): void {\n\tif (actual !== expected) {\n\t\tthrow new Error(\n\t\t\t`Repository contract violated: ${message} (expected ${String(expected)}, got ${String(actual)})`,\n\t\t);\n\t}\n}\n\n/**\n * Walks the standard `cause` chain (cycle-safe, hostile-getter-safe)\n * looking for an Error that matches the given name. Matching is\n * deliberately by NAME, not `instanceof`: the suite ships in its own\n * bundle entry, and the adapter's errors come from the main entry's\n * copy of the kit (or even a second installed kit version) -\n * cross-copy `instanceof` is always false, name identity is the stable\n * contract. The kit's error classes pin their runtime `name` via\n * BaseError's `options.name`, so the match survives consumer-side\n * minification AND subclassing (a `PgConflictError extends\n * ConcurrencyConflictError` inherits the pinned name). For errors from\n * OLDER kit versions (no pinned name), the prototype chain's\n * constructor names are checked as a fallback, so subclasses still\n * match.\n */\nfunction chainContainsErrorNamed(error: unknown, name: string): boolean {\n\tconst seen = new Set<unknown>();\n\tlet current: unknown = error;\n\twhile (current !== null && current !== undefined && !seen.has(current)) {\n\t\tif (typeof current !== \"object\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (errorMatchesName(current, name)) {\n\t\t\treturn true;\n\t\t}\n\t\tseen.add(current);\n\t\ttry {\n\t\t\tcurrent = (current as { cause?: unknown }).cause;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction errorMatchesName(candidate: object, name: string): boolean {\n\ttry {\n\t\tif ((candidate as { name?: unknown }).name === name) {\n\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\t// Hostile `name` getter: treat as non-matching, keep walking.\n\t}\n\t// Fallback for errors from kit versions without a pinned runtime\n\t// name: a subclass instance's own `name` is the subclass name, but\n\t// its prototype chain still carries the base class's constructor.\n\ttry {\n\t\tlet proto: object | null = Object.getPrototypeOf(candidate);\n\t\tfor (let depth = 0; proto !== null && depth < 20; depth++) {\n\t\t\tif (\n\t\t\t\t(proto.constructor as { name?: unknown } | undefined)?.name === name\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tproto = Object.getPrototypeOf(proto);\n\t\t}\n\t} catch {\n\t\t// Hostile `constructor` getter on a prototype: non-matching.\n\t}\n\treturn false;\n}\n\nfunction describeError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\treturn `${error.name}: ${error.message}`;\n\t}\n\treturn String(error);\n}\n"]}
|
package/dist/utils.d.ts
CHANGED
|
@@ -45,11 +45,23 @@ interface DeepOmitOptions {
|
|
|
45
45
|
* provided rules.
|
|
46
46
|
*
|
|
47
47
|
* Walks the object tree and skips keys that match `ignoreKeys` /
|
|
48
|
-
* `ignoreKeyPredicate`. Built-in atomic types
|
|
49
|
-
*
|
|
50
|
-
*
|
|
48
|
+
* `ignoreKeyPredicate`. Built-in atomic types that `deepEqual` compares by
|
|
49
|
+
* value (Date, RegExp, Map, Set, TypedArrays, DataView) are cloned by type
|
|
50
|
+
* rather than walked, since their internal structure has no key filtering to
|
|
51
|
+
* apply. Types that `deepEqual` compares by reference (Error, ArrayBuffer,
|
|
52
|
+
* SharedArrayBuffer, Promise, WeakMap, WeakSet) are passed through by
|
|
53
|
+
* reference, so `deepEqualExcept(x, x)` stays reflexive. Cycles are
|
|
51
54
|
* preserved: a cycle `a → a` clones to `a' → a'`.
|
|
52
55
|
*
|
|
56
|
+
* **Shared references.** Without `ignoreKeyPredicate`, an object reached
|
|
57
|
+
* via several paths dedupes to a single clone. With a predicate, each
|
|
58
|
+
* path gets its own clone, because the predicate may decide differently per
|
|
59
|
+
* path, so memoising the first path's result would be wrong. This is
|
|
60
|
+
* inherently exponential for diamond-shaped sharing (a node reachable
|
|
61
|
+
* via 2^n paths is cloned 2^n times); the walk aborts with a descriptive
|
|
62
|
+
* error after {@link PATH_SENSITIVE_VISIT_BUDGET} node visits instead of
|
|
63
|
+
* hanging the process.
|
|
64
|
+
*
|
|
53
65
|
* **Prototype-pollution safety.** `__proto__` and `constructor` keys
|
|
54
66
|
* encountered as *own* properties of the input (typical of `JSON.parse`
|
|
55
67
|
* output) are copied as inert data properties via `Object.defineProperty`
|
|
@@ -57,7 +69,7 @@ interface DeepOmitOptions {
|
|
|
57
69
|
*
|
|
58
70
|
* **Class instances.** When the input is a class instance, the clone is
|
|
59
71
|
* built via `Object.create(proto)` so the prototype is preserved, but the
|
|
60
|
-
* constructor is NOT re-invoked
|
|
72
|
+
* constructor is NOT re-invoked, so class invariants enforced by the
|
|
61
73
|
* constructor are not re-checked. `deepOmit` is therefore best used for
|
|
62
74
|
* comparison/serialisation (`voEqualsExcept`, `deepEqualExcept`), not as
|
|
63
75
|
* a general-purpose clone for behaviour-carrying objects.
|
package/dist/utils.js
CHANGED
|
@@ -18,10 +18,83 @@ var BUILT_IN_TAGS = /* @__PURE__ */ new Set([
|
|
|
18
18
|
"[object SharedArrayBuffer]",
|
|
19
19
|
"[object DataView]"
|
|
20
20
|
]);
|
|
21
|
+
function intrinsicGetter(proto, prop) {
|
|
22
|
+
const get = Object.getOwnPropertyDescriptor(proto, prop)?.get;
|
|
23
|
+
if (!get) throw new Error(`missing intrinsic getter for ${prop}`);
|
|
24
|
+
return get;
|
|
25
|
+
}
|
|
26
|
+
__name(intrinsicGetter, "intrinsicGetter");
|
|
27
|
+
var dateGetTime = Date.prototype.getTime;
|
|
28
|
+
var mapSizeGet = intrinsicGetter(Map.prototype, "size");
|
|
29
|
+
var setSizeGet = intrinsicGetter(Set.prototype, "size");
|
|
30
|
+
var weakMapHas = WeakMap.prototype.has;
|
|
31
|
+
var weakSetHas = WeakSet.prototype.has;
|
|
32
|
+
var dataViewByteLengthGet = intrinsicGetter(DataView.prototype, "byteLength");
|
|
33
|
+
var arrayBufferByteLengthGet = intrinsicGetter(
|
|
34
|
+
ArrayBuffer.prototype,
|
|
35
|
+
"byteLength"
|
|
36
|
+
);
|
|
37
|
+
var regExpSourceGet = intrinsicGetter(RegExp.prototype, "source");
|
|
38
|
+
var booleanValueOf = Boolean.prototype.valueOf;
|
|
39
|
+
var numberValueOf = Number.prototype.valueOf;
|
|
40
|
+
var stringValueOf = String.prototype.valueOf;
|
|
41
|
+
var PROBE_KEY = {};
|
|
42
|
+
var REFERENCE_COMPARED_TAGS = /* @__PURE__ */ new Set([
|
|
43
|
+
"[object Error]",
|
|
44
|
+
"[object ArrayBuffer]",
|
|
45
|
+
"[object SharedArrayBuffer]",
|
|
46
|
+
"[object Promise]",
|
|
47
|
+
"[object WeakMap]",
|
|
48
|
+
"[object WeakSet]"
|
|
49
|
+
]);
|
|
50
|
+
function hasBrand(obj, tag) {
|
|
51
|
+
try {
|
|
52
|
+
switch (tag) {
|
|
53
|
+
case "[object Date]":
|
|
54
|
+
dateGetTime.call(obj);
|
|
55
|
+
return true;
|
|
56
|
+
case "[object RegExp]":
|
|
57
|
+
regExpSourceGet.call(obj);
|
|
58
|
+
return true;
|
|
59
|
+
case "[object Map]":
|
|
60
|
+
mapSizeGet.call(obj);
|
|
61
|
+
return true;
|
|
62
|
+
case "[object Set]":
|
|
63
|
+
setSizeGet.call(obj);
|
|
64
|
+
return true;
|
|
65
|
+
case "[object WeakMap]":
|
|
66
|
+
weakMapHas.call(obj, PROBE_KEY);
|
|
67
|
+
return true;
|
|
68
|
+
case "[object WeakSet]":
|
|
69
|
+
weakSetHas.call(obj, PROBE_KEY);
|
|
70
|
+
return true;
|
|
71
|
+
case "[object DataView]":
|
|
72
|
+
dataViewByteLengthGet.call(obj);
|
|
73
|
+
return true;
|
|
74
|
+
case "[object ArrayBuffer]":
|
|
75
|
+
arrayBufferByteLengthGet.call(obj);
|
|
76
|
+
return true;
|
|
77
|
+
case "[object Boolean]":
|
|
78
|
+
booleanValueOf.call(obj);
|
|
79
|
+
return true;
|
|
80
|
+
case "[object Number]":
|
|
81
|
+
numberValueOf.call(obj);
|
|
82
|
+
return true;
|
|
83
|
+
case "[object String]":
|
|
84
|
+
stringValueOf.call(obj);
|
|
85
|
+
return true;
|
|
86
|
+
default:
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
} catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
__name(hasBrand, "hasBrand");
|
|
21
94
|
function isBuiltInObject(obj, tag) {
|
|
22
|
-
if (tag.endsWith("Array]")) return true;
|
|
23
95
|
if (ArrayBuffer.isView(obj)) return true;
|
|
24
|
-
|
|
96
|
+
if (tag.endsWith("Array]")) return false;
|
|
97
|
+
return BUILT_IN_TAGS.has(tag) && hasBrand(obj, tag);
|
|
25
98
|
}
|
|
26
99
|
__name(isBuiltInObject, "isBuiltInObject");
|
|
27
100
|
|
|
@@ -29,6 +102,10 @@ __name(isBuiltInObject, "isBuiltInObject");
|
|
|
29
102
|
var objProto = Object.prototype;
|
|
30
103
|
var objToString = objProto.toString;
|
|
31
104
|
var objHasOwn = objProto.hasOwnProperty;
|
|
105
|
+
function sameValueZero(a, b) {
|
|
106
|
+
return a === b || Number.isNaN(a) && Number.isNaN(b);
|
|
107
|
+
}
|
|
108
|
+
__name(sameValueZero, "sameValueZero");
|
|
32
109
|
function deepEqual(a, b) {
|
|
33
110
|
return deepEqualInner(a, b, /* @__PURE__ */ new WeakMap());
|
|
34
111
|
}
|
|
@@ -74,24 +151,31 @@ function deepEqualInner(a, b, visited) {
|
|
|
74
151
|
const len = arrA.length;
|
|
75
152
|
if (len !== arrB.length) return false;
|
|
76
153
|
for (let i = 0; i < len; i++) {
|
|
77
|
-
if (arrA[i]
|
|
154
|
+
if (!sameValueZero(arrA[i], arrB[i])) return false;
|
|
155
|
+
}
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
if (Array.isArray(objA) || Array.isArray(objB)) {
|
|
159
|
+
if (!Array.isArray(objA) || !Array.isArray(objB)) return false;
|
|
160
|
+
const arrA = objA;
|
|
161
|
+
const arrB = objB;
|
|
162
|
+
const len = arrA.length;
|
|
163
|
+
if (len !== arrB.length) return false;
|
|
164
|
+
for (let i = 0; i < len; i++) {
|
|
165
|
+
if (!deepEqualInner(arrA[i], arrB[i], visited)) return false;
|
|
78
166
|
}
|
|
79
167
|
return true;
|
|
80
168
|
}
|
|
81
169
|
const tagA = objToString.call(objA);
|
|
82
170
|
const tagB = objToString.call(objB);
|
|
83
171
|
if (tagA !== tagB) return false;
|
|
172
|
+
const builtInA = isBuiltInObject(objA, tagA);
|
|
173
|
+
const builtInB = isBuiltInObject(objB, tagB);
|
|
174
|
+
if (builtInA !== builtInB) return false;
|
|
175
|
+
if (!builtInA) {
|
|
176
|
+
return comparePlainObjects(objA, objB, visited);
|
|
177
|
+
}
|
|
84
178
|
switch (tagA) {
|
|
85
|
-
case "[object Array]": {
|
|
86
|
-
const arrA = objA;
|
|
87
|
-
const arrB = objB;
|
|
88
|
-
const len = arrA.length;
|
|
89
|
-
if (len !== arrB.length) return false;
|
|
90
|
-
for (let i = 0; i < len; i++) {
|
|
91
|
-
if (!deepEqualInner(arrA[i], arrB[i], visited)) return false;
|
|
92
|
-
}
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
179
|
case "[object Map]": {
|
|
96
180
|
const mapA = objA;
|
|
97
181
|
const mapB = objB;
|
|
@@ -113,9 +197,7 @@ function deepEqualInner(a, b, visited) {
|
|
|
113
197
|
return true;
|
|
114
198
|
}
|
|
115
199
|
case "[object Date]": {
|
|
116
|
-
|
|
117
|
-
const timeB = objB.getTime();
|
|
118
|
-
return timeA === timeB;
|
|
200
|
+
return sameValueZero(objA.getTime(), objB.getTime());
|
|
119
201
|
}
|
|
120
202
|
case "[object RegExp]": {
|
|
121
203
|
const regA = objA;
|
|
@@ -125,69 +207,88 @@ function deepEqualInner(a, b, visited) {
|
|
|
125
207
|
case "[object Boolean]":
|
|
126
208
|
case "[object Number]":
|
|
127
209
|
case "[object String]": {
|
|
128
|
-
return
|
|
210
|
+
return sameValueZero(
|
|
211
|
+
objA.valueOf(),
|
|
212
|
+
objB.valueOf()
|
|
213
|
+
);
|
|
129
214
|
}
|
|
130
215
|
default: {
|
|
131
|
-
|
|
132
|
-
return objA === objB;
|
|
133
|
-
}
|
|
134
|
-
const recA = objA;
|
|
135
|
-
const recB = objB;
|
|
136
|
-
const stringKeysA = Object.keys(objA);
|
|
137
|
-
const stringKeysB = Object.keys(objB);
|
|
138
|
-
if (stringKeysA.length !== stringKeysB.length) return false;
|
|
139
|
-
const symbolKeysA = Object.getOwnPropertySymbols(objA);
|
|
140
|
-
const symbolKeysB = Object.getOwnPropertySymbols(objB);
|
|
141
|
-
if (symbolKeysA.length !== symbolKeysB.length) return false;
|
|
142
|
-
const symbolKeysBSet = new Set(symbolKeysB);
|
|
143
|
-
for (const key of stringKeysA) {
|
|
144
|
-
if (!objHasOwn.call(objB, key)) return false;
|
|
145
|
-
}
|
|
146
|
-
for (const key of symbolKeysA) {
|
|
147
|
-
if (!symbolKeysBSet.has(key)) return false;
|
|
148
|
-
}
|
|
149
|
-
for (const key of stringKeysA) {
|
|
150
|
-
if (!deepEqualInner(recA[key], recB[key], visited)) {
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
for (const key of symbolKeysA) {
|
|
155
|
-
if (!deepEqualInner(recA[key], recB[key], visited)) {
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return true;
|
|
216
|
+
return objA === objB;
|
|
160
217
|
}
|
|
161
218
|
}
|
|
162
219
|
}
|
|
163
220
|
__name(deepEqualInner, "deepEqualInner");
|
|
221
|
+
function comparePlainObjects(objA, objB, visited) {
|
|
222
|
+
const recA = objA;
|
|
223
|
+
const recB = objB;
|
|
224
|
+
const stringKeysA = Object.keys(objA);
|
|
225
|
+
const stringKeysB = Object.keys(objB);
|
|
226
|
+
if (stringKeysA.length !== stringKeysB.length) return false;
|
|
227
|
+
const symbolKeysA = Object.getOwnPropertySymbols(objA);
|
|
228
|
+
const symbolKeysB = Object.getOwnPropertySymbols(objB);
|
|
229
|
+
if (symbolKeysA.length !== symbolKeysB.length) return false;
|
|
230
|
+
const symbolKeysBSet = new Set(symbolKeysB);
|
|
231
|
+
for (const key of stringKeysA) {
|
|
232
|
+
if (!objHasOwn.call(objB, key)) return false;
|
|
233
|
+
}
|
|
234
|
+
for (const key of symbolKeysA) {
|
|
235
|
+
if (!symbolKeysBSet.has(key)) return false;
|
|
236
|
+
}
|
|
237
|
+
for (const key of stringKeysA) {
|
|
238
|
+
if (!deepEqualInner(recA[key], recB[key], visited)) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
for (const key of symbolKeysA) {
|
|
243
|
+
if (!deepEqualInner(recA[key], recB[key], visited)) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
__name(comparePlainObjects, "comparePlainObjects");
|
|
164
250
|
|
|
165
251
|
// src/utils/array/deep-omit.ts
|
|
166
252
|
function deepOmit(value, options) {
|
|
167
253
|
const visited = /* @__PURE__ */ new WeakMap();
|
|
168
254
|
const ignoreKeys = options.ignoreKeys ? new Set(options.ignoreKeys) : void 0;
|
|
169
|
-
|
|
255
|
+
const budget = options.ignoreKeyPredicate ? { visits: 0 } : void 0;
|
|
256
|
+
return omitInternal(value, options, ignoreKeys, [], visited, budget);
|
|
170
257
|
}
|
|
171
258
|
__name(deepOmit, "deepOmit");
|
|
172
|
-
|
|
259
|
+
var PATH_SENSITIVE_VISIT_BUDGET = 1e6;
|
|
260
|
+
function omitInternal(value, options, ignoreKeys, path, visited, budget) {
|
|
173
261
|
if (value === null) return value;
|
|
174
262
|
if (typeof value !== "object") return value;
|
|
175
263
|
const obj = value;
|
|
176
264
|
if (visited.has(obj)) {
|
|
177
265
|
return visited.get(obj);
|
|
178
266
|
}
|
|
179
|
-
|
|
180
|
-
|
|
267
|
+
if (budget && ++budget.visits > PATH_SENSITIVE_VISIT_BUDGET) {
|
|
268
|
+
throw new Error(
|
|
269
|
+
`deepOmit: exceeded ${PATH_SENSITIVE_VISIT_BUDGET} node visits. With ignoreKeyPredicate, objects reached via shared references are cloned once per path (the predicate may decide differently per path), which expands exponentially on diamond-shaped sharing. Restructure the input to a tree, or use ignoreKeys for path-independent filtering.`
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
if (Array.isArray(obj)) {
|
|
181
273
|
const arr = obj;
|
|
182
274
|
const clone2 = new Array(arr.length);
|
|
183
275
|
visited.set(obj, clone2);
|
|
184
276
|
for (let i = 0; i < arr.length; i++) {
|
|
185
277
|
path.push(i);
|
|
186
|
-
clone2[i] = omitInternal(
|
|
278
|
+
clone2[i] = omitInternal(
|
|
279
|
+
arr[i],
|
|
280
|
+
options,
|
|
281
|
+
ignoreKeys,
|
|
282
|
+
path,
|
|
283
|
+
visited,
|
|
284
|
+
budget
|
|
285
|
+
);
|
|
187
286
|
path.pop();
|
|
188
287
|
}
|
|
288
|
+
if (budget) visited.delete(obj);
|
|
189
289
|
return clone2;
|
|
190
290
|
}
|
|
291
|
+
const tag = Object.prototype.toString.call(obj);
|
|
191
292
|
if (isBuiltInObject(obj, tag)) {
|
|
192
293
|
const builtInClone = cloneBuiltIn(obj, tag);
|
|
193
294
|
visited.set(obj, builtInClone);
|
|
@@ -208,7 +309,8 @@ function omitInternal(value, options, ignoreKeys, path, visited) {
|
|
|
208
309
|
options,
|
|
209
310
|
ignoreKeys,
|
|
210
311
|
path,
|
|
211
|
-
visited
|
|
312
|
+
visited,
|
|
313
|
+
budget
|
|
212
314
|
)
|
|
213
315
|
);
|
|
214
316
|
path.pop();
|
|
@@ -224,11 +326,13 @@ function omitInternal(value, options, ignoreKeys, path, visited) {
|
|
|
224
326
|
options,
|
|
225
327
|
ignoreKeys,
|
|
226
328
|
path,
|
|
227
|
-
visited
|
|
329
|
+
visited,
|
|
330
|
+
budget
|
|
228
331
|
)
|
|
229
332
|
);
|
|
230
333
|
path.pop();
|
|
231
334
|
}
|
|
335
|
+
if (budget) visited.delete(obj);
|
|
232
336
|
return clone;
|
|
233
337
|
}
|
|
234
338
|
__name(omitInternal, "omitInternal");
|
|
@@ -242,6 +346,7 @@ function assignOwn(target, key, value) {
|
|
|
242
346
|
}
|
|
243
347
|
__name(assignOwn, "assignOwn");
|
|
244
348
|
function cloneBuiltIn(obj, tag) {
|
|
349
|
+
if (REFERENCE_COMPARED_TAGS.has(tag)) return obj;
|
|
245
350
|
switch (tag) {
|
|
246
351
|
case "[object Date]":
|
|
247
352
|
return new Date(obj.getTime());
|