better-effect 0.11.0 → 0.12.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 +220 -6
- package/dist/adapters/iti.d.mts +2 -1
- package/dist/adapters/iti.d.mts.map +1 -1
- package/dist/adapters/iti.mjs +11 -10
- package/dist/adapters/iti.mjs.map +1 -1
- package/dist/{effect-2ZcGZI8A.mjs → effect-CK4YZaX0.mjs} +56 -10
- package/dist/effect-CK4YZaX0.mjs.map +1 -0
- package/dist/hono.d.mts +3 -3
- package/dist/hono.mjs +3 -3
- package/dist/{index-DStz0JMN.d.mts → index-B1nH4luq.d.mts} +73 -6
- package/dist/index-B1nH4luq.d.mts.map +1 -0
- package/dist/index-BMdU_Z72.d.mts +18 -0
- package/dist/index-BMdU_Z72.d.mts.map +1 -0
- package/dist/{index-C7Qild0_.d.mts → index-CX6iAoCB.d.mts} +15 -151
- package/dist/index-CX6iAoCB.d.mts.map +1 -0
- package/dist/index-GYJ4qm9K.d.mts +179 -0
- package/dist/index-GYJ4qm9K.d.mts.map +1 -0
- package/dist/index-heuaRmXR.d.mts.map +1 -1
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +6 -5
- package/dist/index.mjs.map +1 -1
- package/dist/{internal-identity-DmUpBeeL.mjs → internal-identity-CbXoZIfw.mjs} +3 -3
- package/dist/internal-identity-CbXoZIfw.mjs.map +1 -0
- package/dist/{signal-B97cs85Z.mjs → layer-D56fRdLt.mjs} +30 -111
- package/dist/layer-D56fRdLt.mjs.map +1 -0
- package/dist/node-context-DWsCUBRa.d.mts +12 -0
- package/dist/node-context-DWsCUBRa.d.mts.map +1 -0
- package/dist/node-context-lggRF4bR.mjs +25 -0
- package/dist/node-context-lggRF4bR.mjs.map +1 -0
- package/dist/node.d.mts +51 -0
- package/dist/node.d.mts.map +1 -0
- package/dist/node.mjs +233 -0
- package/dist/node.mjs.map +1 -0
- package/dist/{index-rQhZk3Nt.d.mts → outcome-CB43bnFW.d.mts} +29 -19
- package/dist/outcome-CB43bnFW.d.mts.map +1 -0
- package/dist/{scope-GGnmTQck.mjs → program-metadata-DhQCCirO.mjs} +18 -3
- package/dist/program-metadata-DhQCCirO.mjs.map +1 -0
- package/dist/registration-drnZk0SY.mjs +182 -0
- package/dist/registration-drnZk0SY.mjs.map +1 -0
- package/dist/runtime/node.d.mts +2 -11
- package/dist/runtime/node.mjs +2 -24
- package/dist/{runtime-DnMn0X0X.mjs → runtime-CBMrX8Wl.mjs} +210 -47
- package/dist/runtime-CBMrX8Wl.mjs.map +1 -0
- package/dist/signal-D2UTcaaG.mjs +105 -0
- package/dist/signal-D2UTcaaG.mjs.map +1 -0
- package/dist/{standard-services-BFBq-4lo.mjs → standard-services-GBZ32tll.mjs} +200 -16
- package/dist/standard-services-GBZ32tll.mjs.map +1 -0
- package/dist/standard-services.d.mts +3 -3
- package/dist/standard-services.mjs +3 -3
- package/dist/testing.d.mts +65 -6
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.mjs +191 -8
- package/dist/testing.mjs.map +1 -1
- package/package.json +8 -3
- package/dist/effect-2ZcGZI8A.mjs.map +0 -1
- package/dist/errors-Dnjhzbt0.mjs +0 -99
- package/dist/errors-Dnjhzbt0.mjs.map +0 -1
- package/dist/index-C7Qild0_.d.mts.map +0 -1
- package/dist/index-DStz0JMN.d.mts.map +0 -1
- package/dist/index-rQhZk3Nt.d.mts.map +0 -1
- package/dist/internal-identity-DmUpBeeL.mjs.map +0 -1
- package/dist/runtime/node.d.mts.map +0 -1
- package/dist/runtime/node.mjs.map +0 -1
- package/dist/runtime-DnMn0X0X.mjs.map +0 -1
- package/dist/scope-GGnmTQck.mjs.map +0 -1
- package/dist/signal-B97cs85Z.mjs.map +0 -1
- package/dist/standard-services-BFBq-4lo.mjs.map +0 -1
package/dist/testing.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing/contracts.ts","../src/testing/recorded-runtime-observer.ts","../src/testing/test-runtime.ts"],"sourcesContent":["import {\n DuplicateServiceError,\n Layer,\n ServiceTagCollisionError,\n type LayerBackend,\n type LayerRegistration\n} from '../layer'\nimport {\n RuntimeContextNotConfiguredError,\n RuntimeContextOverlapError,\n type RuntimeContext,\n type RuntimeContextStorage\n} from '../runtime'\nimport { Scope, ScopeCloseError, ScopeClosedError, type CloseableScope } from '../scope'\nimport { ScopeRuntime } from '../scope/runtime'\nimport { isPromiseLike } from '../utils/runtime'\nimport {\n Service,\n ServiceNotFoundError,\n ServiceRuntime,\n type AnyServiceToken,\n type ServiceResolver\n} from '../service'\n\n/** One runner-neutral conformance scenario. */\nexport interface ContractScenario {\n /** Stable human-readable scenario name for test-runner registration. */\n readonly name: string\n\n /** Execute the scenario and reject with a diagnostic when its contract is violated. */\n readonly run: () => Promise<void>\n}\n\n/** Thrown by a conformance scenario when an adapter violates its contract. */\nexport class ConformanceError extends Error {\n constructor(\n readonly scenario: string,\n detail: string,\n cause?: unknown\n ) {\n super(`${scenario}: ${detail}`, { cause })\n\n this.name = 'ConformanceError'\n }\n}\n\n/** Declared behavior for a backend after a provider acquisition fails. */\nexport type LayerBackendAcquisitionFailure = 'retry' | 'sticky'\n\n/** Configuration for the LayerBackend conformance scenarios. */\nexport interface LayerBackendContractOptions {\n /** Create a new, isolated backend for every scenario. */\n readonly makeBackend: () => LayerBackend | PromiseLike<LayerBackend>\n\n /** Declare whether failed acquisitions retry or remain cached until disposal. */\n readonly acquisitionFailure: LayerBackendAcquisitionFailure\n\n /** Run adapter-specific cleanup after every scenario, including failed assertions. */\n readonly cleanup?: (backend: LayerBackend) => void | PromiseLike<void>\n}\n\n/** Supported overlap behavior for RuntimeContextStorage implementations. */\nexport type ContextConcurrency = 'concurrent' | 'sequential'\n\n/** Configuration for the RuntimeContextStorage conformance scenarios. */\nexport interface RuntimeContextStorageContractOptions {\n /** Create a new, isolated storage instance for every scenario. */\n readonly makeStorage: () => RuntimeContextStorage\n\n /** Declare whether one storage instance supports overlapping root contexts. */\n readonly concurrency: ContextConcurrency\n\n /** Recognize the implementation's standard missing-context error. */\n readonly isMissingContextError?: (cause: unknown) => boolean\n\n /** Recognize the implementation's standard unsupported-overlap error. */\n readonly isOverlapError?: (cause: unknown) => boolean\n\n /** Create a storage that should not leak a frame into this storage. */\n readonly makeCompanionStorage?: () => RuntimeContextStorage\n\n /** Run adapter-specific cleanup after every scenario, including failed assertions. */\n readonly cleanup?: (storage: RuntimeContextStorage) => void | PromiseLike<void>\n}\n\nclass ContractService extends Service<ContractService>()(\n '@better-effect/testing/ContractService'\n) {}\n\nclass MissingContractService extends Service<MissingContractService>()(\n '@better-effect/testing/MissingContractService'\n) {}\n\nclass CompatibleRegisteredService extends Service<CompatibleRegisteredService>()(\n '@better-effect/testing/CompatibleService'\n) {\n read(): string {\n return 'registered'\n }\n\n write(): string {\n return 'registered-only'\n }\n}\n\nclass CompatibleRequestedService extends Service<CompatibleRequestedService>()(\n '@better-effect/testing/CompatibleService'\n) {\n read(): string {\n return 'requested'\n }\n}\n\nclass IncompatibleRegisteredService extends Service<IncompatibleRegisteredService>()(\n '@better-effect/testing/IncompatibleService'\n) {\n read(): string {\n return 'registered'\n }\n}\n\nclass IncompatibleRequestedService extends Service<IncompatibleRequestedService>()(\n '@better-effect/testing/IncompatibleService'\n) {\n write(): string {\n return 'requested'\n }\n}\n\nconst layerScenario = (name: string, run: () => Promise<void>): ContractScenario => ({\n name,\n async run(): Promise<void> {\n try {\n await run()\n } catch (cause) {\n if (cause instanceof ConformanceError) {\n throw cause\n }\n\n throw new ConformanceError(name, `unexpected failure (${describeCause(cause)})`, cause)\n }\n }\n})\n\nconst fail = (scenario: string, detail: string): never => {\n throw new ConformanceError(scenario, detail)\n}\n\nconst assert = (condition: boolean, scenario: string, detail: string): void => {\n if (!condition) {\n fail(scenario, detail)\n }\n}\n\nconst describeCause = (cause: unknown): string =>\n cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause)\n\nconst rejected = async <Value>(\n value: Value | PromiseLike<Value>,\n scenario: string,\n expectation: string\n) => {\n const outcome = await Promise.resolve(value).then(\n () => ({ rejected: false as const }),\n (cause) => ({ rejected: true as const, cause })\n )\n\n if (outcome.rejected) {\n return outcome.cause\n }\n\n fail(scenario, `expected ${expectation} to reject`)\n}\n\nconst withBackend = async <Value>(\n options: LayerBackendContractOptions,\n run: (backend: LayerBackend) => Value | PromiseLike<Value>\n): Promise<Awaited<Value>> => {\n const backend = await options.makeBackend()\n\n try {\n return await run(backend)\n } finally {\n try {\n await backend.disposeAll()\n } finally {\n await options.cleanup?.(backend)\n }\n }\n}\n\nconst expectMissingService = (cause: unknown, service: AnyServiceToken, scenario: string): void => {\n assert(\n cause instanceof ServiceNotFoundError,\n scenario,\n `expected ServiceNotFoundError for tag \"${service.serviceTag}\", received ${describeCause(cause)}`\n )\n\n if (cause instanceof ServiceNotFoundError) {\n assert(\n cause.service.serviceTag === service.serviceTag,\n scenario,\n `expected missing tag \"${service.serviceTag}\", received \"${cause.service.serviceTag}\"`\n )\n }\n}\n\nconst expectDuplicate = (cause: unknown, service: AnyServiceToken, scenario: string): void => {\n assert(\n cause instanceof DuplicateServiceError,\n scenario,\n `expected DuplicateServiceError for tag \"${service.serviceTag}\", received ${describeCause(cause)}`\n )\n\n if (cause instanceof DuplicateServiceError) {\n assert(\n cause.service.serviceTag === service.serviceTag,\n scenario,\n `expected duplicate tag \"${service.serviceTag}\", received \"${cause.service.serviceTag}\"`\n )\n }\n}\n\nconst expectCollision = (cause: unknown, service: AnyServiceToken, scenario: string): void => {\n assert(\n cause instanceof ServiceTagCollisionError,\n scenario,\n `expected ServiceTagCollisionError for tag \"${service.serviceTag}\", received ${describeCause(cause)}`\n )\n\n if (cause instanceof ServiceTagCollisionError) {\n assert(\n cause.incoming.serviceTag === service.serviceTag,\n scenario,\n `expected collision tag \"${service.serviceTag}\", received \"${cause.incoming.serviceTag}\"`\n )\n }\n}\n\n/**\n * Return runner-neutral scenarios for a LayerBackend implementation.\n *\n * Every scenario creates a fresh backend and invokes `cleanup` in `finally`,\n * so consumers can register `scenario.run` directly with their test runner.\n */\nexport const layerBackendContract = (\n options: LayerBackendContractOptions\n): readonly ContractScenario[] => [\n layerScenario('LayerBackend registers providers lazily', async () => {\n await withBackend(options, async (backend) => {\n let acquisitions = 0\n\n await backend.register({\n service: ContractService,\n acquire: () => {\n acquisitions++\n return new ContractService()\n }\n })\n\n assert(\n acquisitions === 0,\n 'LayerBackend registers providers lazily',\n `expected no acquisitions during registration for tag \"${ContractService.serviceTag}\", received ${acquisitions}`\n )\n })\n }),\n layerScenario('LayerBackend resolves the registered Service token', async () => {\n await withBackend(options, async (backend) => {\n const instance = new ContractService()\n\n await backend.register({\n service: ContractService,\n acquire: () => instance\n })\n\n const resolved = await backend.resolve(ContractService)\n\n assert(\n resolved === instance && resolved instanceof ContractService,\n 'LayerBackend resolves the registered Service token',\n `expected token \"${ContractService.serviceTag}\" to resolve its registered instance`\n )\n })\n }),\n layerScenario('LayerBackend caches successful acquisitions', async () => {\n await withBackend(options, async (backend) => {\n let acquisitions = 0\n\n await backend.register({\n service: ContractService,\n acquire: () => {\n acquisitions++\n return new ContractService()\n }\n })\n\n const first = await backend.resolve(ContractService)\n const second = await backend.resolve(ContractService)\n\n assert(\n first === second && acquisitions === 1,\n 'LayerBackend caches successful acquisitions',\n `expected one cached acquisition for tag \"${ContractService.serviceTag}\", received ${acquisitions}`\n )\n })\n }),\n layerScenario('LayerBackend deduplicates concurrent acquisitions', async () => {\n await withBackend(options, async (backend) => {\n let acquisitions = 0\n let releaseAcquisition!: () => void\n let markStarted!: () => void\n const acquired = new Promise<void>((resolve) => {\n markStarted = resolve\n })\n const release = new Promise<void>((resolve) => {\n releaseAcquisition = resolve\n })\n const instance = new ContractService()\n\n await backend.register({\n service: ContractService,\n acquire: async () => {\n acquisitions++\n markStarted()\n await release\n return instance\n }\n })\n\n const first = Promise.resolve(backend.resolve(ContractService))\n const second = Promise.resolve(backend.resolve(ContractService))\n\n try {\n await acquired\n assert(\n acquisitions === 1,\n 'LayerBackend deduplicates concurrent acquisitions',\n `expected one in-flight acquisition for tag \"${ContractService.serviceTag}\", received ${acquisitions}`\n )\n\n releaseAcquisition()\n const [firstInstance, secondInstance] = await Promise.all([first, second])\n\n assert(\n firstInstance === instance && secondInstance === instance,\n 'LayerBackend deduplicates concurrent acquisitions',\n `expected concurrent resolves for tag \"${ContractService.serviceTag}\" to share one instance`\n )\n } finally {\n releaseAcquisition()\n await Promise.allSettled([first, second])\n }\n })\n }),\n layerScenario('LayerBackend reports a missing Service tag', async () => {\n await withBackend(options, async (backend) => {\n const cause = await rejected(\n Promise.resolve().then(() => backend.resolve(MissingContractService)),\n 'LayerBackend reports a missing Service tag',\n `resolution for tag \"${MissingContractService.serviceTag}\"`\n )\n\n expectMissingService(\n cause,\n MissingContractService,\n 'LayerBackend reports a missing Service tag'\n )\n })\n }),\n layerScenario('LayerBackend rejects exact duplicate registrations', async () => {\n await withBackend(options, async (backend) => {\n const registration: LayerRegistration = {\n service: ContractService,\n acquire: () => new ContractService()\n }\n\n await backend.register(registration)\n\n const cause = await rejected(\n Promise.resolve().then(() => backend.register(registration)),\n 'LayerBackend rejects exact duplicate registrations',\n `a duplicate registration for tag \"${ContractService.serviceTag}\"`\n )\n\n expectDuplicate(cause, ContractService, 'LayerBackend rejects exact duplicate registrations')\n })\n }),\n layerScenario('LayerBackend rejects incompatible same-tag collisions', async () => {\n await withBackend(options, async (backend) => {\n await backend.register({\n service: IncompatibleRegisteredService,\n acquire: () => new IncompatibleRegisteredService()\n })\n\n const registrationCause = await rejected(\n Promise.resolve().then(() =>\n backend.register({\n service: IncompatibleRequestedService,\n acquire: () => new IncompatibleRequestedService()\n })\n ),\n 'LayerBackend rejects incompatible same-tag collisions',\n `a colliding registration for tag \"${IncompatibleRequestedService.serviceTag}\"`\n )\n\n expectCollision(\n registrationCause,\n IncompatibleRequestedService,\n 'LayerBackend rejects incompatible same-tag collisions'\n )\n\n const resolutionCause = await rejected(\n Promise.resolve().then(() => backend.resolve(IncompatibleRequestedService)),\n 'LayerBackend rejects incompatible same-tag collisions',\n `an incompatible lookup for tag \"${IncompatibleRequestedService.serviceTag}\"`\n )\n\n expectCollision(\n resolutionCause,\n IncompatibleRequestedService,\n 'LayerBackend rejects incompatible same-tag collisions'\n )\n })\n }),\n layerScenario('LayerBackend preserves compatible same-tag registrations', async () => {\n await withBackend(options, async (backend) => {\n const registered = new CompatibleRegisteredService()\n\n await backend.register({\n service: CompatibleRegisteredService,\n acquire: () => registered\n })\n\n const resolved = await backend.resolve(CompatibleRequestedService)\n\n assert(\n resolved === registered && resolved.read() === 'registered',\n 'LayerBackend preserves compatible same-tag registrations',\n `expected compatible tag \"${CompatibleRequestedService.serviceTag}\" to resolve the registered contract`\n )\n })\n }),\n layerScenario('LayerBackend applies declared acquisition-failure behavior', async () => {\n await withBackend(options, async (backend) => {\n const failure = new Error('contract acquisition failure')\n let acquisitions = 0\n\n await backend.register({\n service: ContractService,\n acquire: async () => {\n acquisitions++\n throw failure\n }\n })\n\n const firstCause = await rejected(\n Promise.resolve().then(() => backend.resolve(ContractService)),\n 'LayerBackend applies declared acquisition-failure behavior',\n `the first acquisition for tag \"${ContractService.serviceTag}\"`\n )\n const secondCause = await rejected(\n Promise.resolve().then(() => backend.resolve(ContractService)),\n 'LayerBackend applies declared acquisition-failure behavior',\n `the second acquisition for tag \"${ContractService.serviceTag}\"`\n )\n const expectedAcquisitions = options.acquisitionFailure === 'retry' ? 2 : 1\n\n assert(\n firstCause === failure && secondCause === failure && acquisitions === expectedAcquisitions,\n 'LayerBackend applies declared acquisition-failure behavior',\n `expected ${options.acquisitionFailure} behavior with ${expectedAcquisitions} acquisition attempts for tag \"${ContractService.serviceTag}\", received ${acquisitions}`\n )\n })\n }),\n layerScenario('LayerBackend disposal waits for in-flight acquisition', async () => {\n await withBackend(options, async (backend) => {\n let releaseAcquisition!: () => void\n let releaseCallbackGate!: () => void\n let markStarted!: () => void\n let disposing: Promise<void> | undefined\n let callbackCompleted: Promise<void> | undefined\n let observedPendingAcquisitions: Promise<void> | undefined\n let callbackInvoked = false\n let acquisitionCompleted = false\n let callbackCompletionReactionObserved = false\n let disposalSettled = false\n const acquired = new Promise<void>((resolve) => {\n markStarted = resolve\n })\n const release = new Promise<void>((resolve) => {\n releaseAcquisition = resolve\n })\n const callbackGate = new Promise<void>((resolve) => {\n releaseCallbackGate = resolve\n })\n\n await backend.register({\n service: ContractService,\n acquire: async () => {\n markStarted()\n await release\n acquisitionCompleted = true\n return new ContractService()\n }\n })\n\n const resolving = Promise.resolve(backend.resolve(ContractService))\n\n try {\n await acquired\n const disposalResult = backend.disposeAll({\n onPendingAcquisitions: (acquisitions) => {\n assert(\n acquisitions.length > 0,\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll did not report a pending acquisition for tag \"${ContractService.serviceTag}\"`\n )\n callbackInvoked = true\n observedPendingAcquisitions = Promise.allSettled(acquisitions).then(() => {\n assert(\n acquisitionCompleted,\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll reported an acquisition that settled before tag \"${ContractService.serviceTag}\" completed`\n )\n })\n callbackCompleted = callbackGate.then(() => undefined)\n\n return callbackCompleted\n }\n })\n\n assert(\n disposalResult !== undefined && isPromiseLike(disposalResult),\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll did not await the pending-acquisition callback for tag \"${ContractService.serviceTag}\"`\n )\n disposing = Promise.resolve(disposalResult)\n const disposalReaction = disposing.then(\n () => {\n disposalSettled = true\n },\n () => {\n disposalSettled = true\n }\n )\n\n assert(\n callbackInvoked,\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll did not synchronously invoke the pending-acquisition callback for tag \"${ContractService.serviceTag}\"`\n )\n\n const pendingCallback =\n callbackCompleted ??\n fail(\n 'LayerBackend disposal waits for in-flight acquisition',\n `the pending-acquisition callback for tag \"${ContractService.serviceTag}\" did not return a completion Promise`\n )\n // React to this callback's returned Promise instead of advancing an arbitrary event-loop tick.\n const callbackCompletionBarrier = pendingCallback.then(() => {\n callbackCompletionReactionObserved = true\n })\n\n releaseCallbackGate()\n await callbackCompletionBarrier\n assert(\n callbackCompletionReactionObserved,\n 'LayerBackend disposal waits for in-flight acquisition',\n `the pending-acquisition callback for tag \"${ContractService.serviceTag}\" did not complete`\n )\n assert(\n !acquisitionCompleted,\n 'LayerBackend disposal waits for in-flight acquisition',\n `the pending acquisition for tag \"${ContractService.serviceTag}\" completed before disposal released it`\n )\n assert(\n !disposalSettled,\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll settled after its pending-acquisition callback completed but before tag \"${ContractService.serviceTag}\" completed`\n )\n\n releaseAcquisition()\n if (observedPendingAcquisitions === undefined) {\n fail(\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll did not observe a pending acquisition for tag \"${ContractService.serviceTag}\"`\n )\n }\n\n await Promise.all([resolving, observedPendingAcquisitions, disposing, disposalReaction])\n } finally {\n releaseCallbackGate()\n releaseAcquisition()\n const pending: Promise<unknown>[] = [resolving]\n\n if (observedPendingAcquisitions !== undefined) {\n pending.push(observedPendingAcquisitions)\n }\n\n if (disposing !== undefined) {\n pending.push(disposing)\n }\n\n await Promise.allSettled(pending)\n }\n })\n }),\n layerScenario('LayerBackend disposal clears registrations and supports reuse', async () => {\n await withBackend(options, async (backend) => {\n const first = new ContractService()\n\n await backend.register({\n service: ContractService,\n acquire: () => first\n })\n assert(\n (await backend.resolve(ContractService)) === first,\n 'LayerBackend disposal clears registrations and supports reuse',\n `expected the first registration for tag \"${ContractService.serviceTag}\" to resolve before disposal`\n )\n\n await backend.disposeAll()\n\n const missingCause = await rejected(\n Promise.resolve().then(() => backend.resolve(ContractService)),\n 'LayerBackend disposal clears registrations and supports reuse',\n `resolution after disposing tag \"${ContractService.serviceTag}\"`\n )\n\n expectMissingService(\n missingCause,\n ContractService,\n 'LayerBackend disposal clears registrations and supports reuse'\n )\n\n const second = new ContractService()\n await backend.register({\n service: ContractService,\n acquire: () => second\n })\n\n assert(\n (await backend.resolve(ContractService)) === second,\n 'LayerBackend disposal clears registrations and supports reuse',\n `expected a fresh instance for reused tag \"${ContractService.serviceTag}\" after disposal`\n )\n })\n }),\n layerScenario('LayerBackend repeated disposal is safe', async () => {\n await withBackend(options, async (backend) => {\n await backend.disposeAll()\n await backend.disposeAll()\n })\n }),\n layerScenario('LayerBackend does not execute Layer release callbacks', async () => {\n await withBackend(options, async (backend) => {\n let releases = 0\n const layer = Layer.scoped(\n ContractService,\n () => new ContractService(),\n () => {\n releases++\n }\n )\n const registration =\n layer.providers[0] ??\n fail(\n 'LayerBackend does not execute Layer release callbacks',\n `Layer did not retain the provider for tag \"${ContractService.serviceTag}\"`\n )\n\n await backend.register(registration)\n await backend.resolve(ContractService)\n await backend.disposeAll()\n\n assert(\n releases === 0,\n 'LayerBackend does not execute Layer release callbacks',\n `backend disposal executed ${releases} Layer release callback(s) for tag \"${ContractService.serviceTag}\"`\n )\n })\n })\n]\n\nconst makeResolver = (): ServiceResolver => {\n const services = new Map<AnyServiceToken, unknown>()\n\n return {\n resolve<T extends AnyServiceToken>(token: T): InstanceType<T> {\n const service = services.get(token)\n\n if (service === undefined) {\n throw new Error(`No test Service is registered for \"${token.serviceTag}\"`)\n }\n\n // SAFETY: This test resolver is keyed by the exact Service token used at lookup.\n return service as InstanceType<T>\n }\n }\n}\n\nconst makeContext = (scope: CloseableScope, resolver: ServiceResolver): RuntimeContext => ({\n scope,\n resolver,\n resolutionPath: []\n})\n\nconst withStorage = async <Value>(\n options: RuntimeContextStorageContractOptions,\n run: (storage: RuntimeContextStorage) => Value | PromiseLike<Value>\n): Promise<Awaited<Value>> => {\n const storage = options.makeStorage()\n\n try {\n return await run(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n}\n\nconst expectMissingContext = (\n cause: unknown,\n options: RuntimeContextStorageContractOptions,\n scenario: string\n): void => {\n const isMissing =\n options.isMissingContextError ??\n ((cause: unknown): boolean => cause instanceof RuntimeContextNotConfiguredError)\n\n assert(\n isMissing(cause),\n scenario,\n `expected the declared missing-context error for ${options.concurrency} storage, received ${describeCause(cause)}`\n )\n}\n\nconst expectOverlap = (\n cause: unknown,\n options: RuntimeContextStorageContractOptions,\n scenario: string\n): void => {\n const isOverlap =\n options.isOverlapError ??\n ((cause: unknown): boolean => cause instanceof RuntimeContextOverlapError)\n\n assert(\n isOverlap(cause),\n scenario,\n `expected the declared overlap error for sequential storage, received ${describeCause(cause)}`\n )\n}\n\nconst closeScopes = async (...scopes: readonly CloseableScope[]): Promise<void> => {\n const failures: unknown[] = []\n\n for (const scope of scopes) {\n try {\n await scope.close()\n } catch (cause) {\n failures.push(cause)\n }\n }\n\n if (failures.length === 1) {\n throw failures[0]\n }\n\n if (failures.length > 1) {\n throw new AggregateError(failures, 'Contract Scope cleanup failed')\n }\n}\n\n/**\n * Return runner-neutral scenarios for a RuntimeContextStorage implementation.\n *\n * Every scenario creates a fresh storage and invokes `cleanup` in `finally`,\n * so consumers can register `scenario.run` directly with their test runner.\n */\nexport const runtimeContextStorageContract = (\n options: RuntimeContextStorageContractOptions\n): readonly ContractScenario[] => {\n const scenarios: ContractScenario[] = [\n layerScenario(\n 'RuntimeContextStorage exposes context synchronously and after await',\n async () => {\n await withStorage(options, async (storage) => {\n const scope = Scope.make()\n const context = makeContext(scope, makeResolver())\n\n try {\n await storage.run(context, async () => {\n assert(\n storage.current() === context,\n 'RuntimeContextStorage exposes context synchronously and after await',\n 'current() did not return the context synchronously inside run()'\n )\n await Promise.resolve()\n assert(\n storage.current() === context,\n 'RuntimeContextStorage exposes context synchronously and after await',\n 'current() did not retain the context after Promise suspension'\n )\n })\n } finally {\n await scope.close()\n }\n })\n }\n ),\n layerScenario(\n 'RuntimeContextStorage restores parent context after nested execution',\n async () => {\n await withStorage(options, async (storage) => {\n const rootScope = Scope.make()\n const childScope = rootScope.fork()\n const resolver = makeResolver()\n const root = makeContext(rootScope, resolver)\n\n try {\n await storage.run(root, async () => {\n await ServiceRuntime.run(\n resolver,\n async () => {\n const serviceContext = storage.current()\n\n assert(\n serviceContext !== root && serviceContext.resolver === resolver,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'ServiceRuntime.run did not preserve the parent resolver lineage'\n )\n\n await Scope.provide(childScope, async () => {\n const scopeContext = storage.current()\n\n assert(\n scopeContext.scope === childScope && scopeContext.resolver === resolver,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'Scope.provide did not preserve the parent Service lineage'\n )\n await Promise.resolve()\n assert(\n storage.current() === scopeContext,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'derived Scope context changed after Promise suspension'\n )\n })\n\n assert(\n storage.current() === serviceContext,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'parent Service context was not restored after Scope.provide'\n )\n },\n storage\n )\n\n assert(\n storage.current() === root,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'root context was not restored after ServiceRuntime.run'\n )\n })\n } finally {\n await closeScopes(childScope, rootScope)\n }\n })\n }\n ),\n layerScenario('RuntimeContextStorage restores context after synchronous throw', async () => {\n await withStorage(options, async (storage) => {\n const scope = Scope.make()\n const context = makeContext(scope, makeResolver())\n const failure = new Error('contract synchronous failure')\n\n try {\n const cause = await rejected(\n Promise.resolve().then(() =>\n storage.run(context, () => {\n throw failure\n })\n ),\n 'RuntimeContextStorage restores context after synchronous throw',\n 'the synchronous callback failure'\n )\n\n assert(\n cause === failure,\n 'RuntimeContextStorage restores context after synchronous throw',\n `expected the original synchronous failure, received ${describeCause(cause)}`\n )\n expectMissingContext(\n await rejected(\n Promise.resolve().then(() => storage.current()),\n 'RuntimeContextStorage restores context after synchronous throw',\n 'current() outside run()'\n ),\n options,\n 'RuntimeContextStorage restores context after synchronous throw'\n )\n } finally {\n await scope.close()\n }\n })\n }),\n layerScenario('RuntimeContextStorage restores context after Promise rejection', async () => {\n await withStorage(options, async (storage) => {\n const scope = Scope.make()\n const context = makeContext(scope, makeResolver())\n const failure = new Error('contract async failure')\n\n try {\n const cause = await rejected(\n storage.run(context, async () => {\n await Promise.resolve()\n throw failure\n }),\n 'RuntimeContextStorage restores context after Promise rejection',\n 'the asynchronous callback failure'\n )\n\n assert(\n cause === failure,\n 'RuntimeContextStorage restores context after Promise rejection',\n `expected the original asynchronous failure, received ${describeCause(cause)}`\n )\n expectMissingContext(\n await rejected(\n Promise.resolve().then(() => storage.current()),\n 'RuntimeContextStorage restores context after Promise rejection',\n 'current() outside run()'\n ),\n options,\n 'RuntimeContextStorage restores context after Promise rejection'\n )\n } finally {\n await scope.close()\n }\n })\n }),\n layerScenario('RuntimeContextStorage preserves custom internal failures', async () => {\n await withStorage(options, async (storage) => {\n const failure = new Error('contract storage failure')\n const faultyStorage: RuntimeContextStorage = {\n run: (context, program) => storage.run(context, program),\n current: () => {\n throw failure\n }\n }\n\n const cause = await rejected(\n Promise.resolve().then(() =>\n ServiceRuntime.run(makeResolver(), () => undefined, faultyStorage)\n ),\n 'RuntimeContextStorage preserves custom internal failures',\n 'a custom storage failure'\n )\n\n assert(\n cause === failure,\n 'RuntimeContextStorage preserves custom internal failures',\n `expected the original custom failure, received ${describeCause(cause)}`\n )\n })\n }),\n layerScenario('Scope closes when RuntimeContextStorage.run throws synchronously', async () => {\n await withStorage(options, async (storage) => {\n const parent = Scope.make()\n const child = parent.fork()\n const storageFailure = new Error('contract close storage failure')\n const closeFailure = new Error('contract close finalizer failure')\n const outcome = { status: 'failure' as const, cause: closeFailure }\n const events: string[] = []\n const faultyStorage: RuntimeContextStorage = {\n run: () => {\n throw storageFailure\n },\n current: () => storage.current()\n }\n\n child.addFinalizer((childOutcome) => {\n events.push(`child:${childOutcome.status}`)\n })\n parent.addFinalizer((parentOutcome) => {\n events.push(`first:${parentOutcome.status}`)\n throw closeFailure\n })\n parent.addFinalizer((parentOutcome) => {\n events.push(`second:${parentOutcome.status}`)\n })\n ScopeRuntime.bind(parent, faultyStorage)\n\n const firstClose = parent.close(outcome)\n const secondClose = parent.close()\n\n assert(\n secondClose === firstClose,\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n 'later close did not share the original close Promise'\n )\n\n const cause = await rejected(\n firstClose,\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n 'the storage-safe close'\n )\n\n assert(\n cause instanceof ScopeCloseError &&\n cause.causes.length === 2 &&\n cause.causes[0] === storageFailure &&\n cause.causes[1] === closeFailure,\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n `expected storage then finalizer cleanup failures, received ${describeCause(cause)}`\n )\n assert(\n events.join(',') === 'child:failure,second:failure,first:failure',\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n `expected child-first LIFO finalizers with the original outcome, received ${events.join(',')}`\n )\n\n const closedCause = await rejected(\n Promise.resolve().then(() => parent.addFinalizer(() => undefined)),\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n 'registration after close'\n )\n\n assert(\n closedCause instanceof ScopeClosedError,\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n `Scope remained open after storage failure (${describeCause(closedCause)})`\n )\n })\n })\n ]\n\n if (options.concurrency === 'concurrent') {\n scenarios.push(\n layerScenario('RuntimeContextStorage isolates concurrent roots', async () => {\n await withStorage(options, async (storage) => {\n const firstScope = Scope.make()\n const secondScope = Scope.make()\n const first = makeContext(firstScope, makeResolver())\n const second = makeContext(secondScope, makeResolver())\n let releaseFirst!: () => void\n let releaseSecond!: () => void\n let firstStarted!: () => void\n let secondStarted!: () => void\n const firstMayFinish = new Promise<void>((resolve) => {\n releaseFirst = resolve\n })\n const secondMayFinish = new Promise<void>((resolve) => {\n releaseSecond = resolve\n })\n const firstStartedPromise = new Promise<void>((resolve) => {\n firstStarted = resolve\n })\n const secondStartedPromise = new Promise<void>((resolve) => {\n secondStarted = resolve\n })\n const runs: Promise<RuntimeContext>[] = []\n\n try {\n const firstRun = Promise.resolve(\n storage.run(first, async () => {\n firstStarted()\n await firstMayFinish\n return storage.current()\n })\n )\n runs.push(firstRun)\n const secondRun = Promise.resolve(\n storage.run(second, async () => {\n secondStarted()\n await secondMayFinish\n return storage.current()\n })\n )\n runs.push(secondRun)\n\n await Promise.all([firstStartedPromise, secondStartedPromise])\n releaseFirst()\n releaseSecond()\n const [firstCurrent, secondCurrent] = await Promise.all([firstRun, secondRun])\n\n assert(\n firstCurrent === first && secondCurrent === second,\n 'RuntimeContextStorage isolates concurrent roots',\n 'overlapping roots observed another context frame'\n )\n } finally {\n releaseFirst()\n releaseSecond()\n await Promise.allSettled(runs)\n await closeScopes(firstScope, secondScope)\n }\n })\n }),\n layerScenario('RuntimeContextStorage isolates concurrent derived siblings', async () => {\n await withStorage(options, async (storage) => {\n const rootScope = Scope.make()\n const firstScope = rootScope.fork()\n const secondScope = rootScope.fork()\n const root = makeContext(rootScope, makeResolver())\n let releaseFirst!: () => void\n let releaseSecond!: () => void\n let firstStarted!: () => void\n let secondStarted!: () => void\n const firstMayFinish = new Promise<void>((resolve) => {\n releaseFirst = resolve\n })\n const secondMayFinish = new Promise<void>((resolve) => {\n releaseSecond = resolve\n })\n const firstStartedPromise = new Promise<void>((resolve) => {\n firstStarted = resolve\n })\n const secondStartedPromise = new Promise<void>((resolve) => {\n secondStarted = resolve\n })\n\n const runs: Promise<RuntimeContext>[] = []\n\n try {\n await storage.run(root, async () => {\n try {\n const firstRun = Promise.resolve(\n Scope.provide(firstScope, async () => {\n firstStarted()\n await firstMayFinish\n return storage.current()\n })\n )\n runs.push(firstRun)\n const secondRun = Promise.resolve(\n Scope.provide(secondScope, async () => {\n secondStarted()\n await secondMayFinish\n return storage.current()\n })\n )\n runs.push(secondRun)\n\n await Promise.all([firstStartedPromise, secondStartedPromise])\n releaseFirst()\n releaseSecond()\n const [firstContext, secondContext] = await Promise.all([firstRun, secondRun])\n\n assert(\n firstContext.scope === firstScope && secondContext.scope === secondScope,\n 'RuntimeContextStorage isolates concurrent derived siblings',\n 'overlapping derived siblings observed another Scope context'\n )\n assert(\n storage.current() === root,\n 'RuntimeContextStorage isolates concurrent derived siblings',\n 'root context was not restored after concurrent derived siblings settled'\n )\n } finally {\n releaseFirst()\n releaseSecond()\n await Promise.allSettled(runs)\n }\n })\n } finally {\n releaseFirst()\n releaseSecond()\n await Promise.allSettled(runs)\n await closeScopes(firstScope, secondScope, rootScope)\n }\n })\n })\n )\n } else {\n scenarios.push(\n layerScenario('RuntimeContextStorage rejects overlap and remains reusable', async () => {\n await withStorage(options, async (storage) => {\n const firstScope = Scope.make()\n const secondScope = Scope.make()\n const first = makeContext(firstScope, makeResolver())\n const second = makeContext(secondScope, makeResolver())\n let releaseFirst!: () => void\n let firstStarted!: () => void\n const firstMayFinish = new Promise<void>((resolve) => {\n releaseFirst = resolve\n })\n const firstStartedPromise = new Promise<void>((resolve) => {\n firstStarted = resolve\n })\n const runs: Promise<RuntimeContext>[] = []\n\n try {\n const firstRun = Promise.resolve(\n storage.run(first, async () => {\n firstStarted()\n await firstMayFinish\n return storage.current()\n })\n )\n runs.push(firstRun)\n\n await firstStartedPromise\n const overlapCause = await rejected(\n Promise.resolve().then(() => storage.run(second, () => storage.current())),\n 'RuntimeContextStorage rejects overlap and remains reusable',\n 'an overlapping root run'\n )\n\n expectOverlap(\n overlapCause,\n options,\n 'RuntimeContextStorage rejects overlap and remains reusable'\n )\n\n releaseFirst()\n assert(\n (await firstRun) === first,\n 'RuntimeContextStorage rejects overlap and remains reusable',\n 'the first context did not remain intact after rejected overlap'\n )\n assert(\n storage.run(second, () => storage.current()) === second,\n 'RuntimeContextStorage rejects overlap and remains reusable',\n 'storage was not reusable after rejected overlap'\n )\n } finally {\n releaseFirst()\n await Promise.allSettled(runs)\n await closeScopes(firstScope, secondScope)\n }\n })\n }),\n layerScenario(\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n async () => {\n await withStorage(options, async (storage) => {\n const rootScope = Scope.make()\n const firstScope = rootScope.fork()\n const secondScope = rootScope.fork()\n const root = makeContext(rootScope, makeResolver())\n let releaseFirst!: () => void\n let firstStarted!: () => void\n const firstMayFinish = new Promise<void>((resolve) => {\n releaseFirst = resolve\n })\n const firstStartedPromise = new Promise<void>((resolve) => {\n firstStarted = resolve\n })\n const runs: Promise<RuntimeContext>[] = []\n\n try {\n await storage.run(root, async () => {\n try {\n const firstRun = Promise.resolve(\n Scope.provide(firstScope, async () => {\n firstStarted()\n await firstMayFinish\n return storage.current()\n })\n )\n runs.push(firstRun)\n\n await firstStartedPromise\n let secondRan = false\n const overlapCause = await rejected(\n Promise.resolve().then(() =>\n Scope.provide(secondScope, () => {\n secondRan = true\n return storage.current()\n })\n ),\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'an overlapping derived sibling run'\n )\n\n expectOverlap(\n overlapCause,\n options,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable'\n )\n assert(\n !secondRan,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'the rejected derived sibling callback ran'\n )\n\n releaseFirst()\n const firstContext = await firstRun\n\n assert(\n firstContext.scope === firstScope,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'the first derived sibling context changed after rejected overlap'\n )\n assert(\n storage.current() === root,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'root context was not restored after the first derived sibling settled'\n )\n } finally {\n releaseFirst()\n await Promise.allSettled(runs)\n }\n })\n\n const reusable = makeContext(secondScope, makeResolver())\n assert(\n storage.run(reusable, () => storage.current()) === reusable,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'storage was not reusable after rejected derived sibling overlap'\n )\n } finally {\n releaseFirst()\n await Promise.allSettled(runs)\n await closeScopes(firstScope, secondScope, rootScope)\n }\n })\n }\n )\n )\n }\n\n const makeCompanionStorage = options.makeCompanionStorage\n\n if (makeCompanionStorage) {\n scenarios.push(\n layerScenario('RuntimeContextStorage interoperates without leaking frames', async () => {\n await withStorage(options, async (storage) => {\n const companion = makeCompanionStorage()\n const outerScope = Scope.make()\n const innerScope = Scope.make()\n const outer = makeContext(outerScope, makeResolver())\n const inner = makeContext(innerScope, makeResolver())\n\n try {\n await storage.run(outer, async () => {\n await companion.run(inner, async () => {\n assert(\n companion.current() === inner,\n 'RuntimeContextStorage interoperates without leaking frames',\n 'companion storage did not expose its own context'\n )\n await Promise.resolve()\n assert(\n companion.current() === inner,\n 'RuntimeContextStorage interoperates without leaking frames',\n 'companion storage lost its context after Promise suspension'\n )\n })\n\n assert(\n storage.current() === outer,\n 'RuntimeContextStorage interoperates without leaking frames',\n 'companion storage leaked its frame into the primary storage'\n )\n expectMissingContext(\n await rejected(\n Promise.resolve().then(() => companion.current()),\n 'RuntimeContextStorage interoperates without leaking frames',\n 'companion current() after its run() settled'\n ),\n options,\n 'RuntimeContextStorage interoperates without leaking frames'\n )\n })\n\n expectMissingContext(\n await rejected(\n Promise.resolve().then(() => storage.current()),\n 'RuntimeContextStorage interoperates without leaking frames',\n 'primary current() after its run() settled'\n ),\n options,\n 'RuntimeContextStorage interoperates without leaking frames'\n )\n } finally {\n try {\n await closeScopes(outerScope, innerScope)\n } finally {\n await options.cleanup?.(companion)\n }\n }\n })\n })\n )\n }\n\n return scenarios\n}\n","import type {\n RuntimeExecutionEndEvent,\n RuntimeExecutionStartEvent,\n RuntimeObserver,\n RuntimeResourceReleaseEvent,\n RuntimeServiceAcquireEvent,\n RuntimeServiceResolveEvent\n} from '../runtime/observer'\n\n/** Every event emitted by a Runtime observer hook. */\nexport type RuntimeObserverEvent =\n | RuntimeServiceResolveEvent\n | RuntimeServiceAcquireEvent\n | RuntimeExecutionStartEvent\n | RuntimeExecutionEndEvent\n | RuntimeResourceReleaseEvent\n\n/** Immutable views of events recorded by a {@link RecordedRuntimeObserver}. */\nexport type RecordedRuntimeObserverSnapshot = {\n readonly serviceResolutions: readonly RuntimeServiceResolveEvent[]\n readonly serviceAcquisitions: readonly RuntimeServiceAcquireEvent[]\n readonly executionStarts: readonly RuntimeExecutionStartEvent[]\n readonly executionEnds: readonly RuntimeExecutionEndEvent[]\n readonly resourceReleases: readonly RuntimeResourceReleaseEvent[]\n readonly timeline: readonly RuntimeObserverEvent[]\n}\n\nconst immutableView = <Event>(events: readonly Event[]): readonly Event[] =>\n Object.freeze([...events])\n\n/** Records Runtime lifecycle events for assertions in tests. */\nexport class RecordedRuntimeObserver implements RuntimeObserver {\n private readonly serviceResolutionEvents: RuntimeServiceResolveEvent[] = []\n private readonly serviceAcquisitionEvents: RuntimeServiceAcquireEvent[] = []\n private readonly executionStartEvents: RuntimeExecutionStartEvent[] = []\n private readonly executionEndEvents: RuntimeExecutionEndEvent[] = []\n private readonly resourceReleaseEvents: RuntimeResourceReleaseEvent[] = []\n private readonly timelineEvents: RuntimeObserverEvent[] = []\n\n static make(): RecordedRuntimeObserver {\n return new RecordedRuntimeObserver()\n }\n\n readonly onServiceResolve = (event: RuntimeServiceResolveEvent): void => {\n this.record(this.serviceResolutionEvents, event)\n }\n\n readonly onServiceAcquire = (event: RuntimeServiceAcquireEvent): void => {\n this.record(this.serviceAcquisitionEvents, event)\n }\n\n readonly onExecutionStart = (event: RuntimeExecutionStartEvent): void => {\n this.record(this.executionStartEvents, event)\n }\n\n readonly onExecutionEnd = (event: RuntimeExecutionEndEvent): void => {\n this.record(this.executionEndEvents, event)\n }\n\n readonly onResourceRelease = (event: RuntimeResourceReleaseEvent): void => {\n this.record(this.resourceReleaseEvents, event)\n }\n\n get serviceResolutions(): readonly RuntimeServiceResolveEvent[] {\n return immutableView(this.serviceResolutionEvents)\n }\n\n get serviceAcquisitions(): readonly RuntimeServiceAcquireEvent[] {\n return immutableView(this.serviceAcquisitionEvents)\n }\n\n get executionStarts(): readonly RuntimeExecutionStartEvent[] {\n return immutableView(this.executionStartEvents)\n }\n\n get executionEnds(): readonly RuntimeExecutionEndEvent[] {\n return immutableView(this.executionEndEvents)\n }\n\n get resourceReleases(): readonly RuntimeResourceReleaseEvent[] {\n return immutableView(this.resourceReleaseEvents)\n }\n\n get timeline(): readonly RuntimeObserverEvent[] {\n return immutableView(this.timelineEvents)\n }\n\n clear(): void {\n this.serviceResolutionEvents.length = 0\n this.serviceAcquisitionEvents.length = 0\n this.executionStartEvents.length = 0\n this.executionEndEvents.length = 0\n this.resourceReleaseEvents.length = 0\n this.timelineEvents.length = 0\n }\n\n snapshot(): RecordedRuntimeObserverSnapshot {\n return Object.freeze({\n serviceResolutions: this.serviceResolutions,\n serviceAcquisitions: this.serviceAcquisitions,\n executionStarts: this.executionStarts,\n executionEnds: this.executionEnds,\n resourceReleases: this.resourceReleases,\n timeline: this.timeline\n })\n }\n\n private record<Event extends RuntimeObserverEvent>(events: Event[], event: Event): void {\n events.push(event)\n this.timelineEvents.push(event)\n }\n}\n","import { Layer } from '../layer'\nimport type {\n CompleteExecution,\n CompleteExecutionLayer,\n CompleteInput,\n LayerInput,\n LayerInputState,\n OverrideLayerResult,\n ProvidedEnvironment,\n RequiredEnvironment,\n ValidateLayerInput,\n ValidateOverrides,\n ValidateOverridesWitness\n} from '../layer/inference'\nimport type { LayerBackend } from '../layer/backend'\nimport { LayerDisposeError } from '../layer/errors'\nimport { MapLayerBackend } from '../layer/map-layer-backend'\nimport {\n classifyRuntimeOutcome,\n type RuntimeDisposeOptions,\n type RuntimeOptions,\n type RuntimeRunOptions\n} from '../runtime/outcome'\nimport { Runtime } from '../runtime/runtime'\nimport type { RuntimeObserver } from '../runtime/observer'\nimport type { RuntimeExecutionEndEvent, RuntimeExecutionStartEvent } from '../runtime/observer'\nimport type { ScopeOutcome } from '../scope'\nimport { Clock, ClockTest, Logger, LoggerTest, Random, RandomSeeded } from '../standard-services'\nimport type { MissingDependencies } from '../internal/missing-dependencies'\nimport type { AnyService } from '../service'\nimport { RecordedRuntimeObserver } from './recorded-runtime-observer'\n\ndeclare const TestRuntimeOptionsOverridesTypeId: unique symbol\n\ntype ValidatedTestServiceOption<\n Base extends LayerInput,\n Overrides extends readonly LayerInput[],\n Replacement extends LayerInput,\n Value\n> = Value & ValidateOverridesWitness<Base, readonly [...Overrides, Replacement]>\n\n/** Options for an isolated TestRuntime. */\nexport type TestRuntimeOptions<\n Base extends LayerInput = LayerInput,\n Overrides extends readonly LayerInput[] = readonly []\n> = Omit<RuntimeOptions, 'backend' | 'observers'> & {\n /** Explicitly replace or add providers through `Layer.override`. */\n readonly overrides?: Overrides & ValidateOverrides<Base, Overrides>\n /** Backend used by the underlying Runtime. Defaults to a fresh MapLayerBackend. */\n readonly backend?: LayerBackend\n /** Deterministic Clock provider to install for this TestRuntime. */\n readonly clock?: ValidatedTestServiceOption<Base, Overrides, ClockTestLayer, ClockTest>\n /** In-memory Logger provider to install for this TestRuntime. */\n readonly logger?: ValidatedTestServiceOption<Base, Overrides, LoggerTestLayer, LoggerTest>\n /** Seeded Random provider to install for this TestRuntime. */\n readonly random?: ValidatedTestServiceOption<Base, Overrides, RandomSeededLayer, RandomSeeded>\n /** Additional best-effort observers after the default recorder. */\n readonly observers?: readonly RuntimeObserver[]\n} & {\n readonly [TestRuntimeOptionsOverridesTypeId]?: Overrides\n}\n\ntype ClockTestLayer = ReturnType<typeof ClockTest.layer>\ntype LoggerTestLayer = ReturnType<typeof LoggerTest.layer>\ntype RandomSeededLayer = ReturnType<typeof RandomSeeded.layer>\n\ntype TestRuntimeOptionsInput = Omit<RuntimeOptions, 'backend' | 'observers'> & {\n readonly overrides?: readonly LayerInput[]\n readonly backend?: LayerBackend\n readonly clock?: ClockTest\n readonly logger?: LoggerTest\n readonly random?: RandomSeeded\n readonly observers?: readonly RuntimeObserver[]\n}\n\ntype ExplicitOverrides<Options extends TestRuntimeOptionsInput> =\n typeof TestRuntimeOptionsOverridesTypeId extends keyof Options\n ? Exclude<\n Options[typeof TestRuntimeOptionsOverridesTypeId],\n undefined\n > extends infer Overrides extends readonly LayerInput[]\n ? Overrides\n : readonly []\n : Exclude<Options['overrides'], undefined> extends infer Overrides extends readonly LayerInput[]\n ? Overrides\n : readonly []\n\ntype HasDefinedOption<Options, Key extends PropertyKey> = true extends (\n Options extends unknown\n ? Key extends keyof Options\n ? {} extends Pick<Options, Key>\n ? false\n : undefined extends Options[Key]\n ? false\n : true\n : false\n : never\n)\n ? true\n : false\n\ntype HasPotentialOption<Options, Key extends PropertyKey> = true extends (\n Options extends unknown\n ? Key extends keyof Options\n ? [Exclude<Options[Key], undefined>] extends [never]\n ? false\n : true\n : false\n : never\n)\n ? true\n : false\n\ntype HasGuaranteedOption<Options, Key extends PropertyKey> = [Options] extends [never]\n ? false\n : false extends (Options extends unknown ? HasDefinedOption<Options, Key> : never)\n ? false\n : true\n\ntype TestRuntimeOptionLayers<Options extends TestRuntimeOptionsInput> = [\n ...ExplicitOverrides<Options>,\n ...(HasGuaranteedOption<Options, 'clock'> extends true ? [ClockTestLayer] : []),\n ...(HasGuaranteedOption<Options, 'logger'> extends true ? [LoggerTestLayer] : []),\n ...(HasGuaranteedOption<Options, 'random'> extends true ? [RandomSeededLayer] : [])\n]\n\ntype TestRuntimeValidationLayers<Options extends TestRuntimeOptionsInput> = [\n ...ExplicitOverrides<Options>,\n ...(HasPotentialOption<Options, 'clock'> extends true ? [ClockTestLayer] : []),\n ...(HasPotentialOption<Options, 'logger'> extends true ? [LoggerTestLayer] : []),\n ...(HasPotentialOption<Options, 'random'> extends true ? [RandomSeededLayer] : [])\n]\n\ntype TestRuntimeLayer<\n Base extends LayerInput,\n Options extends TestRuntimeOptionsInput\n> = OverrideLayerResult<Base, TestRuntimeOptionLayers<Options>>\n\ntype TestRuntimeOptionsValidation<\n Base extends LayerInput,\n Options extends TestRuntimeOptionsInput\n> = (Options extends {\n readonly overrides?: infer Overrides extends readonly LayerInput[]\n}\n ? { readonly overrides?: Overrides & ValidateOverrides<Base, Overrides> }\n : unknown) &\n ValidateOverridesWitness<Base, TestRuntimeValidationLayers<Options>>\n\ntype CompleteLayerCheck<L extends LayerInput> = ValidateLayerInput<L> &\n (LayerInputState<L> extends 'typed'\n ? [RequiredEnvironment<L>] extends [never]\n ? unknown\n : MissingDependencies<Extract<RequiredEnvironment<L>, AnyService>>\n : unknown)\n\ntype ConfiguredService<Options, Key extends PropertyKey, Service> = Options extends unknown\n ? Key extends keyof Options\n ? undefined extends Options[Key]\n ? undefined\n : Options[Key] extends Service\n ? Options[Key]\n : undefined\n : undefined\n : never\n\ntype TestCallback<Provided extends AnyService, A, Options extends object = {}> = (\n test: TestRuntime<Provided, Options>\n) => A | PromiseLike<A>\n\n/**\n * Thrown when the TestRuntime recorder contains an execution start or end\n * event without its matching event at final disposal.\n */\nexport class TestRuntimeObserverError extends Error {\n readonly unmatchedStarts: readonly RuntimeExecutionStartEvent[]\n readonly unmatchedEnds: readonly RuntimeExecutionEndEvent[]\n\n constructor(\n unmatchedStarts: readonly RuntimeExecutionStartEvent[],\n unmatchedEnds: readonly RuntimeExecutionEndEvent[]\n ) {\n const startLabel = `${unmatchedStarts.length} start${unmatchedStarts.length === 1 ? '' : 's'}`\n const endLabel = `${unmatchedEnds.length} end${unmatchedEnds.length === 1 ? '' : 's'}`\n\n super(\n `TestRuntime found unmatched execution events: ${startLabel} without an end, ${endLabel} without a start`\n )\n\n this.name = 'TestRuntimeObserverError'\n this.unmatchedStarts = Object.freeze([...unmatchedStarts])\n this.unmatchedEnds = Object.freeze([...unmatchedEnds])\n }\n}\n\n/**\n * A disposable test boundary backed by the real Layer and Runtime\n * implementations.\n */\nexport class TestRuntime<Provided extends AnyService = any, Options extends object = {}> {\n readonly clock: ConfiguredService<Options, 'clock', ClockTest>\n readonly logger: ConfiguredService<Options, 'logger', LoggerTest>\n readonly random: ConfiguredService<Options, 'random', RandomSeeded>\n\n private disposalPromise: Promise<void> | undefined\n\n private constructor(\n /** The real Runtime used by this testing facade. */\n readonly runtime: Runtime<Provided>,\n /** Lifecycle events recorded by this TestRuntime. */\n readonly observer: RecordedRuntimeObserver,\n clock: ClockTest | undefined,\n logger: LoggerTest | undefined,\n random: RandomSeeded | undefined\n ) {\n // SAFETY: The public factory's Options type records which explicit test services were supplied.\n this.clock = clock as ConfiguredService<Options, 'clock', ClockTest>\n // SAFETY: The public factory's Options type records which explicit test services were supplied.\n this.logger = logger as ConfiguredService<Options, 'logger', LoggerTest>\n // SAFETY: The public factory's Options type records which explicit test services were supplied.\n this.random = random as ConfiguredService<Options, 'random', RandomSeeded>\n }\n\n /** Create a TestRuntime with a fresh backend and default lifecycle recorder. */\n static make<L extends LayerInput>(\n layer: L & CompleteLayerCheck<L>\n ): Promise<TestRuntime<ProvidedEnvironment<L>>>\n\n static make<L extends LayerInput, const Options extends TestRuntimeOptionsInput>(\n layer: L & ValidateLayerInput<L> & CompleteLayerCheck<TestRuntimeLayer<L, NoInfer<Options>>>,\n options: Options & TestRuntimeOptionsValidation<L, Options>\n ): Promise<TestRuntime<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, Options>>\n\n static async make<L extends LayerInput, const Options extends TestRuntimeOptionsInput = {}>(\n layer: L,\n options?: Options\n ): Promise<TestRuntime<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, Options>> {\n // SAFETY: The overloads validate the Layer and options; the empty default is used only when no options were supplied.\n const resolvedOptions = options === undefined ? ({} as Options) : options\n\n return TestRuntime.makeInternal(layer, resolvedOptions)\n }\n\n private static async makeInternal<\n L extends LayerInput,\n const Options extends TestRuntimeOptionsInput\n >(\n layer: L,\n options: Options\n ): Promise<TestRuntime<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, Options>> {\n const observer = RecordedRuntimeObserver.make()\n const composedLayer = composeTestLayer(layer, options)\n const runtimeOptions: RuntimeOptions = {\n ...options,\n backend: options.backend ?? new MapLayerBackend(),\n observers: [observer, ...(options.observers ?? [])]\n }\n // SAFETY: Public overloads require the composed Layer to be complete before this internal Runtime call.\n const typedLayer = composedLayer as TestRuntimeLayer<L, Options> &\n CompleteInput<TestRuntimeLayer<L, Options>>\n const runtime = await Runtime.make(typedLayer, runtimeOptions)\n\n return new TestRuntime<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, Options>(\n runtime,\n observer,\n options.clock,\n options.logger,\n options.random\n )\n }\n\n /** Run a fully typechecked program in the underlying Runtime. */\n run<A>(\n program: CompleteExecution<Provided, A>,\n options?: RuntimeRunOptions\n ): Promise<Awaited<A>> {\n return this.runtime.run(program, options)\n }\n\n /** Run a fully typechecked program with an execution-local Layer. */\n runWith<Request extends LayerInput, A>(\n layer: Request & CompleteExecutionLayer<Provided, Request>,\n program: CompleteExecution<Provided | ProvidedEnvironment<Request>, A>,\n options?: RuntimeRunOptions\n ): Promise<Awaited<A>> {\n return this.runtime.runWith(layer, program, options)\n }\n\n /** Dispose the underlying Runtime and perform the final recorder consistency check. */\n dispose(options?: RuntimeDisposeOptions): Promise<void> {\n return this.disposeWithInput(options)\n }\n\n /** Release this TestRuntime through JavaScript's async disposal protocol. */\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose()\n }\n\n private disposeWithOutcome(outcome: ScopeOutcome): Promise<void> {\n return this.disposeWithInput(outcome)\n }\n\n private disposeWithInput(input?: RuntimeDisposeOptions | ScopeOutcome): Promise<void> {\n if (this.disposalPromise !== undefined) {\n return this.disposalPromise\n }\n\n const disposal =\n input === undefined\n ? this.runtime.dispose()\n : isScopeOutcome(input)\n ? this.runtime.dispose(input)\n : this.runtime.dispose(input)\n this.disposalPromise = disposal.then(\n () => this.assertObserverConsistency(),\n (cause) => {\n const observerFailure = this.observerConsistencyFailure()\n\n if (observerFailure === undefined) {\n throw cause\n }\n\n const causes = cause instanceof LayerDisposeError ? cause.causes : [cause]\n throw new LayerDisposeError([...causes, observerFailure])\n }\n )\n\n return this.disposalPromise\n }\n\n private assertObserverConsistency(): void {\n const failure = this.observerConsistencyFailure()\n\n if (failure !== undefined) {\n throw failure\n }\n }\n\n private observerConsistencyFailure(): TestRuntimeObserverError | undefined {\n const unmatched = findUnmatchedExecutionEvents(\n this.observer.executionStarts,\n this.observer.executionEnds\n )\n\n if (unmatched.starts.length === 0 && unmatched.ends.length === 0) {\n return undefined\n }\n\n return new TestRuntimeObserverError(unmatched.starts, unmatched.ends)\n }\n\n /** Run a callback and always dispose this TestRuntime with its final outcome. */\n static use<A, L extends LayerInput>(\n layer: L & CompleteLayerCheck<L>,\n use: TestCallback<ProvidedEnvironment<L>, A>\n ): Promise<Awaited<A>>\n\n static use<A, L extends LayerInput, const Options extends TestRuntimeOptionsInput>(\n layer: L & ValidateLayerInput<L> & CompleteLayerCheck<TestRuntimeLayer<L, NoInfer<Options>>>,\n options: Options & TestRuntimeOptionsValidation<L, Options>,\n use: TestCallback<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, A, Options>\n ): Promise<Awaited<A>>\n\n static async use<A, L extends LayerInput, const Options extends TestRuntimeOptionsInput = {}>(\n layer: L,\n optionsOrUse:\n | Options\n | TestCallback<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, A, Options>,\n maybeUse?: TestCallback<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, A, Options>\n ): Promise<Awaited<A>> {\n let use: TestCallback<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, A, Options> | undefined\n let resolvedOptions: Options\n\n // oxlint-disable-next-line anti-slop/no-runtime-typeof -- overload dispatch distinguishes the callback from the options object.\n if (typeof optionsOrUse === 'function') {\n use = optionsOrUse\n // SAFETY: The public overloads validate the supplied Layer; no options are needed for this branch.\n resolvedOptions = {} as Options\n } else {\n use = maybeUse\n resolvedOptions = optionsOrUse\n }\n\n if (use === undefined) {\n throw new TypeError('TestRuntime.use requires a callback')\n }\n\n const test = await TestRuntime.makeInternal(layer, resolvedOptions)\n let value!: Awaited<A>\n let executionFailed = false\n let executionFailure: unknown\n let outcome: ScopeOutcome\n\n try {\n value = await use(test)\n outcome = classifyRuntimeOutcome(value)\n } catch (cause) {\n executionFailed = true\n executionFailure = cause\n outcome = { status: 'failure', cause }\n }\n\n try {\n await test.disposeWithOutcome(outcome)\n } catch (cleanupFailure) {\n if (!executionFailed && outcome.status === 'success') {\n throw cleanupFailure\n }\n }\n\n if (executionFailed) {\n throw executionFailure\n }\n\n return value\n }\n}\n\nconst isScopeOutcome = (input: RuntimeDisposeOptions | ScopeOutcome): input is ScopeOutcome =>\n 'status' in input\n\nconst composeTestLayer = <Base extends LayerInput, Options extends TestRuntimeOptionsInput>(\n layer: Base,\n options: Options\n): TestRuntimeLayer<Base, Options> => {\n const overrides = [...(options.overrides ?? [])]\n\n if (options.clock !== undefined) {\n overrides.push(Layer.succeed(Clock, options.clock))\n }\n\n if (options.logger !== undefined) {\n overrides.push(Layer.succeed(Logger, options.logger))\n }\n\n if (options.random !== undefined) {\n overrides.push(Layer.succeed(Random, options.random))\n }\n\n // SAFETY: The public overloads validate the Layer and every generated option override.\n const typedLayer = layer as Base & ValidateLayerInput<Base>\n // SAFETY: Runtime branches collect the tuple described by TestRuntimeOptionLayers; the cast only restores that validated tuple for Layer.override.\n const typedOverrides = overrides as TestRuntimeOptionLayers<Options> &\n ValidateOverrides<Base, TestRuntimeOptionLayers<Options>>\n\n return Layer.override<Base, TestRuntimeOptionLayers<Options>>(typedLayer, ...typedOverrides)\n}\n\ntype UnmatchedExecutionEvents = {\n readonly starts: readonly RuntimeExecutionStartEvent[]\n readonly ends: readonly RuntimeExecutionEndEvent[]\n}\n\nconst findUnmatchedExecutionEvents = (\n starts: readonly RuntimeExecutionStartEvent[],\n ends: readonly RuntimeExecutionEndEvent[]\n): UnmatchedExecutionEvents => {\n const endCounts = countExecutionScopes(ends)\n const unmatchedStarts: RuntimeExecutionStartEvent[] = []\n\n for (const event of starts) {\n const count = endCounts.get(event.scope) ?? 0\n\n if (count === 0) {\n unmatchedStarts.push(event)\n } else {\n endCounts.set(event.scope, count - 1)\n }\n }\n\n const startCounts = countExecutionScopes(starts)\n const unmatchedEnds: RuntimeExecutionEndEvent[] = []\n\n for (const event of ends) {\n const count = startCounts.get(event.scope) ?? 0\n\n if (count === 0) {\n unmatchedEnds.push(event)\n } else {\n startCounts.set(event.scope, count - 1)\n }\n }\n\n return { starts: unmatchedStarts, ends: unmatchedEnds }\n}\n\nconst countExecutionScopes = <Event extends { readonly scope: object }>(\n events: readonly Event[]\n): Map<object, number> => {\n const counts = new Map<object, number>()\n\n for (const event of events) {\n counts.set(event.scope, (counts.get(event.scope) ?? 0) + 1)\n }\n\n return counts\n}\n\n/** Type-level aliases for TestRuntime configuration. */\nexport declare namespace TestRuntime {\n /** Options accepted by `TestRuntime.make` and `TestRuntime.use`. */\n export type Options<\n Base extends LayerInput = LayerInput,\n Overrides extends readonly LayerInput[] = readonly []\n > = TestRuntimeOptions<Base, Overrides>\n\n /** Optional signal supplied to one managed TestRuntime execution. */\n export type RunOptions = RuntimeRunOptions\n\n /** Cooperative shutdown policy for a managed TestRuntime. */\n export type DisposeOptions = RuntimeDisposeOptions\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing/contracts.ts","../src/testing/recorded-runtime-observer.ts","../src/testing/runtime-graph-observer.ts","../src/testing/test-runtime.ts"],"sourcesContent":["import {\n DuplicateServiceError,\n Layer,\n ServiceTagCollisionError,\n type LayerBackend,\n type LayerRegistration\n} from '../layer'\nimport {\n RuntimeContextNotConfiguredError,\n RuntimeContextOverlapError,\n type RuntimeContext,\n type RuntimeContextStorage\n} from '../runtime'\nimport { Scope, ScopeCloseError, ScopeClosedError, type CloseableScope } from '../scope'\nimport { ScopeRuntime } from '../scope/runtime'\nimport { isPromiseLike } from '../utils/runtime'\nimport {\n Service,\n ServiceNotFoundError,\n ServiceRuntime,\n type AnyServiceToken,\n type ServiceResolver\n} from '../service'\n\n/** One runner-neutral conformance scenario. */\nexport interface ContractScenario {\n /** Stable human-readable scenario name for test-runner registration. */\n readonly name: string\n\n /** Execute the scenario and reject with a diagnostic when its contract is violated. */\n readonly run: () => Promise<void>\n}\n\n/** Thrown by a conformance scenario when an adapter violates its contract. */\nexport class ConformanceError extends Error {\n constructor(\n readonly scenario: string,\n detail: string,\n cause?: unknown\n ) {\n super(`${scenario}: ${detail}`, { cause })\n\n this.name = 'ConformanceError'\n }\n}\n\n/** Declared behavior for a backend after a provider acquisition fails. */\nexport type LayerBackendAcquisitionFailure = 'retry' | 'sticky'\n\n/** Configuration for the LayerBackend conformance scenarios. */\nexport interface LayerBackendContractOptions {\n /** Create a new, isolated backend for every scenario. */\n readonly makeBackend: () => LayerBackend | PromiseLike<LayerBackend>\n\n /** Declare whether failed acquisitions retry or remain cached until disposal. */\n readonly acquisitionFailure: LayerBackendAcquisitionFailure\n\n /** Run adapter-specific cleanup after every scenario, including failed assertions. */\n readonly cleanup?: (backend: LayerBackend) => void | PromiseLike<void>\n}\n\n/** Supported overlap behavior for RuntimeContextStorage implementations. */\nexport type ContextConcurrency = 'concurrent' | 'sequential'\n\n/** Configuration for the RuntimeContextStorage conformance scenarios. */\nexport interface RuntimeContextStorageContractOptions {\n /** Create a new, isolated storage instance for every scenario. */\n readonly makeStorage: () => RuntimeContextStorage\n\n /** Declare whether one storage instance supports overlapping root contexts. */\n readonly concurrency: ContextConcurrency\n\n /** Recognize the implementation's standard missing-context error. */\n readonly isMissingContextError?: (cause: unknown) => boolean\n\n /** Recognize the implementation's standard unsupported-overlap error. */\n readonly isOverlapError?: (cause: unknown) => boolean\n\n /** Create a storage that should not leak a frame into this storage. */\n readonly makeCompanionStorage?: () => RuntimeContextStorage\n\n /** Run adapter-specific cleanup after every scenario, including failed assertions. */\n readonly cleanup?: (storage: RuntimeContextStorage) => void | PromiseLike<void>\n}\n\nclass ContractService extends Service<ContractService>()(\n '@better-effect/testing/ContractService'\n) {}\n\nclass MissingContractService extends Service<MissingContractService>()(\n '@better-effect/testing/MissingContractService'\n) {}\n\nclass CompatibleRegisteredService extends Service<CompatibleRegisteredService>()(\n '@better-effect/testing/CompatibleService'\n) {\n read(): string {\n return 'registered'\n }\n\n write(): string {\n return 'registered-only'\n }\n}\n\nclass CompatibleRequestedService extends Service<CompatibleRequestedService>()(\n '@better-effect/testing/CompatibleService'\n) {\n read(): string {\n return 'requested'\n }\n}\n\nclass IncompatibleRegisteredService extends Service<IncompatibleRegisteredService>()(\n '@better-effect/testing/IncompatibleService'\n) {\n read(): string {\n return 'registered'\n }\n}\n\nclass IncompatibleRequestedService extends Service<IncompatibleRequestedService>()(\n '@better-effect/testing/IncompatibleService'\n) {\n write(): string {\n return 'requested'\n }\n}\n\nconst layerScenario = (name: string, run: () => Promise<void>): ContractScenario => ({\n name,\n async run(): Promise<void> {\n try {\n await run()\n } catch (cause) {\n if (cause instanceof ConformanceError) {\n throw cause\n }\n\n throw new ConformanceError(name, `unexpected failure (${describeCause(cause)})`, cause)\n }\n }\n})\n\nconst fail = (scenario: string, detail: string): never => {\n throw new ConformanceError(scenario, detail)\n}\n\nconst assert = (condition: boolean, scenario: string, detail: string): void => {\n if (!condition) {\n fail(scenario, detail)\n }\n}\n\nconst describeCause = (cause: unknown): string =>\n cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause)\n\nconst rejected = async <Value>(\n value: Value | PromiseLike<Value>,\n scenario: string,\n expectation: string\n) => {\n const outcome = await Promise.resolve(value).then(\n () => ({ rejected: false as const }),\n (cause) => ({ rejected: true as const, cause })\n )\n\n if (outcome.rejected) {\n return outcome.cause\n }\n\n fail(scenario, `expected ${expectation} to reject`)\n}\n\nconst withBackend = async <Value>(\n options: LayerBackendContractOptions,\n run: (backend: LayerBackend) => Value | PromiseLike<Value>\n): Promise<Awaited<Value>> => {\n const backend = await options.makeBackend()\n\n try {\n return await run(backend)\n } finally {\n try {\n await backend.disposeAll()\n } finally {\n await options.cleanup?.(backend)\n }\n }\n}\n\nconst expectMissingService = (cause: unknown, service: AnyServiceToken, scenario: string): void => {\n assert(\n cause instanceof ServiceNotFoundError,\n scenario,\n `expected ServiceNotFoundError for tag \"${service.serviceTag}\", received ${describeCause(cause)}`\n )\n\n if (cause instanceof ServiceNotFoundError) {\n assert(\n cause.service.serviceTag === service.serviceTag,\n scenario,\n `expected missing tag \"${service.serviceTag}\", received \"${cause.service.serviceTag}\"`\n )\n }\n}\n\nconst expectDuplicate = (cause: unknown, service: AnyServiceToken, scenario: string): void => {\n assert(\n cause instanceof DuplicateServiceError,\n scenario,\n `expected DuplicateServiceError for tag \"${service.serviceTag}\", received ${describeCause(cause)}`\n )\n\n if (cause instanceof DuplicateServiceError) {\n assert(\n cause.service.serviceTag === service.serviceTag,\n scenario,\n `expected duplicate tag \"${service.serviceTag}\", received \"${cause.service.serviceTag}\"`\n )\n }\n}\n\nconst expectCollision = (cause: unknown, service: AnyServiceToken, scenario: string): void => {\n assert(\n cause instanceof ServiceTagCollisionError,\n scenario,\n `expected ServiceTagCollisionError for tag \"${service.serviceTag}\", received ${describeCause(cause)}`\n )\n\n if (cause instanceof ServiceTagCollisionError) {\n assert(\n cause.incoming.serviceTag === service.serviceTag,\n scenario,\n `expected collision tag \"${service.serviceTag}\", received \"${cause.incoming.serviceTag}\"`\n )\n }\n}\n\n/**\n * Return runner-neutral scenarios for a LayerBackend implementation.\n *\n * Every scenario creates a fresh backend and invokes `cleanup` in `finally`,\n * so consumers can register `scenario.run` directly with their test runner.\n */\nexport const layerBackendContract = (\n options: LayerBackendContractOptions\n): readonly ContractScenario[] => [\n layerScenario('LayerBackend registers providers lazily', async () => {\n await withBackend(options, async (backend) => {\n let acquisitions = 0\n\n await backend.register({\n service: ContractService,\n acquire: () => {\n acquisitions++\n return new ContractService()\n }\n })\n\n assert(\n acquisitions === 0,\n 'LayerBackend registers providers lazily',\n `expected no acquisitions during registration for tag \"${ContractService.serviceTag}\", received ${acquisitions}`\n )\n })\n }),\n layerScenario('LayerBackend resolves the registered Service token', async () => {\n await withBackend(options, async (backend) => {\n const instance = new ContractService()\n\n await backend.register({\n service: ContractService,\n acquire: () => instance\n })\n\n const resolved = await backend.resolve(ContractService)\n\n assert(\n resolved === instance && resolved instanceof ContractService,\n 'LayerBackend resolves the registered Service token',\n `expected token \"${ContractService.serviceTag}\" to resolve its registered instance`\n )\n })\n }),\n layerScenario('LayerBackend caches successful acquisitions', async () => {\n await withBackend(options, async (backend) => {\n let acquisitions = 0\n\n await backend.register({\n service: ContractService,\n acquire: () => {\n acquisitions++\n return new ContractService()\n }\n })\n\n const first = await backend.resolve(ContractService)\n const second = await backend.resolve(ContractService)\n\n assert(\n first === second && acquisitions === 1,\n 'LayerBackend caches successful acquisitions',\n `expected one cached acquisition for tag \"${ContractService.serviceTag}\", received ${acquisitions}`\n )\n })\n }),\n layerScenario('LayerBackend deduplicates concurrent acquisitions', async () => {\n await withBackend(options, async (backend) => {\n let acquisitions = 0\n let releaseAcquisition!: () => void\n let markStarted!: () => void\n const acquired = new Promise<void>((resolve) => {\n markStarted = resolve\n })\n const release = new Promise<void>((resolve) => {\n releaseAcquisition = resolve\n })\n const instance = new ContractService()\n\n await backend.register({\n service: ContractService,\n acquire: async () => {\n acquisitions++\n markStarted()\n await release\n return instance\n }\n })\n\n const first = Promise.resolve(backend.resolve(ContractService))\n const second = Promise.resolve(backend.resolve(ContractService))\n\n try {\n await acquired\n assert(\n acquisitions === 1,\n 'LayerBackend deduplicates concurrent acquisitions',\n `expected one in-flight acquisition for tag \"${ContractService.serviceTag}\", received ${acquisitions}`\n )\n\n releaseAcquisition()\n const [firstInstance, secondInstance] = await Promise.all([first, second])\n\n assert(\n firstInstance === instance && secondInstance === instance,\n 'LayerBackend deduplicates concurrent acquisitions',\n `expected concurrent resolves for tag \"${ContractService.serviceTag}\" to share one instance`\n )\n } finally {\n releaseAcquisition()\n await Promise.allSettled([first, second])\n }\n })\n }),\n layerScenario('LayerBackend reports a missing Service tag', async () => {\n await withBackend(options, async (backend) => {\n const cause = await rejected(\n Promise.resolve().then(() => backend.resolve(MissingContractService)),\n 'LayerBackend reports a missing Service tag',\n `resolution for tag \"${MissingContractService.serviceTag}\"`\n )\n\n expectMissingService(\n cause,\n MissingContractService,\n 'LayerBackend reports a missing Service tag'\n )\n })\n }),\n layerScenario('LayerBackend rejects exact duplicate registrations', async () => {\n await withBackend(options, async (backend) => {\n const registration: LayerRegistration = {\n service: ContractService,\n acquire: () => new ContractService()\n }\n\n await backend.register(registration)\n\n const cause = await rejected(\n Promise.resolve().then(() => backend.register(registration)),\n 'LayerBackend rejects exact duplicate registrations',\n `a duplicate registration for tag \"${ContractService.serviceTag}\"`\n )\n\n expectDuplicate(cause, ContractService, 'LayerBackend rejects exact duplicate registrations')\n })\n }),\n layerScenario('LayerBackend rejects incompatible same-tag collisions', async () => {\n await withBackend(options, async (backend) => {\n await backend.register({\n service: IncompatibleRegisteredService,\n acquire: () => new IncompatibleRegisteredService()\n })\n\n const registrationCause = await rejected(\n Promise.resolve().then(() =>\n backend.register({\n service: IncompatibleRequestedService,\n acquire: () => new IncompatibleRequestedService()\n })\n ),\n 'LayerBackend rejects incompatible same-tag collisions',\n `a colliding registration for tag \"${IncompatibleRequestedService.serviceTag}\"`\n )\n\n expectCollision(\n registrationCause,\n IncompatibleRequestedService,\n 'LayerBackend rejects incompatible same-tag collisions'\n )\n\n const resolutionCause = await rejected(\n Promise.resolve().then(() => backend.resolve(IncompatibleRequestedService)),\n 'LayerBackend rejects incompatible same-tag collisions',\n `an incompatible lookup for tag \"${IncompatibleRequestedService.serviceTag}\"`\n )\n\n expectCollision(\n resolutionCause,\n IncompatibleRequestedService,\n 'LayerBackend rejects incompatible same-tag collisions'\n )\n })\n }),\n layerScenario('LayerBackend preserves compatible same-tag registrations', async () => {\n await withBackend(options, async (backend) => {\n const registered = new CompatibleRegisteredService()\n\n await backend.register({\n service: CompatibleRegisteredService,\n acquire: () => registered\n })\n\n const resolved = await backend.resolve(CompatibleRequestedService)\n\n assert(\n resolved === registered && resolved.read() === 'registered',\n 'LayerBackend preserves compatible same-tag registrations',\n `expected compatible tag \"${CompatibleRequestedService.serviceTag}\" to resolve the registered contract`\n )\n })\n }),\n layerScenario('LayerBackend applies declared acquisition-failure behavior', async () => {\n await withBackend(options, async (backend) => {\n const failure = new Error('contract acquisition failure')\n let acquisitions = 0\n\n await backend.register({\n service: ContractService,\n acquire: async () => {\n acquisitions++\n throw failure\n }\n })\n\n const firstCause = await rejected(\n Promise.resolve().then(() => backend.resolve(ContractService)),\n 'LayerBackend applies declared acquisition-failure behavior',\n `the first acquisition for tag \"${ContractService.serviceTag}\"`\n )\n const secondCause = await rejected(\n Promise.resolve().then(() => backend.resolve(ContractService)),\n 'LayerBackend applies declared acquisition-failure behavior',\n `the second acquisition for tag \"${ContractService.serviceTag}\"`\n )\n const expectedAcquisitions = options.acquisitionFailure === 'retry' ? 2 : 1\n\n assert(\n firstCause === failure && secondCause === failure && acquisitions === expectedAcquisitions,\n 'LayerBackend applies declared acquisition-failure behavior',\n `expected ${options.acquisitionFailure} behavior with ${expectedAcquisitions} acquisition attempts for tag \"${ContractService.serviceTag}\", received ${acquisitions}`\n )\n })\n }),\n layerScenario('LayerBackend disposal waits for in-flight acquisition', async () => {\n await withBackend(options, async (backend) => {\n let releaseAcquisition!: () => void\n let releaseCallbackGate!: () => void\n let markStarted!: () => void\n let disposing: Promise<void> | undefined\n let callbackCompleted: Promise<void> | undefined\n let observedPendingAcquisitions: Promise<void> | undefined\n let callbackInvoked = false\n let acquisitionCompleted = false\n let callbackCompletionReactionObserved = false\n let disposalSettled = false\n const acquired = new Promise<void>((resolve) => {\n markStarted = resolve\n })\n const release = new Promise<void>((resolve) => {\n releaseAcquisition = resolve\n })\n const callbackGate = new Promise<void>((resolve) => {\n releaseCallbackGate = resolve\n })\n\n await backend.register({\n service: ContractService,\n acquire: async () => {\n markStarted()\n await release\n acquisitionCompleted = true\n return new ContractService()\n }\n })\n\n const resolving = Promise.resolve(backend.resolve(ContractService))\n\n try {\n await acquired\n const disposalResult = backend.disposeAll({\n onPendingAcquisitions: (acquisitions) => {\n assert(\n acquisitions.length > 0,\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll did not report a pending acquisition for tag \"${ContractService.serviceTag}\"`\n )\n callbackInvoked = true\n observedPendingAcquisitions = Promise.allSettled(acquisitions).then(() => {\n assert(\n acquisitionCompleted,\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll reported an acquisition that settled before tag \"${ContractService.serviceTag}\" completed`\n )\n })\n callbackCompleted = callbackGate.then(() => undefined)\n\n return callbackCompleted\n }\n })\n\n assert(\n disposalResult !== undefined && isPromiseLike(disposalResult),\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll did not await the pending-acquisition callback for tag \"${ContractService.serviceTag}\"`\n )\n disposing = Promise.resolve(disposalResult)\n const disposalReaction = disposing.then(\n () => {\n disposalSettled = true\n },\n () => {\n disposalSettled = true\n }\n )\n\n assert(\n callbackInvoked,\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll did not synchronously invoke the pending-acquisition callback for tag \"${ContractService.serviceTag}\"`\n )\n\n const pendingCallback =\n callbackCompleted ??\n fail(\n 'LayerBackend disposal waits for in-flight acquisition',\n `the pending-acquisition callback for tag \"${ContractService.serviceTag}\" did not return a completion Promise`\n )\n // React to this callback's returned Promise instead of advancing an arbitrary event-loop tick.\n const callbackCompletionBarrier = pendingCallback.then(() => {\n callbackCompletionReactionObserved = true\n })\n\n releaseCallbackGate()\n await callbackCompletionBarrier\n assert(\n callbackCompletionReactionObserved,\n 'LayerBackend disposal waits for in-flight acquisition',\n `the pending-acquisition callback for tag \"${ContractService.serviceTag}\" did not complete`\n )\n assert(\n !acquisitionCompleted,\n 'LayerBackend disposal waits for in-flight acquisition',\n `the pending acquisition for tag \"${ContractService.serviceTag}\" completed before disposal released it`\n )\n assert(\n !disposalSettled,\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll settled after its pending-acquisition callback completed but before tag \"${ContractService.serviceTag}\" completed`\n )\n\n releaseAcquisition()\n if (observedPendingAcquisitions === undefined) {\n fail(\n 'LayerBackend disposal waits for in-flight acquisition',\n `disposeAll did not observe a pending acquisition for tag \"${ContractService.serviceTag}\"`\n )\n }\n\n await Promise.all([resolving, observedPendingAcquisitions, disposing, disposalReaction])\n } finally {\n releaseCallbackGate()\n releaseAcquisition()\n const pending: Promise<unknown>[] = [resolving]\n\n if (observedPendingAcquisitions !== undefined) {\n pending.push(observedPendingAcquisitions)\n }\n\n if (disposing !== undefined) {\n pending.push(disposing)\n }\n\n await Promise.allSettled(pending)\n }\n })\n }),\n layerScenario('LayerBackend disposal clears registrations and supports reuse', async () => {\n await withBackend(options, async (backend) => {\n const first = new ContractService()\n\n await backend.register({\n service: ContractService,\n acquire: () => first\n })\n assert(\n (await backend.resolve(ContractService)) === first,\n 'LayerBackend disposal clears registrations and supports reuse',\n `expected the first registration for tag \"${ContractService.serviceTag}\" to resolve before disposal`\n )\n\n await backend.disposeAll()\n\n const missingCause = await rejected(\n Promise.resolve().then(() => backend.resolve(ContractService)),\n 'LayerBackend disposal clears registrations and supports reuse',\n `resolution after disposing tag \"${ContractService.serviceTag}\"`\n )\n\n expectMissingService(\n missingCause,\n ContractService,\n 'LayerBackend disposal clears registrations and supports reuse'\n )\n\n const second = new ContractService()\n await backend.register({\n service: ContractService,\n acquire: () => second\n })\n\n assert(\n (await backend.resolve(ContractService)) === second,\n 'LayerBackend disposal clears registrations and supports reuse',\n `expected a fresh instance for reused tag \"${ContractService.serviceTag}\" after disposal`\n )\n })\n }),\n layerScenario('LayerBackend repeated disposal is safe', async () => {\n await withBackend(options, async (backend) => {\n await backend.disposeAll()\n await backend.disposeAll()\n })\n }),\n layerScenario('LayerBackend does not execute Layer release callbacks', async () => {\n await withBackend(options, async (backend) => {\n let releases = 0\n const layer = Layer.scoped(\n ContractService,\n () => new ContractService(),\n () => {\n releases++\n }\n )\n const registration =\n layer.providers[0] ??\n fail(\n 'LayerBackend does not execute Layer release callbacks',\n `Layer did not retain the provider for tag \"${ContractService.serviceTag}\"`\n )\n\n await backend.register(registration)\n await backend.resolve(ContractService)\n await backend.disposeAll()\n\n assert(\n releases === 0,\n 'LayerBackend does not execute Layer release callbacks',\n `backend disposal executed ${releases} Layer release callback(s) for tag \"${ContractService.serviceTag}\"`\n )\n })\n })\n]\n\nconst makeResolver = (): ServiceResolver => {\n const services = new Map<AnyServiceToken, unknown>()\n\n return {\n resolve<T extends AnyServiceToken>(token: T): InstanceType<T> {\n const service = services.get(token)\n\n if (service === undefined) {\n throw new Error(`No test Service is registered for \"${token.serviceTag}\"`)\n }\n\n // SAFETY: This test resolver is keyed by the exact Service token used at lookup.\n return service as InstanceType<T>\n }\n }\n}\n\nconst makeContext = (scope: CloseableScope, resolver: ServiceResolver): RuntimeContext => ({\n scope,\n resolver,\n resolutionPath: []\n})\n\nconst withStorage = async <Value>(\n options: RuntimeContextStorageContractOptions,\n run: (storage: RuntimeContextStorage) => Value | PromiseLike<Value>\n): Promise<Awaited<Value>> => {\n const storage = options.makeStorage()\n\n try {\n return await run(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n}\n\nconst expectMissingContext = (\n cause: unknown,\n options: RuntimeContextStorageContractOptions,\n scenario: string\n): void => {\n const isMissing =\n options.isMissingContextError ??\n ((cause: unknown): boolean => cause instanceof RuntimeContextNotConfiguredError)\n\n assert(\n isMissing(cause),\n scenario,\n `expected the declared missing-context error for ${options.concurrency} storage, received ${describeCause(cause)}`\n )\n}\n\nconst expectOverlap = (\n cause: unknown,\n options: RuntimeContextStorageContractOptions,\n scenario: string\n): void => {\n const isOverlap =\n options.isOverlapError ??\n ((cause: unknown): boolean => cause instanceof RuntimeContextOverlapError)\n\n assert(\n isOverlap(cause),\n scenario,\n `expected the declared overlap error for sequential storage, received ${describeCause(cause)}`\n )\n}\n\nconst closeScopes = async (...scopes: readonly CloseableScope[]): Promise<void> => {\n const failures: unknown[] = []\n\n for (const scope of scopes) {\n try {\n await scope.close()\n } catch (cause) {\n failures.push(cause)\n }\n }\n\n if (failures.length === 1) {\n throw failures[0]\n }\n\n if (failures.length > 1) {\n throw new AggregateError(failures, 'Contract Scope cleanup failed')\n }\n}\n\n/**\n * Return runner-neutral scenarios for a RuntimeContextStorage implementation.\n *\n * Every scenario creates a fresh storage and invokes `cleanup` in `finally`,\n * so consumers can register `scenario.run` directly with their test runner.\n */\nexport const runtimeContextStorageContract = (\n options: RuntimeContextStorageContractOptions\n): readonly ContractScenario[] => {\n const scenarios: ContractScenario[] = [\n layerScenario(\n 'RuntimeContextStorage exposes context synchronously and after await',\n async () => {\n await withStorage(options, async (storage) => {\n const scope = Scope.make()\n const context = makeContext(scope, makeResolver())\n\n try {\n await storage.run(context, async () => {\n assert(\n storage.current() === context,\n 'RuntimeContextStorage exposes context synchronously and after await',\n 'current() did not return the context synchronously inside run()'\n )\n await Promise.resolve()\n assert(\n storage.current() === context,\n 'RuntimeContextStorage exposes context synchronously and after await',\n 'current() did not retain the context after Promise suspension'\n )\n })\n } finally {\n await scope.close()\n }\n })\n }\n ),\n layerScenario(\n 'RuntimeContextStorage restores parent context after nested execution',\n async () => {\n await withStorage(options, async (storage) => {\n const rootScope = Scope.make()\n const childScope = rootScope.fork()\n const resolver = makeResolver()\n const root = makeContext(rootScope, resolver)\n\n try {\n await storage.run(root, async () => {\n await ServiceRuntime.run(\n resolver,\n async () => {\n const serviceContext = storage.current()\n\n assert(\n serviceContext !== root && serviceContext.resolver === resolver,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'ServiceRuntime.run did not preserve the parent resolver lineage'\n )\n\n await Scope.provide(childScope, async () => {\n const scopeContext = storage.current()\n\n assert(\n scopeContext.scope === childScope && scopeContext.resolver === resolver,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'Scope.provide did not preserve the parent Service lineage'\n )\n await Promise.resolve()\n assert(\n storage.current() === scopeContext,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'derived Scope context changed after Promise suspension'\n )\n })\n\n assert(\n storage.current() === serviceContext,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'parent Service context was not restored after Scope.provide'\n )\n },\n storage\n )\n\n assert(\n storage.current() === root,\n 'RuntimeContextStorage restores parent context after nested execution',\n 'root context was not restored after ServiceRuntime.run'\n )\n })\n } finally {\n await closeScopes(childScope, rootScope)\n }\n })\n }\n ),\n layerScenario('RuntimeContextStorage restores context after synchronous throw', async () => {\n await withStorage(options, async (storage) => {\n const scope = Scope.make()\n const context = makeContext(scope, makeResolver())\n const failure = new Error('contract synchronous failure')\n\n try {\n const cause = await rejected(\n Promise.resolve().then(() =>\n storage.run(context, () => {\n throw failure\n })\n ),\n 'RuntimeContextStorage restores context after synchronous throw',\n 'the synchronous callback failure'\n )\n\n assert(\n cause === failure,\n 'RuntimeContextStorage restores context after synchronous throw',\n `expected the original synchronous failure, received ${describeCause(cause)}`\n )\n expectMissingContext(\n await rejected(\n Promise.resolve().then(() => storage.current()),\n 'RuntimeContextStorage restores context after synchronous throw',\n 'current() outside run()'\n ),\n options,\n 'RuntimeContextStorage restores context after synchronous throw'\n )\n } finally {\n await scope.close()\n }\n })\n }),\n layerScenario('RuntimeContextStorage restores context after Promise rejection', async () => {\n await withStorage(options, async (storage) => {\n const scope = Scope.make()\n const context = makeContext(scope, makeResolver())\n const failure = new Error('contract async failure')\n\n try {\n const cause = await rejected(\n storage.run(context, async () => {\n await Promise.resolve()\n throw failure\n }),\n 'RuntimeContextStorage restores context after Promise rejection',\n 'the asynchronous callback failure'\n )\n\n assert(\n cause === failure,\n 'RuntimeContextStorage restores context after Promise rejection',\n `expected the original asynchronous failure, received ${describeCause(cause)}`\n )\n expectMissingContext(\n await rejected(\n Promise.resolve().then(() => storage.current()),\n 'RuntimeContextStorage restores context after Promise rejection',\n 'current() outside run()'\n ),\n options,\n 'RuntimeContextStorage restores context after Promise rejection'\n )\n } finally {\n await scope.close()\n }\n })\n }),\n layerScenario('RuntimeContextStorage preserves custom internal failures', async () => {\n await withStorage(options, async (storage) => {\n const failure = new Error('contract storage failure')\n const faultyStorage: RuntimeContextStorage = {\n run: (context, program) => storage.run(context, program),\n current: () => {\n throw failure\n }\n }\n\n const cause = await rejected(\n Promise.resolve().then(() =>\n ServiceRuntime.run(makeResolver(), () => undefined, faultyStorage)\n ),\n 'RuntimeContextStorage preserves custom internal failures',\n 'a custom storage failure'\n )\n\n assert(\n cause === failure,\n 'RuntimeContextStorage preserves custom internal failures',\n `expected the original custom failure, received ${describeCause(cause)}`\n )\n })\n }),\n layerScenario('Scope closes when RuntimeContextStorage.run throws synchronously', async () => {\n await withStorage(options, async (storage) => {\n const parent = Scope.make()\n const child = parent.fork()\n const storageFailure = new Error('contract close storage failure')\n const closeFailure = new Error('contract close finalizer failure')\n const outcome = { status: 'failure' as const, cause: closeFailure }\n const events: string[] = []\n const faultyStorage: RuntimeContextStorage = {\n run: () => {\n throw storageFailure\n },\n current: () => storage.current()\n }\n\n child.addFinalizer((childOutcome) => {\n events.push(`child:${childOutcome.status}`)\n })\n parent.addFinalizer((parentOutcome) => {\n events.push(`first:${parentOutcome.status}`)\n throw closeFailure\n })\n parent.addFinalizer((parentOutcome) => {\n events.push(`second:${parentOutcome.status}`)\n })\n ScopeRuntime.bind(parent, faultyStorage)\n\n const firstClose = parent.close(outcome)\n const secondClose = parent.close()\n\n assert(\n secondClose === firstClose,\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n 'later close did not share the original close Promise'\n )\n\n const cause = await rejected(\n firstClose,\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n 'the storage-safe close'\n )\n\n assert(\n cause instanceof ScopeCloseError &&\n cause.causes.length === 2 &&\n cause.causes[0] === storageFailure &&\n cause.causes[1] === closeFailure,\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n `expected storage then finalizer cleanup failures, received ${describeCause(cause)}`\n )\n assert(\n events.join(',') === 'child:failure,second:failure,first:failure',\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n `expected child-first LIFO finalizers with the original outcome, received ${events.join(',')}`\n )\n\n const closedCause = await rejected(\n Promise.resolve().then(() => parent.addFinalizer(() => undefined)),\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n 'registration after close'\n )\n\n assert(\n closedCause instanceof ScopeClosedError,\n 'Scope closes when RuntimeContextStorage.run throws synchronously',\n `Scope remained open after storage failure (${describeCause(closedCause)})`\n )\n })\n })\n ]\n\n if (options.concurrency === 'concurrent') {\n scenarios.push(\n layerScenario('RuntimeContextStorage isolates concurrent roots', async () => {\n await withStorage(options, async (storage) => {\n const firstScope = Scope.make()\n const secondScope = Scope.make()\n const first = makeContext(firstScope, makeResolver())\n const second = makeContext(secondScope, makeResolver())\n let releaseFirst!: () => void\n let releaseSecond!: () => void\n let firstStarted!: () => void\n let secondStarted!: () => void\n const firstMayFinish = new Promise<void>((resolve) => {\n releaseFirst = resolve\n })\n const secondMayFinish = new Promise<void>((resolve) => {\n releaseSecond = resolve\n })\n const firstStartedPromise = new Promise<void>((resolve) => {\n firstStarted = resolve\n })\n const secondStartedPromise = new Promise<void>((resolve) => {\n secondStarted = resolve\n })\n const runs: Promise<RuntimeContext>[] = []\n\n try {\n const firstRun = Promise.resolve(\n storage.run(first, async () => {\n firstStarted()\n await firstMayFinish\n return storage.current()\n })\n )\n runs.push(firstRun)\n const secondRun = Promise.resolve(\n storage.run(second, async () => {\n secondStarted()\n await secondMayFinish\n return storage.current()\n })\n )\n runs.push(secondRun)\n\n await Promise.all([firstStartedPromise, secondStartedPromise])\n releaseFirst()\n releaseSecond()\n const [firstCurrent, secondCurrent] = await Promise.all([firstRun, secondRun])\n\n assert(\n firstCurrent === first && secondCurrent === second,\n 'RuntimeContextStorage isolates concurrent roots',\n 'overlapping roots observed another context frame'\n )\n } finally {\n releaseFirst()\n releaseSecond()\n await Promise.allSettled(runs)\n await closeScopes(firstScope, secondScope)\n }\n })\n }),\n layerScenario('RuntimeContextStorage isolates concurrent derived siblings', async () => {\n await withStorage(options, async (storage) => {\n const rootScope = Scope.make()\n const firstScope = rootScope.fork()\n const secondScope = rootScope.fork()\n const root = makeContext(rootScope, makeResolver())\n let releaseFirst!: () => void\n let releaseSecond!: () => void\n let firstStarted!: () => void\n let secondStarted!: () => void\n const firstMayFinish = new Promise<void>((resolve) => {\n releaseFirst = resolve\n })\n const secondMayFinish = new Promise<void>((resolve) => {\n releaseSecond = resolve\n })\n const firstStartedPromise = new Promise<void>((resolve) => {\n firstStarted = resolve\n })\n const secondStartedPromise = new Promise<void>((resolve) => {\n secondStarted = resolve\n })\n\n const runs: Promise<RuntimeContext>[] = []\n\n try {\n await storage.run(root, async () => {\n try {\n const firstRun = Promise.resolve(\n Scope.provide(firstScope, async () => {\n firstStarted()\n await firstMayFinish\n return storage.current()\n })\n )\n runs.push(firstRun)\n const secondRun = Promise.resolve(\n Scope.provide(secondScope, async () => {\n secondStarted()\n await secondMayFinish\n return storage.current()\n })\n )\n runs.push(secondRun)\n\n await Promise.all([firstStartedPromise, secondStartedPromise])\n releaseFirst()\n releaseSecond()\n const [firstContext, secondContext] = await Promise.all([firstRun, secondRun])\n\n assert(\n firstContext.scope === firstScope && secondContext.scope === secondScope,\n 'RuntimeContextStorage isolates concurrent derived siblings',\n 'overlapping derived siblings observed another Scope context'\n )\n assert(\n storage.current() === root,\n 'RuntimeContextStorage isolates concurrent derived siblings',\n 'root context was not restored after concurrent derived siblings settled'\n )\n } finally {\n releaseFirst()\n releaseSecond()\n await Promise.allSettled(runs)\n }\n })\n } finally {\n releaseFirst()\n releaseSecond()\n await Promise.allSettled(runs)\n await closeScopes(firstScope, secondScope, rootScope)\n }\n })\n })\n )\n } else {\n scenarios.push(\n layerScenario('RuntimeContextStorage rejects overlap and remains reusable', async () => {\n await withStorage(options, async (storage) => {\n const firstScope = Scope.make()\n const secondScope = Scope.make()\n const first = makeContext(firstScope, makeResolver())\n const second = makeContext(secondScope, makeResolver())\n let releaseFirst!: () => void\n let firstStarted!: () => void\n const firstMayFinish = new Promise<void>((resolve) => {\n releaseFirst = resolve\n })\n const firstStartedPromise = new Promise<void>((resolve) => {\n firstStarted = resolve\n })\n const runs: Promise<RuntimeContext>[] = []\n\n try {\n const firstRun = Promise.resolve(\n storage.run(first, async () => {\n firstStarted()\n await firstMayFinish\n return storage.current()\n })\n )\n runs.push(firstRun)\n\n await firstStartedPromise\n const overlapCause = await rejected(\n Promise.resolve().then(() => storage.run(second, () => storage.current())),\n 'RuntimeContextStorage rejects overlap and remains reusable',\n 'an overlapping root run'\n )\n\n expectOverlap(\n overlapCause,\n options,\n 'RuntimeContextStorage rejects overlap and remains reusable'\n )\n\n releaseFirst()\n assert(\n (await firstRun) === first,\n 'RuntimeContextStorage rejects overlap and remains reusable',\n 'the first context did not remain intact after rejected overlap'\n )\n assert(\n storage.run(second, () => storage.current()) === second,\n 'RuntimeContextStorage rejects overlap and remains reusable',\n 'storage was not reusable after rejected overlap'\n )\n } finally {\n releaseFirst()\n await Promise.allSettled(runs)\n await closeScopes(firstScope, secondScope)\n }\n })\n }),\n layerScenario(\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n async () => {\n await withStorage(options, async (storage) => {\n const rootScope = Scope.make()\n const firstScope = rootScope.fork()\n const secondScope = rootScope.fork()\n const root = makeContext(rootScope, makeResolver())\n let releaseFirst!: () => void\n let firstStarted!: () => void\n const firstMayFinish = new Promise<void>((resolve) => {\n releaseFirst = resolve\n })\n const firstStartedPromise = new Promise<void>((resolve) => {\n firstStarted = resolve\n })\n const runs: Promise<RuntimeContext>[] = []\n\n try {\n await storage.run(root, async () => {\n try {\n const firstRun = Promise.resolve(\n Scope.provide(firstScope, async () => {\n firstStarted()\n await firstMayFinish\n return storage.current()\n })\n )\n runs.push(firstRun)\n\n await firstStartedPromise\n let secondRan = false\n const overlapCause = await rejected(\n Promise.resolve().then(() =>\n Scope.provide(secondScope, () => {\n secondRan = true\n return storage.current()\n })\n ),\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'an overlapping derived sibling run'\n )\n\n expectOverlap(\n overlapCause,\n options,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable'\n )\n assert(\n !secondRan,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'the rejected derived sibling callback ran'\n )\n\n releaseFirst()\n const firstContext = await firstRun\n\n assert(\n firstContext.scope === firstScope,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'the first derived sibling context changed after rejected overlap'\n )\n assert(\n storage.current() === root,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'root context was not restored after the first derived sibling settled'\n )\n } finally {\n releaseFirst()\n await Promise.allSettled(runs)\n }\n })\n\n const reusable = makeContext(secondScope, makeResolver())\n assert(\n storage.run(reusable, () => storage.current()) === reusable,\n 'RuntimeContextStorage rejects overlapping derived siblings and remains reusable',\n 'storage was not reusable after rejected derived sibling overlap'\n )\n } finally {\n releaseFirst()\n await Promise.allSettled(runs)\n await closeScopes(firstScope, secondScope, rootScope)\n }\n })\n }\n )\n )\n }\n\n const makeCompanionStorage = options.makeCompanionStorage\n\n if (makeCompanionStorage) {\n scenarios.push(\n layerScenario('RuntimeContextStorage interoperates without leaking frames', async () => {\n await withStorage(options, async (storage) => {\n const companion = makeCompanionStorage()\n const outerScope = Scope.make()\n const innerScope = Scope.make()\n const outer = makeContext(outerScope, makeResolver())\n const inner = makeContext(innerScope, makeResolver())\n\n try {\n await storage.run(outer, async () => {\n await companion.run(inner, async () => {\n assert(\n companion.current() === inner,\n 'RuntimeContextStorage interoperates without leaking frames',\n 'companion storage did not expose its own context'\n )\n await Promise.resolve()\n assert(\n companion.current() === inner,\n 'RuntimeContextStorage interoperates without leaking frames',\n 'companion storage lost its context after Promise suspension'\n )\n })\n\n assert(\n storage.current() === outer,\n 'RuntimeContextStorage interoperates without leaking frames',\n 'companion storage leaked its frame into the primary storage'\n )\n expectMissingContext(\n await rejected(\n Promise.resolve().then(() => companion.current()),\n 'RuntimeContextStorage interoperates without leaking frames',\n 'companion current() after its run() settled'\n ),\n options,\n 'RuntimeContextStorage interoperates without leaking frames'\n )\n })\n\n expectMissingContext(\n await rejected(\n Promise.resolve().then(() => storage.current()),\n 'RuntimeContextStorage interoperates without leaking frames',\n 'primary current() after its run() settled'\n ),\n options,\n 'RuntimeContextStorage interoperates without leaking frames'\n )\n } finally {\n try {\n await closeScopes(outerScope, innerScope)\n } finally {\n await options.cleanup?.(companion)\n }\n }\n })\n })\n )\n }\n\n return scenarios\n}\n","import type {\n RuntimeExecutionEndEvent,\n RuntimeExecutionStartEvent,\n RuntimeObserver,\n RuntimeResourceReleaseEvent,\n RuntimeServiceAcquireEvent,\n RuntimeServiceResolveEvent\n} from '../runtime/observer'\n\n/** Every event emitted by a Runtime observer hook. */\nexport type RuntimeObserverEvent =\n | RuntimeServiceResolveEvent\n | RuntimeServiceAcquireEvent\n | RuntimeExecutionStartEvent\n | RuntimeExecutionEndEvent\n | RuntimeResourceReleaseEvent\n\n/** Immutable views of events recorded by a {@link RecordedRuntimeObserver}. */\nexport type RecordedRuntimeObserverSnapshot = {\n readonly serviceResolutions: readonly RuntimeServiceResolveEvent[]\n readonly serviceAcquisitions: readonly RuntimeServiceAcquireEvent[]\n readonly executionStarts: readonly RuntimeExecutionStartEvent[]\n readonly executionEnds: readonly RuntimeExecutionEndEvent[]\n readonly resourceReleases: readonly RuntimeResourceReleaseEvent[]\n readonly timeline: readonly RuntimeObserverEvent[]\n}\n\nconst immutableView = <Event>(events: readonly Event[]): readonly Event[] =>\n Object.freeze([...events])\n\n/** Records Runtime lifecycle events for assertions in tests. */\nexport class RecordedRuntimeObserver implements RuntimeObserver {\n private readonly serviceResolutionEvents: RuntimeServiceResolveEvent[] = []\n private readonly serviceAcquisitionEvents: RuntimeServiceAcquireEvent[] = []\n private readonly executionStartEvents: RuntimeExecutionStartEvent[] = []\n private readonly executionEndEvents: RuntimeExecutionEndEvent[] = []\n private readonly resourceReleaseEvents: RuntimeResourceReleaseEvent[] = []\n private readonly timelineEvents: RuntimeObserverEvent[] = []\n\n static make(): RecordedRuntimeObserver {\n return new RecordedRuntimeObserver()\n }\n\n readonly onServiceResolve = (event: RuntimeServiceResolveEvent): void => {\n this.record(this.serviceResolutionEvents, event)\n }\n\n readonly onServiceAcquire = (event: RuntimeServiceAcquireEvent): void => {\n this.record(this.serviceAcquisitionEvents, event)\n }\n\n readonly onExecutionStart = (event: RuntimeExecutionStartEvent): void => {\n this.record(this.executionStartEvents, event)\n }\n\n readonly onExecutionEnd = (event: RuntimeExecutionEndEvent): void => {\n this.record(this.executionEndEvents, event)\n }\n\n readonly onResourceRelease = (event: RuntimeResourceReleaseEvent): void => {\n this.record(this.resourceReleaseEvents, event)\n }\n\n get serviceResolutions(): readonly RuntimeServiceResolveEvent[] {\n return immutableView(this.serviceResolutionEvents)\n }\n\n get serviceAcquisitions(): readonly RuntimeServiceAcquireEvent[] {\n return immutableView(this.serviceAcquisitionEvents)\n }\n\n get executionStarts(): readonly RuntimeExecutionStartEvent[] {\n return immutableView(this.executionStartEvents)\n }\n\n get executionEnds(): readonly RuntimeExecutionEndEvent[] {\n return immutableView(this.executionEndEvents)\n }\n\n get resourceReleases(): readonly RuntimeResourceReleaseEvent[] {\n return immutableView(this.resourceReleaseEvents)\n }\n\n get timeline(): readonly RuntimeObserverEvent[] {\n return immutableView(this.timelineEvents)\n }\n\n clear(): void {\n this.serviceResolutionEvents.length = 0\n this.serviceAcquisitionEvents.length = 0\n this.executionStartEvents.length = 0\n this.executionEndEvents.length = 0\n this.resourceReleaseEvents.length = 0\n this.timelineEvents.length = 0\n }\n\n snapshot(): RecordedRuntimeObserverSnapshot {\n return Object.freeze({\n serviceResolutions: this.serviceResolutions,\n serviceAcquisitions: this.serviceAcquisitions,\n executionStarts: this.executionStarts,\n executionEnds: this.executionEnds,\n resourceReleases: this.resourceReleases,\n timeline: this.timeline\n })\n }\n\n private record<Event extends RuntimeObserverEvent>(events: Event[], event: Event): void {\n events.push(event)\n this.timelineEvents.push(event)\n }\n}\n","import type {\n RuntimeObserver,\n RuntimeServiceAcquireEvent,\n RuntimeServiceResolveEvent\n} from '../runtime/observer'\nimport type { AnyServiceToken } from '../service'\n\n/** One logical Service node in a Runtime graph snapshot. */\nexport type RuntimeGraphNode = {\n readonly tag: string\n readonly resolutions: number\n readonly acquisitions: number\n readonly failures: number\n}\n\n/** One observed parent-to-child Service edge in a Runtime graph snapshot. */\nexport type RuntimeGraphEdge = {\n readonly from: string\n readonly to: string\n readonly resolutions: number\n}\n\n/** Detached, sorted and immutable Runtime graph data. */\nexport type RuntimeGraphSnapshot = {\n readonly nodes: readonly RuntimeGraphNode[]\n readonly edges: readonly RuntimeGraphEdge[]\n}\n\n/** Options for a diagnostic Runtime graph observer. */\nexport type RuntimeGraphObserverOptions = {\n /** Count failed resolution and acquisition events in each node's failures field. */\n readonly includeFailures?: boolean\n /** Add this label as a synthetic root in Mermaid output for top-level resolutions. */\n readonly rootLabel?: string\n}\n\ntype MutableGraphNode = {\n resolutions: number\n acquisitions: number\n failures: number\n}\n\ntype MutableGraphEdge = {\n from: string\n to: string\n resolutions: number\n}\n\nconst compareStrings = (left: string, right: string): number =>\n left < right ? -1 : left > right ? 1 : 0\n\nconst compareEdges = (left: RuntimeGraphEdge, right: RuntimeGraphEdge): number =>\n compareStrings(left.from, right.from) || compareStrings(left.to, right.to)\n\nconst freezeNode = (node: RuntimeGraphNode): RuntimeGraphNode => Object.freeze({ ...node })\n\nconst freezeEdge = (edge: RuntimeGraphEdge): RuntimeGraphEdge => Object.freeze({ ...edge })\n\nconst serviceTags = (path: readonly AnyServiceToken[], targetTag: string): string[] => {\n const tags = path.map((service) => service.serviceTag)\n\n if (tags[tags.length - 1] !== targetTag) {\n tags.push(targetTag)\n }\n\n return tags\n}\n\nconst mermaidLabelPunctuation = new Set([\n '&',\n '\"',\n \"'\",\n '\\\\',\n '[',\n ']',\n '(',\n ')',\n '{',\n '}',\n '|',\n '#',\n ';',\n // Mermaid rewrites fa:fa-* label text into icon elements after decoding entities.\n ':',\n '<',\n '>',\n '=',\n '`',\n '*',\n '_',\n '~',\n '!',\n '^',\n '$'\n])\n\nconst isMermaidLabelControl = (character: string, codePoint: number): boolean =>\n codePoint <= 0x1f ||\n (codePoint >= 0x7f && codePoint <= 0x9f) ||\n (codePoint >= 0xd800 && codePoint <= 0xdfff) ||\n (/\\s/u.test(character) && character !== ' ') ||\n /\\p{Cf}/u.test(character)\n\n/**\n * Escape Mermaid syntax while keeping the decoded label readable.\n *\n * Mermaid's documented `#number;` form is a syntax-level escape. Encoding the\n * entity introducers themselves prevents label text from creating a second\n * entity, while encoding Markdown and HTML punctuation keeps it out of the\n * renderer's interpretation paths.\n */\nconst escapeMermaidLabel = (label: string): string => {\n let escaped = ''\n\n for (const character of label) {\n const codePoint = character.codePointAt(0)\n\n if (codePoint === undefined) {\n continue\n }\n\n if (isMermaidLabelControl(character, codePoint) || mermaidLabelPunctuation.has(character)) {\n escaped += `#${codePoint};`\n } else {\n escaped += character\n }\n }\n\n return escaped\n}\n\n/** Encode a string as a Mermaid-safe, injective and registration-order-independent ID. */\nconst mermaidId = (prefix: string, value: string): string => {\n const codeUnits: string[] = []\n\n for (let index = 0; index < value.length; index += 1) {\n codeUnits.push(value.charCodeAt(index).toString(16).padStart(4, '0'))\n }\n\n return `${prefix}${codeUnits.join('_') || 'empty'}`\n}\n\n/**\n * Observe the public Runtime resolution and acquisition events as a diagnostic graph.\n *\n * The graph is deliberately an observation of paths emitted by Runtime. It does\n * not inspect Layer provenance, retain Service instances, or plan dependencies.\n */\nexport class RuntimeGraphObserver implements RuntimeObserver {\n private readonly nodes = new Map<string, MutableGraphNode>()\n private readonly edges = new Map<string, Map<string, MutableGraphEdge>>()\n private readonly rootEdges = new Map<string, number>()\n\n private constructor(\n private readonly includeFailures: boolean,\n private readonly rootLabel: string | undefined\n ) {}\n\n /** Create an empty Runtime graph observer. */\n static make(options: RuntimeGraphObserverOptions = {}): RuntimeGraphObserver {\n // oxlint-disable-next-line anti-slop/no-runtime-typeof -- validate JavaScript callers at the public factory boundary.\n if (typeof options !== 'object' || options === null) {\n throw new TypeError('RuntimeGraphObserver options must be an object')\n }\n\n // oxlint-disable-next-line anti-slop/no-runtime-typeof -- validate JavaScript callers at the public factory boundary.\n if (options.includeFailures !== undefined && typeof options.includeFailures !== 'boolean') {\n throw new TypeError('RuntimeGraphObserver includeFailures must be a boolean')\n }\n\n // oxlint-disable-next-line anti-slop/no-runtime-typeof -- validate JavaScript callers at the public factory boundary.\n if (options.rootLabel !== undefined && typeof options.rootLabel !== 'string') {\n throw new TypeError('RuntimeGraphObserver rootLabel must be a string')\n }\n\n return new RuntimeGraphObserver(options.includeFailures ?? true, options.rootLabel)\n }\n\n readonly onServiceResolve = (event: RuntimeServiceResolveEvent): void => {\n const targetTag = event.service.serviceTag\n const path = serviceTags(event.resolutionPath, targetTag)\n const node = this.ensureNode(targetTag)\n\n this.ensurePath(path)\n node.resolutions += 1\n\n if (event.outcome.status === 'failure' && this.includeFailures) {\n node.failures += 1\n }\n\n const parentTag = path[path.length - 2]\n\n if (parentTag === undefined) {\n if (this.rootLabel !== undefined) {\n this.rootEdges.set(targetTag, (this.rootEdges.get(targetTag) ?? 0) + 1)\n }\n\n return\n }\n\n const targets = this.edges.get(parentTag) ?? new Map<string, MutableGraphEdge>()\n const edge =\n targets.get(targetTag) ??\n (() => {\n const created: MutableGraphEdge = { from: parentTag, to: targetTag, resolutions: 0 }\n targets.set(targetTag, created)\n return created\n })()\n\n edge.resolutions += 1\n this.edges.set(parentTag, targets)\n }\n\n readonly onServiceAcquire = (event: RuntimeServiceAcquireEvent): void => {\n const targetTag = event.service.serviceTag\n const path = serviceTags(event.resolutionPath, targetTag)\n const node = this.ensureNode(targetTag)\n\n this.ensurePath(path)\n node.acquisitions += 1\n\n if (event.outcome.status === 'failure' && this.includeFailures) {\n node.failures += 1\n }\n }\n\n /** Return a fresh, deeply detached and sorted graph snapshot. */\n toJSON(): RuntimeGraphSnapshot {\n const nodes = Object.freeze(\n [...this.nodes.entries()]\n .sort(([left], [right]) => compareStrings(left, right))\n .map(([tag, counters]) =>\n freezeNode({\n tag,\n resolutions: counters.resolutions,\n acquisitions: counters.acquisitions,\n failures: counters.failures\n })\n )\n )\n const edges = Object.freeze(\n [...this.edges.values()]\n .flatMap((targets) => [...targets.values()])\n .map((edge) => freezeEdge({ ...edge }))\n .sort(compareEdges)\n )\n\n return Object.freeze({ nodes, edges })\n }\n\n /** Render the current graph as deterministic Mermaid flowchart source. */\n toMermaid(): string {\n const snapshot = this.toJSON()\n const serviceIds = new Map(\n snapshot.nodes.map((node) => [node.tag, mermaidId('service_', node.tag)])\n )\n const lines = ['flowchart TD']\n const rootTargets = [...this.rootEdges.entries()].sort(([left], [right]) =>\n compareStrings(left, right)\n )\n const root =\n this.rootLabel !== undefined && rootTargets.length > 0\n ? { id: mermaidId('root_', this.rootLabel), label: this.rootLabel }\n : undefined\n\n if (root !== undefined) {\n lines.push(` ${root.id}[\"${escapeMermaidLabel(root.label)}\"]`)\n }\n\n for (const node of snapshot.nodes) {\n const id = serviceIds.get(node.tag)\n\n if (id !== undefined) {\n lines.push(` ${id}[\"${escapeMermaidLabel(node.tag)}\"]`)\n }\n }\n\n if (root !== undefined) {\n for (const [targetTag, resolutions] of rootTargets) {\n const targetId = serviceIds.get(targetTag)\n\n if (targetId !== undefined) {\n lines.push(` ${root.id} -->|${resolutions}| ${targetId}`)\n }\n }\n }\n\n for (const edge of snapshot.edges) {\n const fromId = serviceIds.get(edge.from)\n const toId = serviceIds.get(edge.to)\n\n if (fromId !== undefined && toId !== undefined) {\n lines.push(` ${fromId} -->|${edge.resolutions}| ${toId}`)\n }\n }\n\n return lines.join('\\n')\n }\n\n /** Discard all observed graph data while keeping this observer reusable. */\n clear(): void {\n this.nodes.clear()\n this.edges.clear()\n this.rootEdges.clear()\n }\n\n private ensureNode(tag: string): MutableGraphNode {\n const existing = this.nodes.get(tag)\n\n if (existing !== undefined) {\n return existing\n }\n\n const node: MutableGraphNode = { resolutions: 0, acquisitions: 0, failures: 0 }\n this.nodes.set(tag, node)\n return node\n }\n\n private ensurePath(path: readonly string[]): void {\n for (const tag of path) {\n this.ensureNode(tag)\n }\n }\n}\n","import { Layer } from '../layer'\nimport type {\n CompleteExecution,\n CompleteExecutionLayer,\n CompleteInput,\n LayerInput,\n LayerInputState,\n OverrideLayerResult,\n ProvidedEnvironment,\n RequiredEnvironment,\n ValidateLayerInput,\n ValidateOverrides,\n ValidateOverridesWitness\n} from '../layer/inference'\nimport type { LayerBackend } from '../layer/backend'\nimport { LayerDisposeError } from '../layer/errors'\nimport { MapLayerBackend } from '../layer/map-layer-backend'\nimport {\n classifyRuntimeOutcome,\n type RuntimeDisposeOptions,\n type RuntimeOptions,\n type RuntimeRunOptions\n} from '../runtime/outcome'\nimport { Runtime } from '../runtime/runtime'\nimport type { RuntimeObserver } from '../runtime/observer'\nimport type { RuntimeExecutionEndEvent, RuntimeExecutionStartEvent } from '../runtime/observer'\nimport type { ScopeOutcome } from '../scope'\nimport {\n Clock,\n ClockTest,\n IdGenerator,\n IdGeneratorTest,\n Logger,\n LoggerTest,\n Random,\n RandomSeeded\n} from '../standard-services'\nimport type { MissingDependencies } from '../internal/missing-dependencies'\nimport type { AnyService } from '../service'\nimport { RecordedRuntimeObserver } from './recorded-runtime-observer'\n\ndeclare const TestRuntimeOptionsOverridesTypeId: unique symbol\n\ntype ValidatedTestServiceOption<\n Base extends LayerInput,\n Overrides extends readonly LayerInput[],\n Replacement extends LayerInput,\n Value\n> = Value & ValidateOverridesWitness<Base, readonly [...Overrides, Replacement]>\n\n/** Options for an isolated TestRuntime. */\nexport type TestRuntimeOptions<\n Base extends LayerInput = LayerInput,\n Overrides extends readonly LayerInput[] = readonly []\n> = Omit<RuntimeOptions, 'backend' | 'observers'> & {\n /** Explicitly replace or add providers through `Layer.override`. */\n readonly overrides?: Overrides & ValidateOverrides<Base, Overrides>\n /** Backend used by the underlying Runtime. Defaults to a fresh MapLayerBackend. */\n readonly backend?: LayerBackend\n /** Deterministic Clock provider to install for this TestRuntime. */\n readonly clock?: ValidatedTestServiceOption<Base, Overrides, ClockTestLayer, ClockTest>\n /** In-memory Logger provider to install for this TestRuntime. */\n readonly logger?: ValidatedTestServiceOption<Base, Overrides, LoggerTestLayer, LoggerTest>\n /** Seeded Random provider to install for this TestRuntime. */\n readonly random?: ValidatedTestServiceOption<Base, Overrides, RandomSeededLayer, RandomSeeded>\n /** Deterministic IdGenerator provider to install for this TestRuntime. */\n readonly idGenerator?: ValidatedTestServiceOption<\n Base,\n Overrides,\n IdGeneratorTestLayer,\n IdGeneratorTest\n >\n /** Additional best-effort observers after the default recorder. */\n readonly observers?: readonly RuntimeObserver[]\n} & {\n readonly [TestRuntimeOptionsOverridesTypeId]?: Overrides\n}\n\ntype ClockTestLayer = ReturnType<typeof ClockTest.layer>\ntype LoggerTestLayer = ReturnType<typeof LoggerTest.layer>\ntype RandomSeededLayer = ReturnType<typeof RandomSeeded.layer>\ntype IdGeneratorTestLayer = ReturnType<typeof IdGeneratorTest.layer>\n\ntype TestRuntimeOptionsInput = Omit<RuntimeOptions, 'backend' | 'observers'> & {\n readonly overrides?: readonly LayerInput[]\n readonly backend?: LayerBackend\n readonly clock?: ClockTest\n readonly logger?: LoggerTest\n readonly random?: RandomSeeded\n readonly idGenerator?: IdGeneratorTest\n readonly observers?: readonly RuntimeObserver[]\n}\n\ntype ExplicitOverrides<Options extends TestRuntimeOptionsInput> =\n typeof TestRuntimeOptionsOverridesTypeId extends keyof Options\n ? Exclude<\n Options[typeof TestRuntimeOptionsOverridesTypeId],\n undefined\n > extends infer Overrides extends readonly LayerInput[]\n ? Overrides\n : readonly []\n : Exclude<Options['overrides'], undefined> extends infer Overrides extends readonly LayerInput[]\n ? Overrides\n : readonly []\n\ntype HasDefinedOption<Options, Key extends PropertyKey> = true extends (\n Options extends unknown\n ? Key extends keyof Options\n ? {} extends Pick<Options, Key>\n ? false\n : undefined extends Options[Key]\n ? false\n : true\n : false\n : never\n)\n ? true\n : false\n\ntype HasPotentialOption<Options, Key extends PropertyKey> = true extends (\n Options extends unknown\n ? Key extends keyof Options\n ? [Exclude<Options[Key], undefined>] extends [never]\n ? false\n : true\n : false\n : never\n)\n ? true\n : false\n\ntype HasGuaranteedOption<Options, Key extends PropertyKey> = [Options] extends [never]\n ? false\n : false extends (Options extends unknown ? HasDefinedOption<Options, Key> : never)\n ? false\n : true\n\ntype TestRuntimeOptionLayers<Options extends TestRuntimeOptionsInput> = [\n ...ExplicitOverrides<Options>,\n ...(HasGuaranteedOption<Options, 'clock'> extends true ? [ClockTestLayer] : []),\n ...(HasGuaranteedOption<Options, 'logger'> extends true ? [LoggerTestLayer] : []),\n ...(HasGuaranteedOption<Options, 'random'> extends true ? [RandomSeededLayer] : []),\n ...(HasGuaranteedOption<Options, 'idGenerator'> extends true ? [IdGeneratorTestLayer] : [])\n]\n\ntype TestRuntimeValidationLayers<Options extends TestRuntimeOptionsInput> = [\n ...ExplicitOverrides<Options>,\n ...(HasPotentialOption<Options, 'clock'> extends true ? [ClockTestLayer] : []),\n ...(HasPotentialOption<Options, 'logger'> extends true ? [LoggerTestLayer] : []),\n ...(HasPotentialOption<Options, 'random'> extends true ? [RandomSeededLayer] : []),\n ...(HasPotentialOption<Options, 'idGenerator'> extends true ? [IdGeneratorTestLayer] : [])\n]\n\ntype TestRuntimeLayer<\n Base extends LayerInput,\n Options extends TestRuntimeOptionsInput\n> = OverrideLayerResult<Base, TestRuntimeOptionLayers<Options>>\n\ntype TestRuntimeOptionsValidation<\n Base extends LayerInput,\n Options extends TestRuntimeOptionsInput\n> = (Options extends {\n readonly overrides?: infer Overrides extends readonly LayerInput[]\n}\n ? { readonly overrides?: Overrides & ValidateOverrides<Base, Overrides> }\n : unknown) &\n ValidateOverridesWitness<Base, TestRuntimeValidationLayers<Options>>\n\ntype CompleteLayerCheck<L extends LayerInput> = ValidateLayerInput<L> &\n (LayerInputState<L> extends 'typed'\n ? [RequiredEnvironment<L>] extends [never]\n ? unknown\n : MissingDependencies<Extract<RequiredEnvironment<L>, AnyService>>\n : unknown)\n\ntype ConfiguredService<Options, Key extends PropertyKey, Service> = Options extends unknown\n ? Key extends keyof Options\n ? undefined extends Options[Key]\n ? undefined\n : Options[Key] extends Service\n ? Options[Key]\n : undefined\n : undefined\n : never\n\ntype TestCallback<Provided extends AnyService, A, Options extends object = {}> = (\n test: TestRuntime<Provided, Options>\n) => A | PromiseLike<A>\n\n/**\n * Thrown when the TestRuntime recorder contains an execution start or end\n * event without its matching event at final disposal.\n */\nexport class TestRuntimeObserverError extends Error {\n readonly unmatchedStarts: readonly RuntimeExecutionStartEvent[]\n readonly unmatchedEnds: readonly RuntimeExecutionEndEvent[]\n\n constructor(\n unmatchedStarts: readonly RuntimeExecutionStartEvent[],\n unmatchedEnds: readonly RuntimeExecutionEndEvent[]\n ) {\n const startLabel = `${unmatchedStarts.length} start${unmatchedStarts.length === 1 ? '' : 's'}`\n const endLabel = `${unmatchedEnds.length} end${unmatchedEnds.length === 1 ? '' : 's'}`\n\n super(\n `TestRuntime found unmatched execution events: ${startLabel} without an end, ${endLabel} without a start`\n )\n\n this.name = 'TestRuntimeObserverError'\n this.unmatchedStarts = Object.freeze([...unmatchedStarts])\n this.unmatchedEnds = Object.freeze([...unmatchedEnds])\n }\n}\n\n/**\n * A disposable test boundary backed by the real Layer and Runtime\n * implementations.\n */\nexport class TestRuntime<Provided extends AnyService = any, Options extends object = {}> {\n readonly clock: ConfiguredService<Options, 'clock', ClockTest>\n readonly logger: ConfiguredService<Options, 'logger', LoggerTest>\n readonly random: ConfiguredService<Options, 'random', RandomSeeded>\n readonly idGenerator: ConfiguredService<Options, 'idGenerator', IdGeneratorTest>\n\n private disposalPromise: Promise<void> | undefined\n\n private constructor(\n /** The real Runtime used by this testing facade. */\n readonly runtime: Runtime<Provided>,\n /** Lifecycle events recorded by this TestRuntime. */\n readonly observer: RecordedRuntimeObserver,\n clock: ClockTest | undefined,\n logger: LoggerTest | undefined,\n random: RandomSeeded | undefined,\n idGenerator: IdGeneratorTest | undefined\n ) {\n // SAFETY: The public factory's Options type records which explicit test services were supplied.\n this.clock = clock as ConfiguredService<Options, 'clock', ClockTest>\n // SAFETY: The public factory's Options type records which explicit test services were supplied.\n this.logger = logger as ConfiguredService<Options, 'logger', LoggerTest>\n // SAFETY: The public factory's Options type records which explicit test services were supplied.\n this.random = random as ConfiguredService<Options, 'random', RandomSeeded>\n // SAFETY: The public factory's Options type records which explicit test services were supplied.\n this.idGenerator = idGenerator as ConfiguredService<Options, 'idGenerator', IdGeneratorTest>\n }\n\n /** Create a TestRuntime with a fresh backend and default lifecycle recorder. */\n static make<L extends LayerInput>(\n layer: L & CompleteLayerCheck<L>\n ): Promise<TestRuntime<ProvidedEnvironment<L>>>\n\n static make<L extends LayerInput, const Options extends TestRuntimeOptionsInput>(\n layer: L & ValidateLayerInput<L> & CompleteLayerCheck<TestRuntimeLayer<L, NoInfer<Options>>>,\n options: Options & TestRuntimeOptionsValidation<L, Options>\n ): Promise<TestRuntime<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, Options>>\n\n static async make<L extends LayerInput, const Options extends TestRuntimeOptionsInput = {}>(\n layer: L,\n options?: Options\n ): Promise<TestRuntime<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, Options>> {\n // SAFETY: The overloads validate the Layer and options; the empty default is used only when no options were supplied.\n const resolvedOptions = options === undefined ? ({} as Options) : options\n\n return TestRuntime.makeInternal(layer, resolvedOptions)\n }\n\n private static async makeInternal<\n L extends LayerInput,\n const Options extends TestRuntimeOptionsInput\n >(\n layer: L,\n options: Options\n ): Promise<TestRuntime<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, Options>> {\n const observer = RecordedRuntimeObserver.make()\n const composedLayer = composeTestLayer(layer, options)\n const runtimeOptions: RuntimeOptions = {\n ...options,\n backend: options.backend ?? new MapLayerBackend(),\n observers: [observer, ...(options.observers ?? [])]\n }\n // SAFETY: Public overloads require the composed Layer to be complete before this internal Runtime call.\n const typedLayer = composedLayer as TestRuntimeLayer<L, Options> &\n CompleteInput<TestRuntimeLayer<L, Options>>\n const runtime = await Runtime.make(typedLayer, runtimeOptions)\n\n return new TestRuntime<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, Options>(\n runtime,\n observer,\n options.clock,\n options.logger,\n options.random,\n options.idGenerator\n )\n }\n\n /** Run a fully typechecked program in the underlying Runtime. */\n run<A>(\n program: CompleteExecution<Provided, A>,\n options?: RuntimeRunOptions\n ): Promise<Awaited<A>> {\n return this.runtime.run(program, options)\n }\n\n /** Run a fully typechecked program with an execution-local Layer. */\n runWith<Request extends LayerInput, A>(\n layer: Request & CompleteExecutionLayer<Provided, Request>,\n program: CompleteExecution<Provided | ProvidedEnvironment<Request>, A>,\n options?: RuntimeRunOptions\n ): Promise<Awaited<A>> {\n return this.runtime.runWith(layer, program, options)\n }\n\n /** Dispose the underlying Runtime and perform the final recorder consistency check. */\n dispose(options?: RuntimeDisposeOptions): Promise<void> {\n return this.disposeWithInput(options)\n }\n\n /** Release this TestRuntime through JavaScript's async disposal protocol. */\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose()\n }\n\n private disposeWithOutcome(outcome: ScopeOutcome): Promise<void> {\n return this.disposeWithInput(outcome)\n }\n\n private disposeWithInput(input?: RuntimeDisposeOptions | ScopeOutcome): Promise<void> {\n if (this.disposalPromise !== undefined) {\n return this.disposalPromise\n }\n\n const disposal =\n input === undefined\n ? this.runtime.dispose()\n : isScopeOutcome(input)\n ? this.runtime.dispose(input)\n : this.runtime.dispose(input)\n this.disposalPromise = disposal.then(\n () => this.assertObserverConsistency(),\n (cause) => {\n const observerFailure = this.observerConsistencyFailure()\n\n if (observerFailure === undefined) {\n throw cause\n }\n\n const causes = cause instanceof LayerDisposeError ? cause.causes : [cause]\n throw new LayerDisposeError([...causes, observerFailure])\n }\n )\n\n return this.disposalPromise\n }\n\n private assertObserverConsistency(): void {\n const failure = this.observerConsistencyFailure()\n\n if (failure !== undefined) {\n throw failure\n }\n }\n\n private observerConsistencyFailure(): TestRuntimeObserverError | undefined {\n const unmatched = findUnmatchedExecutionEvents(\n this.observer.executionStarts,\n this.observer.executionEnds\n )\n\n if (unmatched.starts.length === 0 && unmatched.ends.length === 0) {\n return undefined\n }\n\n return new TestRuntimeObserverError(unmatched.starts, unmatched.ends)\n }\n\n /** Run a callback and always dispose this TestRuntime with its final outcome. */\n static use<A, L extends LayerInput>(\n layer: L & CompleteLayerCheck<L>,\n use: TestCallback<ProvidedEnvironment<L>, A>\n ): Promise<Awaited<A>>\n\n static use<A, L extends LayerInput, const Options extends TestRuntimeOptionsInput>(\n layer: L & ValidateLayerInput<L> & CompleteLayerCheck<TestRuntimeLayer<L, NoInfer<Options>>>,\n options: Options & TestRuntimeOptionsValidation<L, Options>,\n use: TestCallback<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, A, Options>\n ): Promise<Awaited<A>>\n\n static async use<A, L extends LayerInput, const Options extends TestRuntimeOptionsInput = {}>(\n layer: L,\n optionsOrUse:\n | Options\n | TestCallback<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, A, Options>,\n maybeUse?: TestCallback<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, A, Options>\n ): Promise<Awaited<A>> {\n let use: TestCallback<ProvidedEnvironment<TestRuntimeLayer<L, Options>>, A, Options> | undefined\n let resolvedOptions: Options\n\n // oxlint-disable-next-line anti-slop/no-runtime-typeof -- overload dispatch distinguishes the callback from the options object.\n if (typeof optionsOrUse === 'function') {\n use = optionsOrUse\n // SAFETY: The public overloads validate the supplied Layer; no options are needed for this branch.\n resolvedOptions = {} as Options\n } else {\n use = maybeUse\n resolvedOptions = optionsOrUse\n }\n\n if (use === undefined) {\n throw new TypeError('TestRuntime.use requires a callback')\n }\n\n const test = await TestRuntime.makeInternal(layer, resolvedOptions)\n let value!: Awaited<A>\n let executionFailed = false\n let executionFailure: unknown\n let outcome: ScopeOutcome\n\n try {\n value = await use(test)\n outcome = classifyRuntimeOutcome(value)\n } catch (cause) {\n executionFailed = true\n executionFailure = cause\n outcome = { status: 'failure', cause }\n }\n\n try {\n await test.disposeWithOutcome(outcome)\n } catch (cleanupFailure) {\n if (!executionFailed && outcome.status === 'success') {\n throw cleanupFailure\n }\n }\n\n if (executionFailed) {\n throw executionFailure\n }\n\n return value\n }\n}\n\nconst isScopeOutcome = (input: RuntimeDisposeOptions | ScopeOutcome): input is ScopeOutcome =>\n 'status' in input\n\nconst composeTestLayer = <Base extends LayerInput, Options extends TestRuntimeOptionsInput>(\n layer: Base,\n options: Options\n): TestRuntimeLayer<Base, Options> => {\n const overrides = [...(options.overrides ?? [])]\n\n if (options.clock !== undefined) {\n overrides.push(Layer.succeed(Clock, options.clock))\n }\n\n if (options.logger !== undefined) {\n overrides.push(Layer.succeed(Logger, options.logger))\n }\n\n if (options.random !== undefined) {\n overrides.push(Layer.succeed(Random, options.random))\n }\n\n if (options.idGenerator !== undefined) {\n overrides.push(Layer.succeed(IdGenerator, options.idGenerator))\n }\n\n // SAFETY: The public overloads validate the Layer and every generated option override.\n const typedLayer = layer as Base & ValidateLayerInput<Base>\n // SAFETY: Runtime branches collect the tuple described by TestRuntimeOptionLayers; the cast only restores that validated tuple for Layer.override.\n const typedOverrides = overrides as TestRuntimeOptionLayers<Options> &\n ValidateOverrides<Base, TestRuntimeOptionLayers<Options>>\n\n return Layer.override<Base, TestRuntimeOptionLayers<Options>>(typedLayer, ...typedOverrides)\n}\n\ntype UnmatchedExecutionEvents = {\n readonly starts: readonly RuntimeExecutionStartEvent[]\n readonly ends: readonly RuntimeExecutionEndEvent[]\n}\n\nconst findUnmatchedExecutionEvents = (\n starts: readonly RuntimeExecutionStartEvent[],\n ends: readonly RuntimeExecutionEndEvent[]\n): UnmatchedExecutionEvents => {\n const endCounts = countExecutionScopes(ends)\n const unmatchedStarts: RuntimeExecutionStartEvent[] = []\n\n for (const event of starts) {\n const count = endCounts.get(event.scope) ?? 0\n\n if (count === 0) {\n unmatchedStarts.push(event)\n } else {\n endCounts.set(event.scope, count - 1)\n }\n }\n\n const startCounts = countExecutionScopes(starts)\n const unmatchedEnds: RuntimeExecutionEndEvent[] = []\n\n for (const event of ends) {\n const count = startCounts.get(event.scope) ?? 0\n\n if (count === 0) {\n unmatchedEnds.push(event)\n } else {\n startCounts.set(event.scope, count - 1)\n }\n }\n\n return { starts: unmatchedStarts, ends: unmatchedEnds }\n}\n\nconst countExecutionScopes = <Event extends { readonly scope: object }>(\n events: readonly Event[]\n): Map<object, number> => {\n const counts = new Map<object, number>()\n\n for (const event of events) {\n counts.set(event.scope, (counts.get(event.scope) ?? 0) + 1)\n }\n\n return counts\n}\n\n/** Type-level aliases for TestRuntime configuration. */\nexport declare namespace TestRuntime {\n /** Options accepted by `TestRuntime.make` and `TestRuntime.use`. */\n export type Options<\n Base extends LayerInput = LayerInput,\n Overrides extends readonly LayerInput[] = readonly []\n > = TestRuntimeOptions<Base, Overrides>\n\n /** Optional signal supplied to one managed TestRuntime execution. */\n export type RunOptions = RuntimeRunOptions\n\n /** Cooperative shutdown policy for a managed TestRuntime. */\n export type DisposeOptions = RuntimeDisposeOptions\n}\n"],"mappings":";;;;;;;;;;AAkCA,IAAa,mBAAb,cAAsC,MAAM;CAE/B;CADX,YACE,UACA,QACA,OACA;EACA,MAAM,GAAG,SAAS,IAAI,UAAU,EAAE,MAAM,CAAC;EAJhC,KAAA,WAAA;EAMT,KAAK,OAAO;CACd;AACF;AAyCA,IAAM,kBAAN,cAA8B,QAAyB,CAAC,CACtD,wCACF,CAAC,CAAC,CAAC;AAEH,IAAM,yBAAN,cAAqC,QAAgC,CAAC,CACpE,+CACF,CAAC,CAAC,CAAC;AAEH,IAAM,8BAAN,cAA0C,QAAqC,CAAC,CAC9E,0CACF,CAAC,CAAC;CACA,OAAe;EACb,OAAO;CACT;CAEA,QAAgB;EACd,OAAO;CACT;AACF;AAEA,IAAM,6BAAN,cAAyC,QAAoC,CAAC,CAC5E,0CACF,CAAC,CAAC;CACA,OAAe;EACb,OAAO;CACT;AACF;AAEA,IAAM,gCAAN,cAA4C,QAAuC,CAAC,CAClF,4CACF,CAAC,CAAC;CACA,OAAe;EACb,OAAO;CACT;AACF;AAEA,IAAM,+BAAN,cAA2C,QAAsC,CAAC,CAChF,4CACF,CAAC,CAAC;CACA,QAAgB;EACd,OAAO;CACT;AACF;AAEA,MAAM,iBAAiB,MAAc,SAAgD;CACnF;CACA,MAAM,MAAqB;EACzB,IAAI;GACF,MAAM,IAAI;EACZ,SAAS,OAAO;GACd,IAAI,iBAAiB,kBACnB,MAAM;GAGR,MAAM,IAAI,iBAAiB,MAAM,uBAAuB,cAAc,KAAK,EAAE,IAAI,KAAK;EACxF;CACF;AACF;AAEA,MAAM,QAAQ,UAAkB,WAA0B;CACxD,MAAM,IAAI,iBAAiB,UAAU,MAAM;AAC7C;AAEA,MAAM,UAAU,WAAoB,UAAkB,WAAyB;CAC7E,IAAI,CAAC,WACH,KAAK,UAAU,MAAM;AAEzB;AAEA,MAAM,iBAAiB,UACrB,iBAAiB,QAAQ,GAAG,MAAM,KAAK,IAAI,MAAM,YAAY,OAAO,KAAK;AAE3E,MAAM,WAAW,OACf,OACA,UACA,gBACG;CACH,MAAM,UAAU,MAAM,QAAQ,QAAQ,KAAK,CAAC,CAAC,YACpC,EAAE,UAAU,MAAe,KACjC,WAAW;EAAE,UAAU;EAAe;CAAM,EAC/C;CAEA,IAAI,QAAQ,UACV,OAAO,QAAQ;CAGjB,KAAK,UAAU,YAAY,YAAY,WAAW;AACpD;AAEA,MAAM,cAAc,OAClB,SACA,QAC4B;CAC5B,MAAM,UAAU,MAAM,QAAQ,YAAY;CAE1C,IAAI;EACF,OAAO,MAAM,IAAI,OAAO;CAC1B,UAAU;EACR,IAAI;GACF,MAAM,QAAQ,WAAW;EAC3B,UAAU;GACR,MAAM,QAAQ,UAAU,OAAO;EACjC;CACF;AACF;AAEA,MAAM,wBAAwB,OAAgB,SAA0B,aAA2B;CACjG,OACE,iBAAiB,sBACjB,UACA,0CAA0C,QAAQ,WAAW,cAAc,cAAc,KAAK,GAChG;CAEA,IAAI,iBAAiB,sBACnB,OACE,MAAM,QAAQ,eAAe,QAAQ,YACrC,UACA,yBAAyB,QAAQ,WAAW,eAAe,MAAM,QAAQ,WAAW,EACtF;AAEJ;AAEA,MAAM,mBAAmB,OAAgB,SAA0B,aAA2B;CAC5F,OACE,iBAAiB,uBACjB,UACA,2CAA2C,QAAQ,WAAW,cAAc,cAAc,KAAK,GACjG;CAEA,IAAI,iBAAiB,uBACnB,OACE,MAAM,QAAQ,eAAe,QAAQ,YACrC,UACA,2BAA2B,QAAQ,WAAW,eAAe,MAAM,QAAQ,WAAW,EACxF;AAEJ;AAEA,MAAM,mBAAmB,OAAgB,SAA0B,aAA2B;CAC5F,OACE,iBAAiB,0BACjB,UACA,8CAA8C,QAAQ,WAAW,cAAc,cAAc,KAAK,GACpG;CAEA,IAAI,iBAAiB,0BACnB,OACE,MAAM,SAAS,eAAe,QAAQ,YACtC,UACA,2BAA2B,QAAQ,WAAW,eAAe,MAAM,SAAS,WAAW,EACzF;AAEJ;;;;;;;AAQA,MAAa,wBACX,YACgC;CAChC,cAAc,2CAA2C,YAAY;EACnE,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,IAAI,eAAe;GAEnB,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,eAAe;KACb;KACA,OAAO,IAAI,gBAAgB;IAC7B;GACF,CAAC;GAED,OACE,iBAAiB,GACjB,2CACA,yDAAyD,gBAAgB,WAAW,cAAc,cACpG;EACF,CAAC;CACH,CAAC;CACD,cAAc,sDAAsD,YAAY;EAC9E,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,WAAW,IAAI,gBAAgB;GAErC,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,eAAe;GACjB,CAAC;GAED,MAAM,WAAW,MAAM,QAAQ,QAAQ,eAAe;GAEtD,OACE,aAAa,YAAY,oBAAoB,iBAC7C,sDACA,mBAAmB,gBAAgB,WAAW,qCAChD;EACF,CAAC;CACH,CAAC;CACD,cAAc,+CAA+C,YAAY;EACvE,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,IAAI,eAAe;GAEnB,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,eAAe;KACb;KACA,OAAO,IAAI,gBAAgB;IAC7B;GACF,CAAC;GAED,MAAM,QAAQ,MAAM,QAAQ,QAAQ,eAAe;GACnD,MAAM,SAAS,MAAM,QAAQ,QAAQ,eAAe;GAEpD,OACE,UAAU,UAAU,iBAAiB,GACrC,+CACA,4CAA4C,gBAAgB,WAAW,cAAc,cACvF;EACF,CAAC;CACH,CAAC;CACD,cAAc,qDAAqD,YAAY;EAC7E,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,IAAI,eAAe;GACnB,IAAI;GACJ,IAAI;GACJ,MAAM,WAAW,IAAI,SAAe,YAAY;IAC9C,cAAc;GAChB,CAAC;GACD,MAAM,UAAU,IAAI,SAAe,YAAY;IAC7C,qBAAqB;GACvB,CAAC;GACD,MAAM,WAAW,IAAI,gBAAgB;GAErC,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,SAAS,YAAY;KACnB;KACA,YAAY;KACZ,MAAM;KACN,OAAO;IACT;GACF,CAAC;GAED,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,eAAe,CAAC;GAC9D,MAAM,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,eAAe,CAAC;GAE/D,IAAI;IACF,MAAM;IACN,OACE,iBAAiB,GACjB,qDACA,+CAA+C,gBAAgB,WAAW,cAAc,cAC1F;IAEA,mBAAmB;IACnB,MAAM,CAAC,eAAe,kBAAkB,MAAM,QAAQ,IAAI,CAAC,OAAO,MAAM,CAAC;IAEzE,OACE,kBAAkB,YAAY,mBAAmB,UACjD,qDACA,yCAAyC,gBAAgB,WAAW,wBACtE;GACF,UAAU;IACR,mBAAmB;IACnB,MAAM,QAAQ,WAAW,CAAC,OAAO,MAAM,CAAC;GAC1C;EACF,CAAC;CACH,CAAC;CACD,cAAc,8CAA8C,YAAY;EACtE,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,QAAQ,MAAM,SAClB,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,QAAQ,sBAAsB,CAAC,GACpE,8CACA,uBAAuB,uBAAuB,WAAW,EAC3D;GAEA,qBACE,OACA,wBACA,4CACF;EACF,CAAC;CACH,CAAC;CACD,cAAc,sDAAsD,YAAY;EAC9E,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,eAAkC;IACtC,SAAS;IACT,eAAe,IAAI,gBAAgB;GACrC;GAEA,MAAM,QAAQ,SAAS,YAAY;GAEnC,MAAM,QAAQ,MAAM,SAClB,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,SAAS,YAAY,CAAC,GAC3D,sDACA,qCAAqC,gBAAgB,WAAW,EAClE;GAEA,gBAAgB,OAAO,iBAAiB,oDAAoD;EAC9F,CAAC;CACH,CAAC;CACD,cAAc,yDAAyD,YAAY;EACjF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,eAAe,IAAI,8BAA8B;GACnD,CAAC;GAED,MAAM,oBAAoB,MAAM,SAC9B,QAAQ,QAAQ,CAAC,CAAC,WAChB,QAAQ,SAAS;IACf,SAAS;IACT,eAAe,IAAI,6BAA6B;GAClD,CAAC,CACH,GACA,yDACA,qCAAqC,6BAA6B,WAAW,EAC/E;GAEA,gBACE,mBACA,8BACA,uDACF;GAEA,MAAM,kBAAkB,MAAM,SAC5B,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,QAAQ,4BAA4B,CAAC,GAC1E,yDACA,mCAAmC,6BAA6B,WAAW,EAC7E;GAEA,gBACE,iBACA,8BACA,uDACF;EACF,CAAC;CACH,CAAC;CACD,cAAc,4DAA4D,YAAY;EACpF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,aAAa,IAAI,4BAA4B;GAEnD,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,eAAe;GACjB,CAAC;GAED,MAAM,WAAW,MAAM,QAAQ,QAAQ,0BAA0B;GAEjE,OACE,aAAa,cAAc,SAAS,KAAK,MAAM,cAC/C,4DACA,4BAA4B,2BAA2B,WAAW,qCACpE;EACF,CAAC;CACH,CAAC;CACD,cAAc,8DAA8D,YAAY;EACtF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,0BAAU,IAAI,MAAM,8BAA8B;GACxD,IAAI,eAAe;GAEnB,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,SAAS,YAAY;KACnB;KACA,MAAM;IACR;GACF,CAAC;GAED,MAAM,aAAa,MAAM,SACvB,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,QAAQ,eAAe,CAAC,GAC7D,8DACA,kCAAkC,gBAAgB,WAAW,EAC/D;GACA,MAAM,cAAc,MAAM,SACxB,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,QAAQ,eAAe,CAAC,GAC7D,8DACA,mCAAmC,gBAAgB,WAAW,EAChE;GACA,MAAM,uBAAuB,QAAQ,uBAAuB,UAAU,IAAI;GAE1E,OACE,eAAe,WAAW,gBAAgB,WAAW,iBAAiB,sBACtE,8DACA,YAAY,QAAQ,mBAAmB,iBAAiB,qBAAqB,iCAAiC,gBAAgB,WAAW,cAAc,cACzJ;EACF,CAAC;CACH,CAAC;CACD,cAAc,yDAAyD,YAAY;EACjF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI,kBAAkB;GACtB,IAAI,uBAAuB;GAC3B,IAAI,qCAAqC;GACzC,IAAI,kBAAkB;GACtB,MAAM,WAAW,IAAI,SAAe,YAAY;IAC9C,cAAc;GAChB,CAAC;GACD,MAAM,UAAU,IAAI,SAAe,YAAY;IAC7C,qBAAqB;GACvB,CAAC;GACD,MAAM,eAAe,IAAI,SAAe,YAAY;IAClD,sBAAsB;GACxB,CAAC;GAED,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,SAAS,YAAY;KACnB,YAAY;KACZ,MAAM;KACN,uBAAuB;KACvB,OAAO,IAAI,gBAAgB;IAC7B;GACF,CAAC;GAED,MAAM,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,eAAe,CAAC;GAElE,IAAI;IACF,MAAM;IACN,MAAM,iBAAiB,QAAQ,WAAW,EACxC,wBAAwB,iBAAiB;KACvC,OACE,aAAa,SAAS,GACtB,yDACA,4DAA4D,gBAAgB,WAAW,EACzF;KACA,kBAAkB;KAClB,8BAA8B,QAAQ,WAAW,YAAY,CAAC,CAAC,WAAW;MACxE,OACE,sBACA,yDACA,+DAA+D,gBAAgB,WAAW,YAC5F;KACF,CAAC;KACD,oBAAoB,aAAa,WAAW,KAAA,CAAS;KAErD,OAAO;IACT,EACF,CAAC;IAED,OACE,mBAAmB,KAAA,KAAa,cAAc,cAAc,GAC5D,yDACA,sEAAsE,gBAAgB,WAAW,EACnG;IACA,YAAY,QAAQ,QAAQ,cAAc;IAC1C,MAAM,mBAAmB,UAAU,WAC3B;KACJ,kBAAkB;IACpB,SACM;KACJ,kBAAkB;IACpB,CACF;IAEA,OACE,iBACA,yDACA,qFAAqF,gBAAgB,WAAW,EAClH;IASA,MAAM,6BANJ,qBACA,KACE,yDACA,6CAA6C,gBAAgB,WAAW,sCAC1E,EAAA,CAEgD,WAAW;KAC3D,qCAAqC;IACvC,CAAC;IAED,oBAAoB;IACpB,MAAM;IACN,OACE,oCACA,yDACA,6CAA6C,gBAAgB,WAAW,mBAC1E;IACA,OACE,CAAC,sBACD,yDACA,oCAAoC,gBAAgB,WAAW,wCACjE;IACA,OACE,CAAC,iBACD,yDACA,uFAAuF,gBAAgB,WAAW,YACpH;IAEA,mBAAmB;IACnB,IAAI,gCAAgC,KAAA,GAClC,KACE,yDACA,6DAA6D,gBAAgB,WAAW,EAC1F;IAGF,MAAM,QAAQ,IAAI;KAAC;KAAW;KAA6B;KAAW;IAAgB,CAAC;GACzF,UAAU;IACR,oBAAoB;IACpB,mBAAmB;IACnB,MAAM,UAA8B,CAAC,SAAS;IAE9C,IAAI,gCAAgC,KAAA,GAClC,QAAQ,KAAK,2BAA2B;IAG1C,IAAI,cAAc,KAAA,GAChB,QAAQ,KAAK,SAAS;IAGxB,MAAM,QAAQ,WAAW,OAAO;GAClC;EACF,CAAC;CACH,CAAC;CACD,cAAc,iEAAiE,YAAY;EACzF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,QAAQ,IAAI,gBAAgB;GAElC,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,eAAe;GACjB,CAAC;GACD,OACG,MAAM,QAAQ,QAAQ,eAAe,MAAO,OAC7C,iEACA,4CAA4C,gBAAgB,WAAW,6BACzE;GAEA,MAAM,QAAQ,WAAW;GAEzB,MAAM,eAAe,MAAM,SACzB,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,QAAQ,eAAe,CAAC,GAC7D,iEACA,mCAAmC,gBAAgB,WAAW,EAChE;GAEA,qBACE,cACA,iBACA,+DACF;GAEA,MAAM,SAAS,IAAI,gBAAgB;GACnC,MAAM,QAAQ,SAAS;IACrB,SAAS;IACT,eAAe;GACjB,CAAC;GAED,OACG,MAAM,QAAQ,QAAQ,eAAe,MAAO,QAC7C,iEACA,6CAA6C,gBAAgB,WAAW,iBAC1E;EACF,CAAC;CACH,CAAC;CACD,cAAc,0CAA0C,YAAY;EAClE,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,QAAQ,WAAW;GACzB,MAAM,QAAQ,WAAW;EAC3B,CAAC;CACH,CAAC;CACD,cAAc,yDAAyD,YAAY;EACjF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,IAAI,WAAW;GAQf,MAAM,eAPQ,MAAM,OAClB,uBACM,IAAI,gBAAgB,SACpB;IACJ;GACF,CAGI,CAAC,CAAC,UAAU,MAChB,KACE,yDACA,8CAA8C,gBAAgB,WAAW,EAC3E;GAEF,MAAM,QAAQ,SAAS,YAAY;GACnC,MAAM,QAAQ,QAAQ,eAAe;GACrC,MAAM,QAAQ,WAAW;GAEzB,OACE,aAAa,GACb,yDACA,6BAA6B,SAAS,sCAAsC,gBAAgB,WAAW,EACzG;EACF,CAAC;CACH,CAAC;AACH;AAEA,MAAM,qBAAsC;CAC1C,MAAM,2BAAW,IAAI,IAA8B;CAEnD,OAAO,EACL,QAAmC,OAA2B;EAC5D,MAAM,UAAU,SAAS,IAAI,KAAK;EAElC,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,sCAAsC,MAAM,WAAW,EAAE;EAI3E,OAAO;CACT,EACF;AACF;AAEA,MAAM,eAAe,OAAuB,cAA+C;CACzF;CACA;CACA,gBAAgB,CAAC;AACnB;AAEA,MAAM,cAAc,OAClB,SACA,QAC4B;CAC5B,MAAM,UAAU,QAAQ,YAAY;CAEpC,IAAI;EACF,OAAO,MAAM,IAAI,OAAO;CAC1B,UAAU;EACR,MAAM,QAAQ,UAAU,OAAO;CACjC;AACF;AAEA,MAAM,wBACJ,OACA,SACA,aACS;CACT,MAAM,YACJ,QAAQ,2BACN,UAA4B,iBAAiB;CAEjD,OACE,UAAU,KAAK,GACf,UACA,mDAAmD,QAAQ,YAAY,qBAAqB,cAAc,KAAK,GACjH;AACF;AAEA,MAAM,iBACJ,OACA,SACA,aACS;CACT,MAAM,YACJ,QAAQ,oBACN,UAA4B,iBAAiB;CAEjD,OACE,UAAU,KAAK,GACf,UACA,wEAAwE,cAAc,KAAK,GAC7F;AACF;AAEA,MAAM,cAAc,OAAO,GAAG,WAAqD;CACjF,MAAM,WAAsB,CAAC;CAE7B,KAAK,MAAM,SAAS,QAClB,IAAI;EACF,MAAM,MAAM,MAAM;CACpB,SAAS,OAAO;EACd,SAAS,KAAK,KAAK;CACrB;CAGF,IAAI,SAAS,WAAW,GACtB,MAAM,SAAS;CAGjB,IAAI,SAAS,SAAS,GACpB,MAAM,IAAI,eAAe,UAAU,+BAA+B;AAEtE;;;;;;;AAQA,MAAa,iCACX,YACgC;CAChC,MAAM,YAAgC;EACpC,cACE,uEACA,YAAY;GACV,MAAM,YAAY,SAAS,OAAO,YAAY;IAC5C,MAAM,QAAQ,MAAM,KAAK;IACzB,MAAM,UAAU,YAAY,OAAO,aAAa,CAAC;IAEjD,IAAI;KACF,MAAM,QAAQ,IAAI,SAAS,YAAY;MACrC,OACE,QAAQ,QAAQ,MAAM,SACtB,uEACA,iEACF;MACA,MAAM,QAAQ,QAAQ;MACtB,OACE,QAAQ,QAAQ,MAAM,SACtB,uEACA,+DACF;KACF,CAAC;IACH,UAAU;KACR,MAAM,MAAM,MAAM;IACpB;GACF,CAAC;EACH,CACF;EACA,cACE,wEACA,YAAY;GACV,MAAM,YAAY,SAAS,OAAO,YAAY;IAC5C,MAAM,YAAY,MAAM,KAAK;IAC7B,MAAM,aAAa,UAAU,KAAK;IAClC,MAAM,WAAW,aAAa;IAC9B,MAAM,OAAO,YAAY,WAAW,QAAQ;IAE5C,IAAI;KACF,MAAM,QAAQ,IAAI,MAAM,YAAY;MAClC,MAAM,eAAe,IACnB,UACA,YAAY;OACV,MAAM,iBAAiB,QAAQ,QAAQ;OAEvC,OACE,mBAAmB,QAAQ,eAAe,aAAa,UACvD,wEACA,iEACF;OAEA,MAAM,MAAM,QAAQ,YAAY,YAAY;QAC1C,MAAM,eAAe,QAAQ,QAAQ;QAErC,OACE,aAAa,UAAU,cAAc,aAAa,aAAa,UAC/D,wEACA,2DACF;QACA,MAAM,QAAQ,QAAQ;QACtB,OACE,QAAQ,QAAQ,MAAM,cACtB,wEACA,wDACF;OACF,CAAC;OAED,OACE,QAAQ,QAAQ,MAAM,gBACtB,wEACA,6DACF;MACF,GACA,OACF;MAEA,OACE,QAAQ,QAAQ,MAAM,MACtB,wEACA,wDACF;KACF,CAAC;IACH,UAAU;KACR,MAAM,YAAY,YAAY,SAAS;IACzC;GACF,CAAC;EACH,CACF;EACA,cAAc,kEAAkE,YAAY;GAC1F,MAAM,YAAY,SAAS,OAAO,YAAY;IAC5C,MAAM,QAAQ,MAAM,KAAK;IACzB,MAAM,UAAU,YAAY,OAAO,aAAa,CAAC;IACjD,MAAM,0BAAU,IAAI,MAAM,8BAA8B;IAExD,IAAI;KACF,MAAM,QAAQ,MAAM,SAClB,QAAQ,QAAQ,CAAC,CAAC,WAChB,QAAQ,IAAI,eAAe;MACzB,MAAM;KACR,CAAC,CACH,GACA,kEACA,kCACF;KAEA,OACE,UAAU,SACV,kEACA,uDAAuD,cAAc,KAAK,GAC5E;KACA,qBACE,MAAM,SACJ,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,QAAQ,CAAC,GAC9C,kEACA,yBACF,GACA,SACA,gEACF;IACF,UAAU;KACR,MAAM,MAAM,MAAM;IACpB;GACF,CAAC;EACH,CAAC;EACD,cAAc,kEAAkE,YAAY;GAC1F,MAAM,YAAY,SAAS,OAAO,YAAY;IAC5C,MAAM,QAAQ,MAAM,KAAK;IACzB,MAAM,UAAU,YAAY,OAAO,aAAa,CAAC;IACjD,MAAM,0BAAU,IAAI,MAAM,wBAAwB;IAElD,IAAI;KACF,MAAM,QAAQ,MAAM,SAClB,QAAQ,IAAI,SAAS,YAAY;MAC/B,MAAM,QAAQ,QAAQ;MACtB,MAAM;KACR,CAAC,GACD,kEACA,mCACF;KAEA,OACE,UAAU,SACV,kEACA,wDAAwD,cAAc,KAAK,GAC7E;KACA,qBACE,MAAM,SACJ,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,QAAQ,CAAC,GAC9C,kEACA,yBACF,GACA,SACA,gEACF;IACF,UAAU;KACR,MAAM,MAAM,MAAM;IACpB;GACF,CAAC;EACH,CAAC;EACD,cAAc,4DAA4D,YAAY;GACpF,MAAM,YAAY,SAAS,OAAO,YAAY;IAC5C,MAAM,0BAAU,IAAI,MAAM,0BAA0B;IACpD,MAAM,gBAAuC;KAC3C,MAAM,SAAS,YAAY,QAAQ,IAAI,SAAS,OAAO;KACvD,eAAe;MACb,MAAM;KACR;IACF;IAEA,MAAM,QAAQ,MAAM,SAClB,QAAQ,QAAQ,CAAC,CAAC,WAChB,eAAe,IAAI,aAAa,SAAS,KAAA,GAAW,aAAa,CACnE,GACA,4DACA,0BACF;IAEA,OACE,UAAU,SACV,4DACA,kDAAkD,cAAc,KAAK,GACvE;GACF,CAAC;EACH,CAAC;EACD,cAAc,oEAAoE,YAAY;GAC5F,MAAM,YAAY,SAAS,OAAO,YAAY;IAC5C,MAAM,SAAS,MAAM,KAAK;IAC1B,MAAM,QAAQ,OAAO,KAAK;IAC1B,MAAM,iCAAiB,IAAI,MAAM,gCAAgC;IACjE,MAAM,+BAAe,IAAI,MAAM,kCAAkC;IACjE,MAAM,UAAU;KAAE,QAAQ;KAAoB,OAAO;IAAa;IAClE,MAAM,SAAmB,CAAC;IAC1B,MAAM,gBAAuC;KAC3C,WAAW;MACT,MAAM;KACR;KACA,eAAe,QAAQ,QAAQ;IACjC;IAEA,MAAM,cAAc,iBAAiB;KACnC,OAAO,KAAK,SAAS,aAAa,QAAQ;IAC5C,CAAC;IACD,OAAO,cAAc,kBAAkB;KACrC,OAAO,KAAK,SAAS,cAAc,QAAQ;KAC3C,MAAM;IACR,CAAC;IACD,OAAO,cAAc,kBAAkB;KACrC,OAAO,KAAK,UAAU,cAAc,QAAQ;IAC9C,CAAC;IACD,aAAa,KAAK,QAAQ,aAAa;IAEvC,MAAM,aAAa,OAAO,MAAM,OAAO;IACvC,MAAM,cAAc,OAAO,MAAM;IAEjC,OACE,gBAAgB,YAChB,oEACA,sDACF;IAEA,MAAM,QAAQ,MAAM,SAClB,YACA,oEACA,wBACF;IAEA,OACE,iBAAiB,mBACf,MAAM,OAAO,WAAW,KACxB,MAAM,OAAO,OAAO,kBACpB,MAAM,OAAO,OAAO,cACtB,oEACA,8DAA8D,cAAc,KAAK,GACnF;IACA,OACE,OAAO,KAAK,GAAG,MAAM,8CACrB,oEACA,4EAA4E,OAAO,KAAK,GAAG,GAC7F;IAEA,MAAM,cAAc,MAAM,SACxB,QAAQ,QAAQ,CAAC,CAAC,WAAW,OAAO,mBAAmB,KAAA,CAAS,CAAC,GACjE,oEACA,0BACF;IAEA,OACE,uBAAuB,kBACvB,oEACA,8CAA8C,cAAc,WAAW,EAAE,EAC3E;GACF,CAAC;EACH,CAAC;CACH;CAEA,IAAI,QAAQ,gBAAgB,cAC1B,UAAU,KACR,cAAc,mDAAmD,YAAY;EAC3E,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,aAAa,MAAM,KAAK;GAC9B,MAAM,cAAc,MAAM,KAAK;GAC/B,MAAM,QAAQ,YAAY,YAAY,aAAa,CAAC;GACpD,MAAM,SAAS,YAAY,aAAa,aAAa,CAAC;GACtD,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM,iBAAiB,IAAI,SAAe,YAAY;IACpD,eAAe;GACjB,CAAC;GACD,MAAM,kBAAkB,IAAI,SAAe,YAAY;IACrD,gBAAgB;GAClB,CAAC;GACD,MAAM,sBAAsB,IAAI,SAAe,YAAY;IACzD,eAAe;GACjB,CAAC;GACD,MAAM,uBAAuB,IAAI,SAAe,YAAY;IAC1D,gBAAgB;GAClB,CAAC;GACD,MAAM,OAAkC,CAAC;GAEzC,IAAI;IACF,MAAM,WAAW,QAAQ,QACvB,QAAQ,IAAI,OAAO,YAAY;KAC7B,aAAa;KACb,MAAM;KACN,OAAO,QAAQ,QAAQ;IACzB,CAAC,CACH;IACA,KAAK,KAAK,QAAQ;IAClB,MAAM,YAAY,QAAQ,QACxB,QAAQ,IAAI,QAAQ,YAAY;KAC9B,cAAc;KACd,MAAM;KACN,OAAO,QAAQ,QAAQ;IACzB,CAAC,CACH;IACA,KAAK,KAAK,SAAS;IAEnB,MAAM,QAAQ,IAAI,CAAC,qBAAqB,oBAAoB,CAAC;IAC7D,aAAa;IACb,cAAc;IACd,MAAM,CAAC,cAAc,iBAAiB,MAAM,QAAQ,IAAI,CAAC,UAAU,SAAS,CAAC;IAE7E,OACE,iBAAiB,SAAS,kBAAkB,QAC5C,mDACA,kDACF;GACF,UAAU;IACR,aAAa;IACb,cAAc;IACd,MAAM,QAAQ,WAAW,IAAI;IAC7B,MAAM,YAAY,YAAY,WAAW;GAC3C;EACF,CAAC;CACH,CAAC,GACD,cAAc,8DAA8D,YAAY;EACtF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,YAAY,MAAM,KAAK;GAC7B,MAAM,aAAa,UAAU,KAAK;GAClC,MAAM,cAAc,UAAU,KAAK;GACnC,MAAM,OAAO,YAAY,WAAW,aAAa,CAAC;GAClD,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM,iBAAiB,IAAI,SAAe,YAAY;IACpD,eAAe;GACjB,CAAC;GACD,MAAM,kBAAkB,IAAI,SAAe,YAAY;IACrD,gBAAgB;GAClB,CAAC;GACD,MAAM,sBAAsB,IAAI,SAAe,YAAY;IACzD,eAAe;GACjB,CAAC;GACD,MAAM,uBAAuB,IAAI,SAAe,YAAY;IAC1D,gBAAgB;GAClB,CAAC;GAED,MAAM,OAAkC,CAAC;GAEzC,IAAI;IACF,MAAM,QAAQ,IAAI,MAAM,YAAY;KAClC,IAAI;MACF,MAAM,WAAW,QAAQ,QACvB,MAAM,QAAQ,YAAY,YAAY;OACpC,aAAa;OACb,MAAM;OACN,OAAO,QAAQ,QAAQ;MACzB,CAAC,CACH;MACA,KAAK,KAAK,QAAQ;MAClB,MAAM,YAAY,QAAQ,QACxB,MAAM,QAAQ,aAAa,YAAY;OACrC,cAAc;OACd,MAAM;OACN,OAAO,QAAQ,QAAQ;MACzB,CAAC,CACH;MACA,KAAK,KAAK,SAAS;MAEnB,MAAM,QAAQ,IAAI,CAAC,qBAAqB,oBAAoB,CAAC;MAC7D,aAAa;MACb,cAAc;MACd,MAAM,CAAC,cAAc,iBAAiB,MAAM,QAAQ,IAAI,CAAC,UAAU,SAAS,CAAC;MAE7E,OACE,aAAa,UAAU,cAAc,cAAc,UAAU,aAC7D,8DACA,6DACF;MACA,OACE,QAAQ,QAAQ,MAAM,MACtB,8DACA,yEACF;KACF,UAAU;MACR,aAAa;MACb,cAAc;MACd,MAAM,QAAQ,WAAW,IAAI;KAC/B;IACF,CAAC;GACH,UAAU;IACR,aAAa;IACb,cAAc;IACd,MAAM,QAAQ,WAAW,IAAI;IAC7B,MAAM,YAAY,YAAY,aAAa,SAAS;GACtD;EACF,CAAC;CACH,CAAC,CACH;MAEA,UAAU,KACR,cAAc,8DAA8D,YAAY;EACtF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,aAAa,MAAM,KAAK;GAC9B,MAAM,cAAc,MAAM,KAAK;GAC/B,MAAM,QAAQ,YAAY,YAAY,aAAa,CAAC;GACpD,MAAM,SAAS,YAAY,aAAa,aAAa,CAAC;GACtD,IAAI;GACJ,IAAI;GACJ,MAAM,iBAAiB,IAAI,SAAe,YAAY;IACpD,eAAe;GACjB,CAAC;GACD,MAAM,sBAAsB,IAAI,SAAe,YAAY;IACzD,eAAe;GACjB,CAAC;GACD,MAAM,OAAkC,CAAC;GAEzC,IAAI;IACF,MAAM,WAAW,QAAQ,QACvB,QAAQ,IAAI,OAAO,YAAY;KAC7B,aAAa;KACb,MAAM;KACN,OAAO,QAAQ,QAAQ;IACzB,CAAC,CACH;IACA,KAAK,KAAK,QAAQ;IAElB,MAAM;IACN,MAAM,eAAe,MAAM,SACzB,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,IAAI,cAAc,QAAQ,QAAQ,CAAC,CAAC,GACzE,8DACA,yBACF;IAEA,cACE,cACA,SACA,4DACF;IAEA,aAAa;IACb,OACG,MAAM,aAAc,OACrB,8DACA,gEACF;IACA,OACE,QAAQ,IAAI,cAAc,QAAQ,QAAQ,CAAC,MAAM,QACjD,8DACA,iDACF;GACF,UAAU;IACR,aAAa;IACb,MAAM,QAAQ,WAAW,IAAI;IAC7B,MAAM,YAAY,YAAY,WAAW;GAC3C;EACF,CAAC;CACH,CAAC,GACD,cACE,mFACA,YAAY;EACV,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,YAAY,MAAM,KAAK;GAC7B,MAAM,aAAa,UAAU,KAAK;GAClC,MAAM,cAAc,UAAU,KAAK;GACnC,MAAM,OAAO,YAAY,WAAW,aAAa,CAAC;GAClD,IAAI;GACJ,IAAI;GACJ,MAAM,iBAAiB,IAAI,SAAe,YAAY;IACpD,eAAe;GACjB,CAAC;GACD,MAAM,sBAAsB,IAAI,SAAe,YAAY;IACzD,eAAe;GACjB,CAAC;GACD,MAAM,OAAkC,CAAC;GAEzC,IAAI;IACF,MAAM,QAAQ,IAAI,MAAM,YAAY;KAClC,IAAI;MACF,MAAM,WAAW,QAAQ,QACvB,MAAM,QAAQ,YAAY,YAAY;OACpC,aAAa;OACb,MAAM;OACN,OAAO,QAAQ,QAAQ;MACzB,CAAC,CACH;MACA,KAAK,KAAK,QAAQ;MAElB,MAAM;MACN,IAAI,YAAY;MAChB,MAAM,eAAe,MAAM,SACzB,QAAQ,QAAQ,CAAC,CAAC,WAChB,MAAM,QAAQ,mBAAmB;OAC/B,YAAY;OACZ,OAAO,QAAQ,QAAQ;MACzB,CAAC,CACH,GACA,mFACA,oCACF;MAEA,cACE,cACA,SACA,iFACF;MACA,OACE,CAAC,WACD,mFACA,2CACF;MAEA,aAAa;MACb,MAAM,eAAe,MAAM;MAE3B,OACE,aAAa,UAAU,YACvB,mFACA,kEACF;MACA,OACE,QAAQ,QAAQ,MAAM,MACtB,mFACA,uEACF;KACF,UAAU;MACR,aAAa;MACb,MAAM,QAAQ,WAAW,IAAI;KAC/B;IACF,CAAC;IAED,MAAM,WAAW,YAAY,aAAa,aAAa,CAAC;IACxD,OACE,QAAQ,IAAI,gBAAgB,QAAQ,QAAQ,CAAC,MAAM,UACnD,mFACA,iEACF;GACF,UAAU;IACR,aAAa;IACb,MAAM,QAAQ,WAAW,IAAI;IAC7B,MAAM,YAAY,YAAY,aAAa,SAAS;GACtD;EACF,CAAC;CACH,CACF,CACF;CAGF,MAAM,uBAAuB,QAAQ;CAErC,IAAI,sBACF,UAAU,KACR,cAAc,8DAA8D,YAAY;EACtF,MAAM,YAAY,SAAS,OAAO,YAAY;GAC5C,MAAM,YAAY,qBAAqB;GACvC,MAAM,aAAa,MAAM,KAAK;GAC9B,MAAM,aAAa,MAAM,KAAK;GAC9B,MAAM,QAAQ,YAAY,YAAY,aAAa,CAAC;GACpD,MAAM,QAAQ,YAAY,YAAY,aAAa,CAAC;GAEpD,IAAI;IACF,MAAM,QAAQ,IAAI,OAAO,YAAY;KACnC,MAAM,UAAU,IAAI,OAAO,YAAY;MACrC,OACE,UAAU,QAAQ,MAAM,OACxB,8DACA,kDACF;MACA,MAAM,QAAQ,QAAQ;MACtB,OACE,UAAU,QAAQ,MAAM,OACxB,8DACA,6DACF;KACF,CAAC;KAED,OACE,QAAQ,QAAQ,MAAM,OACtB,8DACA,6DACF;KACA,qBACE,MAAM,SACJ,QAAQ,QAAQ,CAAC,CAAC,WAAW,UAAU,QAAQ,CAAC,GAChD,8DACA,6CACF,GACA,SACA,4DACF;IACF,CAAC;IAED,qBACE,MAAM,SACJ,QAAQ,QAAQ,CAAC,CAAC,WAAW,QAAQ,QAAQ,CAAC,GAC9C,8DACA,2CACF,GACA,SACA,4DACF;GACF,UAAU;IACR,IAAI;KACF,MAAM,YAAY,YAAY,UAAU;IAC1C,UAAU;KACR,MAAM,QAAQ,UAAU,SAAS;IACnC;GACF;EACF,CAAC;CACH,CAAC,CACH;CAGF,OAAO;AACT;;;ACj1CA,MAAM,iBAAwB,WAC5B,OAAO,OAAO,CAAC,GAAG,MAAM,CAAC;;AAG3B,IAAa,0BAAb,MAAa,wBAAmD;CAC9D,0BAAyE,CAAC;CAC1E,2BAA0E,CAAC;CAC3E,uBAAsE,CAAC;CACvE,qBAAkE,CAAC;CACnE,wBAAwE,CAAC;CACzE,iBAA0D,CAAC;CAE3D,OAAO,OAAgC;EACrC,OAAO,IAAI,wBAAwB;CACrC;CAEA,oBAA6B,UAA4C;EACvE,KAAK,OAAO,KAAK,yBAAyB,KAAK;CACjD;CAEA,oBAA6B,UAA4C;EACvE,KAAK,OAAO,KAAK,0BAA0B,KAAK;CAClD;CAEA,oBAA6B,UAA4C;EACvE,KAAK,OAAO,KAAK,sBAAsB,KAAK;CAC9C;CAEA,kBAA2B,UAA0C;EACnE,KAAK,OAAO,KAAK,oBAAoB,KAAK;CAC5C;CAEA,qBAA8B,UAA6C;EACzE,KAAK,OAAO,KAAK,uBAAuB,KAAK;CAC/C;CAEA,IAAI,qBAA4D;EAC9D,OAAO,cAAc,KAAK,uBAAuB;CACnD;CAEA,IAAI,sBAA6D;EAC/D,OAAO,cAAc,KAAK,wBAAwB;CACpD;CAEA,IAAI,kBAAyD;EAC3D,OAAO,cAAc,KAAK,oBAAoB;CAChD;CAEA,IAAI,gBAAqD;EACvD,OAAO,cAAc,KAAK,kBAAkB;CAC9C;CAEA,IAAI,mBAA2D;EAC7D,OAAO,cAAc,KAAK,qBAAqB;CACjD;CAEA,IAAI,WAA4C;EAC9C,OAAO,cAAc,KAAK,cAAc;CAC1C;CAEA,QAAc;EACZ,KAAK,wBAAwB,SAAS;EACtC,KAAK,yBAAyB,SAAS;EACvC,KAAK,qBAAqB,SAAS;EACnC,KAAK,mBAAmB,SAAS;EACjC,KAAK,sBAAsB,SAAS;EACpC,KAAK,eAAe,SAAS;CAC/B;CAEA,WAA4C;EAC1C,OAAO,OAAO,OAAO;GACnB,oBAAoB,KAAK;GACzB,qBAAqB,KAAK;GAC1B,iBAAiB,KAAK;GACtB,eAAe,KAAK;GACpB,kBAAkB,KAAK;GACvB,UAAU,KAAK;EACjB,CAAC;CACH;CAEA,OAAmD,QAAiB,OAAoB;EACtF,OAAO,KAAK,KAAK;EACjB,KAAK,eAAe,KAAK,KAAK;CAChC;AACF;;;AC/DA,MAAM,kBAAkB,MAAc,UACpC,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;AAEzC,MAAM,gBAAgB,MAAwB,UAC5C,eAAe,KAAK,MAAM,MAAM,IAAI,KAAK,eAAe,KAAK,IAAI,MAAM,EAAE;AAE3E,MAAM,cAAc,SAA6C,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC;AAE1F,MAAM,cAAc,SAA6C,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC;AAE1F,MAAM,eAAe,MAAkC,cAAgC;CACrF,MAAM,OAAO,KAAK,KAAK,YAAY,QAAQ,UAAU;CAErD,IAAI,KAAK,KAAK,SAAS,OAAO,WAC5B,KAAK,KAAK,SAAS;CAGrB,OAAO;AACT;AAEA,MAAM,0CAA0B,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,yBAAyB,WAAmB,cAChD,aAAa,MACZ,aAAa,OAAQ,aAAa,OAClC,aAAa,SAAU,aAAa,SACpC,MAAM,KAAK,SAAS,KAAK,cAAc,OACxC,UAAU,KAAK,SAAS;;;;;;;;;AAU1B,MAAM,sBAAsB,UAA0B;CACpD,IAAI,UAAU;CAEd,KAAK,MAAM,aAAa,OAAO;EAC7B,MAAM,YAAY,UAAU,YAAY,CAAC;EAEzC,IAAI,cAAc,KAAA,GAChB;EAGF,IAAI,sBAAsB,WAAW,SAAS,KAAK,wBAAwB,IAAI,SAAS,GACtF,WAAW,IAAI,UAAU;OAEzB,WAAW;CAEf;CAEA,OAAO;AACT;;AAGA,MAAM,aAAa,QAAgB,UAA0B;CAC3D,MAAM,YAAsB,CAAC;CAE7B,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GACjD,UAAU,KAAK,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC;CAGtE,OAAO,GAAG,SAAS,UAAU,KAAK,GAAG,KAAK;AAC5C;;;;;;;AAQA,IAAa,uBAAb,MAAa,qBAAgD;CAMxC;CACA;CANnB,wBAAyB,IAAI,IAA8B;CAC3D,wBAAyB,IAAI,IAA2C;CACxE,4BAA6B,IAAI,IAAoB;CAErD,YACE,iBACA,WACA;EAFiB,KAAA,kBAAA;EACA,KAAA,YAAA;CAChB;;CAGH,OAAO,KAAK,UAAuC,CAAC,GAAyB;EAE3E,IAAI,OAAO,YAAY,YAAY,YAAY,MAC7C,MAAM,IAAI,UAAU,gDAAgD;EAItE,IAAI,QAAQ,oBAAoB,KAAA,KAAa,OAAO,QAAQ,oBAAoB,WAC9E,MAAM,IAAI,UAAU,wDAAwD;EAI9E,IAAI,QAAQ,cAAc,KAAA,KAAa,OAAO,QAAQ,cAAc,UAClE,MAAM,IAAI,UAAU,iDAAiD;EAGvE,OAAO,IAAI,qBAAqB,QAAQ,mBAAmB,MAAM,QAAQ,SAAS;CACpF;CAEA,oBAA6B,UAA4C;EACvE,MAAM,YAAY,MAAM,QAAQ;EAChC,MAAM,OAAO,YAAY,MAAM,gBAAgB,SAAS;EACxD,MAAM,OAAO,KAAK,WAAW,SAAS;EAEtC,KAAK,WAAW,IAAI;EACpB,KAAK,eAAe;EAEpB,IAAI,MAAM,QAAQ,WAAW,aAAa,KAAK,iBAC7C,KAAK,YAAY;EAGnB,MAAM,YAAY,KAAK,KAAK,SAAS;EAErC,IAAI,cAAc,KAAA,GAAW;GAC3B,IAAI,KAAK,cAAc,KAAA,GACrB,KAAK,UAAU,IAAI,YAAY,KAAK,UAAU,IAAI,SAAS,KAAK,KAAK,CAAC;GAGxE;EACF;EAEA,MAAM,UAAU,KAAK,MAAM,IAAI,SAAS,qBAAK,IAAI,IAA8B;EAC/E,MAAM,OACJ,QAAQ,IAAI,SAAS,YACd;GACL,MAAM,UAA4B;IAAE,MAAM;IAAW,IAAI;IAAW,aAAa;GAAE;GACnF,QAAQ,IAAI,WAAW,OAAO;GAC9B,OAAO;EACT,EAAA,CAAG;EAEL,KAAK,eAAe;EACpB,KAAK,MAAM,IAAI,WAAW,OAAO;CACnC;CAEA,oBAA6B,UAA4C;EACvE,MAAM,YAAY,MAAM,QAAQ;EAChC,MAAM,OAAO,YAAY,MAAM,gBAAgB,SAAS;EACxD,MAAM,OAAO,KAAK,WAAW,SAAS;EAEtC,KAAK,WAAW,IAAI;EACpB,KAAK,gBAAgB;EAErB,IAAI,MAAM,QAAQ,WAAW,aAAa,KAAK,iBAC7C,KAAK,YAAY;CAErB;;CAGA,SAA+B;EAC7B,MAAM,QAAQ,OAAO,OACnB,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC,CACtB,MAAM,CAAC,OAAO,CAAC,WAAW,eAAe,MAAM,KAAK,CAAC,CAAC,CACtD,KAAK,CAAC,KAAK,cACV,WAAW;GACT;GACA,aAAa,SAAS;GACtB,cAAc,SAAS;GACvB,UAAU,SAAS;EACrB,CAAC,CACH,CACJ;EACA,MAAM,QAAQ,OAAO,OACnB,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,CACrB,SAAS,YAAY,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,CAC3C,KAAK,SAAS,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CACtC,KAAK,YAAY,CACtB;EAEA,OAAO,OAAO,OAAO;GAAE;GAAO;EAAM,CAAC;CACvC;;CAGA,YAAoB;EAClB,MAAM,WAAW,KAAK,OAAO;EAC7B,MAAM,aAAa,IAAI,IACrB,SAAS,MAAM,KAAK,SAAS,CAAC,KAAK,KAAK,UAAU,YAAY,KAAK,GAAG,CAAC,CAAC,CAC1E;EACA,MAAM,QAAQ,CAAC,cAAc;EAC7B,MAAM,cAAc,CAAC,GAAG,KAAK,UAAU,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAC/D,eAAe,MAAM,KAAK,CAC5B;EACA,MAAM,OACJ,KAAK,cAAc,KAAA,KAAa,YAAY,SAAS,IACjD;GAAE,IAAI,UAAU,SAAS,KAAK,SAAS;GAAG,OAAO,KAAK;EAAU,IAChE,KAAA;EAEN,IAAI,SAAS,KAAA,GACX,MAAM,KAAK,KAAK,KAAK,GAAG,IAAI,mBAAmB,KAAK,KAAK,EAAE,GAAG;EAGhE,KAAK,MAAM,QAAQ,SAAS,OAAO;GACjC,MAAM,KAAK,WAAW,IAAI,KAAK,GAAG;GAElC,IAAI,OAAO,KAAA,GACT,MAAM,KAAK,KAAK,GAAG,IAAI,mBAAmB,KAAK,GAAG,EAAE,GAAG;EAE3D;EAEA,IAAI,SAAS,KAAA,GACX,KAAK,MAAM,CAAC,WAAW,gBAAgB,aAAa;GAClD,MAAM,WAAW,WAAW,IAAI,SAAS;GAEzC,IAAI,aAAa,KAAA,GACf,MAAM,KAAK,KAAK,KAAK,GAAG,OAAO,YAAY,IAAI,UAAU;EAE7D;EAGF,KAAK,MAAM,QAAQ,SAAS,OAAO;GACjC,MAAM,SAAS,WAAW,IAAI,KAAK,IAAI;GACvC,MAAM,OAAO,WAAW,IAAI,KAAK,EAAE;GAEnC,IAAI,WAAW,KAAA,KAAa,SAAS,KAAA,GACnC,MAAM,KAAK,KAAK,OAAO,OAAO,KAAK,YAAY,IAAI,MAAM;EAE7D;EAEA,OAAO,MAAM,KAAK,IAAI;CACxB;;CAGA,QAAc;EACZ,KAAK,MAAM,MAAM;EACjB,KAAK,MAAM,MAAM;EACjB,KAAK,UAAU,MAAM;CACvB;CAEA,WAAmB,KAA+B;EAChD,MAAM,WAAW,KAAK,MAAM,IAAI,GAAG;EAEnC,IAAI,aAAa,KAAA,GACf,OAAO;EAGT,MAAM,OAAyB;GAAE,aAAa;GAAG,cAAc;GAAG,UAAU;EAAE;EAC9E,KAAK,MAAM,IAAI,KAAK,IAAI;EACxB,OAAO;CACT;CAEA,WAAmB,MAA+B;EAChD,KAAK,MAAM,OAAO,MAChB,KAAK,WAAW,GAAG;CAEvB;AACF;;;;;;;AClIA,IAAa,2BAAb,cAA8C,MAAM;CAClD;CACA;CAEA,YACE,iBACA,eACA;EACA,MAAM,aAAa,GAAG,gBAAgB,OAAO,QAAQ,gBAAgB,WAAW,IAAI,KAAK;EACzF,MAAM,WAAW,GAAG,cAAc,OAAO,MAAM,cAAc,WAAW,IAAI,KAAK;EAEjF,MACE,iDAAiD,WAAW,mBAAmB,SAAS,iBAC1F;EAEA,KAAK,OAAO;EACZ,KAAK,kBAAkB,OAAO,OAAO,CAAC,GAAG,eAAe,CAAC;EACzD,KAAK,gBAAgB,OAAO,OAAO,CAAC,GAAG,aAAa,CAAC;CACvD;AACF;;;;;AAMA,IAAa,cAAb,MAAa,YAA4E;CAU5E;CAEA;CAXX;CACA;CACA;CACA;CAEA;CAEA,YAEE,SAEA,UACA,OACA,QACA,QACA,aACA;EAPS,KAAA,UAAA;EAEA,KAAA,WAAA;EAOT,KAAK,QAAQ;EAEb,KAAK,SAAS;EAEd,KAAK,SAAS;EAEd,KAAK,cAAc;CACrB;CAYA,aAAa,KACX,OACA,SACkF;EAElF,MAAM,kBAAkB,YAAY,KAAA,IAAa,CAAC,IAAgB;EAElE,OAAO,YAAY,aAAa,OAAO,eAAe;CACxD;CAEA,aAAqB,aAInB,OACA,SACkF;EAClF,MAAM,WAAW,wBAAwB,KAAK;EAC9C,MAAM,gBAAgB,iBAAiB,OAAO,OAAO;EACrD,MAAM,iBAAiC;GACrC,GAAG;GACH,SAAS,QAAQ,WAAW,IAAI,gBAAgB;GAChD,WAAW,CAAC,UAAU,GAAI,QAAQ,aAAa,CAAC,CAAE;EACpD;EAEA,MAAM,aAAa;EAEnB,MAAM,UAAU,MAAM,QAAQ,KAAK,YAAY,cAAc;EAE7D,OAAO,IAAI,YACT,SACA,UACA,QAAQ,OACR,QAAQ,QACR,QAAQ,QACR,QAAQ,WACV;CACF;;CAGA,IACE,SACA,SACqB;EACrB,OAAO,KAAK,QAAQ,IAAI,SAAS,OAAO;CAC1C;;CAGA,QACE,OACA,SACA,SACqB;EACrB,OAAO,KAAK,QAAQ,QAAQ,OAAO,SAAS,OAAO;CACrD;;CAGA,QAAQ,SAAgD;EACtD,OAAO,KAAK,iBAAiB,OAAO;CACtC;;CAGA,CAAC,OAAO,gBAA+B;EACrC,OAAO,KAAK,QAAQ;CACtB;CAEA,mBAA2B,SAAsC;EAC/D,OAAO,KAAK,iBAAiB,OAAO;CACtC;CAEA,iBAAyB,OAA6D;EACpF,IAAI,KAAK,oBAAoB,KAAA,GAC3B,OAAO,KAAK;EAGd,MAAM,WACJ,UAAU,KAAA,IACN,KAAK,QAAQ,QAAQ,IACrB,eAAe,KAAK,IAClB,KAAK,QAAQ,QAAQ,KAAK,IAC1B,KAAK,QAAQ,QAAQ,KAAK;EAClC,KAAK,kBAAkB,SAAS,WACxB,KAAK,0BAA0B,IACpC,UAAU;GACT,MAAM,kBAAkB,KAAK,2BAA2B;GAExD,IAAI,oBAAoB,KAAA,GACtB,MAAM;GAGR,MAAM,SAAS,iBAAiB,oBAAoB,MAAM,SAAS,CAAC,KAAK;GACzE,MAAM,IAAI,kBAAkB,CAAC,GAAG,QAAQ,eAAe,CAAC;EAC1D,CACF;EAEA,OAAO,KAAK;CACd;CAEA,4BAA0C;EACxC,MAAM,UAAU,KAAK,2BAA2B;EAEhD,IAAI,YAAY,KAAA,GACd,MAAM;CAEV;CAEA,6BAA2E;EACzE,MAAM,YAAY,6BAChB,KAAK,SAAS,iBACd,KAAK,SAAS,aAChB;EAEA,IAAI,UAAU,OAAO,WAAW,KAAK,UAAU,KAAK,WAAW,GAC7D;EAGF,OAAO,IAAI,yBAAyB,UAAU,QAAQ,UAAU,IAAI;CACtE;CAcA,aAAa,IACX,OACA,cAGA,UACqB;EACrB,IAAI;EACJ,IAAI;EAGJ,IAAI,OAAO,iBAAiB,YAAY;GACtC,MAAM;GAEN,kBAAkB,CAAC;EACrB,OAAO;GACL,MAAM;GACN,kBAAkB;EACpB;EAEA,IAAI,QAAQ,KAAA,GACV,MAAM,IAAI,UAAU,qCAAqC;EAG3D,MAAM,OAAO,MAAM,YAAY,aAAa,OAAO,eAAe;EAClE,IAAI;EACJ,IAAI,kBAAkB;EACtB,IAAI;EACJ,IAAI;EAEJ,IAAI;GACF,QAAQ,MAAM,IAAI,IAAI;GACtB,UAAU,uBAAuB,KAAK;EACxC,SAAS,OAAO;GACd,kBAAkB;GAClB,mBAAmB;GACnB,UAAU;IAAE,QAAQ;IAAW;GAAM;EACvC;EAEA,IAAI;GACF,MAAM,KAAK,mBAAmB,OAAO;EACvC,SAAS,gBAAgB;GACvB,IAAI,CAAC,mBAAmB,QAAQ,WAAW,WACzC,MAAM;EAEV;EAEA,IAAI,iBACF,MAAM;EAGR,OAAO;CACT;AACF;AAEA,MAAM,kBAAkB,UACtB,YAAY;AAEd,MAAM,oBACJ,OACA,YACoC;CACpC,MAAM,YAAY,CAAC,GAAI,QAAQ,aAAa,CAAC,CAAE;CAE/C,IAAI,QAAQ,UAAU,KAAA,GACpB,UAAU,KAAK,MAAM,QAAQ,OAAO,QAAQ,KAAK,CAAC;CAGpD,IAAI,QAAQ,WAAW,KAAA,GACrB,UAAU,KAAK,MAAM,QAAQ,QAAQ,QAAQ,MAAM,CAAC;CAGtD,IAAI,QAAQ,WAAW,KAAA,GACrB,UAAU,KAAK,MAAM,QAAQ,QAAQ,QAAQ,MAAM,CAAC;CAGtD,IAAI,QAAQ,gBAAgB,KAAA,GAC1B,UAAU,KAAK,MAAM,QAAQ,aAAa,QAAQ,WAAW,CAAC;CAIhE,MAAM,aAAa;CAEnB,MAAM,iBAAiB;CAGvB,OAAO,MAAM,SAAiD,YAAY,GAAG,cAAc;AAC7F;AAOA,MAAM,gCACJ,QACA,SAC6B;CAC7B,MAAM,YAAY,qBAAqB,IAAI;CAC3C,MAAM,kBAAgD,CAAC;CAEvD,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,QAAQ,UAAU,IAAI,MAAM,KAAK,KAAK;EAE5C,IAAI,UAAU,GACZ,gBAAgB,KAAK,KAAK;OAE1B,UAAU,IAAI,MAAM,OAAO,QAAQ,CAAC;CAExC;CAEA,MAAM,cAAc,qBAAqB,MAAM;CAC/C,MAAM,gBAA4C,CAAC;CAEnD,KAAK,MAAM,SAAS,MAAM;EACxB,MAAM,QAAQ,YAAY,IAAI,MAAM,KAAK,KAAK;EAE9C,IAAI,UAAU,GACZ,cAAc,KAAK,KAAK;OAExB,YAAY,IAAI,MAAM,OAAO,QAAQ,CAAC;CAE1C;CAEA,OAAO;EAAE,QAAQ;EAAiB,MAAM;CAAc;AACxD;AAEA,MAAM,wBACJ,WACwB;CACxB,MAAM,yBAAS,IAAI,IAAoB;CAEvC,KAAK,MAAM,SAAS,QAClB,OAAO,IAAI,MAAM,QAAQ,OAAO,IAAI,MAAM,KAAK,KAAK,KAAK,CAAC;CAG5D,OAAO;AACT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "better-effect",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Effect-inspired application architecture for better-result with typechecked Services and environments, scoped resource lifetimes, and pluggable DI backends.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"better-result",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
".": "./dist/index.mjs",
|
|
32
32
|
"./adapters/iti": "./dist/adapters/iti.mjs",
|
|
33
33
|
"./hono": "./dist/hono.mjs",
|
|
34
|
+
"./node": "./dist/node.mjs",
|
|
34
35
|
"./runtime/explicit": "./dist/runtime/explicit.mjs",
|
|
35
36
|
"./runtime/node": "./dist/runtime/node.mjs",
|
|
36
37
|
"./standard-services": "./dist/standard-services.mjs",
|
|
@@ -60,18 +61,22 @@
|
|
|
60
61
|
"format:check": "oxfmt --check .",
|
|
61
62
|
"publint": "publint",
|
|
62
63
|
"check:public-type-namespaces": "bun run test:package-types && bun run test:package-types:minimum && bun tests/package/public-type-namespaces/check.ts",
|
|
64
|
+
"check:node-runtime": "bun tests/check-node-runtime.ts",
|
|
63
65
|
"check:standard-services": "bun run test:package-standard-services && bun run test:package-standard-services:minimum",
|
|
64
66
|
"check:public-type-variance": "bun run test:package-variance && bun run test:package-variance:minimum && bun tests/package/public-type-variance/check.ts",
|
|
65
67
|
"check:instance-requirements": "bun tests/package/instance-requirements/check.ts",
|
|
66
|
-
"check": "bun run typecheck && bun test && bun run format:check && bun run
|
|
68
|
+
"check": "bun run typecheck && bun test && bun run format:check && bun run check:node-runtime && bun run check:public-type-namespaces && bun run check:standard-services && bun run check:public-type-variance && bun run check:instance-requirements && bun run publint && bun run lint",
|
|
67
69
|
"prepublishOnly": "bun run check",
|
|
68
70
|
"release:dry": "bun publish --dry-run"
|
|
69
71
|
},
|
|
70
72
|
"devDependencies": {
|
|
71
|
-
"@types/bun": "
|
|
73
|
+
"@types/bun": "1.3.14",
|
|
74
|
+
"@types/jsdom": "21.1.7",
|
|
72
75
|
"hono": "^4.9.0",
|
|
73
76
|
"iti": "^0.8.0",
|
|
77
|
+
"jsdom": "26.1.0",
|
|
74
78
|
"lefthook": "^2.1.10",
|
|
79
|
+
"mermaid": "11.17.2",
|
|
75
80
|
"oxfmt": "^0.63.0",
|
|
76
81
|
"oxlint": "^1.78.0",
|
|
77
82
|
"oxlint-tsgolint": "^7.0.2001",
|