definitely-fine 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["context: RuntimeScenarioContext","callback: () => TResult","directory: string","scenarioId: string","message: string","cause: unknown","startPath: string","path: string","packageRootPath: string","nodeModulesDirectory","installedPackageDirectory","directory: string","options: ResolveJsonScenarioStorageAdapterDirectoryOptions","value: unknown","scenarioId: string","scenarioFilePath: string","serializedScenarioText: string","parsedValue: unknown","options: JsonScenarioStorageAdapterOptions","scenario: SerializedScenario","message: string","options?: ErrorOptions","options: ScenarioStorageSelectionInput","errorFactories: ErrorFactoryRegistry<TContract>","factoryName: string","errorFactories: ErrorFactoryRegistry<TContract> | undefined","factoryName: ContractErrorFactoryName<TContract> | string","cacheEntries: Map<string, RuntimeScenarioCacheEntry>","scenarioId: string","ttlMs: number","options: RuntimeCacheOptions","runtimeScenario: RuntimeScenario","scenarioId: string","scenario: SerializedScenario | undefined","#scenario","target: SerializedTarget","#targetCounters","left: SerializedTarget","right: SerializedTarget","targetCounters: RuntimeTargetCounters","options: RuntimeRuleResolutionOptions","options: RuntimeScenarioLoaderServiceOptions","left: SerializedTarget","right: SerializedTarget","target: SerializedTarget","context: ScenarioBuilderContext<TContract>","callNumber: number","action: SerializedRule[\"action\"]","value: TReturnValue","message: string","factory: TFactoryName","service: TServiceName","method: TMethodName","fn: TFunctionName","adapter: IScenarioStorageAdapter","implementation: TFunction","options: WrappedFunctionOptions<TContract>","options: {\n /**\n * Service instance whose callable methods may be wrapped.\n */\n implementation: TService;\n /**\n * Factory that wraps each intercepted service method.\n */\n createWrapper: <TFunction extends UnknownFunction>(\n implementation: TFunction,\n wrappedOptions: WrappedFunctionOptions<TContract>,\n ) => TFunction;\n /**\n * Contract service name represented by the wrapped instance.\n */\n service: string;\n /**\n * Creates typed errors for `throw-factory` scenario actions.\n */\n runtimeErrorFactory: IRuntimeErrorFactory<TContract>;\n /**\n * Resolves the current runtime scenario from async context and cache.\n */\n runtimeScenarioLoaderService: IRuntimeScenarioLoaderService;\n}","targetRule: SerializedTarget","options: ScenarioOptions","options: RuntimeOptions<TContract>","name: TFunctionName","implementation: ContractFunction<TContract, TFunctionName>","service: TServiceName","method: TMethodName","implementation: ContractServiceMethod<\n TContract,\n TServiceName,\n TMethodName\n >","implementation: TContract[\"services\"][TServiceName]"],"sources":["../src/runtime-scenario-context.ts","../src/services/utils/get-scenario-file-path.ts","../src/services/impls/JsonScenarioStorageAdapter.ts","../src/runtime-errors.ts","../src/adapter-resolution.ts","../src/services/impls/RuntimeErrorFactory.ts","../src/services/impls/RuntimeScenarioCacheService.ts","../src/runtime-matcher.ts","../src/services/impls/RuntimeScenarioLoaderService.ts","../src/services/impls/ScenarioBuilderService.ts","../src/runtime-wrappers.ts","../src/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { RuntimeScenarioContext } from \"./types.js\";\n\nconst runtimeScenarioContextStorage =\n new AsyncLocalStorage<RuntimeScenarioContext>();\n\n/**\n * Runs a callback inside a request-scoped runtime scenario context.\n * @public\n *\n * @example\n * ```ts\n * runWithRuntimeScenarioContext({ scenarioId: \"checkout\" }, () => {\n * return getRuntimeScenarioId();\n * });\n * ```\n */\nexport function runWithRuntimeScenarioContext<TResult>(\n context: RuntimeScenarioContext,\n callback: () => TResult,\n): TResult {\n return runtimeScenarioContextStorage.run(context, callback);\n}\n\n/**\n * Returns the active runtime scenario id for the current async scope.\n * @public\n *\n * @example\n * ```ts\n * const scenarioId = getRuntimeScenarioId();\n * ```\n */\nexport function getRuntimeScenarioId(): string | undefined {\n return runtimeScenarioContextStorage.getStore()?.scenarioId;\n}\n","import { join } from \"node:path\";\n\n/**\n * Builds the persisted JSON file path for a scenario id.\n * @internal\n */\nexport function getScenarioFilePath(\n directory: string,\n scenarioId: string,\n): string {\n return join(directory, `${scenarioId}.json`);\n}\n","import { readFileSync, realpathSync, statSync } from \"node:fs\";\nimport { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport {\n basename,\n dirname,\n isAbsolute,\n join,\n parse,\n relative,\n} from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { IScenarioStorageAdapter } from \"../interfaces/IScenarioStorageAdapter.js\";\nimport { getScenarioFilePath } from \"../utils/get-scenario-file-path.js\";\nimport type { SerializedRule, SerializedScenario } from \"../../types.js\";\n\n/**\n * Options for the built-in JSON scenario storage adapter.\n * @public\n */\nexport type JsonScenarioStorageAdapterOptions = {\n /**\n * Directory where scenario JSON files should be stored.\n */\n directory?: string;\n};\n\ntype ResolveJsonScenarioStorageAdapterDirectoryOptions = {\n /**\n * Directory override for the resolved scenario storage location.\n */\n directory?: string;\n /**\n * Module URL used to locate the installed package root.\n */\n moduleUrl?: string;\n};\n\nfunction createJsonScenarioStorageAdapterError(\n message: string,\n cause: unknown,\n): Error {\n return new Error(message, { cause });\n}\n\nfunction findNodeModulesDirectory(startPath: string): string | undefined {\n let currentPath = dirname(startPath);\n const { root } = parse(currentPath);\n\n while (currentPath !== root) {\n if (basename(currentPath) === \"node_modules\") {\n return currentPath;\n }\n\n currentPath = dirname(currentPath);\n }\n\n if (basename(currentPath) === \"node_modules\") {\n return currentPath;\n }\n\n return undefined;\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch (_error) {\n return false;\n }\n}\n\nfunction findInstalledPackageNodeModulesDirectory(\n packageRootPath: string,\n): string | undefined {\n let currentPath = process.cwd();\n const { root } = parse(currentPath);\n\n while (currentPath !== root) {\n const nodeModulesDirectory = join(currentPath, \"node_modules\");\n const installedPackageDirectory = join(\n nodeModulesDirectory,\n \"definitely-fine\",\n );\n\n if (\n isDirectory(installedPackageDirectory) &&\n realpathSync(installedPackageDirectory) === packageRootPath\n ) {\n return nodeModulesDirectory;\n }\n\n currentPath = dirname(currentPath);\n }\n\n const nodeModulesDirectory = join(currentPath, \"node_modules\");\n const installedPackageDirectory = join(\n nodeModulesDirectory,\n \"definitely-fine\",\n );\n\n if (\n isDirectory(installedPackageDirectory) &&\n realpathSync(installedPackageDirectory) === packageRootPath\n ) {\n return nodeModulesDirectory;\n }\n\n return undefined;\n}\n\nfunction isPathInsideDirectory(path: string, directory: string): boolean {\n const relativePath = relative(directory, path);\n\n return (\n relativePath === \"\" ||\n (!relativePath.startsWith(\"..\") && !isAbsolute(relativePath))\n );\n}\n\n/**\n * Resolves the default directory used by the built-in JSON scenario adapter.\n * @public\n *\n * @example\n * ```ts\n * import { resolveJsonScenarioStorageAdapterDirectory } from \"definitely-fine\";\n *\n * const directory = resolveJsonScenarioStorageAdapterDirectory({\n * directory: \".definitely-fine\",\n * });\n * ```\n */\nexport function resolveJsonScenarioStorageAdapterDirectory(\n options: ResolveJsonScenarioStorageAdapterDirectoryOptions,\n): string {\n if (options.directory !== undefined) {\n return options.directory;\n }\n\n const unresolvedModuleFilePath = fileURLToPath(\n options.moduleUrl ?? import.meta.url,\n );\n const symlinkedNodeModulesDirectory = findNodeModulesDirectory(\n unresolvedModuleFilePath,\n );\n\n if (symlinkedNodeModulesDirectory !== undefined) {\n return join(\n symlinkedNodeModulesDirectory,\n \".cache\",\n \"definitely-fine\",\n \"scenarios\",\n );\n }\n\n const moduleFilePath = realpathSync(unresolvedModuleFilePath);\n const nodeModulesDirectory = findNodeModulesDirectory(moduleFilePath);\n\n if (nodeModulesDirectory !== undefined) {\n return join(nodeModulesDirectory, \".cache\", \"definitely-fine\", \"scenarios\");\n }\n\n if (\n options.moduleUrl === undefined &&\n !isPathInsideDirectory(moduleFilePath, process.cwd())\n ) {\n const workingDirectoryNodeModulesDirectory =\n findInstalledPackageNodeModulesDirectory(\n dirname(dirname(moduleFilePath)),\n );\n\n if (workingDirectoryNodeModulesDirectory !== undefined) {\n return join(\n workingDirectoryNodeModulesDirectory,\n \".cache\",\n \"definitely-fine\",\n \"scenarios\",\n );\n }\n }\n\n throw new Error(\n `Could not infer the default file scenario adapter directory from ${moduleFilePath}. Provide an explicit directory instead.`,\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isValidIsoTimestamp(value: unknown): value is string {\n if (typeof value !== \"string\") {\n return false;\n }\n\n const parsed = new Date(value);\n\n return !Number.isNaN(parsed.valueOf()) && parsed.toISOString() === value;\n}\n\nfunction isSerializedTarget(value: unknown): value is SerializedRule[\"target\"] {\n if (!isRecord(value) || typeof value.kind !== \"string\") {\n return false;\n }\n\n if (value.kind === \"function\") {\n return typeof value.function === \"string\";\n }\n\n if (value.kind === \"service-method\") {\n return (\n typeof value.service === \"string\" && typeof value.method === \"string\"\n );\n }\n\n return false;\n}\n\nfunction isSerializedAction(value: unknown): value is SerializedRule[\"action\"] {\n if (!isRecord(value) || typeof value.kind !== \"string\") {\n return false;\n }\n\n if (value.kind === \"return\") {\n return \"value\" in value;\n }\n\n if (value.kind === \"throw-message\") {\n return typeof value.message === \"string\";\n }\n\n if (value.kind === \"throw-factory\") {\n return typeof value.factory === \"string\";\n }\n\n return false;\n}\n\nfunction isSerializedRule(value: unknown): value is SerializedRule {\n return (\n isRecord(value) &&\n typeof value.callNumber === \"number\" &&\n Number.isInteger(value.callNumber) &&\n value.callNumber > 0 &&\n isSerializedTarget(value.target) &&\n isSerializedAction(value.action)\n );\n}\n\nfunction isSerializedScenario(value: unknown): value is SerializedScenario {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n value.version === 1 &&\n isValidIsoTimestamp(value.createdAt) &&\n Array.isArray(value.rules) &&\n value.rules.every((rule) => isSerializedRule(rule))\n );\n}\n\nfunction loadSerializedScenario(\n scenarioId: string,\n scenarioFilePath: string,\n): SerializedScenario | undefined {\n let serializedScenarioText: string;\n\n try {\n serializedScenarioText = readFileSync(scenarioFilePath, \"utf8\");\n } catch (error) {\n if (isRecord(error) && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n\n try {\n const parsedValue: unknown = JSON.parse(serializedScenarioText);\n\n if (!isSerializedScenario(parsedValue) || parsedValue.id !== scenarioId) {\n throw new Error(\n `Invalid persisted scenario data in ${scenarioFilePath}.`,\n );\n }\n\n return parsedValue;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message ===\n `Invalid persisted scenario data in ${scenarioFilePath}.`\n ) {\n throw error;\n }\n\n throw new Error(`Invalid persisted scenario data in ${scenarioFilePath}.`, {\n cause: error,\n });\n }\n}\n\n/**\n * Persists scenarios as JSON files in a local directory.\n *\n * @example\n * ```ts\n * import { JsonScenarioStorageAdapter } from \"definitely-fine\";\n *\n * const adapter = new JsonScenarioStorageAdapter({\n * directory: \".definitely-fine\",\n * });\n * ```\n * @public\n */\nexport class JsonScenarioStorageAdapter implements IScenarioStorageAdapter {\n readonly directory: string;\n\n constructor(options: JsonScenarioStorageAdapterOptions = {}) {\n this.directory = resolveJsonScenarioStorageAdapterDirectory(options);\n }\n\n async deleteScenario(scenarioId: string): Promise<void> {\n await rm(getScenarioFilePath(this.directory, scenarioId), {\n force: true,\n });\n }\n\n describeScenarioLocation(scenarioId: string): string {\n return getScenarioFilePath(this.directory, scenarioId);\n }\n\n loadScenario(scenarioId: string): SerializedScenario | undefined {\n return loadSerializedScenario(\n scenarioId,\n getScenarioFilePath(this.directory, scenarioId),\n );\n }\n\n async saveScenario(scenario: SerializedScenario): Promise<void> {\n try {\n await mkdir(this.directory, { recursive: true });\n } catch (error) {\n throw createJsonScenarioStorageAdapterError(\n `Could not create the file scenario adapter directory at ${this.directory}.`,\n error,\n );\n }\n\n const scenarioFilePath = getScenarioFilePath(this.directory, scenario.id);\n\n try {\n await writeFile(scenarioFilePath, JSON.stringify(scenario, null, 2));\n } catch (error) {\n throw createJsonScenarioStorageAdapterError(\n `Could not write the file scenario adapter payload to ${scenarioFilePath}.`,\n error,\n );\n }\n }\n}\n","/**\n * Signals that runtime setup is missing required configuration.\n * @public\n *\n * @example\n * ```ts\n * import { RuntimeConfigurationError } from \"definitely-fine\";\n *\n * throw new RuntimeConfigurationError(\"A scenario adapter is required.\");\n * ```\n */\nexport class RuntimeConfigurationError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"RuntimeConfigurationError\";\n }\n}\n","import type { IScenarioStorageAdapter } from \"./services/interfaces/IScenarioStorageAdapter.js\";\n\nimport { RuntimeConfigurationError } from \"./runtime-errors.js\";\n\ntype ScenarioStorageSelectionInput = {\n /**\n * Explicit storage adapter to use for scenario persistence.\n */\n adapter?: IScenarioStorageAdapter | undefined;\n /**\n * Filesystem directory to use when resolving the built-in storage adapter.\n */\n directory?: string | undefined;\n};\n\n/**\n * Internal normalization result for runtime and scenario storage options.\n * @internal\n */\nexport type ScenarioStorageSelection =\n | {\n /**\n * Marks the selection as an explicit adapter.\n */\n kind: \"adapter\";\n /**\n * Adapter chosen for persistence operations.\n */\n adapter: IScenarioStorageAdapter;\n }\n | {\n /**\n * Marks the selection as a directory-backed configuration.\n */\n kind: \"directory\";\n /**\n * Directory path used to build the storage adapter.\n */\n directory: string;\n }\n | {\n /**\n * Marks the selection as the built-in default adapter.\n */\n kind: \"default\";\n };\n\n/**\n * Normalizes storage options into an adapter, directory, or missing state.\n * @internal\n */\nexport function resolveScenarioStorageSelection(\n options: ScenarioStorageSelectionInput,\n): ScenarioStorageSelection {\n if (options.adapter !== undefined && options.directory !== undefined) {\n throw new RuntimeConfigurationError(\n \"A storage adapter and directory cannot be used together.\",\n );\n }\n\n if (options.adapter) {\n return {\n kind: \"adapter\",\n adapter: options.adapter,\n };\n }\n\n if (options.directory !== undefined) {\n return {\n kind: \"directory\",\n directory: options.directory,\n };\n }\n\n return { kind: \"default\" };\n}\n","import { RuntimeConfigurationError } from \"../../runtime-errors.js\";\nimport type { IRuntimeErrorFactory } from \"../interfaces/IRuntimeErrorFactory.js\";\nimport type {\n ContractErrorFactoryName,\n ErrorFactoryRegistry,\n SutContract,\n} from \"../../types.js\";\n\nfunction hasRuntimeFactory<TContract extends SutContract>(\n errorFactories: ErrorFactoryRegistry<TContract>,\n factoryName: string,\n): factoryName is ContractErrorFactoryName<TContract> {\n return factoryName in errorFactories;\n}\n\n/**\n * Default runtime factory-error resolver implementation.\n * @internal\n */\nexport class RuntimeErrorFactory<\n TContract extends SutContract,\n> implements IRuntimeErrorFactory<TContract> {\n private readonly errorFactories: ErrorFactoryRegistry<TContract>;\n\n constructor(errorFactories: ErrorFactoryRegistry<TContract> | undefined) {\n this.errorFactories = errorFactories ?? {};\n }\n\n create(\n factoryName: ContractErrorFactoryName<TContract> | string,\n ...input: [input?: unknown]\n ): Error {\n if (!hasRuntimeFactory(this.errorFactories, factoryName)) {\n throw new RuntimeConfigurationError(\n `No runtime error factory registered for \"${factoryName}\".`,\n );\n }\n\n const factory = this.errorFactories[factoryName];\n\n if (typeof factory !== \"function\") {\n throw new RuntimeConfigurationError(\n `No runtime error factory registered for \"${factoryName}\".`,\n );\n }\n\n return Reflect.apply(factory, undefined, input);\n }\n}\n","import { RuntimeScenario } from \"../../runtime-matcher.js\";\nimport type { IRuntimeScenarioCacheService } from \"../interfaces/IRuntimeScenarioCacheService.js\";\n\nconst DEFAULT_RUNTIME_SCENARIO_CACHE_TTL_MS = 60_000;\n\n/**\n * Cache retention configuration for loaded runtime scenarios.\n * @public\n */\nexport type RuntimeCacheOptions = {\n /**\n * Inactivity window before a cached scenario is evicted.\n */\n ttlMs?: number;\n};\n\ntype RuntimeScenarioCacheEntry = {\n /**\n * Reusable runtime scenario state for the cached id.\n */\n runtimeScenario: RuntimeScenario;\n /**\n * Timer that evicts the entry after a period of inactivity.\n */\n evictionTimer: ReturnType<typeof setTimeout>;\n};\n\nfunction scheduleEntryEviction(\n cacheEntries: Map<string, RuntimeScenarioCacheEntry>,\n scenarioId: string,\n ttlMs: number,\n): ReturnType<typeof setTimeout> {\n const evictionTimer = setTimeout(() => {\n cacheEntries.delete(scenarioId);\n }, ttlMs);\n\n evictionTimer.unref?.();\n\n return evictionTimer;\n}\n\n/**\n * Default runtime scenario cache with inactivity-based eviction.\n * @internal\n */\nexport class RuntimeScenarioCacheService implements IRuntimeScenarioCacheService {\n private readonly ttlMs: number;\n\n private readonly cacheEntries = new Map<string, RuntimeScenarioCacheEntry>();\n\n constructor(options: RuntimeCacheOptions = {}) {\n this.ttlMs = options.ttlMs ?? DEFAULT_RUNTIME_SCENARIO_CACHE_TTL_MS;\n }\n\n has(scenarioId: string): boolean {\n return this.cacheEntries.has(scenarioId);\n }\n\n get(scenarioId: string): RuntimeScenario | undefined {\n const cacheEntry = this.cacheEntries.get(scenarioId);\n\n if (cacheEntry) {\n clearTimeout(cacheEntry.evictionTimer);\n cacheEntry.evictionTimer = scheduleEntryEviction(\n this.cacheEntries,\n scenarioId,\n this.ttlMs,\n );\n\n return cacheEntry.runtimeScenario;\n }\n\n return undefined;\n }\n\n set(scenarioId: string, runtimeScenario: RuntimeScenario): void {\n const cacheEntry = this.cacheEntries.get(scenarioId);\n\n if (cacheEntry) {\n clearTimeout(cacheEntry.evictionTimer);\n }\n\n this.cacheEntries.set(scenarioId, {\n runtimeScenario,\n evictionTimer: scheduleEntryEviction(\n this.cacheEntries,\n scenarioId,\n this.ttlMs,\n ),\n });\n }\n}\n","import type {\n SerializedRule,\n SerializedScenario,\n SerializedTarget,\n} from \"./types.js\";\n\ntype RuntimeTargetCounters = Map<string, number>;\n\n/**\n * Internal result for matching a runtime target against scenario rules.\n * @internal\n */\nexport type RuntimeRuleMatch = {\n /**\n * Incremented call number for the matched target.\n */\n callNumber: number;\n /**\n * Scenario rule that applies to the current call, if any.\n */\n rule: SerializedRule | undefined;\n};\n\ntype RuntimeRuleMatchOptions = {\n /**\n * Persisted scenario document containing candidate rules.\n */\n scenario: SerializedScenario;\n /**\n * Function or service-method target being matched.\n */\n target: SerializedTarget;\n};\n\ntype RuntimeRuleResolutionOptions = RuntimeRuleMatchOptions & {\n /**\n * Per-target call counters held by the runtime scenario state.\n */\n targetCounters: RuntimeTargetCounters;\n};\n\n/**\n * Reusable runtime scenario state bound to a single scenario id.\n * @internal\n */\nexport class RuntimeScenario {\n /**\n * Stable identifier for the runtime scenario state.\n */\n readonly id: string;\n\n #scenario: SerializedScenario | undefined;\n #targetCounters: RuntimeTargetCounters = new Map();\n\n constructor(scenarioId: string, scenario: SerializedScenario | undefined) {\n this.id = scenarioId;\n this.#scenario = scenario;\n }\n\n /**\n * Replaces the currently loaded persisted scenario document.\n * @internal\n */\n setSerializedScenario(scenario: SerializedScenario | undefined): void {\n this.#scenario = scenario;\n }\n\n /**\n * Resolves the next matching rule for a target call, if this scenario has any.\n * @internal\n */\n resolveRuleMatch(target: SerializedTarget): RuntimeRuleMatch | undefined {\n if (!this.#scenario || !hasScenarioRuleForTarget(this.#scenario, target)) {\n return undefined;\n }\n\n return resolveRuntimeRuleMatch({\n scenario: this.#scenario,\n target,\n targetCounters: this.#targetCounters,\n });\n }\n}\n\nfunction getTargetKey(target: SerializedTarget): string {\n if (target.kind === \"function\") {\n return `function:${target.function}`;\n }\n\n return `service:${target.service}:${target.method}`;\n}\n\nfunction isSameTarget(\n left: SerializedTarget,\n right: SerializedTarget,\n): boolean {\n if (left.kind !== right.kind) {\n return false;\n }\n\n if (left.kind === \"function\" && right.kind === \"function\") {\n return left.function === right.function;\n }\n\n if (left.kind === \"service-method\" && right.kind === \"service-method\") {\n return left.service === right.service && left.method === right.method;\n }\n\n return false;\n}\n\nfunction incrementTargetCounter(\n targetCounters: RuntimeTargetCounters,\n target: SerializedTarget,\n): number {\n const targetKey = getTargetKey(target);\n const nextCallNumber = (targetCounters.get(targetKey) ?? 0) + 1;\n\n targetCounters.set(targetKey, nextCallNumber);\n\n return nextCallNumber;\n}\n\n/**\n * Checks whether a scenario contains any rule for a target.\n * @internal\n */\nexport function hasScenarioRuleForTarget(\n scenario: SerializedScenario | undefined,\n target: SerializedTarget,\n): boolean {\n if (!scenario) {\n return false;\n }\n\n return scenario.rules.some((rule) => isSameTarget(rule.target, target));\n}\n\n/**\n * Resolves the next matching rule for a target call.\n * @internal\n */\nfunction resolveRuntimeRuleMatch(\n options: RuntimeRuleResolutionOptions,\n): RuntimeRuleMatch {\n const callNumber = incrementTargetCounter(\n options.targetCounters,\n options.target,\n );\n const rule = options.scenario.rules.find((candidate) => {\n return (\n candidate.callNumber === callNumber &&\n isSameTarget(candidate.target, options.target)\n );\n });\n\n return { callNumber, rule };\n}\n","import { RuntimeScenario } from \"../../runtime-matcher.js\";\nimport type { IRuntimeScenarioLoaderService } from \"../interfaces/IRuntimeScenarioLoaderService.js\";\nimport type { IRuntimeScenarioCacheService } from \"../interfaces/IRuntimeScenarioCacheService.js\";\nimport type { IScenarioStorageAdapter } from \"../interfaces/IScenarioStorageAdapter.js\";\n\ntype RuntimeScenarioLoaderServiceOptions = {\n /**\n * Adapter used to read persisted scenarios.\n */\n adapter: IScenarioStorageAdapter;\n /**\n * Cache service used to resolve loaded scenarios.\n */\n cacheService: IRuntimeScenarioCacheService;\n /**\n * Resolves the active runtime scenario id from ambient context.\n */\n resolveScenarioId: () => string | undefined;\n};\n\n/**\n * Default runtime scenario loader implementation.\n * @internal\n */\nexport class RuntimeScenarioLoaderService implements IRuntimeScenarioLoaderService {\n private readonly adapter: IScenarioStorageAdapter;\n\n private readonly cacheService: IRuntimeScenarioCacheService;\n\n private readonly resolveScenarioId: () => string | undefined;\n\n constructor(options: RuntimeScenarioLoaderServiceOptions) {\n this.adapter = options.adapter;\n this.cacheService = options.cacheService;\n this.resolveScenarioId = options.resolveScenarioId;\n }\n\n resolve(): RuntimeScenario | undefined {\n const scenarioId = this.resolveScenarioId();\n\n if (!scenarioId) {\n return undefined;\n }\n\n const cachedScenario = this.cacheService.get(scenarioId);\n\n if (cachedScenario) {\n return cachedScenario;\n }\n\n const runtimeScenario = new RuntimeScenario(\n scenarioId,\n this.adapter.loadScenario(scenarioId),\n );\n\n this.cacheService.set(scenarioId, runtimeScenario);\n\n return runtimeScenario;\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { IScenarioBuilderService } from \"../interfaces/IScenarioBuilderService.js\";\nimport type { IScenarioStorageAdapter } from \"../interfaces/IScenarioStorageAdapter.js\";\nimport type {\n ContractErrorFactoryArguments,\n ContractErrorFactoryName,\n ContractFunctionName,\n ContractFunctionReturnValue,\n ContractServiceMethodName,\n ContractServiceMethodReturnValue,\n ContractServiceName,\n ScenarioActionBuilder,\n ScenarioBuilder,\n ScenarioFunctionRuleBuilder,\n ScenarioServiceMethodRuleBuilder,\n ScenarioServiceRuleBuilder,\n SerializedRule,\n SerializedTarget,\n SutContract,\n} from \"../../types.js\";\n\ntype ScenarioBuilderContext<TContract extends SutContract> = {\n /**\n * Serialized rules accumulated for the in-progress scenario.\n */\n rules: SerializedRule[];\n /**\n * Active scenario builder instance exposed to fluent callbacks.\n */\n scenario: ScenarioBuilder<TContract> | undefined;\n};\n\nfunction isSameSerializedTarget(\n left: SerializedTarget,\n right: SerializedTarget,\n): boolean {\n if (left.kind !== right.kind) {\n return false;\n }\n\n if (left.kind === \"function\" && right.kind === \"function\") {\n return left.function === right.function;\n }\n\n if (left.kind === \"service-method\" && right.kind === \"service-method\") {\n return left.service === right.service && left.method === right.method;\n }\n\n return false;\n}\n\nfunction formatSerializedTarget(target: SerializedTarget): string {\n if (target.kind === \"function\") {\n return `function ${target.function}`;\n }\n\n return `service method ${target.service}.${target.method}`;\n}\n\nfunction createActionBuilder<TContract extends SutContract, TReturnValue>(\n context: ScenarioBuilderContext<TContract>,\n target: SerializedTarget,\n callNumber: number,\n): ScenarioActionBuilder<TContract, TReturnValue> {\n function pushRuleAndReturnBuilder(\n action: SerializedRule[\"action\"],\n ): ScenarioBuilder<TContract> {\n const duplicateRule = context.rules.find((rule) => {\n return (\n rule.callNumber === callNumber &&\n isSameSerializedTarget(rule.target, target)\n );\n });\n\n if (duplicateRule) {\n throw new Error(\n `Duplicate scenario rule for ${formatSerializedTarget(target)} on call ${callNumber}.`,\n );\n }\n\n context.rules.push({ action, callNumber, target });\n\n if (!context.scenario) {\n throw new Error(\"scenario builder reference is not initialized\");\n }\n\n return context.scenario;\n }\n\n return {\n returns(value: TReturnValue): ScenarioBuilder<TContract> {\n return pushRuleAndReturnBuilder({ kind: \"return\", value });\n },\n throwsMessage(message: string): ScenarioBuilder<TContract> {\n return pushRuleAndReturnBuilder({ kind: \"throw-message\", message });\n },\n throwsFactory<TFactoryName extends ContractErrorFactoryName<TContract>>(\n factory: TFactoryName,\n ...args: ContractErrorFactoryArguments<TContract, TFactoryName>\n ): ScenarioBuilder<TContract> {\n const [input] = args;\n\n return pushRuleAndReturnBuilder({\n kind: \"throw-factory\",\n factory,\n input,\n });\n },\n };\n}\n\nfunction createScenarioServiceMethodRuleBuilder<\n TContract extends SutContract,\n TServiceName extends ContractServiceName<TContract>,\n TMethodName extends ContractServiceMethodName<TContract, TServiceName>,\n>(\n context: ScenarioBuilderContext<TContract>,\n service: TServiceName,\n method: TMethodName,\n): ScenarioServiceMethodRuleBuilder<TContract, TServiceName, TMethodName> {\n return {\n onCall(\n callNumber: number,\n ): ScenarioActionBuilder<\n TContract,\n ContractServiceMethodReturnValue<TContract, TServiceName, TMethodName>\n > {\n return createActionBuilder<\n TContract,\n ContractServiceMethodReturnValue<TContract, TServiceName, TMethodName>\n >(context, { kind: \"service-method\", method, service }, callNumber);\n },\n };\n}\n\nfunction createScenarioServiceRuleBuilder<\n TContract extends SutContract,\n TServiceName extends ContractServiceName<TContract>,\n>(\n context: ScenarioBuilderContext<TContract>,\n service: TServiceName,\n): ScenarioServiceRuleBuilder<TContract, TServiceName> {\n return {\n method<\n TMethodName extends ContractServiceMethodName<TContract, TServiceName>,\n >(\n method: TMethodName,\n ): ScenarioServiceMethodRuleBuilder<TContract, TServiceName, TMethodName> {\n return createScenarioServiceMethodRuleBuilder(context, service, method);\n },\n };\n}\n\nfunction createScenarioFunctionRuleBuilder<\n TContract extends SutContract,\n TFunctionName extends ContractFunctionName<TContract>,\n>(\n context: ScenarioBuilderContext<TContract>,\n fn: TFunctionName,\n): ScenarioFunctionRuleBuilder<TContract, TFunctionName> {\n return {\n onCall(\n callNumber: number,\n ): ScenarioActionBuilder<\n TContract,\n ContractFunctionReturnValue<TContract, TFunctionName>\n > {\n return createActionBuilder<\n TContract,\n ContractFunctionReturnValue<TContract, TFunctionName>\n >(context, { kind: \"function\", function: fn }, callNumber);\n },\n };\n}\n\n/**\n * Default scenario builder implementation.\n * @internal\n */\nexport class ScenarioBuilderService<\n TContract extends SutContract,\n> implements IScenarioBuilderService<TContract> {\n declare readonly __contract?: TContract;\n\n readonly id: string;\n\n private readonly adapter: IScenarioStorageAdapter;\n\n private readonly createdAt: string;\n\n private readonly context: ScenarioBuilderContext<TContract>;\n\n constructor(adapter: IScenarioStorageAdapter) {\n this.adapter = adapter;\n this.id = randomUUID();\n this.createdAt = new Date().toISOString();\n this.context = {\n rules: [],\n scenario: this,\n };\n }\n\n service<TServiceName extends ContractServiceName<TContract>>(\n service: TServiceName,\n ): ScenarioServiceRuleBuilder<TContract, TServiceName> {\n return createScenarioServiceRuleBuilder(this.context, service);\n }\n\n fn<TFunctionName extends ContractFunctionName<TContract>>(\n fn: TFunctionName,\n ): ScenarioFunctionRuleBuilder<TContract, TFunctionName> {\n return createScenarioFunctionRuleBuilder(this.context, fn);\n }\n\n async save(): Promise<void> {\n await this.adapter.saveScenario({\n id: this.id,\n version: 1,\n createdAt: this.createdAt,\n rules: this.context.rules,\n });\n }\n\n async dispose(): Promise<void> {\n await this.adapter.deleteScenario(this.id);\n }\n}\n","import type { IRuntimeErrorFactory } from \"./services/interfaces/IRuntimeErrorFactory.js\";\nimport type { IRuntimeScenarioLoaderService } from \"./services/interfaces/IRuntimeScenarioLoaderService.js\";\nimport type {\n SutContract,\n ServiceContract,\n SerializedTarget,\n UnknownFunction,\n} from \"./types.js\";\n\ntype WrappedFunctionOptions<TContract extends SutContract> = {\n /**\n * Resolves runtime scenario state for the active scenario id.\n */\n runtimeScenarioLoaderService: IRuntimeScenarioLoaderService;\n /**\n * Serialized function or service-method target identifier.\n */\n target: SerializedTarget;\n /**\n * Creates typed errors for `throw-factory` scenario actions.\n */\n runtimeErrorFactory: IRuntimeErrorFactory<TContract>;\n};\n\n/**\n * Wraps a synchronous function with scenario interception behavior.\n * @internal\n */\nexport function createWrappedSyncFunction<\n TContract extends SutContract,\n TFunction extends UnknownFunction,\n>(\n implementation: TFunction,\n options: WrappedFunctionOptions<TContract>,\n): TFunction {\n return new Proxy(implementation, {\n apply(target, thisArg, args) {\n const runtimeScenario = options.runtimeScenarioLoaderService.resolve();\n\n if (!runtimeScenario) {\n return Reflect.apply(target, thisArg, args);\n }\n\n const match = runtimeScenario.resolveRuleMatch(options.target);\n\n if (match?.rule?.action.kind === \"return\") {\n return match.rule.action.value;\n }\n\n if (match?.rule?.action.kind === \"throw-message\") {\n throw new Error(match.rule.action.message);\n }\n\n if (match?.rule?.action.kind === \"throw-factory\") {\n throw options.runtimeErrorFactory.create(\n match.rule.action.factory,\n match.rule.action.input,\n );\n }\n\n return Reflect.apply(target, thisArg, args);\n },\n });\n}\n\n/**\n * Wraps an async function with scenario interception behavior.\n * @internal\n */\nexport function createWrappedAsyncFunction<\n TContract extends SutContract,\n TFunction extends UnknownFunction,\n>(\n implementation: TFunction,\n options: WrappedFunctionOptions<TContract>,\n): TFunction {\n return new Proxy(implementation, {\n apply(target, thisArg, args) {\n const runtimeScenario = options.runtimeScenarioLoaderService.resolve();\n\n if (!runtimeScenario) {\n return Reflect.apply(target, thisArg, args);\n }\n\n const match = runtimeScenario.resolveRuleMatch(options.target);\n\n if (match?.rule?.action.kind === \"return\") {\n return Promise.resolve(match.rule.action.value);\n }\n\n if (match?.rule?.action.kind === \"throw-message\") {\n return Promise.reject(new Error(match.rule.action.message));\n }\n\n if (match?.rule?.action.kind === \"throw-factory\") {\n try {\n return Promise.reject(\n options.runtimeErrorFactory.create(\n match.rule.action.factory,\n match.rule.action.input,\n ),\n );\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n return Reflect.apply(target, thisArg, args);\n },\n });\n}\n\n/**\n * Wraps each callable method on a service with scenario interception behavior.\n * @internal\n */\nexport function createWrappedService<\n TContract extends SutContract,\n TService extends ServiceContract,\n>(options: {\n /**\n * Service instance whose callable methods may be wrapped.\n */\n implementation: TService;\n /**\n * Factory that wraps each intercepted service method.\n */\n createWrapper: <TFunction extends UnknownFunction>(\n implementation: TFunction,\n wrappedOptions: WrappedFunctionOptions<TContract>,\n ) => TFunction;\n /**\n * Contract service name represented by the wrapped instance.\n */\n service: string;\n /**\n * Creates typed errors for `throw-factory` scenario actions.\n */\n runtimeErrorFactory: IRuntimeErrorFactory<TContract>;\n /**\n * Resolves the current runtime scenario from async context and cache.\n */\n runtimeScenarioLoaderService: IRuntimeScenarioLoaderService;\n}): TService {\n const wrappedMethods = new Map<string, UnknownFunction>();\n\n return new Proxy(options.implementation, {\n get(target, property, _receiver) {\n const value = Reflect.get(target, property, target);\n\n if (typeof property !== \"string\" || typeof value !== \"function\") {\n return value;\n }\n\n const targetRule: SerializedTarget = {\n kind: \"service-method\",\n method: property,\n service: options.service,\n };\n\n const wrappedMethod = wrappedMethods.get(property);\n\n if (wrappedMethod) {\n return wrappedMethod;\n }\n\n const nextWrappedMethod = options.createWrapper(\n value.bind(options.implementation),\n {\n runtimeScenarioLoaderService: options.runtimeScenarioLoaderService,\n target: targetRule,\n runtimeErrorFactory: options.runtimeErrorFactory,\n },\n );\n\n wrappedMethods.set(property, nextWrappedMethod);\n\n return nextWrappedMethod;\n },\n });\n}\n","export {\n getRuntimeScenarioId,\n runWithRuntimeScenarioContext,\n} from \"./runtime-scenario-context.js\";\nexport {\n JsonScenarioStorageAdapter,\n resolveJsonScenarioStorageAdapterDirectory,\n} from \"./services/impls/JsonScenarioStorageAdapter.js\";\nexport type { JsonScenarioStorageAdapterOptions } from \"./services/impls/JsonScenarioStorageAdapter.js\";\nexport type { RuntimeCacheOptions } from \"./services/impls/RuntimeScenarioCacheService.js\";\nexport type { IScenarioStorageAdapter } from \"./services/interfaces/IScenarioStorageAdapter.js\";\n\nimport { resolveScenarioStorageSelection } from \"./adapter-resolution.js\";\nimport { JsonScenarioStorageAdapter } from \"./services/impls/JsonScenarioStorageAdapter.js\";\nimport { RuntimeErrorFactory } from \"./services/impls/RuntimeErrorFactory.js\";\nimport { RuntimeScenarioCacheService } from \"./services/impls/RuntimeScenarioCacheService.js\";\nimport { RuntimeScenarioLoaderService } from \"./services/impls/RuntimeScenarioLoaderService.js\";\nimport { ScenarioBuilderService } from \"./services/impls/ScenarioBuilderService.js\";\nimport {\n createWrappedAsyncFunction,\n createWrappedService,\n createWrappedSyncFunction,\n} from \"./runtime-wrappers.js\";\nimport type {\n ContractFunction,\n ContractFunctionName,\n ContractServiceMethod,\n ContractServiceMethodName,\n ContractServiceName,\n ErrorFactoryRegistry,\n Runtime,\n ScenarioBuilder,\n SutContract,\n} from \"./types.js\";\nimport type { RuntimeCacheOptions } from \"./services/impls/RuntimeScenarioCacheService.js\";\nimport type { IScenarioStorageAdapter } from \"./services/interfaces/IScenarioStorageAdapter.js\";\nimport { getRuntimeScenarioId } from \"./runtime-scenario-context.js\";\n\nexport { RuntimeConfigurationError } from \"./runtime-errors.js\";\n\nexport type {\n ContractErrorFactoryArguments,\n ContractErrorFactory,\n ContractErrorFactoryInput,\n ContractErrorFactoryName,\n ContractFunction,\n ContractFunctionName,\n ContractFunctionReturnValue,\n ContractServiceMethod,\n ContractServiceMethodName,\n ContractServiceMethodReturnValue,\n ContractServiceName,\n ErrorFactoryContracts,\n ErrorFactoryRegistry,\n FunctionContracts,\n Runtime,\n RuntimeScenarioContext,\n ScenarioActionBuilder,\n ScenarioBuilder,\n ScenarioFunctionRuleBuilder,\n ScenarioServiceMethodRuleBuilder,\n ScenarioServiceRuleBuilder,\n SerializedAction,\n SerializedRule,\n SerializedScenario,\n SerializedTarget,\n ServiceContract,\n ServiceContracts,\n SutContract,\n UnknownFunction,\n} from \"./types.js\";\n\n/**\n * Storage options for persisting scenarios.\n *\n * Pass an explicit `adapter` to route persistence through custom storage, or a\n * `directory` to keep using the built-in file adapter behavior.\n *\n * @example\n * ```ts\n * import {\n * JsonScenarioStorageAdapter,\n * createScenario,\n * type IScenarioStorageAdapter,\n * } from \"definitely-fine\";\n *\n * const customAdapter: IScenarioStorageAdapter = {\n * async deleteScenario(_scenarioId) {},\n * loadScenario(_scenarioId) {\n * return undefined;\n * },\n * async saveScenario(_scenario) {},\n * };\n *\n * createScenario({\n * adapter: new JsonScenarioStorageAdapter({}),\n * });\n *\n * createScenario({\n * adapter: customAdapter,\n * });\n * ```\n * @public\n */\nexport type ScenarioOptions =\n | {\n /**\n * Omit storage options to use the built-in JSON adapter with its inferred default directory.\n */\n adapter?: never;\n /**\n * Omit storage options to use the built-in JSON adapter with its inferred default directory.\n */\n directory?: never;\n }\n | {\n /**\n * Directory where the scenario should be saved.\n */\n directory: string;\n /**\n * Explicit adapters cannot be combined with a directory.\n */\n adapter?: never;\n }\n | {\n /**\n * Custom adapter used to persist the scenario.\n */\n adapter: IScenarioStorageAdapter;\n /**\n * Explicit adapters cannot be combined with a directory.\n */\n directory?: never;\n };\n\ntype RuntimeOptionsBase<TContract extends SutContract> = {\n /**\n * Enables or disables runtime interception for the wrapped target.\n */\n enabled?: boolean;\n /**\n * Cache retention for loaded scenario documents.\n */\n cache?: RuntimeCacheOptions;\n /**\n * Error factories available to `throwsFactory()` rules.\n */\n errorFactories?: ErrorFactoryRegistry<TContract>;\n};\n\n/**\n * Storage and cache options for loading persisted scenarios into a runtime.\n *\n * @example\n * ```ts\n * import {\n * JsonScenarioStorageAdapter,\n * createRuntime,\n * type IScenarioStorageAdapter,\n * } from \"definitely-fine\";\n *\n * const customAdapter: IScenarioStorageAdapter = {\n * async deleteScenario(_scenarioId) {},\n * loadScenario(_scenarioId) {\n * return undefined;\n * },\n * async saveScenario(_scenario) {},\n * };\n *\n * createRuntime({\n * adapter: new JsonScenarioStorageAdapter({}),\n * });\n *\n * createRuntime({\n * adapter: customAdapter,\n * });\n * ```\n * @public\n */\nexport type RuntimeOptions<TContract extends SutContract> =\n RuntimeOptionsBase<TContract> &\n (\n | {\n /**\n * Omit storage options to use the built-in JSON adapter with its inferred default directory.\n */\n adapter?: never;\n /**\n * Omit storage options to use the built-in JSON adapter with its inferred default directory.\n */\n directory?: never;\n }\n | {\n /**\n * Directory where persisted scenarios should be loaded from.\n */\n directory: string;\n /**\n * Explicit adapters cannot be combined with a directory.\n */\n adapter?: never;\n }\n | {\n /**\n * Custom adapter used to load persisted scenarios.\n */\n adapter: IScenarioStorageAdapter;\n /**\n * Explicit adapters cannot be combined with a directory.\n */\n directory?: never;\n }\n );\n\nfunction resolveScenarioStorageAdapter(\n options: ScenarioOptions = {},\n): IScenarioStorageAdapter {\n const storageSelection = resolveScenarioStorageSelection({\n adapter: \"adapter\" in options ? options.adapter : undefined,\n directory: \"directory\" in options ? options.directory : undefined,\n });\n\n return storageSelection.kind === \"adapter\"\n ? storageSelection.adapter\n : new JsonScenarioStorageAdapter(\n storageSelection.kind === \"directory\"\n ? {\n directory: storageSelection.directory,\n }\n : {},\n );\n}\n\n/**\n * Creates a scenario builder that records interception rules and persists them as JSON.\n *\n * @public\n *\n * @example\n * ```ts\n * import { JsonScenarioStorageAdapter, createScenario } from \"definitely-fine\";\n *\n * const scenario = createScenario({\n * adapter: new JsonScenarioStorageAdapter({}),\n * });\n *\n * scenario.fn(\"fetchUser\").onCall(1).returns({ id: \"user-1\" });\n * await scenario.save();\n * ```\n */\nexport function createScenario<TContract extends SutContract>(\n options: ScenarioOptions = {},\n): ScenarioBuilder<TContract> {\n const adapter = resolveScenarioStorageAdapter(options);\n\n return new ScenarioBuilderService<TContract>(adapter);\n}\n\n/**\n * Creates a runtime that loads a persisted scenario and wraps implementations.\n *\n * @public\n *\n * @example\n * ```ts\n * import { createRuntime, type IScenarioStorageAdapter } from \"definitely-fine\";\n *\n * const customAdapter: IScenarioStorageAdapter = {\n * async deleteScenario(_scenarioId) {},\n * loadScenario(_scenarioId) {\n * return undefined;\n * },\n * async saveScenario(_scenario) {},\n * };\n *\n * const runtime = createRuntime({\n * adapter: customAdapter,\n * errorFactories: {},\n * });\n *\n * const wrappedFetchUser = runtime.wrapAsyncFunction(\"fetchUser\", fetchUser);\n * ```\n */\nexport function createRuntime<TContract extends SutContract>(\n options: RuntimeOptions<TContract> = {},\n): Runtime<TContract> {\n if (options.enabled === false) {\n return {\n wrapSyncFunction(_name, implementation) {\n return implementation;\n },\n wrapAsyncFunction(_name, implementation) {\n return implementation;\n },\n wrapSyncServiceMethod(_service, _method, implementation) {\n return implementation;\n },\n wrapAsyncServiceMethod(_service, _method, implementation) {\n return implementation;\n },\n wrapSyncService(_service, implementation) {\n return implementation;\n },\n wrapAsyncService(_service, implementation) {\n return implementation;\n },\n };\n }\n\n const storageSelection = resolveScenarioStorageSelection({\n adapter: \"adapter\" in options ? options.adapter : undefined,\n directory: \"directory\" in options ? options.directory : undefined,\n });\n\n const adapter =\n storageSelection.kind === \"adapter\"\n ? storageSelection.adapter\n : new JsonScenarioStorageAdapter(\n storageSelection.kind === \"directory\"\n ? {\n directory: storageSelection.directory,\n }\n : {},\n );\n\n const runtimeErrorFactory = new RuntimeErrorFactory(options.errorFactories);\n const cacheService = new RuntimeScenarioCacheService(options.cache);\n const runtimeScenarioLoaderService = new RuntimeScenarioLoaderService({\n adapter,\n cacheService,\n resolveScenarioId: getRuntimeScenarioId,\n });\n\n return {\n wrapSyncFunction<TFunctionName extends ContractFunctionName<TContract>>(\n name: TFunctionName,\n implementation: ContractFunction<TContract, TFunctionName>,\n ): ContractFunction<TContract, TFunctionName> {\n return createWrappedSyncFunction(implementation, {\n runtimeErrorFactory,\n runtimeScenarioLoaderService,\n target: { kind: \"function\", function: name },\n });\n },\n wrapAsyncFunction<TFunctionName extends ContractFunctionName<TContract>>(\n name: TFunctionName,\n implementation: ContractFunction<TContract, TFunctionName>,\n ): ContractFunction<TContract, TFunctionName> {\n return createWrappedAsyncFunction(implementation, {\n runtimeErrorFactory,\n runtimeScenarioLoaderService,\n target: { kind: \"function\", function: name },\n });\n },\n wrapSyncServiceMethod<\n TServiceName extends ContractServiceName<TContract>,\n TMethodName extends ContractServiceMethodName<TContract, TServiceName>,\n >(\n service: TServiceName,\n method: TMethodName,\n implementation: ContractServiceMethod<\n TContract,\n TServiceName,\n TMethodName\n >,\n ): ContractServiceMethod<TContract, TServiceName, TMethodName> {\n return createWrappedSyncFunction(implementation, {\n runtimeErrorFactory,\n runtimeScenarioLoaderService,\n target: { kind: \"service-method\", method, service },\n });\n },\n wrapAsyncServiceMethod<\n TServiceName extends ContractServiceName<TContract>,\n TMethodName extends ContractServiceMethodName<TContract, TServiceName>,\n >(\n service: TServiceName,\n method: TMethodName,\n implementation: ContractServiceMethod<\n TContract,\n TServiceName,\n TMethodName\n >,\n ): ContractServiceMethod<TContract, TServiceName, TMethodName> {\n return createWrappedAsyncFunction(implementation, {\n runtimeErrorFactory,\n runtimeScenarioLoaderService,\n target: { kind: \"service-method\", method, service },\n });\n },\n wrapSyncService<TServiceName extends ContractServiceName<TContract>>(\n service: TServiceName,\n implementation: TContract[\"services\"][TServiceName],\n ): TContract[\"services\"][TServiceName] {\n return createWrappedService({\n implementation,\n createWrapper: createWrappedSyncFunction,\n runtimeErrorFactory,\n service,\n runtimeScenarioLoaderService,\n });\n },\n wrapAsyncService<TServiceName extends ContractServiceName<TContract>>(\n service: TServiceName,\n implementation: TContract[\"services\"][TServiceName],\n ): TContract[\"services\"][TServiceName] {\n return createWrappedService({\n implementation,\n createWrapper: createWrappedAsyncFunction,\n runtimeErrorFactory,\n service,\n runtimeScenarioLoaderService,\n });\n },\n };\n}\n"],"mappings":";;;;;;;;AAIA,MAAM,gCACJ,IAAI;;;;;;;;;;;;AAaN,SAAgB,8BACdA,SACAC,UACS;AACT,QAAO,8BAA8B,IAAI,SAAS,SAAS;AAC5D;;;;;;;;;;AAWD,SAAgB,uBAA2C;AACzD,QAAO,8BAA8B,UAAU,EAAE;AAClD;;;;;;;;AC9BD,SAAgB,oBACdC,WACAC,YACQ;AACR,QAAO,KAAK,YAAY,EAAE,WAAW,OAAO;AAC7C;;;;AC2BD,SAAS,sCACPC,SACAC,OACO;AACP,QAAO,IAAI,MAAM,SAAS,EAAE,MAAO;AACpC;AAED,SAAS,yBAAyBC,WAAuC;CACvE,IAAI,cAAc,QAAQ,UAAU;CACpC,MAAM,EAAE,MAAM,GAAG,MAAM,YAAY;AAEnC,QAAO,gBAAgB,MAAM;AAC3B,MAAI,SAAS,YAAY,KAAK,eAC5B,QAAO;AAGT,gBAAc,QAAQ,YAAY;CACnC;AAED,KAAI,SAAS,YAAY,KAAK,eAC5B,QAAO;AAGT;AACD;AAED,SAAS,YAAYC,MAAuB;AAC1C,KAAI;AACF,SAAO,SAAS,KAAK,CAAC,aAAa;CACpC,SAAQ,QAAQ;AACf,SAAO;CACR;AACF;AAED,SAAS,yCACPC,iBACoB;CACpB,IAAI,cAAc,QAAQ,KAAK;CAC/B,MAAM,EAAE,MAAM,GAAG,MAAM,YAAY;AAEnC,QAAO,gBAAgB,MAAM;EAC3B,MAAMC,yBAAuB,KAAK,aAAa,eAAe;EAC9D,MAAMC,8BAA4B,KAChCD,wBACA,kBACD;AAED,MACE,YAAYC,4BAA0B,IACtC,aAAaA,4BAA0B,KAAK,gBAE5C,QAAOD;AAGT,gBAAc,QAAQ,YAAY;CACnC;CAED,MAAM,uBAAuB,KAAK,aAAa,eAAe;CAC9D,MAAM,4BAA4B,KAChC,sBACA,kBACD;AAED,KACE,YAAY,0BAA0B,IACtC,aAAa,0BAA0B,KAAK,gBAE5C,QAAO;AAGT;AACD;AAED,SAAS,sBAAsBF,MAAcI,WAA4B;CACvE,MAAM,eAAe,SAAS,WAAW,KAAK;AAE9C,QACE,iBAAiB,OACf,aAAa,WAAW,KAAK,KAAK,WAAW,aAAa;AAE/D;;;;;;;;;;;;;;AAeD,SAAgB,2CACdC,SACQ;AACR,KAAI,QAAQ,qBACV,QAAO,QAAQ;CAGjB,MAAM,2BAA2B,cAC/B,QAAQ,aAAa,OAAO,KAAK,IAClC;CACD,MAAM,gCAAgC,yBACpC,yBACD;AAED,KAAI,yCACF,QAAO,KACL,+BACA,UACA,mBACA,YACD;CAGH,MAAM,iBAAiB,aAAa,yBAAyB;CAC7D,MAAM,uBAAuB,yBAAyB,eAAe;AAErE,KAAI,gCACF,QAAO,KAAK,sBAAsB,UAAU,mBAAmB,YAAY;AAG7E,KACE,QAAQ,yBACP,sBAAsB,gBAAgB,QAAQ,KAAK,CAAC,EACrD;EACA,MAAM,uCACJ,yCACE,QAAQ,QAAQ,eAAe,CAAC,CACjC;AAEH,MAAI,gDACF,QAAO,KACL,sCACA,UACA,mBACA,YACD;CAEJ;AAED,OAAM,IAAI,OACP,mEAAmE,eAAe;AAEtF;AAED,SAAS,SAASC,OAAkD;AAClE,eAAc,UAAU,YAAY,UAAU;AAC/C;AAED,SAAS,oBAAoBA,OAAiC;AAC5D,YAAW,UAAU,SACnB,QAAO;CAGT,MAAM,SAAS,IAAI,KAAK;AAExB,SAAQ,OAAO,MAAM,OAAO,SAAS,CAAC,IAAI,OAAO,aAAa,KAAK;AACpE;AAED,SAAS,mBAAmBA,OAAmD;AAC7E,MAAK,SAAS,MAAM,WAAW,MAAM,SAAS,SAC5C,QAAO;AAGT,KAAI,MAAM,SAAS,WACjB,eAAc,MAAM,aAAa;AAGnC,KAAI,MAAM,SAAS,iBACjB,eACS,MAAM,YAAY,mBAAmB,MAAM,WAAW;AAIjE,QAAO;AACR;AAED,SAAS,mBAAmBA,OAAmD;AAC7E,MAAK,SAAS,MAAM,WAAW,MAAM,SAAS,SAC5C,QAAO;AAGT,KAAI,MAAM,SAAS,SACjB,QAAO,WAAW;AAGpB,KAAI,MAAM,SAAS,gBACjB,eAAc,MAAM,YAAY;AAGlC,KAAI,MAAM,SAAS,gBACjB,eAAc,MAAM,YAAY;AAGlC,QAAO;AACR;AAED,SAAS,iBAAiBA,OAAyC;AACjE,QACE,SAAS,MAAM,WACR,MAAM,eAAe,YAC5B,OAAO,UAAU,MAAM,WAAW,IAClC,MAAM,aAAa,KACnB,mBAAmB,MAAM,OAAO,IAChC,mBAAmB,MAAM,OAAO;AAEnC;AAED,SAAS,qBAAqBA,OAA6C;AACzE,QACE,SAAS,MAAM,WACR,MAAM,OAAO,YACpB,MAAM,YAAY,KAClB,oBAAoB,MAAM,UAAU,IACpC,MAAM,QAAQ,MAAM,MAAM,IAC1B,MAAM,MAAM,MAAM,CAAC,SAAS,iBAAiB,KAAK,CAAC;AAEtD;AAED,SAAS,uBACPC,YACAC,kBACgC;CAChC,IAAIC;AAEJ,KAAI;AACF,2BAAyB,aAAa,kBAAkB,OAAO;CAChE,SAAQ,OAAO;AACd,MAAI,SAAS,MAAM,IAAI,UAAU,SAAS,MAAM,SAAS,SACvD;AAGF,QAAM;CACP;AAED,KAAI;EACF,MAAMC,cAAuB,KAAK,MAAM,uBAAuB;AAE/D,OAAK,qBAAqB,YAAY,IAAI,YAAY,OAAO,WAC3D,OAAM,IAAI,OACP,qCAAqC,iBAAiB;AAI3D,SAAO;CACR,SAAQ,OAAO;AACd,MACE,iBAAiB,SACjB,MAAM,aACH,qCAAqC,iBAAiB,GAEzD,OAAM;AAGR,QAAM,IAAI,OAAO,qCAAqC,iBAAiB,IAAI,EACzE,OAAO,MACR;CACF;AACF;;;;;;;;;;;;;;AAeD,IAAa,6BAAb,MAA2E;CACzE,AAAS;CAET,YAAYC,UAA6C,CAAE,GAAE;AAC3D,OAAK,YAAY,2CAA2C,QAAQ;CACrE;CAED,MAAM,eAAeJ,YAAmC;AACtD,QAAM,GAAG,oBAAoB,KAAK,WAAW,WAAW,EAAE,EACxD,OAAO,KACR,EAAC;CACH;CAED,yBAAyBA,YAA4B;AACnD,SAAO,oBAAoB,KAAK,WAAW,WAAW;CACvD;CAED,aAAaA,YAAoD;AAC/D,SAAO,uBACL,YACA,oBAAoB,KAAK,WAAW,WAAW,CAChD;CACF;CAED,MAAM,aAAaK,UAA6C;AAC9D,MAAI;AACF,SAAM,MAAM,KAAK,WAAW,EAAE,WAAW,KAAM,EAAC;EACjD,SAAQ,OAAO;AACd,SAAM,uCACH,0DAA0D,KAAK,UAAU,IAC1E,MACD;EACF;EAED,MAAM,mBAAmB,oBAAoB,KAAK,WAAW,SAAS,GAAG;AAEzE,MAAI;AACF,SAAM,UAAU,kBAAkB,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;EACrE,SAAQ,OAAO;AACd,SAAM,uCACH,uDAAuD,iBAAiB,IACzE,MACD;EACF;CACF;AACF;;;;;;;;;;;;;;;AC7VD,IAAa,4BAAb,cAA+C,MAAM;CACnD,YAAYC,SAAiBC,SAAwB;AACnD,QAAM,SAAS,QAAQ;AACvB,OAAK,OAAO;CACb;AACF;;;;;;;;ACmCD,SAAgB,gCACdC,SAC0B;AAC1B,KAAI,QAAQ,sBAAyB,QAAQ,qBAC3C,OAAM,IAAI,0BACR;AAIJ,KAAI,QAAQ,QACV,QAAO;EACL,MAAM;EACN,SAAS,QAAQ;CAClB;AAGH,KAAI,QAAQ,qBACV,QAAO;EACL,MAAM;EACN,WAAW,QAAQ;CACpB;AAGH,QAAO,EAAE,MAAM,UAAW;AAC3B;;;;ACnED,SAAS,kBACPC,gBACAC,aACoD;AACpD,QAAO,eAAe;AACvB;;;;;AAMD,IAAa,sBAAb,MAE6C;CAC3C,AAAiB;CAEjB,YAAYC,gBAA6D;AACvE,OAAK,iBAAiB,kBAAkB,CAAE;CAC3C;CAED,OACEC,aACA,GAAG,OACI;AACP,OAAK,kBAAkB,KAAK,gBAAgB,YAAY,CACtD,OAAM,IAAI,2BACP,2CAA2C,YAAY;EAI5D,MAAM,UAAU,KAAK,eAAe;AAEpC,aAAW,YAAY,WACrB,OAAM,IAAI,2BACP,2CAA2C,YAAY;AAI5D,SAAO,QAAQ,MAAM,iBAAoB,MAAM;CAChD;AACF;;;;AC7CD,MAAM,wCAAwC;AAwB9C,SAAS,sBACPC,cACAC,YACAC,OAC+B;CAC/B,MAAM,gBAAgB,WAAW,MAAM;AACrC,eAAa,OAAO,WAAW;CAChC,GAAE,MAAM;AAET,eAAc,SAAS;AAEvB,QAAO;AACR;;;;;AAMD,IAAa,8BAAb,MAAiF;CAC/E,AAAiB;CAEjB,AAAiB,eAAe,IAAI;CAEpC,YAAYC,UAA+B,CAAE,GAAE;AAC7C,OAAK,QAAQ,QAAQ,SAAS;CAC/B;CAED,IAAIF,YAA6B;AAC/B,SAAO,KAAK,aAAa,IAAI,WAAW;CACzC;CAED,IAAIA,YAAiD;EACnD,MAAM,aAAa,KAAK,aAAa,IAAI,WAAW;AAEpD,MAAI,YAAY;AACd,gBAAa,WAAW,cAAc;AACtC,cAAW,gBAAgB,sBACzB,KAAK,cACL,YACA,KAAK,MACN;AAED,UAAO,WAAW;EACnB;AAED;CACD;CAED,IAAIA,YAAoBG,iBAAwC;EAC9D,MAAM,aAAa,KAAK,aAAa,IAAI,WAAW;AAEpD,MAAI,WACF,cAAa,WAAW,cAAc;AAGxC,OAAK,aAAa,IAAI,YAAY;GAChC;GACA,eAAe,sBACb,KAAK,cACL,YACA,KAAK,MACN;EACF,EAAC;CACH;AACF;;;;;;;;AC9CD,IAAa,kBAAb,MAA6B;;;;CAI3B,AAAS;CAET;CACA,kBAAyC,IAAI;CAE7C,YAAYC,YAAoBC,UAA0C;AACxE,OAAK,KAAK;AACV,OAAKC,YAAY;CAClB;;;;;CAMD,sBAAsBD,UAAgD;AACpE,OAAKC,YAAY;CAClB;;;;;CAMD,iBAAiBC,QAAwD;AACvE,OAAK,KAAKD,cAAc,yBAAyB,KAAKA,WAAW,OAAO,CACtE;AAGF,SAAO,wBAAwB;GAC7B,UAAU,KAAKA;GACf;GACA,gBAAgB,KAAKE;EACtB,EAAC;CACH;AACF;AAED,SAAS,aAAaD,QAAkC;AACtD,KAAI,OAAO,SAAS,WAClB,SAAQ,WAAW,OAAO,SAAS;AAGrC,SAAQ,UAAU,OAAO,QAAQ,GAAG,OAAO,OAAO;AACnD;AAED,SAAS,aACPE,MACAC,OACS;AACT,KAAI,KAAK,SAAS,MAAM,KACtB,QAAO;AAGT,KAAI,KAAK,SAAS,cAAc,MAAM,SAAS,WAC7C,QAAO,KAAK,aAAa,MAAM;AAGjC,KAAI,KAAK,SAAS,oBAAoB,MAAM,SAAS,iBACnD,QAAO,KAAK,YAAY,MAAM,WAAW,KAAK,WAAW,MAAM;AAGjE,QAAO;AACR;AAED,SAAS,uBACPC,gBACAJ,QACQ;CACR,MAAM,YAAY,aAAa,OAAO;CACtC,MAAM,kBAAkB,eAAe,IAAI,UAAU,IAAI,KAAK;AAE9D,gBAAe,IAAI,WAAW,eAAe;AAE7C,QAAO;AACR;;;;;AAMD,SAAgB,yBACdF,UACAE,QACS;AACT,MAAK,SACH,QAAO;AAGT,QAAO,SAAS,MAAM,KAAK,CAAC,SAAS,aAAa,KAAK,QAAQ,OAAO,CAAC;AACxE;;;;;AAMD,SAAS,wBACPK,SACkB;CAClB,MAAM,aAAa,uBACjB,QAAQ,gBACR,QAAQ,OACT;CACD,MAAM,OAAO,QAAQ,SAAS,MAAM,KAAK,CAAC,cAAc;AACtD,SACE,UAAU,eAAe,cACzB,aAAa,UAAU,QAAQ,QAAQ,OAAO;CAEjD,EAAC;AAEF,QAAO;EAAE;EAAY;CAAM;AAC5B;;;;;;;;ACrID,IAAa,+BAAb,MAAmF;CACjF,AAAiB;CAEjB,AAAiB;CAEjB,AAAiB;CAEjB,YAAYC,SAA8C;AACxD,OAAK,UAAU,QAAQ;AACvB,OAAK,eAAe,QAAQ;AAC5B,OAAK,oBAAoB,QAAQ;CAClC;CAED,UAAuC;EACrC,MAAM,aAAa,KAAK,mBAAmB;AAE3C,OAAK,WACH;EAGF,MAAM,iBAAiB,KAAK,aAAa,IAAI,WAAW;AAExD,MAAI,eACF,QAAO;EAGT,MAAM,kBAAkB,IAAI,gBAC1B,YACA,KAAK,QAAQ,aAAa,WAAW;AAGvC,OAAK,aAAa,IAAI,YAAY,gBAAgB;AAElD,SAAO;CACR;AACF;;;;AC1BD,SAAS,uBACPC,MACAC,OACS;AACT,KAAI,KAAK,SAAS,MAAM,KACtB,QAAO;AAGT,KAAI,KAAK,SAAS,cAAc,MAAM,SAAS,WAC7C,QAAO,KAAK,aAAa,MAAM;AAGjC,KAAI,KAAK,SAAS,oBAAoB,MAAM,SAAS,iBACnD,QAAO,KAAK,YAAY,MAAM,WAAW,KAAK,WAAW,MAAM;AAGjE,QAAO;AACR;AAED,SAAS,uBAAuBC,QAAkC;AAChE,KAAI,OAAO,SAAS,WAClB,SAAQ,WAAW,OAAO,SAAS;AAGrC,SAAQ,iBAAiB,OAAO,QAAQ,GAAG,OAAO,OAAO;AAC1D;AAED,SAAS,oBACPC,SACAD,QACAE,YACgD;CAChD,SAAS,yBACPC,QAC4B;EAC5B,MAAM,gBAAgB,QAAQ,MAAM,KAAK,CAAC,SAAS;AACjD,UACE,KAAK,eAAe,cACpB,uBAAuB,KAAK,QAAQ,OAAO;EAE9C,EAAC;AAEF,MAAI,cACF,OAAM,IAAI,OACP,8BAA8B,uBAAuB,OAAO,CAAC,WAAW,WAAW;AAIxF,UAAQ,MAAM,KAAK;GAAE;GAAQ;GAAY;EAAQ,EAAC;AAElD,OAAK,QAAQ,SACX,OAAM,IAAI,MAAM;AAGlB,SAAO,QAAQ;CAChB;AAED,QAAO;EACL,QAAQC,OAAiD;AACvD,UAAO,yBAAyB;IAAE,MAAM;IAAU;GAAO,EAAC;EAC3D;EACD,cAAcC,SAA6C;AACzD,UAAO,yBAAyB;IAAE,MAAM;IAAiB;GAAS,EAAC;EACpE;EACD,cACEC,SACA,GAAG,MACyB;GAC5B,MAAM,CAAC,MAAM,GAAG;AAEhB,UAAO,yBAAyB;IAC9B,MAAM;IACN;IACA;GACD,EAAC;EACH;CACF;AACF;AAED,SAAS,uCAKPL,SACAM,SACAC,QACwE;AACxE,QAAO,EACL,OACEN,YAIA;AACA,SAAO,oBAGL,SAAS;GAAE,MAAM;GAAkB;GAAQ;EAAS,GAAE,WAAW;CACpE,EACF;AACF;AAED,SAAS,iCAIPD,SACAM,SACqD;AACrD,QAAO,EACL,OAGEC,QACwE;AACxE,SAAO,uCAAuC,SAAS,SAAS,OAAO;CACxE,EACF;AACF;AAED,SAAS,kCAIPP,SACAQ,IACuD;AACvD,QAAO,EACL,OACEP,YAIA;AACA,SAAO,oBAGL,SAAS;GAAE,MAAM;GAAY,UAAU;EAAI,GAAE,WAAW;CAC3D,EACF;AACF;;;;;AAMD,IAAa,yBAAb,MAEgD;CAG9C,AAAS;CAET,AAAiB;CAEjB,AAAiB;CAEjB,AAAiB;CAEjB,YAAYQ,SAAkC;AAC5C,OAAK,UAAU;AACf,OAAK,KAAK,YAAY;AACtB,OAAK,YAAY,IAAI,OAAO,aAAa;AACzC,OAAK,UAAU;GACb,OAAO,CAAE;GACT,UAAU;EACX;CACF;CAED,QACEH,SACqD;AACrD,SAAO,iCAAiC,KAAK,SAAS,QAAQ;CAC/D;CAED,GACEE,IACuD;AACvD,SAAO,kCAAkC,KAAK,SAAS,GAAG;CAC3D;CAED,MAAM,OAAsB;AAC1B,QAAM,KAAK,QAAQ,aAAa;GAC9B,IAAI,KAAK;GACT,SAAS;GACT,WAAW,KAAK;GAChB,OAAO,KAAK,QAAQ;EACrB,EAAC;CACH;CAED,MAAM,UAAyB;AAC7B,QAAM,KAAK,QAAQ,eAAe,KAAK,GAAG;CAC3C;AACF;;;;;;;;ACvMD,SAAgB,0BAIdE,gBACAC,SACW;AACX,QAAO,IAAI,MAAM,gBAAgB,EAC/B,MAAM,QAAQ,SAAS,MAAM;EAC3B,MAAM,kBAAkB,QAAQ,6BAA6B,SAAS;AAEtE,OAAK,gBACH,QAAO,QAAQ,MAAM,QAAQ,SAAS,KAAK;EAG7C,MAAM,QAAQ,gBAAgB,iBAAiB,QAAQ,OAAO;AAE9D,MAAI,OAAO,MAAM,OAAO,SAAS,SAC/B,QAAO,MAAM,KAAK,OAAO;AAG3B,MAAI,OAAO,MAAM,OAAO,SAAS,gBAC/B,OAAM,IAAI,MAAM,MAAM,KAAK,OAAO;AAGpC,MAAI,OAAO,MAAM,OAAO,SAAS,gBAC/B,OAAM,QAAQ,oBAAoB,OAChC,MAAM,KAAK,OAAO,SAClB,MAAM,KAAK,OAAO,MACnB;AAGH,SAAO,QAAQ,MAAM,QAAQ,SAAS,KAAK;CAC5C,EACF;AACF;;;;;AAMD,SAAgB,2BAIdD,gBACAC,SACW;AACX,QAAO,IAAI,MAAM,gBAAgB,EAC/B,MAAM,QAAQ,SAAS,MAAM;EAC3B,MAAM,kBAAkB,QAAQ,6BAA6B,SAAS;AAEtE,OAAK,gBACH,QAAO,QAAQ,MAAM,QAAQ,SAAS,KAAK;EAG7C,MAAM,QAAQ,gBAAgB,iBAAiB,QAAQ,OAAO;AAE9D,MAAI,OAAO,MAAM,OAAO,SAAS,SAC/B,QAAO,QAAQ,QAAQ,MAAM,KAAK,OAAO,MAAM;AAGjD,MAAI,OAAO,MAAM,OAAO,SAAS,gBAC/B,QAAO,QAAQ,OAAO,IAAI,MAAM,MAAM,KAAK,OAAO,SAAS;AAG7D,MAAI,OAAO,MAAM,OAAO,SAAS,gBAC/B,KAAI;AACF,UAAO,QAAQ,OACb,QAAQ,oBAAoB,OAC1B,MAAM,KAAK,OAAO,SAClB,MAAM,KAAK,OAAO,MACnB,CACF;EACF,SAAQ,OAAO;AACd,UAAO,QAAQ,OAAO,MAAM;EAC7B;AAGH,SAAO,QAAQ,MAAM,QAAQ,SAAS,KAAK;CAC5C,EACF;AACF;;;;;AAMD,SAAgB,qBAGdC,SAwBW;CACX,MAAM,iBAAiB,IAAI;AAE3B,QAAO,IAAI,MAAM,QAAQ,gBAAgB,EACvC,IAAI,QAAQ,UAAU,WAAW;EAC/B,MAAM,QAAQ,QAAQ,IAAI,QAAQ,UAAU,OAAO;AAEnD,aAAW,aAAa,mBAAmB,UAAU,WACnD,QAAO;EAGT,MAAMC,aAA+B;GACnC,MAAM;GACN,QAAQ;GACR,SAAS,QAAQ;EAClB;EAED,MAAM,gBAAgB,eAAe,IAAI,SAAS;AAElD,MAAI,cACF,QAAO;EAGT,MAAM,oBAAoB,QAAQ,cAChC,MAAM,KAAK,QAAQ,eAAe,EAClC;GACE,8BAA8B,QAAQ;GACtC,QAAQ;GACR,qBAAqB,QAAQ;EAC9B,EACF;AAED,iBAAe,IAAI,UAAU,kBAAkB;AAE/C,SAAO;CACR,EACF;AACF;;;;ACmCD,SAAS,8BACPC,UAA2B,CAAE,GACJ;CACzB,MAAM,mBAAmB,gCAAgC;EACvD,SAAS,aAAa,UAAU,QAAQ;EACxC,WAAW,eAAe,UAAU,QAAQ;CAC7C,EAAC;AAEF,QAAO,iBAAiB,SAAS,YAC7B,iBAAiB,UACjB,IAAI,2BACF,iBAAiB,SAAS,cACtB,EACE,WAAW,iBAAiB,UAC7B,IACD,CAAE;AAEb;;;;;;;;;;;;;;;;;;AAmBD,SAAgB,eACdA,UAA2B,CAAE,GACD;CAC5B,MAAM,UAAU,8BAA8B,QAAQ;AAEtD,QAAO,IAAI,uBAAkC;AAC9C;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BD,SAAgB,cACdC,UAAqC,CAAE,GACnB;AACpB,KAAI,QAAQ,YAAY,MACtB,QAAO;EACL,iBAAiB,OAAO,gBAAgB;AACtC,UAAO;EACR;EACD,kBAAkB,OAAO,gBAAgB;AACvC,UAAO;EACR;EACD,sBAAsB,UAAU,SAAS,gBAAgB;AACvD,UAAO;EACR;EACD,uBAAuB,UAAU,SAAS,gBAAgB;AACxD,UAAO;EACR;EACD,gBAAgB,UAAU,gBAAgB;AACxC,UAAO;EACR;EACD,iBAAiB,UAAU,gBAAgB;AACzC,UAAO;EACR;CACF;CAGH,MAAM,mBAAmB,gCAAgC;EACvD,SAAS,aAAa,UAAU,QAAQ;EACxC,WAAW,eAAe,UAAU,QAAQ;CAC7C,EAAC;CAEF,MAAM,UACJ,iBAAiB,SAAS,YACtB,iBAAiB,UACjB,IAAI,2BACF,iBAAiB,SAAS,cACtB,EACE,WAAW,iBAAiB,UAC7B,IACD,CAAE;CAGd,MAAM,sBAAsB,IAAI,oBAAoB,QAAQ;CAC5D,MAAM,eAAe,IAAI,4BAA4B,QAAQ;CAC7D,MAAM,+BAA+B,IAAI,6BAA6B;EACpE;EACA;EACA,mBAAmB;CACpB;AAED,QAAO;EACL,iBACEC,MACAC,gBAC4C;AAC5C,UAAO,0BAA0B,gBAAgB;IAC/C;IACA;IACA,QAAQ;KAAE,MAAM;KAAY,UAAU;IAAM;GAC7C,EAAC;EACH;EACD,kBACED,MACAC,gBAC4C;AAC5C,UAAO,2BAA2B,gBAAgB;IAChD;IACA;IACA,QAAQ;KAAE,MAAM;KAAY,UAAU;IAAM;GAC7C,EAAC;EACH;EACD,sBAIEC,SACAC,QACAC,gBAK6D;AAC7D,UAAO,0BAA0B,gBAAgB;IAC/C;IACA;IACA,QAAQ;KAAE,MAAM;KAAkB;KAAQ;IAAS;GACpD,EAAC;EACH;EACD,uBAIEF,SACAC,QACAC,gBAK6D;AAC7D,UAAO,2BAA2B,gBAAgB;IAChD;IACA;IACA,QAAQ;KAAE,MAAM;KAAkB;KAAQ;IAAS;GACpD,EAAC;EACH;EACD,gBACEF,SACAG,gBACqC;AACrC,UAAO,qBAAqB;IAC1B;IACA,eAAe;IACf;IACA;IACA;GACD,EAAC;EACH;EACD,iBACEH,SACAG,gBACqC;AACrC,UAAO,qBAAqB;IAC1B;IACA,eAAe;IACf;IACA;IACA;GACD,EAAC;EACH;CACF;AACF"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "definitely-fine",
3
+ "version": "0.1.0",
4
+ "description": "Core utilities for the definitely-fine monorepo.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "engines": {
20
+ "node": ">=22"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "scripts": {
26
+ "build": "tsdown src/index.ts --format esm --dts --publint",
27
+ "typecheck": "tsc --project tsconfig.json"
28
+ }
29
+ }