cvx-kit 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +1 -0
  3. package/dist/contracts.d.mts +2 -1
  4. package/dist/contracts.mjs +1 -1
  5. package/dist/index.d.mts +2 -1
  6. package/dist/index.mjs +1 -1
  7. package/dist/modules/contracts/binding.d.mts +26 -0
  8. package/dist/modules/contracts/binding.mjs +2 -0
  9. package/dist/modules/contracts/binding.mjs.map +1 -0
  10. package/dist/modules/contracts/domain.d.mts +59 -0
  11. package/dist/modules/contracts/domain.mjs +2 -0
  12. package/dist/modules/contracts/domain.mjs.map +1 -0
  13. package/dist/modules/effect/command.d.mts +39 -1
  14. package/dist/modules/effect/command.mjs +1 -1
  15. package/dist/modules/effect/command.mjs.map +1 -1
  16. package/dist/modules/effect/crud.d.mts +6 -0
  17. package/dist/modules/effect/domain.d.mts +72 -0
  18. package/dist/modules/effect/domain.mjs +2 -0
  19. package/dist/modules/effect/domain.mjs.map +1 -0
  20. package/dist/modules/effect/operation.d.mts +4 -3
  21. package/dist/modules/effect/operation.mjs.map +1 -1
  22. package/dist/modules/effect/query.d.mts +24 -8
  23. package/dist/modules/effect/query.mjs +1 -1
  24. package/dist/modules/effect/query.mjs.map +1 -1
  25. package/dist/modules/foundation/foundation.d.mts +109 -0
  26. package/dist/modules/foundation/foundation.mjs +2 -0
  27. package/dist/modules/foundation/foundation.mjs.map +1 -0
  28. package/dist/modules/foundation/operation.d.mts +140 -0
  29. package/dist/modules/foundation/operation.mjs +2 -0
  30. package/dist/modules/foundation/operation.mjs.map +1 -0
  31. package/dist/oxlint/ownership.mjs +1 -1
  32. package/dist/oxlint/ownership.mjs.map +1 -1
  33. package/dist/oxlint/reserved-files.d.mts +6 -0
  34. package/dist/oxlint/reserved-files.mjs +2 -0
  35. package/dist/oxlint/reserved-files.mjs.map +1 -0
  36. package/dist/oxlint.d.mts +1 -1
  37. package/dist/oxlint.mjs +1 -1
  38. package/dist/oxlint.mjs.map +1 -1
  39. package/docs/commands-legacy.md +3 -1
  40. package/docs/conventions.md +7 -3
  41. package/docs/domain-contracts.md +148 -0
  42. package/docs/effect.md +2 -0
  43. package/docs/oxlint.md +4 -0
  44. package/package.json +1 -1
  45. package/scripts/test-packed-effect.mjs +14 -0
  46. package/scripts/test-packed-oxlint.mjs +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"operation.mjs","names":["effectOperationFactory","operation","definition","command","query"],"sources":["../../../src/modules/effect/operation.ts"],"sourcesContent":["import type { Effect } from 'effect'\nimport type { ContractSchema, ContractInput, ContractOutput } from '../contracts/contract'\nimport type { ContractDecoderError, ContractDecoderRequirements } from './schema'\nimport type { AuditEntryInput } from '../../components/foundation/client'\n\n/** Ordinary failures are defects; only an explicit Effect supplies a typed error. */\nexport type CallbackError<Value> = Value extends (...arguments_: never[]) => infer Returned\n\t? CallbackError<Returned>\n\t: Value extends Effect.Effect<infer Success, infer Error, unknown>\n\t\t? Error | CallbackError<Success>\n\t\t: Value extends PromiseLike<infer Awaited>\n\t\t\t? CallbackError<Awaited>\n\t\t\t: Value extends readonly (infer Item)[]\n\t\t\t\t? CallbackError<Item>\n\t\t\t\t: Value extends { kind: 'execute'; complete?: infer Complete }\n\t\t\t\t\t? CallbackError<Complete>\n\t\t\t\t\t: never\n\nexport type CallbackRequirements<Value> = Value extends (...arguments_: never[]) => infer Returned\n\t? CallbackRequirements<Returned>\n\t: Value extends Effect.Effect<infer Success, unknown, infer Requirements>\n\t\t? Requirements | CallbackRequirements<Success>\n\t\t: Value extends PromiseLike<infer Awaited>\n\t\t\t? CallbackRequirements<Awaited>\n\t\t\t: Value extends readonly (infer Item)[]\n\t\t\t\t? CallbackRequirements<Item>\n\t\t\t\t: Value extends { kind: 'execute'; complete?: infer Complete }\n\t\t\t\t\t? CallbackRequirements<Complete>\n\t\t\t\t\t: never\n\nexport type EffectValue<Value> =\n\tValue extends Effect.Effect<infer Success, unknown, unknown>\n\t\t? EffectValue<Success>\n\t\t: Value extends PromiseLike<infer Awaited>\n\t\t\t? EffectValue<Awaited>\n\t\t\t: Value\n\ndeclare const checkedOperation: unique symbol\n/** Type-only evidence that the helper checked callbacks against the base context and schemas. */\nexport type CheckedEffectOperation<Context> = {\n\treadonly [checkedOperation]: {\n\t\tcontext: (context: Context) => void\n\t\terror: unknown\n\t\trequirements: unknown\n\t\tdefinition: unknown\n\t}\n}\ntype CheckedChannels<Context, Error, Requirements, Definition> = {\n\treadonly [checkedOperation]: {\n\t\tcontext: (context: Context) => void\n\t\terror: Error\n\t\trequirements: Requirements\n\t\tdefinition: Definition\n\t}\n}\n/** Named checked-definition boundary keeps the private evidence marker inside this module's declarations. */\nexport type CheckedEffectDefinition<\n\tContext,\n\tDefinition,\n\tError = never,\n\tRequirements = never,\n> = NoInfer<Omit<Definition, typeof checkedOperation>> &\n\tCheckedChannels<Context, Error, Requirements, Omit<Definition, typeof checkedOperation>>\n/** Reject stale helper evidence after callbacks or schemas are replaced. */\nexport type ValidatedEffectOperations<Operations> = {\n\t[Key in keyof Operations]: Operations[Key] extends {\n\t\treadonly [checkedOperation]: { definition: infer Definition }\n\t}\n\t\t? Operations[Key] extends Definition\n\t\t\t? Operations[Key]\n\t\t\t: never\n\t\t: never\n}\n/** Only middleware whose next contract captured a default policy can discharge its channels. */\nexport type UnwrappedDefaultError<Definition, Guard> = Definition extends { middleware: Function }\n\t? Definition extends CheckedChannels<never, infer Error, unknown, unknown>\n\t\t? Exclude<CallbackError<Guard>, Error>\n\t\t: CallbackError<Guard>\n\t: CallbackError<Guard>\nexport type UnwrappedDefaultRequirements<Definition, Guard> = Definition extends {\n\tmiddleware: Function\n}\n\t? Definition extends CheckedChannels<never, unknown, infer Requirements, unknown>\n\t\t? Exclude<CallbackRequirements<Guard>, Requirements>\n\t\t: CallbackRequirements<Guard>\n\t: CallbackRequirements<Guard>\nexport type EffectOperationArgument<Definition extends { input: ContractSchema }> = ContractInput<\n\tDefinition['input']\n>\nexport type EffectOperationInput<Definition extends { input: ContractSchema }> = ContractOutput<\n\tDefinition['input']\n>\nexport type EffectOperationHandlerResult<Definition extends { result: ContractSchema }> =\n\tContractInput<Definition['result']>\nexport type EffectOperationResult<Definition extends { result: ContractSchema }> = ContractOutput<\n\tDefinition['result']\n>\n\ntype Hook<Definition, Key extends PropertyKey> = Key extends keyof Definition\n\t? Definition[Key]\n\t: never\ntype Returned<Callback> = Callback extends (...arguments_: never[]) => infer Value ? Value : never\n/** A conditional wrapper must retain the unwrapped channels for its absent branch. */\ntype CoreValue<Definition> = [Returned<Hook<Definition, 'middleware'>>] extends [never]\n\t? Returned<Hook<Definition, 'handler'>> | Returned<Hook<Definition, 'guard'>>\n\t: undefined extends Hook<Definition, 'middleware'>\n\t\t?\n\t\t\t\t| Returned<Hook<Definition, 'handler'>>\n\t\t\t\t| Returned<Hook<Definition, 'guard'>>\n\t\t\t\t| Returned<Hook<Definition, 'middleware'>>\n\t\t: Returned<Hook<Definition, 'middleware'>>\ntype OutsideHooks = 'prepare' | 'audit' | 'checkPermission' | 'writeAudit'\nexport type EffectOperationError<Definition> =\n\t| ContractDecoderError<Hook<Definition, 'input'>>\n\t| ContractDecoderError<Hook<Definition, 'result'>>\n\t| ContractDecoderError<Hook<Definition, 'replayResult'>>\n\t| CallbackError<CoreValue<Definition>>\n\t| CallbackError<Definition[Extract<keyof Definition, OutsideHooks>]>\nexport type EffectOperationRequirements<Definition> =\n\t| ContractDecoderRequirements<Hook<Definition, 'input'>>\n\t| ContractDecoderRequirements<Hook<Definition, 'result'>>\n\t| ContractDecoderRequirements<Hook<Definition, 'replayResult'>>\n\t| CallbackRequirements<CoreValue<Definition>>\n\t| CallbackRequirements<Definition[Extract<keyof Definition, OutsideHooks>]>\n\ntype Supported<Value, Error = unknown, Requirements = unknown> =\n\t| Value\n\t| PromiseLike<Value>\n\t| Effect.Effect<Value, Error, Requirements>\nexport type EffectPreparation<Result, Error = never, Requirements = never> =\n\t| { kind: 'replay'; result: unknown }\n\t| { kind: 'execute'; complete?: (result: Result) => Supported<void, Error, Requirements> }\nexport type EffectMiddlewareInput<\n\tContext,\n\tInput,\n\tResult,\n\tExtension,\n\tError = never,\n\tRequirements = never,\n> = {\n\toperation: string\n\tcontext: Context\n\tcommand: Input\n\tinput: Input\n\tnext: keyof Extension extends never\n\t\t? (options?: { context?: Extension }) => Effect.Effect<Result, Error, Requirements>\n\t\t: (options: { context: Extension }) => Effect.Effect<Result, Error, Requirements>\n}\ntype Audit<Aggregates extends readonly string[]> = Omit<\n\tAuditEntryInput,\n\t'classification' | 'aggregate'\n> & {\n\taggregate: { type: Aggregates[number]; id: string }\n}\ntype OperationDefinition<\n\tContext,\n\tInput extends ContractSchema,\n\tOutput extends ContractSchema,\n\tExtension,\n\tAggregates extends readonly string[],\n\tHandler,\n\tGuard,\n\tPreparation,\n\tAuditResult,\n\tMiddleware,\n\tMetadata,\n\tBaseError,\n\tBaseRequirements,\n\tWire extends ContractSchema,\n\tReplay extends ContractSchema,\n> = {\n\tinput: Input\n\tresult: Output\n\thandler: (input: ContractOutput<Input>, context: Context & Extension) => Handler\n\tclassification?: string\n\tpermission?: string\n\tmetadata?: Metadata\n\taggregates?: Aggregates\n\treplayResult?: Replay & (ContractOutput<Replay> extends ContractOutput<Output> ? unknown : never)\n\twire?: { schema: Wire; project: (value: ContractOutput<Output>) => ContractInput<Wire> }\n\tguard?: (context: Context & Extension, input: ContractOutput<Input>) => Guard\n\tprepare?: (context: Context, input: ContractOutput<Input>) => Preparation\n\taudit?: (\n\t\tresolution: { command: ContractOutput<Input>; result: ContractOutput<Output> },\n\t\tcontext: Context,\n\t) => AuditResult\n} & (keyof Extension extends never\n\t? {\n\t\t\tmiddleware?: (\n\t\t\t\tinput: EffectMiddlewareInput<\n\t\t\t\t\tContext,\n\t\t\t\t\tContractOutput<Input>,\n\t\t\t\t\tContractInput<Output>,\n\t\t\t\t\tExtension,\n\t\t\t\t\tBaseError | CallbackError<Handler | Guard>,\n\t\t\t\t\tBaseRequirements | CallbackRequirements<Handler | Guard>\n\t\t\t\t>,\n\t\t\t) => Middleware\n\t\t}\n\t: {\n\t\t\tmiddleware: (\n\t\t\t\tinput: EffectMiddlewareInput<\n\t\t\t\t\tContext,\n\t\t\t\t\tContractOutput<Input>,\n\t\t\t\t\tContractInput<Output>,\n\t\t\t\t\tExtension,\n\t\t\t\t\tBaseError | CallbackError<Handler | Guard>,\n\t\t\t\t\tBaseRequirements | CallbackRequirements<Handler | Guard>\n\t\t\t\t>,\n\t\t\t) => Middleware\n\t\t})\n\n/**\n * Bind context once; middleware wraps the handler/guard channels and may discharge them.\n * Declare contextual guards/handlers before middleware, or annotate their parameters\n * and returned Effect channels when middleware comes first. TypeScript processes\n * context-sensitive object callbacks in declaration order.\n */\nexport function effectOperationFactory<\n\tContext,\n\tExtension extends Record<string, unknown> = Record<never, never>,\n\tBaseError = never,\n\tBaseRequirements = never,\n>() {\n\tfunction operation<\n\t\tconst Input extends ContractSchema,\n\t\tconst Output extends ContractSchema,\n\t\tHandler extends Supported<ContractInput<Output>>,\n\t\tGuard extends Supported<void> = never,\n\t\tPreparation extends Supported<EffectPreparation<ContractOutput<Output>, unknown, unknown>> =\n\t\t\tnever,\n\t\tconst Aggregates extends readonly string[] = readonly string[],\n\t\tAuditResult extends Supported<Audit<Aggregates> | null> = never,\n\t\tMiddleware extends Supported<ContractInput<Output>> = never,\n\t\tconst Metadata extends object = Record<never, never>,\n\t\t// Retain whether middleware is guaranteed, conditional, or omitted.\n\t\tconst Wire extends ContractSchema = ContractSchema,\n\t\tconst Replay extends ContractSchema = never,\n\t\tconst Definition extends object = object,\n\t>(\n\t\tdefinition: Definition &\n\t\t\tOperationDefinition<\n\t\t\t\tContext,\n\t\t\t\tInput,\n\t\t\t\tOutput,\n\t\t\t\tExtension,\n\t\t\t\tAggregates,\n\t\t\t\tHandler,\n\t\t\t\tGuard,\n\t\t\t\tPreparation,\n\t\t\t\tAuditResult,\n\t\t\t\tMiddleware,\n\t\t\t\tMetadata,\n\t\t\t\tBaseError,\n\t\t\t\tBaseRequirements,\n\t\t\t\tWire,\n\t\t\t\tReplay\n\t\t\t>,\n\t) {\n\t\t// SAFETY: the marker is type-only proof of the helper's checked callback contract.\n\t\treturn definition as CheckedEffectDefinition<\n\t\t\tContext,\n\t\t\ttypeof definition,\n\t\t\tBaseError,\n\t\t\tBaseRequirements\n\t\t>\n\t}\n\tfunction command<\n\t\tconst Input extends ContractSchema,\n\t\tconst Output extends ContractSchema,\n\t\tHandler extends Supported<ContractInput<Output>>,\n\t\tGuard extends Supported<void> = never,\n\t\tPreparation extends Supported<EffectPreparation<ContractOutput<Output>, unknown, unknown>> =\n\t\t\tnever,\n\t\tconst Aggregates extends readonly string[] = readonly string[],\n\t\tAuditResult extends Supported<Audit<Aggregates> | null> = never,\n\t\tMiddleware extends Supported<ContractInput<Output>> = never,\n\t\tconst Metadata extends object = Record<never, never>,\n\t\t// Retain whether middleware is guaranteed, conditional, or omitted.\n\t\tconst Wire extends ContractSchema = ContractSchema,\n\t\tconst Replay extends ContractSchema = never,\n\t\tconst Definition extends object = object,\n\t>(\n\t\tdefinition: Definition &\n\t\t\tOperationDefinition<\n\t\t\t\tContext,\n\t\t\t\tInput,\n\t\t\t\tOutput,\n\t\t\t\tExtension,\n\t\t\t\tAggregates,\n\t\t\t\tHandler,\n\t\t\t\tGuard,\n\t\t\t\tPreparation,\n\t\t\t\tAuditResult,\n\t\t\t\tMiddleware,\n\t\t\t\tMetadata,\n\t\t\t\tBaseError,\n\t\t\t\tBaseRequirements,\n\t\t\t\tWire,\n\t\t\t\tReplay\n\t\t\t> & {\n\t\t\t\tclassification: string\n\t\t\t\taudit: (\n\t\t\t\t\tresolution: { command: ContractOutput<Input>; result: ContractOutput<Output> },\n\t\t\t\t\tcontext: Context,\n\t\t\t\t) => AuditResult\n\t\t\t},\n\t) {\n\t\t// SAFETY: the marker is type-only proof of the helper's checked callback contract.\n\t\treturn definition as CheckedEffectDefinition<\n\t\t\tContext,\n\t\t\ttypeof definition,\n\t\t\tBaseError,\n\t\t\tBaseRequirements\n\t\t>\n\t}\n\tfunction query<\n\t\tconst Input extends ContractSchema,\n\t\tconst Output extends ContractSchema,\n\t\tHandler extends Supported<ContractInput<Output>>,\n\t\tGuard extends Supported<void> = never,\n\t\tMiddleware extends Supported<ContractInput<Output>> = never,\n\t\tconst Metadata extends object = Record<never, never>,\n\t\tconst Wire extends ContractSchema = ContractSchema,\n\t\tconst Replay extends ContractSchema = never,\n\t\tconst Definition extends object = object,\n\t>(\n\t\tdefinition: Definition &\n\t\t\tOperationDefinition<\n\t\t\t\tContext,\n\t\t\t\tInput,\n\t\t\t\tOutput,\n\t\t\t\tExtension,\n\t\t\t\treadonly string[],\n\t\t\t\tHandler,\n\t\t\t\tGuard,\n\t\t\t\tnever,\n\t\t\t\tnever,\n\t\t\t\tMiddleware,\n\t\t\t\tMetadata,\n\t\t\t\tBaseError,\n\t\t\t\tBaseRequirements,\n\t\t\t\tWire,\n\t\t\t\tReplay\n\t\t\t> & {\n\t\t\t\tprepare?: never\n\t\t\t\taudit?: never\n\t\t\t\taggregates?: never\n\t\t\t\treplayResult?: never\n\t\t\t},\n\t) {\n\t\t// SAFETY: the marker is type-only proof of the helper's checked callback contract.\n\t\treturn definition as CheckedEffectDefinition<\n\t\t\tContext,\n\t\t\ttypeof definition,\n\t\t\tBaseError,\n\t\t\tBaseRequirements\n\t\t>\n\t}\n\treturn { operation, command, query }\n}\n"],"mappings":"AA0NA,SAAgBA,GAKZ,CACH,SAASC,EAgBR,EAkBC,CAED,OAAOC,CAMR,CACA,SAASC,EAgBR,EAwBC,CAED,OAAOD,CAMR,CACA,SAASE,EAWR,EAuBC,CAED,OAAOF,CAMR,CACA,MAAO,CAAE,YAAW,UAAS,OAAM,CACpC"}
1
+ {"version":3,"file":"operation.mjs","names":["effectOperationFactory","operation","definition","command","query"],"sources":["../../../src/modules/effect/operation.ts"],"sourcesContent":["import type { Effect } from 'effect'\nimport type { ContractSchema, ContractInput, ContractOutput } from '../contracts/contract'\nimport type { ContractDecoderError, ContractDecoderRequirements } from './schema'\nimport type { AuditEntryInput } from '../../components/foundation/client'\n\n/** Ordinary failures are defects; only an explicit Effect supplies a typed error. */\nexport type CallbackError<Value> = Value extends (...arguments_: never[]) => infer Returned\n\t? CallbackError<Returned>\n\t: Value extends Effect.Effect<infer Success, infer Error, unknown>\n\t\t? Error | CallbackError<Success>\n\t\t: Value extends PromiseLike<infer Awaited>\n\t\t\t? CallbackError<Awaited>\n\t\t\t: Value extends readonly (infer Item)[]\n\t\t\t\t? CallbackError<Item>\n\t\t\t\t: Value extends { kind: 'execute'; complete?: infer Complete }\n\t\t\t\t\t? CallbackError<Complete>\n\t\t\t\t\t: never\n\nexport type CallbackRequirements<Value> = Value extends (...arguments_: never[]) => infer Returned\n\t? CallbackRequirements<Returned>\n\t: Value extends Effect.Effect<infer Success, unknown, infer Requirements>\n\t\t? Requirements | CallbackRequirements<Success>\n\t\t: Value extends PromiseLike<infer Awaited>\n\t\t\t? CallbackRequirements<Awaited>\n\t\t\t: Value extends readonly (infer Item)[]\n\t\t\t\t? CallbackRequirements<Item>\n\t\t\t\t: Value extends { kind: 'execute'; complete?: infer Complete }\n\t\t\t\t\t? CallbackRequirements<Complete>\n\t\t\t\t\t: never\n\nexport type EffectValue<Value> =\n\tValue extends Effect.Effect<infer Success, unknown, unknown>\n\t\t? EffectValue<Success>\n\t\t: Value extends PromiseLike<infer Awaited>\n\t\t\t? EffectValue<Awaited>\n\t\t\t: Value\n\ndeclare const checkedOperation: unique symbol\n/** Type-only evidence that the helper checked callbacks against the base context and schemas. */\nexport type CheckedEffectOperation<Context> = {\n\treadonly [checkedOperation]: {\n\t\tcontext: (context: Context) => void\n\t\terror: unknown\n\t\trequirements: unknown\n\t\tdefinition: unknown\n\t}\n}\ntype CheckedChannels<Context, Error, Requirements, Definition> = {\n\treadonly [checkedOperation]: {\n\t\tcontext: (context: Context) => void\n\t\terror: Error\n\t\trequirements: Requirements\n\t\tdefinition: Definition\n\t}\n}\n/** Named checked-definition boundary keeps the private evidence marker inside this module's declarations. */\nexport type CheckedEffectDefinition<\n\tContext,\n\tDefinition,\n\tError = never,\n\tRequirements = never,\n> = NoInfer<Omit<Definition, typeof checkedOperation>> &\n\tCheckedChannels<Context, Error, Requirements, Omit<Definition, typeof checkedOperation>>\n/** Reject stale helper evidence after callbacks or schemas are replaced. */\nexport type ValidatedEffectOperations<Operations> = {\n\t[Key in keyof Operations]: Operations[Key] extends {\n\t\treadonly [checkedOperation]: { definition: infer Definition }\n\t}\n\t\t? Operations[Key] extends Definition\n\t\t\t? Operations[Key]\n\t\t\t: never\n\t\t: never\n}\n/** Only middleware whose next contract captured a default policy can discharge its channels. */\nexport type UnwrappedDefaultError<Definition, Guard> = Definition extends { middleware: Function }\n\t? Definition extends CheckedChannels<never, infer Error, unknown, unknown>\n\t\t? Exclude<CallbackError<Guard>, Error>\n\t\t: CallbackError<Guard>\n\t: CallbackError<Guard>\nexport type UnwrappedDefaultRequirements<Definition, Guard> = Definition extends {\n\tmiddleware: Function\n}\n\t? Definition extends CheckedChannels<never, unknown, infer Requirements, unknown>\n\t\t? Exclude<CallbackRequirements<Guard>, Requirements>\n\t\t: CallbackRequirements<Guard>\n\t: CallbackRequirements<Guard>\nexport type EffectOperationArgument<Definition extends { input: ContractSchema }> = ContractInput<\n\tDefinition['input']\n>\nexport type EffectOperationInput<Definition extends { input: ContractSchema }> = ContractOutput<\n\tDefinition['input']\n>\nexport type EffectOperationHandlerResult<Definition extends { result: ContractSchema }> =\n\tContractInput<Definition['result']>\nexport type EffectOperationResult<Definition extends { result: ContractSchema }> = ContractOutput<\n\tDefinition['result']\n>\n\ntype Hook<Definition, Key extends PropertyKey> = Key extends keyof Definition\n\t? Definition[Key]\n\t: never\ntype Returned<Callback> = Callback extends (...arguments_: never[]) => infer Value ? Value : never\n/** A conditional wrapper must retain the unwrapped channels for its absent branch. */\ntype CoreValue<Definition> = [Returned<Hook<Definition, 'middleware'>>] extends [never]\n\t? Returned<Hook<Definition, 'handler'>> | Returned<Hook<Definition, 'guard'>>\n\t: undefined extends Hook<Definition, 'middleware'>\n\t\t?\n\t\t\t\t| Returned<Hook<Definition, 'handler'>>\n\t\t\t\t| Returned<Hook<Definition, 'guard'>>\n\t\t\t\t| Returned<Hook<Definition, 'middleware'>>\n\t\t: Returned<Hook<Definition, 'middleware'>>\ntype OutsideHooks = 'prepare' | 'audit' | 'checkPermission' | 'writeAudit'\nexport type EffectOperationError<Definition> =\n\t| ContractDecoderError<Hook<Definition, 'input'>>\n\t| ContractDecoderError<Hook<Definition, 'result'>>\n\t| ContractDecoderError<Hook<Definition, 'replayResult'>>\n\t| CallbackError<CoreValue<Definition>>\n\t| CallbackError<Definition[Extract<keyof Definition, OutsideHooks>]>\nexport type EffectOperationRequirements<Definition> =\n\t| ContractDecoderRequirements<Hook<Definition, 'input'>>\n\t| ContractDecoderRequirements<Hook<Definition, 'result'>>\n\t| ContractDecoderRequirements<Hook<Definition, 'replayResult'>>\n\t| CallbackRequirements<CoreValue<Definition>>\n\t| CallbackRequirements<Definition[Extract<keyof Definition, OutsideHooks>]>\n\ntype Supported<Value, Error = unknown, Requirements = unknown> =\n\t| Value\n\t| PromiseLike<Value>\n\t| Effect.Effect<Value, Error, Requirements>\nexport type EffectPreparation<Result, Error = never, Requirements = never> =\n\t| { kind: 'replay'; result: unknown }\n\t| { kind: 'execute'; complete?: (result: Result) => Supported<void, Error, Requirements> }\nexport type EffectMiddlewareInput<\n\tContext,\n\tInput,\n\tResult,\n\tExtension,\n\tError = never,\n\tRequirements = never,\n> = {\n\toperation: string\n\tcontext: Context\n\tcommand: Input\n\tinput: Input\n\tnext: keyof Extension extends never\n\t\t? (options?: { context?: Extension }) => Effect.Effect<Result, Error, Requirements>\n\t\t: (options: { context: Extension }) => Effect.Effect<Result, Error, Requirements>\n}\ntype Audit<Aggregates extends readonly string[]> = Omit<\n\tAuditEntryInput,\n\t'classification' | 'aggregate'\n> & {\n\taggregate: { type: Aggregates[number]; id: string }\n}\nexport type OperationDefinition<\n\tContext,\n\tInput extends ContractSchema,\n\tOutput extends ContractSchema,\n\tExtension,\n\tAggregates extends readonly string[],\n\tHandler,\n\tGuard,\n\tPreparation,\n\tAuditResult,\n\tMiddleware,\n\tMetadata,\n\tBaseError,\n\tBaseRequirements,\n\tWire extends ContractSchema,\n\tReplay extends ContractSchema,\n> = {\n\tinput: Input\n\tresult: Output\n\thandler: (input: ContractOutput<Input>, context: Context & Extension) => Handler\n\tclassification?: string\n\tpermission?: string\n\tmetadata?: Metadata\n\taggregates?: Aggregates\n\treplayResult?: Replay & (ContractOutput<Replay> extends ContractOutput<Output> ? unknown : never)\n\twire?: { schema: Wire; project: (value: ContractOutput<Output>) => ContractInput<Wire> }\n\tguard?: (context: Context & Extension, input: ContractOutput<Input>) => Guard\n\tprepare?: (context: Context, input: ContractOutput<Input>) => Preparation\n\taudit?: (\n\t\tresolution: { command: ContractOutput<Input>; result: ContractOutput<Output> },\n\t\tcontext: Context,\n\t) => AuditResult\n} & (keyof Extension extends never\n\t? {\n\t\t\tmiddleware?: (\n\t\t\t\tinput: EffectMiddlewareInput<\n\t\t\t\t\tContext,\n\t\t\t\t\tContractOutput<Input>,\n\t\t\t\t\tContractInput<Output>,\n\t\t\t\t\tExtension,\n\t\t\t\t\tBaseError | CallbackError<Handler | Guard>,\n\t\t\t\t\tBaseRequirements | CallbackRequirements<Handler | Guard>\n\t\t\t\t>,\n\t\t\t) => Middleware\n\t\t}\n\t: {\n\t\t\tmiddleware: (\n\t\t\t\tinput: EffectMiddlewareInput<\n\t\t\t\t\tContext,\n\t\t\t\t\tContractOutput<Input>,\n\t\t\t\t\tContractInput<Output>,\n\t\t\t\t\tExtension,\n\t\t\t\t\tBaseError | CallbackError<Handler | Guard>,\n\t\t\t\t\tBaseRequirements | CallbackRequirements<Handler | Guard>\n\t\t\t\t>,\n\t\t\t) => Middleware\n\t\t})\n\n/**\n * Bind context once; middleware wraps the handler/guard channels and may discharge them.\n * Declare contextual guards/handlers before middleware, or annotate their parameters\n * and returned Effect channels when middleware comes first. TypeScript processes\n * context-sensitive object callbacks in declaration order.\n */\nexport function effectOperationFactory<\n\tContext,\n\tExtension extends Record<string, unknown> = Record<never, never>,\n\tBaseError = never,\n\tBaseRequirements = never,\n\tAuditRequired extends boolean = true,\n>() {\n\tfunction operation<\n\t\tconst Input extends ContractSchema,\n\t\tconst Output extends ContractSchema,\n\t\tHandler extends Supported<ContractInput<Output>>,\n\t\tGuard extends Supported<void> = never,\n\t\tPreparation extends Supported<EffectPreparation<ContractOutput<Output>, unknown, unknown>> =\n\t\t\tnever,\n\t\tconst Aggregates extends readonly string[] = readonly string[],\n\t\tAuditResult extends Supported<Audit<Aggregates> | null> = never,\n\t\tMiddleware extends Supported<ContractInput<Output>> = never,\n\t\tconst Metadata extends object = Record<never, never>,\n\t\t// Retain whether middleware is guaranteed, conditional, or omitted.\n\t\tconst Wire extends ContractSchema = ContractSchema,\n\t\tconst Replay extends ContractSchema = never,\n\t\tconst Definition extends object = object,\n\t>(\n\t\tdefinition: Definition &\n\t\t\tOperationDefinition<\n\t\t\t\tContext,\n\t\t\t\tInput,\n\t\t\t\tOutput,\n\t\t\t\tExtension,\n\t\t\t\tAggregates,\n\t\t\t\tHandler,\n\t\t\t\tGuard,\n\t\t\t\tPreparation,\n\t\t\t\tAuditResult,\n\t\t\t\tMiddleware,\n\t\t\t\tMetadata,\n\t\t\t\tBaseError,\n\t\t\t\tBaseRequirements,\n\t\t\t\tWire,\n\t\t\t\tReplay\n\t\t\t>,\n\t) {\n\t\t// SAFETY: the marker is type-only proof of the helper's checked callback contract.\n\t\treturn definition as CheckedEffectDefinition<\n\t\t\tContext,\n\t\t\ttypeof definition,\n\t\t\tBaseError,\n\t\t\tBaseRequirements\n\t\t>\n\t}\n\tfunction command<\n\t\tconst Input extends ContractSchema,\n\t\tconst Output extends ContractSchema,\n\t\tHandler extends Supported<ContractInput<Output>>,\n\t\tGuard extends Supported<void> = never,\n\t\tPreparation extends Supported<EffectPreparation<ContractOutput<Output>, unknown, unknown>> =\n\t\t\tnever,\n\t\tconst Aggregates extends readonly string[] = readonly string[],\n\t\tAuditResult extends Supported<Audit<Aggregates> | null> = never,\n\t\tMiddleware extends Supported<ContractInput<Output>> = never,\n\t\tconst Metadata extends object = Record<never, never>,\n\t\t// Retain whether middleware is guaranteed, conditional, or omitted.\n\t\tconst Wire extends ContractSchema = ContractSchema,\n\t\tconst Replay extends ContractSchema = never,\n\t\tconst Definition extends object = object,\n\t>(\n\t\tdefinition: Definition &\n\t\t\tOperationDefinition<\n\t\t\t\tContext,\n\t\t\t\tInput,\n\t\t\t\tOutput,\n\t\t\t\tExtension,\n\t\t\t\tAggregates,\n\t\t\t\tHandler,\n\t\t\t\tGuard,\n\t\t\t\tPreparation,\n\t\t\t\tAuditResult,\n\t\t\t\tMiddleware,\n\t\t\t\tMetadata,\n\t\t\t\tBaseError,\n\t\t\t\tBaseRequirements,\n\t\t\t\tWire,\n\t\t\t\tReplay\n\t\t\t> & {\n\t\t\t\tclassification: string\n\t\t\t} & (AuditRequired extends true\n\t\t\t\t? {\n\t\t\t\t\t\taudit: (\n\t\t\t\t\t\t\tresolution: { command: ContractOutput<Input>; result: ContractOutput<Output> },\n\t\t\t\t\t\t\tcontext: Context,\n\t\t\t\t\t\t) => AuditResult\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t) {\n\t\t// SAFETY: the marker is type-only proof of the helper's checked callback contract.\n\t\t// oxlint-disable-next-line anti-slop/no-chained-type-assertions -- SAFETY: The private marker is type-only callback evidence, not a runtime field.\n\t\treturn definition as unknown as CheckedEffectDefinition<\n\t\t\tContext,\n\t\t\ttypeof definition,\n\t\t\tBaseError,\n\t\t\tBaseRequirements\n\t\t>\n\t}\n\tfunction query<\n\t\tconst Input extends ContractSchema,\n\t\tconst Output extends ContractSchema,\n\t\tHandler extends Supported<ContractInput<Output>>,\n\t\tGuard extends Supported<void> = never,\n\t\tMiddleware extends Supported<ContractInput<Output>> = never,\n\t\tconst Metadata extends object = Record<never, never>,\n\t\tconst Wire extends ContractSchema = ContractSchema,\n\t\tconst Replay extends ContractSchema = never,\n\t\tconst Definition extends object = object,\n\t>(\n\t\tdefinition: Definition &\n\t\t\tOperationDefinition<\n\t\t\t\tContext,\n\t\t\t\tInput,\n\t\t\t\tOutput,\n\t\t\t\tExtension,\n\t\t\t\treadonly string[],\n\t\t\t\tHandler,\n\t\t\t\tGuard,\n\t\t\t\tnever,\n\t\t\t\tnever,\n\t\t\t\tMiddleware,\n\t\t\t\tMetadata,\n\t\t\t\tBaseError,\n\t\t\t\tBaseRequirements,\n\t\t\t\tWire,\n\t\t\t\tReplay\n\t\t\t> & {\n\t\t\t\tprepare?: never\n\t\t\t\taudit?: never\n\t\t\t\taggregates?: never\n\t\t\t\treplayResult?: never\n\t\t\t},\n\t) {\n\t\t// SAFETY: the marker is type-only proof of the helper's checked callback contract.\n\t\treturn definition as CheckedEffectDefinition<\n\t\t\tContext,\n\t\t\ttypeof definition,\n\t\t\tBaseError,\n\t\t\tBaseRequirements\n\t\t>\n\t}\n\treturn { operation, command, query }\n}\n"],"mappings":"AA0NA,SAAgBA,GAMZ,CACH,SAASC,EAgBR,EAkBC,CAED,OAAOC,CAMR,CACA,SAASC,EAgBR,EA2BC,CAGD,OAAOD,CAMR,CACA,SAASE,EAWR,EAuBC,CAED,OAAOF,CAMR,CACA,MAAO,CAAE,YAAW,UAAS,OAAM,CACpC"}
@@ -1,7 +1,10 @@
1
1
  import { ContractOutput, ContractSchema } from "../contracts/contract.mjs";
2
2
  import { OperationPublicResult, SelectedOperation } from "../contracts/exposure.mjs";
3
3
  import { Observability, ObservabilityOptions } from "../../components/foundation/modules/observability/observability.mjs";
4
+ import { DomainContract, DomainQueryContract } from "../contracts/domain.mjs";
4
5
  import { CallbackError, CallbackRequirements, CheckedEffectOperation, EffectOperationArgument, EffectOperationError, EffectOperationRequirements, EffectOperationResult, EffectValue, UnwrappedDefaultError, UnwrappedDefaultRequirements, ValidatedEffectOperations, effectOperationFactory } from "./operation.mjs";
6
+ import { BoundOperations } from "../contracts/binding.mjs";
7
+ import { DomainEffectFactory, DomainEffectImplementations, ExactDomainOperations } from "./domain.mjs";
5
8
  import { Effect } from "effect";
6
9
  //#region src/modules/effect/query.d.ts
7
10
  type Supported<Value> = Value | PromiseLike<Value> | Effect.Effect<Value, unknown, unknown>;
@@ -56,13 +59,26 @@ export type EffectQueryDependencies = {
56
59
  }) => unknown;
57
60
  };
58
61
  /** The public Foundation binds trusted application policies once. */
59
- export declare function bindEffectQuery<const Dependencies extends EffectQueryDependencies>(dependencies: Dependencies): <Host extends PolicyHost<Dependencies>, ContextReturned, const Operations extends QueryRegistry<EffectValue<ContextReturned>>, GuardReturned extends Supported<void> = never>(configuration: {
60
- context: (host: Host) => ContextReturned;
61
- operations: (definitions: ReturnType<typeof effectOperationFactory<EffectValue<ContextReturned>, Record<never, never>, NoInfer<CallbackError<GuardReturned>>, NoInfer<CallbackRequirements<GuardReturned>>>>) => Operations & NoInfer<ValidatedEffectOperations<Operations>>;
62
- defaults?: {
63
- metadata?: object;
64
- guard?: (context: EffectValue<ContextReturned>) => GuardReturned;
65
- };
66
- }) => ReturnType<typeof createEffectQuery<Host, ContextReturned, Operations, PolicyReturned<Dependencies>, GuardReturned>>;
62
+ export declare function bindEffectQuery<const Dependencies extends EffectQueryDependencies>(dependencies: Dependencies): {
63
+ <Host extends PolicyHost<Dependencies>, ContextReturned, const Contract extends DomainContract & {
64
+ queries: Readonly<Record<string, DomainQueryContract>>;
65
+ }, const Operations extends DomainEffectImplementations<EffectValue<ContextReturned>, Contract['queries']>, Mode extends false, GuardReturned extends Supported<void> = never>(configuration: {
66
+ contract: Contract & NoInfer<Operations extends ExactDomainOperations<Operations, Contract['queries']> & ValidatedEffectOperations<Operations> ? unknown : never>;
67
+ context: (host: Host) => ContextReturned;
68
+ operations: (define: DomainEffectFactory<EffectValue<ContextReturned>, Contract['queries'], Mode, never, NoInfer<CallbackError<GuardReturned>>, NoInfer<CallbackRequirements<GuardReturned>>>) => Operations;
69
+ defaults?: {
70
+ metadata?: object;
71
+ guard?: (context: EffectValue<ContextReturned>) => GuardReturned;
72
+ };
73
+ }): ReturnType<typeof createEffectQuery<Host, ContextReturned, BoundOperations<Operations, Contract['queries']>, PolicyReturned<Dependencies>, GuardReturned>>;
74
+ <Host extends PolicyHost<Dependencies>, ContextReturned, const Operations extends QueryRegistry<EffectValue<ContextReturned>>, GuardReturned extends Supported<void> = never>(configuration: {
75
+ context: (host: Host) => ContextReturned;
76
+ operations: (definitions: ReturnType<typeof effectOperationFactory<EffectValue<ContextReturned>, Record<never, never>, NoInfer<CallbackError<GuardReturned>>, NoInfer<CallbackRequirements<GuardReturned>>>>) => Operations & NoInfer<ValidatedEffectOperations<Operations>>;
77
+ defaults?: {
78
+ metadata?: object;
79
+ guard?: (context: EffectValue<ContextReturned>) => GuardReturned;
80
+ };
81
+ }): ReturnType<typeof createEffectQuery<Host, ContextReturned, Operations, PolicyReturned<Dependencies>, GuardReturned>>;
82
+ };
67
83
  //#endregion
68
84
  //# sourceMappingURL=query.d.mts.map
@@ -1,2 +1,2 @@
1
- import{selectOperation as e}from"../contracts/exposure.mjs";import{normalizeEffect as t,observationFailure as n}from"./normalize.mjs";import{effectOperationFactory as r}from"./operation.mjs";import{Observability as i}from"../../components/foundation/modules/observability/observability.mjs";import{decodeEffectContract as a}from"./schema.mjs";import{Effect as o,Exit as s}from"effect";var c=class extends Error{code=`QUERY_MIDDLEWARE_NEXT_REUSED`;name=`QueryMiddlewareError`;constructor(){super(`A query middleware called next() more than once`)}},l=class extends Error{code=`QUERY_OPERATION_NOT_CONFIGURED`;name=`QueryConfigurationError`;constructor(){super(`The selected query operation is not configured`)}},u=class extends Error{code=`QUERY_PERMISSION_CHECKER_MISSING`;name=`QueryPermissionError`;constructor(){super(`Query permission requires an injected permission checker`)}};function d(d){let f=r(),p=d.operations(f),m=d.observability instanceof i?d.observability:new i(d.observability??{enabled:!1,classifyError:()=>({outcome:`failed`,errorCode:`UNEXPECTED`})});function h(e,r,i){return o.suspend(()=>{if(!Object.prototype.hasOwnProperty.call(p,e))return o.die(new l);let f=p[e];return o.flatMap(a(f.input,r),r=>{let l=m.start({operation:e,classification:f.classification??`query`});return o.gen(function*(){if(f.permission!==void 0){let n=d.checkPermission;if(!n)return yield*o.die(new u);yield*t(()=>n(i,{permission:f.permission,operation:e}))}let n=yield*t(()=>d.context(i)),s={...d.defaults?.metadata,...f.metadata},l=e=>o.gen(function*(){let n=d.defaults?.guard;return n&&(yield*t(()=>n(e))),f.guard&&(yield*t(()=>f.guard(e,r))),yield*t(()=>f.handler(r,e))}),p=!1,m=f.middleware,h=m?yield*t(()=>m({operation:e,input:r,command:r,context:n,metadata:s,next:e=>o.suspend(()=>p?o.die(new c):(p=!0,l(e?.context?Object.assign({},n,e.context):n)))})):yield*l(n);return yield*a(f.result,h)}).pipe(o.onExit(e=>o.sync(()=>{s.isSuccess(e)?l.completed():l.failed(n(e.cause))})))})})}function g(t,n){if(!Object.hasOwn(p,n))throw new l;return e(t,`query`,n,p[n])}return{exec:h,expose:g,withContext(e){return{exec:(t,n)=>h(t,n,e)}}}}function f(e){return function(t){let n=e.checkPermission;return d({...t,observability:e.observability,checkPermission:e.checkPermission?n:void 0})}}export{f as bindEffectQuery,d as createEffectQuery};
1
+ import{selectOperation as e}from"../contracts/exposure.mjs";import{normalizeEffect as t,observationFailure as n}from"./normalize.mjs";import{effectOperationFactory as r}from"./operation.mjs";import{Observability as i}from"../../components/foundation/modules/observability/observability.mjs";import{decodeEffectContract as a}from"./schema.mjs";import{snapshotOperations as o}from"../contracts/binding.mjs";import{domainEffectFactory as s}from"./domain.mjs";import{Effect as c,Exit as l}from"effect";var u=class extends Error{code=`QUERY_MIDDLEWARE_NEXT_REUSED`;name=`QueryMiddlewareError`;constructor(){super(`A query middleware called next() more than once`)}},d=class extends Error{code=`QUERY_OPERATION_NOT_CONFIGURED`;name=`QueryConfigurationError`;constructor(){super(`The selected query operation is not configured`)}},f=class extends Error{code=`QUERY_PERMISSION_CHECKER_MISSING`;name=`QueryPermissionError`;constructor(){super(`Query permission requires an injected permission checker`)}};function p(o){let s=r(),p=o.operations(s),m=o.observability instanceof i?o.observability:new i(o.observability??{enabled:!1,classifyError:()=>({outcome:`failed`,errorCode:`UNEXPECTED`})});function h(e,r,i){return c.suspend(()=>{if(!Object.prototype.hasOwnProperty.call(p,e))return c.die(new d);let s=p[e];return c.flatMap(a(s.input,r),r=>{let d=m.start({operation:e,classification:s.classification??`query`});return c.gen(function*(){if(s.permission!==void 0){let n=o.checkPermission;if(!n)return yield*c.die(new f);yield*t(()=>n(i,{permission:s.permission,operation:e}))}let n=yield*t(()=>o.context(i)),l={...o.defaults?.metadata,...s.metadata},d=e=>c.gen(function*(){let n=o.defaults?.guard;return n&&(yield*t(()=>n(e))),s.guard&&(yield*t(()=>s.guard(e,r))),yield*t(()=>s.handler(r,e))}),p=!1,m=s.middleware,h=m?yield*t(()=>m({operation:e,input:r,command:r,context:n,metadata:l,next:e=>c.suspend(()=>p?c.die(new u):(p=!0,d(e?.context?Object.assign({},n,e.context):n)))})):yield*d(n);return yield*a(s.result,h)}).pipe(c.onExit(e=>c.sync(()=>{l.isSuccess(e)?d.completed():d.failed(n(e.cause))})))})})}function g(t,n){if(!Object.hasOwn(p,n))throw new d;return e(t,`query`,n,p[n])}return{exec:h,expose:g,withContext(e){return{exec:(t,n)=>h(t,n,e)}}}}function m(e){function t(t){let n=t.contract?s(t.contract.queries??{},!1):r(),i=o(t.operations(n),t.contract,`queries`);return p({...t,...e,operations:()=>i})}return t}export{m as bindEffectQuery,p as createEffectQuery};
2
2
  //# sourceMappingURL=query.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.mjs","names":["QueryMiddlewareError","QueryConfigurationError","QueryPermissionError","createEffectQuery","definitions","effectOperationFactory","operations","configuration","observability","Observability","exec","Effect","operation","definition","decodeEffectContract","input","observation","check","normalizeEffect","host","context","metadata","core","guard","current","parsedInput","usedNext","middleware","output","options","Exit","exit","observationFailure","expose","selectOperation","owner","bindEffectQuery","checkPermission","dependencies"],"sources":["../../../src/modules/effect/query.ts"],"sourcesContent":["import { Effect, Exit } from 'effect'\nimport type { ContractSchema } from '../contracts/contract'\nimport {\n\tselectOperation,\n\ttype SelectedOperation,\n\ttype OperationPublicResult,\n} from '../contracts/exposure'\nimport { decodeEffectContract } from './schema'\n// oxlint-disable-next-line cvx/component-boundaries -- SAFETY: Internal optional adapter shares the Effect-free Foundation lifecycle and types without entering the Convex component deployment graph.\nimport {\n\tObservability,\n\ttype ObservabilityOptions,\n} from '../../components/foundation/modules/observability/observability'\nimport { normalizeEffect, observationFailure } from './normalize'\nimport {\n\teffectOperationFactory,\n\ttype CallbackError,\n\ttype CallbackRequirements,\n\ttype EffectOperationArgument,\n\ttype EffectOperationError,\n\ttype EffectOperationRequirements,\n\ttype EffectOperationResult,\n\ttype EffectValue,\n\ttype CheckedEffectOperation,\n\ttype UnwrappedDefaultError,\n\ttype UnwrappedDefaultRequirements,\n\ttype ValidatedEffectOperations,\n} from './operation'\n\ntype Supported<Value> = Value | PromiseLike<Value> | Effect.Effect<Value, unknown, unknown>\ntype QueryDefinition = {\n\tinput: ContractSchema\n\tresult: ContractSchema\n\t// oxlint-disable-next-line anti-slop/no-unknown-returns -- Internal heterogeneous storage; selected schemas restore the concrete result at exec.\n\thandler: (input: never, context: never) => unknown\n\tclassification?: string\n\tpermission?: string\n\tmetadata?: object\n\t// oxlint-disable-next-line anti-slop/no-unknown-returns -- Internal hook storage retains the concrete definition separately.\n\tguard?: (context: never, input: never) => unknown\n\t// oxlint-disable-next-line anti-slop/no-unknown-returns -- Internal hook storage retains the concrete definition separately.\n\tmiddleware?: (input: never) => unknown\n}\ntype QueryRegistry<Context> = Readonly<\n\tRecord<\n\t\tstring,\n\t\tPick<QueryDefinition, 'input' | 'result' | 'handler'> &\n\t\t\tCheckedEffectOperation<Context> & {\n\t\t\t\tprepare?: never\n\t\t\t\taudit?: never\n\t\t\t\taggregates?: never\n\t\t\t\treplayResult?: never\n\t\t\t}\n\t>\n>\ntype OperationKey<Operations> = Extract<keyof Operations, string>\n\nclass QueryMiddlewareError extends Error {\n\treadonly code = 'QUERY_MIDDLEWARE_NEXT_REUSED'\n\treadonly name = 'QueryMiddlewareError'\n\tconstructor() {\n\t\tsuper('A query middleware called next() more than once')\n\t}\n}\nclass QueryConfigurationError extends Error {\n\treadonly code = 'QUERY_OPERATION_NOT_CONFIGURED'\n\treadonly name = 'QueryConfigurationError'\n\tconstructor() {\n\t\tsuper('The selected query operation is not configured')\n\t}\n}\nclass QueryPermissionError extends Error {\n\treadonly code = 'QUERY_PERMISSION_CHECKER_MISSING'\n\treadonly name = 'QueryPermissionError'\n\tconstructor() {\n\t\tsuper('Query permission requires an injected permission checker')\n\t}\n}\n\n/** Injectable domain queries compose lazily; the API chooses native function kind. */\nexport function createEffectQuery<\n\tHost,\n\tContextReturned,\n\tconst Operations extends QueryRegistry<EffectValue<ContextReturned>>,\n\tPermissionReturned = never,\n\tGuardReturned extends Supported<void> = never,\n>(configuration: {\n\tcontext: (host: Host) => ContextReturned\n\toperations: (\n\t\tdefinitions: ReturnType<\n\t\t\ttypeof effectOperationFactory<\n\t\t\t\tEffectValue<ContextReturned>,\n\t\t\t\tRecord<never, never>,\n\t\t\t\tNoInfer<CallbackError<GuardReturned>>,\n\t\t\t\tNoInfer<CallbackRequirements<GuardReturned>>\n\t\t\t>\n\t\t>,\n\t) => Operations & NoInfer<ValidatedEffectOperations<Operations>>\n\tcheckPermission?: (\n\t\thost: Host,\n\t\tinput: { permission: string; operation: string },\n\t) => PermissionReturned\n\tdefaults?: { metadata?: object; guard?: (context: EffectValue<ContextReturned>) => GuardReturned }\n\tobservability?: ObservabilityOptions | Observability\n}) {\n\tconst definitions = effectOperationFactory<\n\t\tEffectValue<ContextReturned>,\n\t\tRecord<never, never>,\n\t\tCallbackError<GuardReturned>,\n\t\tCallbackRequirements<GuardReturned>\n\t>()\n\tconst operations: Operations = configuration.operations(definitions)\n\tconst observability =\n\t\tconfiguration.observability instanceof Observability\n\t\t\t? configuration.observability\n\t\t\t: new Observability(\n\t\t\t\t\tconfiguration.observability ?? {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\tclassifyError: () => ({ outcome: 'failed', errorCode: 'UNEXPECTED' }),\n\t\t\t\t\t},\n\t\t\t\t)\n\n\tfunction exec<const Key extends OperationKey<Operations>>(\n\t\toperation: Key,\n\t\tinput: EffectOperationArgument<Operations[Key]>,\n\t\thost: Host,\n\t): Effect.Effect<\n\t\tEffectOperationResult<Operations[Key]>,\n\t\t| EffectOperationError<Operations[Key]>\n\t\t| CallbackError<ContextReturned | PermissionReturned>\n\t\t| UnwrappedDefaultError<Operations[Key], GuardReturned>,\n\t\t| EffectOperationRequirements<Operations[Key]>\n\t\t| CallbackRequirements<ContextReturned | PermissionReturned>\n\t\t| UnwrappedDefaultRequirements<Operations[Key], GuardReturned>\n\t> {\n\t\tconst execution = Effect.suspend(() => {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(operations, operation)) {\n\t\t\t\treturn Effect.die(new QueryConfigurationError())\n\t\t\t}\n\t\t\t// SAFETY: operation helpers check hooks before this heterogeneous storage seam.\n\t\t\tconst definition: QueryDefinition = operations[operation]\n\t\t\treturn Effect.flatMap(decodeEffectContract(definition.input, input), (parsedInput) => {\n\t\t\t\tconst observation = observability.start({\n\t\t\t\t\toperation,\n\t\t\t\t\tclassification: definition.classification ?? 'query',\n\t\t\t\t})\n\t\t\t\tconst run = Effect.gen(function* () {\n\t\t\t\t\tif (definition.permission !== undefined) {\n\t\t\t\t\t\tconst check = configuration.checkPermission\n\t\t\t\t\t\tif (!check) return yield* Effect.die(new QueryPermissionError())\n\t\t\t\t\t\tyield* normalizeEffect(() =>\n\t\t\t\t\t\t\tcheck(host, { permission: definition.permission!, operation }),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tconst context = yield* normalizeEffect(() => configuration.context(host))\n\t\t\t\t\tconst metadata = { ...configuration.defaults?.metadata, ...definition.metadata }\n\t\t\t\t\tconst core = (current: EffectValue<ContextReturned>) =>\n\t\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\t\tconst guard = configuration.defaults?.guard\n\t\t\t\t\t\t\tif (guard) yield* normalizeEffect(() => guard(current))\n\t\t\t\t\t\t\tif (definition.guard)\n\t\t\t\t\t\t\t\tyield* normalizeEffect(() => {\n\t\t\t\t\t\t\t\t\t// SAFETY: selected schemas and context own the stored guard parameters.\n\t\t\t\t\t\t\t\t\treturn definition.guard!(current as never, parsedInput as never)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\treturn yield* normalizeEffect(() => {\n\t\t\t\t\t\t\t\t// SAFETY: selected schemas and context own the stored handler parameters.\n\t\t\t\t\t\t\t\treturn definition.handler(parsedInput as never, current as never)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\tlet usedNext = false\n\t\t\t\t\tconst middleware = definition.middleware\n\t\t\t\t\tconst output = middleware\n\t\t\t\t\t\t? yield* normalizeEffect(() => {\n\t\t\t\t\t\t\t\t// SAFETY: the selected helper checked this middleware's input and next contract.\n\t\t\t\t\t\t\t\treturn middleware({\n\t\t\t\t\t\t\t\t\toperation,\n\t\t\t\t\t\t\t\t\tinput: parsedInput,\n\t\t\t\t\t\t\t\t\tcommand: parsedInput,\n\t\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\t\tmetadata,\n\t\t\t\t\t\t\t\t\tnext: (options?: { context?: object }) =>\n\t\t\t\t\t\t\t\t\t\tEffect.suspend(() => {\n\t\t\t\t\t\t\t\t\t\t\tif (usedNext) return Effect.die(new QueryMiddlewareError())\n\t\t\t\t\t\t\t\t\t\t\tusedNext = true\n\t\t\t\t\t\t\t\t\t\t\treturn core(\n\t\t\t\t\t\t\t\t\t\t\t\toptions?.context ? Object.assign({}, context, options.context) : context,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t} as never)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: yield* core(context)\n\t\t\t\t\treturn yield* decodeEffectContract(definition.result, output)\n\t\t\t\t})\n\t\t\t\treturn run.pipe(\n\t\t\t\t\tEffect.onExit((exit) =>\n\t\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\t\tif (Exit.isSuccess(exit)) observation.completed()\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tobservation.failed(observationFailure(exit.cause))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t})\n\t\t})\n\t\t// SAFETY: selected schemas own A; concrete callbacks and the wrapped middleware\n\t\t// own E/R. No interpreter or runner executes this Effect before the caller does.\n\t\treturn execution as ReturnType<typeof exec<Key>>\n\t}\n\tfunction expose<const Owner extends symbol, const Key extends OperationKey<Operations>>(\n\t\towner: Owner,\n\t\toperation: Key,\n\t): SelectedOperation<\n\t\tOwner,\n\t\tKey,\n\t\tOperations[Key]['input'],\n\t\tOperationPublicResult<Operations[Key]>\n\t> {\n\t\tif (!Object.hasOwn(operations, operation)) throw new QueryConfigurationError()\n\t\treturn selectOperation(owner, 'query', operation, operations[operation])\n\t}\n\treturn {\n\t\texec,\n\t\texpose,\n\t\t/** Bind invocation context without resolving it or running an operation. */\n\t\twithContext(context: Host) {\n\t\t\treturn {\n\t\t\t\texec: <const Key extends OperationKey<Operations>>(\n\t\t\t\t\toperation: Key,\n\t\t\t\t\tinput: EffectOperationArgument<Operations[Key]>,\n\t\t\t\t) => exec(operation, input, context),\n\t\t\t}\n\t\t},\n\t}\n}\n\ntype Policy<Dependencies> = 'checkPermission' extends keyof Dependencies\n\t? Dependencies['checkPermission']\n\t: never\n// oxlint-disable-next-line anti-slop/no-unknown-returns -- Conditional type extracts the host; no unknown result is exposed by the registry.\ntype CallbackHost<Callback> = Callback extends (host: infer Host, input: never) => unknown\n\t? Host\n\t: never\ntype CallbackReturned<Callback> = Callback extends (...arguments_: never[]) => infer Returned\n\t? Returned\n\t: never\ntype PolicyHost<Dependencies> = [CallbackHost<Policy<Dependencies>>] extends [never]\n\t? unknown\n\t: CallbackHost<Policy<Dependencies>>\ntype PolicyReturned<Dependencies> = CallbackReturned<Policy<Dependencies>>\nexport type EffectQueryDependencies = {\n\tobservability: Observability\n\t// oxlint-disable-next-line anti-slop/no-unknown-returns -- Host policy storage is erased; the bound generic dependency retains its concrete E/R.\n\tcheckPermission?: (host: never, input: { permission: string; operation: string }) => unknown\n}\n\n/** The public Foundation binds trusted application policies once. */\nexport function bindEffectQuery<const Dependencies extends EffectQueryDependencies>(\n\tdependencies: Dependencies,\n) {\n\treturn function query<\n\t\tHost extends PolicyHost<Dependencies>,\n\t\tContextReturned,\n\t\tconst Operations extends QueryRegistry<EffectValue<ContextReturned>>,\n\t\tGuardReturned extends Supported<void> = never,\n\t>(configuration: {\n\t\tcontext: (host: Host) => ContextReturned\n\t\toperations: (\n\t\t\tdefinitions: ReturnType<\n\t\t\t\ttypeof effectOperationFactory<\n\t\t\t\t\tEffectValue<ContextReturned>,\n\t\t\t\t\tRecord<never, never>,\n\t\t\t\t\tNoInfer<CallbackError<GuardReturned>>,\n\t\t\t\t\tNoInfer<CallbackRequirements<GuardReturned>>\n\t\t\t\t>\n\t\t\t>,\n\t\t) => Operations & NoInfer<ValidatedEffectOperations<Operations>>\n\t\tdefaults?: {\n\t\t\tmetadata?: object\n\t\t\tguard?: (context: EffectValue<ContextReturned>) => GuardReturned\n\t\t}\n\t}): ReturnType<\n\t\ttypeof createEffectQuery<\n\t\t\tHost,\n\t\t\tContextReturned,\n\t\t\tOperations,\n\t\t\tPolicyReturned<Dependencies>,\n\t\t\tGuardReturned\n\t\t>\n\t> {\n\t\t// SAFETY: Host is constrained to the trusted checker's host type; its concrete\n\t\t// return is retained while restoring the erased invocation argument slot.\n\t\tconst checkPermission = dependencies.checkPermission as (\n\t\t\thost: Host,\n\t\t\tinput: { permission: string; operation: string },\n\t\t) => PolicyReturned<Dependencies>\n\t\treturn createEffectQuery<\n\t\t\tHost,\n\t\t\tContextReturned,\n\t\t\tOperations,\n\t\t\tPolicyReturned<Dependencies>,\n\t\t\tGuardReturned\n\t\t>({\n\t\t\t...configuration,\n\t\t\tobservability: dependencies.observability,\n\t\t\tcheckPermission: dependencies.checkPermission ? checkPermission : undefined,\n\t\t})\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"query.mjs","names":["QueryMiddlewareError","QueryConfigurationError","QueryPermissionError","createEffectQuery","definitions","effectOperationFactory","operations","configuration","observability","Observability","exec","Effect","operation","definition","decodeEffectContract","input","observation","check","normalizeEffect","host","context","metadata","core","guard","current","parsedInput","usedNext","middleware","output","options","Exit","exit","observationFailure","expose","selectOperation","owner","bindEffectQuery","query","domainEffectFactory","snapshotOperations","dependencies"],"sources":["../../../src/modules/effect/query.ts"],"sourcesContent":["/* oxlint-disable anti-slop/no-unknown-returns, anti-slop/no-unsafe-dictionary-type -- Overload implementation storage is erased; public signatures retain concrete values, errors and services. */\nimport { Effect, Exit } from 'effect'\nimport type { ContractSchema } from '../contracts/contract'\nimport {\n\tselectOperation,\n\ttype SelectedOperation,\n\ttype OperationPublicResult,\n} from '../contracts/exposure'\nimport { decodeEffectContract } from './schema'\n// oxlint-disable-next-line cvx/component-boundaries -- SAFETY: Internal optional adapter shares the Effect-free Foundation lifecycle and types without entering the Convex component deployment graph.\nimport {\n\tObservability,\n\ttype ObservabilityOptions,\n} from '../../components/foundation/modules/observability/observability'\nimport { normalizeEffect, observationFailure } from './normalize'\nimport {\n\teffectOperationFactory,\n\ttype CallbackError,\n\ttype CallbackRequirements,\n\ttype EffectOperationArgument,\n\ttype EffectOperationError,\n\ttype EffectOperationRequirements,\n\ttype EffectOperationResult,\n\ttype EffectValue,\n\ttype CheckedEffectOperation,\n\ttype UnwrappedDefaultError,\n\ttype UnwrappedDefaultRequirements,\n\ttype ValidatedEffectOperations,\n} from './operation'\n\nimport type { DomainContract, DomainQueryContract } from '../contracts/domain'\nimport { snapshotOperations, type BoundOperations } from '../contracts/binding'\nimport {\n\tdomainEffectFactory,\n\ttype DomainEffectFactory,\n\ttype DomainEffectImplementations,\n\ttype ExactDomainOperations,\n} from './domain'\n\ntype Supported<Value> = Value | PromiseLike<Value> | Effect.Effect<Value, unknown, unknown>\ntype QueryDefinition = {\n\tinput: ContractSchema\n\tresult: ContractSchema\n\t// oxlint-disable-next-line anti-slop/no-unknown-returns -- Internal heterogeneous storage; selected schemas restore the concrete result at exec.\n\thandler: (input: never, context: never) => unknown\n\tclassification?: string\n\tpermission?: string\n\tmetadata?: object\n\t// oxlint-disable-next-line anti-slop/no-unknown-returns -- Internal hook storage retains the concrete definition separately.\n\tguard?: (context: never, input: never) => unknown\n\t// oxlint-disable-next-line anti-slop/no-unknown-returns -- Internal hook storage retains the concrete definition separately.\n\tmiddleware?: (input: never) => unknown\n}\ntype QueryRegistry<Context> = Readonly<\n\tRecord<\n\t\tstring,\n\t\tPick<QueryDefinition, 'input' | 'result' | 'handler'> &\n\t\t\tCheckedEffectOperation<Context> & {\n\t\t\t\tprepare?: never\n\t\t\t\taudit?: never\n\t\t\t\taggregates?: never\n\t\t\t\treplayResult?: never\n\t\t\t}\n\t>\n>\ntype OperationKey<Operations> = Extract<keyof Operations, string>\n\nclass QueryMiddlewareError extends Error {\n\treadonly code = 'QUERY_MIDDLEWARE_NEXT_REUSED'\n\treadonly name = 'QueryMiddlewareError'\n\tconstructor() {\n\t\tsuper('A query middleware called next() more than once')\n\t}\n}\nclass QueryConfigurationError extends Error {\n\treadonly code = 'QUERY_OPERATION_NOT_CONFIGURED'\n\treadonly name = 'QueryConfigurationError'\n\tconstructor() {\n\t\tsuper('The selected query operation is not configured')\n\t}\n}\nclass QueryPermissionError extends Error {\n\treadonly code = 'QUERY_PERMISSION_CHECKER_MISSING'\n\treadonly name = 'QueryPermissionError'\n\tconstructor() {\n\t\tsuper('Query permission requires an injected permission checker')\n\t}\n}\n\n/** Injectable domain queries compose lazily; the API chooses native function kind. */\nexport function createEffectQuery<\n\tHost,\n\tContextReturned,\n\tconst Operations extends QueryRegistry<EffectValue<ContextReturned>>,\n\tPermissionReturned = never,\n\tGuardReturned extends Supported<void> = never,\n>(configuration: {\n\tcontext: (host: Host) => ContextReturned\n\toperations: (\n\t\tdefinitions: ReturnType<\n\t\t\ttypeof effectOperationFactory<\n\t\t\t\tEffectValue<ContextReturned>,\n\t\t\t\tRecord<never, never>,\n\t\t\t\tNoInfer<CallbackError<GuardReturned>>,\n\t\t\t\tNoInfer<CallbackRequirements<GuardReturned>>\n\t\t\t>\n\t\t>,\n\t) => Operations & NoInfer<ValidatedEffectOperations<Operations>>\n\tcheckPermission?: (\n\t\thost: Host,\n\t\tinput: { permission: string; operation: string },\n\t) => PermissionReturned\n\tdefaults?: { metadata?: object; guard?: (context: EffectValue<ContextReturned>) => GuardReturned }\n\tobservability?: ObservabilityOptions | Observability\n}) {\n\tconst definitions = effectOperationFactory<\n\t\tEffectValue<ContextReturned>,\n\t\tRecord<never, never>,\n\t\tCallbackError<GuardReturned>,\n\t\tCallbackRequirements<GuardReturned>\n\t>()\n\tconst operations: Operations = configuration.operations(definitions)\n\tconst observability =\n\t\tconfiguration.observability instanceof Observability\n\t\t\t? configuration.observability\n\t\t\t: new Observability(\n\t\t\t\t\tconfiguration.observability ?? {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\tclassifyError: () => ({ outcome: 'failed', errorCode: 'UNEXPECTED' }),\n\t\t\t\t\t},\n\t\t\t\t)\n\n\tfunction exec<const Key extends OperationKey<Operations>>(\n\t\toperation: Key,\n\t\tinput: EffectOperationArgument<Operations[Key]>,\n\t\thost: Host,\n\t): Effect.Effect<\n\t\tEffectOperationResult<Operations[Key]>,\n\t\t| EffectOperationError<Operations[Key]>\n\t\t| CallbackError<ContextReturned | PermissionReturned>\n\t\t| UnwrappedDefaultError<Operations[Key], GuardReturned>,\n\t\t| EffectOperationRequirements<Operations[Key]>\n\t\t| CallbackRequirements<ContextReturned | PermissionReturned>\n\t\t| UnwrappedDefaultRequirements<Operations[Key], GuardReturned>\n\t> {\n\t\tconst execution = Effect.suspend(() => {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(operations, operation)) {\n\t\t\t\treturn Effect.die(new QueryConfigurationError())\n\t\t\t}\n\t\t\t// SAFETY: operation helpers check hooks before this heterogeneous storage seam.\n\t\t\tconst definition: QueryDefinition = operations[operation]\n\t\t\treturn Effect.flatMap(decodeEffectContract(definition.input, input), (parsedInput) => {\n\t\t\t\tconst observation = observability.start({\n\t\t\t\t\toperation,\n\t\t\t\t\tclassification: definition.classification ?? 'query',\n\t\t\t\t})\n\t\t\t\tconst run = Effect.gen(function* () {\n\t\t\t\t\tif (definition.permission !== undefined) {\n\t\t\t\t\t\tconst check = configuration.checkPermission\n\t\t\t\t\t\tif (!check) return yield* Effect.die(new QueryPermissionError())\n\t\t\t\t\t\tyield* normalizeEffect(() =>\n\t\t\t\t\t\t\tcheck(host, { permission: definition.permission!, operation }),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tconst context = yield* normalizeEffect(() => configuration.context(host))\n\t\t\t\t\tconst metadata = { ...configuration.defaults?.metadata, ...definition.metadata }\n\t\t\t\t\tconst core = (current: EffectValue<ContextReturned>) =>\n\t\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\t\tconst guard = configuration.defaults?.guard\n\t\t\t\t\t\t\tif (guard) yield* normalizeEffect(() => guard(current))\n\t\t\t\t\t\t\tif (definition.guard)\n\t\t\t\t\t\t\t\tyield* normalizeEffect(() => {\n\t\t\t\t\t\t\t\t\t// SAFETY: selected schemas and context own the stored guard parameters.\n\t\t\t\t\t\t\t\t\treturn definition.guard!(current as never, parsedInput as never)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\treturn yield* normalizeEffect(() => {\n\t\t\t\t\t\t\t\t// SAFETY: selected schemas and context own the stored handler parameters.\n\t\t\t\t\t\t\t\treturn definition.handler(parsedInput as never, current as never)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\tlet usedNext = false\n\t\t\t\t\tconst middleware = definition.middleware\n\t\t\t\t\tconst output = middleware\n\t\t\t\t\t\t? yield* normalizeEffect(() => {\n\t\t\t\t\t\t\t\t// SAFETY: the selected helper checked this middleware's input and next contract.\n\t\t\t\t\t\t\t\treturn middleware({\n\t\t\t\t\t\t\t\t\toperation,\n\t\t\t\t\t\t\t\t\tinput: parsedInput,\n\t\t\t\t\t\t\t\t\tcommand: parsedInput,\n\t\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\t\tmetadata,\n\t\t\t\t\t\t\t\t\tnext: (options?: { context?: object }) =>\n\t\t\t\t\t\t\t\t\t\tEffect.suspend(() => {\n\t\t\t\t\t\t\t\t\t\t\tif (usedNext) return Effect.die(new QueryMiddlewareError())\n\t\t\t\t\t\t\t\t\t\t\tusedNext = true\n\t\t\t\t\t\t\t\t\t\t\treturn core(\n\t\t\t\t\t\t\t\t\t\t\t\toptions?.context ? Object.assign({}, context, options.context) : context,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t} as never)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: yield* core(context)\n\t\t\t\t\treturn yield* decodeEffectContract(definition.result, output)\n\t\t\t\t})\n\t\t\t\treturn run.pipe(\n\t\t\t\t\tEffect.onExit((exit) =>\n\t\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\t\tif (Exit.isSuccess(exit)) observation.completed()\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tobservation.failed(observationFailure(exit.cause))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t})\n\t\t})\n\t\t// SAFETY: selected schemas own A; concrete callbacks and the wrapped middleware\n\t\t// own E/R. No interpreter or runner executes this Effect before the caller does.\n\t\treturn execution as ReturnType<typeof exec<Key>>\n\t}\n\tfunction expose<const Owner extends symbol, const Key extends OperationKey<Operations>>(\n\t\towner: Owner,\n\t\toperation: Key,\n\t): SelectedOperation<\n\t\tOwner,\n\t\tKey,\n\t\tOperations[Key]['input'],\n\t\tOperationPublicResult<Operations[Key]>\n\t> {\n\t\tif (!Object.hasOwn(operations, operation)) throw new QueryConfigurationError()\n\t\treturn selectOperation(owner, 'query', operation, operations[operation])\n\t}\n\treturn {\n\t\texec,\n\t\texpose,\n\t\t/** Bind invocation context without resolving it or running an operation. */\n\t\twithContext(context: Host) {\n\t\t\treturn {\n\t\t\t\texec: <const Key extends OperationKey<Operations>>(\n\t\t\t\t\toperation: Key,\n\t\t\t\t\tinput: EffectOperationArgument<Operations[Key]>,\n\t\t\t\t) => exec(operation, input, context),\n\t\t\t}\n\t\t},\n\t}\n}\n\ntype Policy<Dependencies> = 'checkPermission' extends keyof Dependencies\n\t? Dependencies['checkPermission']\n\t: never\n// oxlint-disable-next-line anti-slop/no-unknown-returns -- Conditional type extracts the host; no unknown result is exposed by the registry.\ntype CallbackHost<Callback> = Callback extends (host: infer Host, input: never) => unknown\n\t? Host\n\t: never\ntype CallbackReturned<Callback> = Callback extends (...arguments_: never[]) => infer Returned\n\t? Returned\n\t: never\ntype PolicyHost<Dependencies> = [CallbackHost<Policy<Dependencies>>] extends [never]\n\t? unknown\n\t: CallbackHost<Policy<Dependencies>>\ntype PolicyReturned<Dependencies> = CallbackReturned<Policy<Dependencies>>\nexport type EffectQueryDependencies = {\n\tobservability: Observability\n\t// oxlint-disable-next-line anti-slop/no-unknown-returns -- Host policy storage is erased; the bound generic dependency retains its concrete E/R.\n\tcheckPermission?: (host: never, input: { permission: string; operation: string }) => unknown\n}\n\n/** The public Foundation binds trusted application policies once. */\nexport function bindEffectQuery<const Dependencies extends EffectQueryDependencies>(\n\tdependencies: Dependencies,\n) {\n\tfunction query<\n\t\tHost extends PolicyHost<Dependencies>,\n\t\tContextReturned,\n\t\tconst Contract extends DomainContract & {\n\t\t\tqueries: Readonly<Record<string, DomainQueryContract>>\n\t\t},\n\t\tconst Operations extends DomainEffectImplementations<\n\t\t\tEffectValue<ContextReturned>,\n\t\t\tContract['queries']\n\t\t>,\n\t\tMode extends false,\n\t\tGuardReturned extends Supported<void> = never,\n\t>(configuration: {\n\t\tcontract: Contract &\n\t\t\tNoInfer<\n\t\t\t\tOperations extends ExactDomainOperations<Operations, Contract['queries']> &\n\t\t\t\t\tValidatedEffectOperations<Operations>\n\t\t\t\t\t? unknown\n\t\t\t\t\t: never\n\t\t\t>\n\t\tcontext: (host: Host) => ContextReturned\n\t\toperations: (\n\t\t\tdefine: DomainEffectFactory<\n\t\t\t\tEffectValue<ContextReturned>,\n\t\t\t\tContract['queries'],\n\t\t\t\tMode,\n\t\t\t\tnever,\n\t\t\t\tNoInfer<CallbackError<GuardReturned>>,\n\t\t\t\tNoInfer<CallbackRequirements<GuardReturned>>\n\t\t\t>,\n\t\t) => Operations\n\t\tdefaults?: {\n\t\t\tmetadata?: object\n\t\t\tguard?: (context: EffectValue<ContextReturned>) => GuardReturned\n\t\t}\n\t}): ReturnType<\n\t\ttypeof createEffectQuery<\n\t\t\tHost,\n\t\t\tContextReturned,\n\t\t\tBoundOperations<Operations, Contract['queries']>,\n\t\t\tPolicyReturned<Dependencies>,\n\t\t\tGuardReturned\n\t\t>\n\t>\n\n\tfunction query<\n\t\tHost extends PolicyHost<Dependencies>,\n\t\tContextReturned,\n\t\tconst Operations extends QueryRegistry<EffectValue<ContextReturned>>,\n\t\tGuardReturned extends Supported<void> = never,\n\t>(configuration: {\n\t\tcontext: (host: Host) => ContextReturned\n\t\toperations: (\n\t\t\tdefinitions: ReturnType<\n\t\t\t\ttypeof effectOperationFactory<\n\t\t\t\t\tEffectValue<ContextReturned>,\n\t\t\t\t\tRecord<never, never>,\n\t\t\t\t\tNoInfer<CallbackError<GuardReturned>>,\n\t\t\t\t\tNoInfer<CallbackRequirements<GuardReturned>>\n\t\t\t\t>\n\t\t\t>,\n\t\t) => Operations & NoInfer<ValidatedEffectOperations<Operations>>\n\t\tdefaults?: {\n\t\t\tmetadata?: object\n\t\t\tguard?: (context: EffectValue<ContextReturned>) => GuardReturned\n\t\t}\n\t}): ReturnType<\n\t\ttypeof createEffectQuery<\n\t\t\tHost,\n\t\t\tContextReturned,\n\t\t\tOperations,\n\t\t\tPolicyReturned<Dependencies>,\n\t\t\tGuardReturned\n\t\t>\n\t>\n\n\tfunction query(configuration: {\n\t\tcontext: (host: never) => unknown\n\t\tcontract?: DomainContract\n\t\toperations: (define: never) => Readonly<Record<string, object>>\n\t\tdefaults?: { metadata?: object; guard?: (context: never) => Supported<void> }\n\t}): unknown {\n\t\tconst definitions = configuration.contract\n\t\t\t? domainEffectFactory(configuration.contract.queries ?? {}, false)\n\t\t\t: effectOperationFactory()\n\t\tconst operations = snapshotOperations(\n\t\t\tconfiguration.operations(\n\t\t\t\t// SAFETY: the overload chooses this exact inline or contracted helper factory.\n\t\t\t\tdefinitions as never,\n\t\t\t),\n\t\t\tconfiguration.contract,\n\t\t\t'queries',\n\t\t)\n\t\t// SAFETY: the overload verifies callback types; exact binding ownership is verified before execution.\n\t\treturn createEffectQuery({\n\t\t\t...configuration,\n\t\t\t...dependencies,\n\t\t\toperations: () => operations,\n\t\t} as never)\n\t}\n\treturn query\n}\n"],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { ContractInput, ContractOutput } from "../contracts/contract.mjs";
2
+ import { OperationPublicResult, SelectedOperation } from "../contracts/exposure.mjs";
3
+ import { Observability, ObservabilityOptions } from "../../components/foundation/modules/observability/observability.mjs";
4
+ import { AuditEntryInput } from "../../components/foundation/client.mjs";
5
+ import { DomainAuditInput, DomainContract } from "../contracts/domain.mjs";
6
+ import { BoundOperations } from "../contracts/binding.mjs";
7
+ import { Audit, CheckedOperation, DomainFactory, DomainImplementations, ExactOperations, InlineFactory, NormalEntry, ValidatedOperations } from "./operation.mjs";
8
+ //#region src/modules/foundation/foundation.d.ts
9
+ type Supported<Value> = Value | PromiseLike<Value>;
10
+ type Resolver = (host: never) => unknown;
11
+ type Domain<Resolve extends Resolver> = Awaited<ReturnType<Resolve>>;
12
+ type Host<Resolve extends Resolver> = Parameters<Resolve>[0];
13
+ type CallbackHost<Callback> = Callback extends ((host: infer Host, ...args: never[]) => unknown) ? Host : unknown;
14
+ export type FoundationRegistryOptions = {
15
+ observability: ObservabilityOptions;
16
+ writeAudit: (host: never, entry: AuditEntryInput) => Supported<unknown>;
17
+ checkPermission?: (host: never, input: {
18
+ operation: string;
19
+ permission: string;
20
+ }) => Supported<void>;
21
+ };
22
+ type Registry<Context> = Readonly<Record<string, NormalEntry & {
23
+ handler: (input: never, context: never) => unknown;
24
+ } & CheckedOperation<Context>>>;
25
+ type AuditedRegistry<Context> = Registry<Context> & Readonly<Record<string, {
26
+ audit: (resolution: never, context: never) => Supported<Audit>;
27
+ }>>;
28
+ type Defaults<Context> = {
29
+ guard?: (context: Context) => Supported<void>;
30
+ metadata?: object;
31
+ };
32
+ export type FoundationRegistry<Resolve extends Resolver, Operations extends Registry<Domain<Resolve>>> = {
33
+ exec<Key extends Extract<keyof Operations, string>>(operation: Key, input: ContractInput<Operations[Key]['input']>, host: Host<Resolve>): Promise<ContractOutput<Operations[Key]['result']>>;
34
+ withContext(host: Host<Resolve>): {
35
+ exec<Key extends Extract<keyof Operations, string>>(operation: Key, input: ContractInput<Operations[Key]['input']>): Promise<ContractOutput<Operations[Key]['result']>>;
36
+ };
37
+ expose<const Owner extends symbol, const Key extends Extract<keyof Operations, string>>(owner: Owner, operation: Key): SelectedOperation<Owner, Key, Operations[Key]['input'], OperationPublicResult<Operations[Key]>>;
38
+ };
39
+ /** Promise-based registries share the same command protocol as the optional Effect adapter. */
40
+ export declare function createFoundation<const Options extends FoundationRegistryOptions>(options: Options): {
41
+ Command: {
42
+ <Resolve extends Resolver, const Contract extends DomainContract & {
43
+ commands: Readonly<Record<string, NormalEntry & {
44
+ classification: string;
45
+ }>>;
46
+ }, const Operations extends DomainImplementations<Domain<Resolve>, Contract['commands'], true, false>>(configuration: {
47
+ contract: Contract & NoInfer<Operations extends ExactOperations<Operations, Contract['commands']> & ValidatedOperations<Operations> ? unknown : never>;
48
+ context: Resolve;
49
+ audit: (resolution: DomainAuditInput<Contract['commands']>, context: Domain<Resolve>) => Supported<Audit>;
50
+ operations: (definitions: DomainFactory<Domain<Resolve>, Contract['commands'], true, false>) => Operations;
51
+ defaults?: Defaults<Domain<Resolve>>;
52
+ } & (Host<Resolve> extends CallbackHost<Options["writeAudit"]> & CallbackHost<Options["checkPermission"]> ? unknown : {
53
+ context: never;
54
+ })): FoundationRegistry<Resolve, BoundOperations<Operations, Contract['commands']>>;
55
+ <Resolve extends Resolver, const Contract extends DomainContract & {
56
+ commands: Readonly<Record<string, NormalEntry & {
57
+ classification: string;
58
+ }>>;
59
+ }, const Operations extends DomainImplementations<Domain<Resolve>, Contract['commands'], true, true>>(configuration: {
60
+ contract: Contract & NoInfer<Operations extends ExactOperations<Operations, Contract['commands']> & ValidatedOperations<Operations> ? unknown : never>;
61
+ context: Resolve;
62
+ audit?: never;
63
+ operations: (definitions: DomainFactory<Domain<Resolve>, Contract['commands'], true, true>) => Operations;
64
+ defaults?: Defaults<Domain<Resolve>>;
65
+ } & (Host<Resolve> extends CallbackHost<Options["writeAudit"]> & CallbackHost<Options["checkPermission"]> ? unknown : {
66
+ context: never;
67
+ })): FoundationRegistry<Resolve, BoundOperations<Operations, Contract['commands']>>;
68
+ <Resolve extends Resolver, const Operations extends Registry<Domain<Resolve>>>(configuration: {
69
+ contract?: never;
70
+ context: Resolve;
71
+ audit: (resolution: DomainAuditInput<Operations>, context: Domain<Resolve>) => Supported<Audit>;
72
+ operations: (definitions: InlineFactory<Domain<Resolve>, false>) => Operations & NoInfer<ValidatedOperations<Operations>>;
73
+ defaults?: Defaults<Domain<Resolve>>;
74
+ } & (Host<Resolve> extends CallbackHost<Options["writeAudit"]> & CallbackHost<Options["checkPermission"]> ? unknown : {
75
+ context: never;
76
+ })): FoundationRegistry<Resolve, Operations>;
77
+ <Resolve extends Resolver, const Operations extends AuditedRegistry<Domain<Resolve>>>(configuration: {
78
+ contract?: never;
79
+ context: Resolve;
80
+ operations: (definitions: InlineFactory<Domain<Resolve>, true>) => Operations & NoInfer<ValidatedOperations<Operations>>;
81
+ defaults?: Defaults<Domain<Resolve>>;
82
+ } & (Host<Resolve> extends CallbackHost<Options["writeAudit"]> & CallbackHost<Options["checkPermission"]> ? unknown : {
83
+ context: never;
84
+ })): FoundationRegistry<Resolve, Operations>;
85
+ };
86
+ Query: {
87
+ <Resolve extends Resolver, const Contract extends DomainContract & {
88
+ queries: Readonly<Record<string, NormalEntry>>;
89
+ }, const Operations extends DomainImplementations<Domain<Resolve>, Contract['queries'], false, true>>(configuration: {
90
+ contract: Contract & NoInfer<Operations extends ExactOperations<Operations, Contract['queries']> & ValidatedOperations<Operations> ? unknown : never>;
91
+ context: Resolve;
92
+ operations: (definitions: DomainFactory<Domain<Resolve>, Contract['queries'], false, true>) => Operations;
93
+ defaults?: Defaults<Domain<Resolve>>;
94
+ } & (Host<Resolve> extends CallbackHost<Options["writeAudit"]> & CallbackHost<Options["checkPermission"]> ? unknown : {
95
+ context: never;
96
+ })): FoundationRegistry<Resolve, BoundOperations<Operations, Contract['queries']>>;
97
+ <Resolve extends Resolver, const Operations extends Registry<Domain<Resolve>>>(configuration: {
98
+ contract?: never;
99
+ context: Resolve;
100
+ operations: (definitions: InlineFactory<Domain<Resolve>, true>) => Operations & NoInfer<ValidatedOperations<Operations>>;
101
+ defaults?: Defaults<Domain<Resolve>>;
102
+ } & (Host<Resolve> extends CallbackHost<Options["writeAudit"]> & CallbackHost<Options["checkPermission"]> ? unknown : {
103
+ context: never;
104
+ })): FoundationRegistry<Resolve, Operations>;
105
+ };
106
+ observability: Observability;
107
+ };
108
+ //#endregion
109
+ //# sourceMappingURL=foundation.d.mts.map
@@ -0,0 +1,2 @@
1
+ import{selectOperation as e}from"../contracts/exposure.mjs";import{decodeContract as t}from"../contracts/contract.mjs";import{Observability as n}from"../../components/foundation/modules/observability/observability.mjs";import{CommandPermissionError as r,executeCommandLifecycle as i,promiseLifecycle as a}from"../../components/foundation/modules/command/lifecycle.mjs";import{snapshotOperations as o}from"../contracts/binding.mjs";import{domainFactory as s,operationFactory as c}from"./operation.mjs";function l(t){let l=new n(t.observability);function d(e){return p(e,!0)}function f(e){return p(e,!1)}function p(n,d){let f=d?`commands`:`queries`,p=n.contract?s(n.contract[f]??{},d):c(),m=o(n.operations(p),n.contract,f,n.audit);async function h(e,o,s){if(!Object.hasOwn(m,e))throw Error(`The selected ${d?`command`:`query`} operation is not configured`);let c=m[e],f=await u(c.input,o);return l.observe({operation:e,classification:c.classification??`query`},async()=>{let o=async()=>{if(c.permission){if(!t.checkPermission)throw new r(e);await t.checkPermission(s,{operation:e,permission:c.permission})}};d||await o();let l=await n.context(s),p=e=>Promise.resolve(c.handler(f,e)),m=async e=>{await n.defaults?.guard?.(e),await c.guard?.(e,f)};if(d)return i(a,{operation:e,classification:c.classification,context:l,command:f,permission:o,prepare:async()=>{let e=await c.prepare?.(l,f);return e?.kind===`execute`?{...e,complete:e.complete?async t=>{await e.complete(t)}:void 0}:e},middleware:c.middleware?[e=>Promise.resolve(c.middleware({...e,input:f,metadata:{...n.defaults?.metadata,...c.metadata}}))]:[],defaultGuard:async()=>{},guard:m,run:p,decodeReplay:e=>u(c.replayResult??c.result,e),decodeResult:e=>u(c.result,e),audit:async e=>c.audit({command:f,result:e},l),writeAudit:async e=>t.writeAudit(s,e),aggregates:c.aggregates});let h=!1,g=async(e=l)=>{if(h)throw Error(`A query middleware called next() more than once`);return h=!0,await m(e),p(e)},_=c.middleware?await c.middleware({operation:e,command:f,input:f,context:l,metadata:{...n.defaults?.metadata,...c.metadata},next:e=>g(e?.context?{...l,...e.context}:l)}):await g();return u(c.result,_)})}return{exec:h,withContext:e=>({exec:(t,n)=>h(t,n,e)}),expose:(t,n)=>{if(!Object.hasOwn(m,n))throw Error(`The selected operation is not configured`);return e(t,d?`mutation`:`query`,n,m[n])}}}return{Command:d,Query:f,observability:l}}async function u(e,n){if(`kind`in e&&e.kind!==`contract`)throw Error(`Effect contracts require the Effect registry`);let r=await t(e,n);if(r.issues)throw Error(r.issues.map(e=>e.message).join(`; `));return r.value}export{l as createFoundation};
2
+ //# sourceMappingURL=foundation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation.mjs","names":["createFoundation","observability","Observability","options","Command","registry","configuration","Query","section","command","definitions","domainFactory","operationFactory","operations","snapshotOperations","exec","operation","definition","parsed","decode","input","permission","CommandPermissionError","host","context","run","enriched","guard","executeCommandLifecycle","promiseLifecycle","prepared","result","value","entry","called","next","raw","settings","selectOperation","owner","schema","decoded","decodeContract","issue"],"sources":["../../../src/modules/foundation/foundation.ts"],"sourcesContent":["/* oxlint-disable anti-slop/no-unknown-parameters, anti-slop/no-unknown-returns, anti-slop/no-unsafe-dictionary-type -- Private heterogeneous executor storage; public overloads restore schema-owned values and callbacks before dispatch. */\nimport type { AuditEntryInput } from '../../components/foundation/client'\n// oxlint-disable-next-line cvx/component-boundaries -- SAFETY: Host registries share the deployed component's Effect-free interpreter.\nimport {\n\texecuteCommandLifecycle,\n\tpromiseLifecycle,\n\tCommandPermissionError,\n\ttype PromiseExecution,\n} from '../../components/foundation/modules/command/lifecycle'\n// oxlint-disable-next-line cvx/component-boundaries -- SAFETY: Host-only observability is shared without entering the deployment graph.\nimport {\n\tObservability,\n\ttype ObservabilityOptions,\n} from '../../components/foundation/modules/observability/observability'\nimport {\n\tdecodeContract,\n\ttype ContractInput,\n\ttype ContractOutput,\n\ttype NeutralSchema,\n} from '../contracts/contract'\nimport type { DomainContract, DomainAuditInput } from '../contracts/domain'\nimport { snapshotOperations, type BoundOperations } from '../contracts/binding'\nimport {\n\tselectOperation,\n\ttype SelectedOperation,\n\ttype OperationPublicResult,\n} from '../contracts/exposure'\nimport {\n\tdomainFactory,\n\toperationFactory,\n\ttype DomainFactory,\n\ttype DomainImplementations,\n\ttype InlineFactory,\n\ttype NormalEntry,\n\ttype Audit,\n\ttype CheckedOperation,\n\ttype ExactOperations,\n\ttype ValidatedOperations,\n} from './operation'\n\ntype Supported<Value> = Value | PromiseLike<Value>\ntype Resolver = (host: never) => unknown\ntype Domain<Resolve extends Resolver> = Awaited<ReturnType<Resolve>>\ntype Host<Resolve extends Resolver> = Parameters<Resolve>[0]\ntype CallbackHost<Callback> = Callback extends (host: infer Host, ...args: never[]) => unknown\n\t? Host\n\t: unknown\nexport type FoundationRegistryOptions = {\n\tobservability: ObservabilityOptions\n\twriteAudit: (host: never, entry: AuditEntryInput) => Supported<unknown>\n\tcheckPermission?: (\n\t\thost: never,\n\t\tinput: { operation: string; permission: string },\n\t) => Supported<void>\n}\ntype Registry<Context> = Readonly<\n\tRecord<\n\t\tstring,\n\t\tNormalEntry & { handler: (input: never, context: never) => unknown } & CheckedOperation<Context>\n\t>\n>\ntype AuditedRegistry<Context> = Registry<Context> &\n\tReadonly<Record<string, { audit: (resolution: never, context: never) => Supported<Audit> }>>\ntype Defaults<Context> = { guard?: (context: Context) => Supported<void>; metadata?: object }\nexport type FoundationRegistry<\n\tResolve extends Resolver,\n\tOperations extends Registry<Domain<Resolve>>,\n> = {\n\texec<Key extends Extract<keyof Operations, string>>(\n\t\toperation: Key,\n\t\tinput: ContractInput<Operations[Key]['input']>,\n\t\thost: Host<Resolve>,\n\t): Promise<ContractOutput<Operations[Key]['result']>>\n\twithContext(host: Host<Resolve>): {\n\t\texec<Key extends Extract<keyof Operations, string>>(\n\t\t\toperation: Key,\n\t\t\tinput: ContractInput<Operations[Key]['input']>,\n\t\t): Promise<ContractOutput<Operations[Key]['result']>>\n\t}\n\texpose<const Owner extends symbol, const Key extends Extract<keyof Operations, string>>(\n\t\towner: Owner,\n\t\toperation: Key,\n\t): SelectedOperation<Owner, Key, Operations[Key]['input'], OperationPublicResult<Operations[Key]>>\n}\ntype RuntimeDefinition = NormalEntry & {\n\tclassification?: string\n\tpermission?: string\n\tmetadata?: object\n\taggregates?: readonly string[]\n\thandler: (input: unknown, context: unknown) => Supported<unknown>\n\tguard?: (context: unknown, input: unknown) => Supported<void>\n\tprepare?: (\n\t\tcontext: unknown,\n\t\tinput: unknown,\n\t) => Supported<\n\t\t| { kind: 'replay'; result: unknown }\n\t\t| { kind: 'execute'; complete?: (result: unknown) => Supported<void> }\n\t>\n\taudit: (resolution: { command: unknown; result: unknown }, context: unknown) => Supported<Audit>\n\tmiddleware?: (input: {\n\t\toperation: string\n\t\tcommand: unknown\n\t\tinput: unknown\n\t\tcontext: unknown\n\t\tmetadata: object\n\t\tnext: (options?: { context?: object }) => Promise<unknown>\n\t}) => Supported<unknown>\n}\ntype RuntimeConfiguration = {\n\tcontext: Resolver\n\tcontract?: DomainContract\n\toperations: (definitions: never) => Readonly<Record<string, object>>\n\taudit?: (resolution: never, context: never) => Supported<Audit>\n\tdefaults?: Defaults<never>\n}\n\n// SAFETY: public helper signatures and the paired schema check this erased runtime invocation.\n/** Promise-based registries share the same command protocol as the optional Effect adapter. */\nexport function createFoundation<const Options extends FoundationRegistryOptions>(\n\toptions: Options,\n) {\n\tconst observability = new Observability(options.observability)\n\ttype PolicyHost = CallbackHost<Options['writeAudit']> & CallbackHost<Options['checkPermission']>\n\ttype Compatible<Resolve extends Resolver> =\n\t\tHost<Resolve> extends PolicyHost ? unknown : { context: never }\n\tfunction Command<\n\t\tResolve extends Resolver,\n\t\tconst Contract extends DomainContract & {\n\t\t\tcommands: Readonly<Record<string, NormalEntry & { classification: string }>>\n\t\t},\n\t\tconst Operations extends DomainImplementations<\n\t\t\tDomain<Resolve>,\n\t\t\tContract['commands'],\n\t\t\ttrue,\n\t\t\tfalse\n\t\t>,\n\t>(\n\t\tconfiguration: {\n\t\t\tcontract: Contract &\n\t\t\t\tNoInfer<\n\t\t\t\t\tOperations extends ExactOperations<Operations, Contract['commands']> &\n\t\t\t\t\t\tValidatedOperations<Operations>\n\t\t\t\t\t\t? unknown\n\t\t\t\t\t\t: never\n\t\t\t\t>\n\t\t\tcontext: Resolve\n\t\t\taudit: (\n\t\t\t\tresolution: DomainAuditInput<Contract['commands']>,\n\t\t\t\tcontext: Domain<Resolve>,\n\t\t\t) => Supported<Audit>\n\t\t\toperations: (\n\t\t\t\tdefinitions: DomainFactory<Domain<Resolve>, Contract['commands'], true, false>,\n\t\t\t) => Operations\n\t\t\tdefaults?: Defaults<Domain<Resolve>>\n\t\t} & Compatible<Resolve>,\n\t): FoundationRegistry<Resolve, BoundOperations<Operations, Contract['commands']>>\n\tfunction Command<\n\t\tResolve extends Resolver,\n\t\tconst Contract extends DomainContract & {\n\t\t\tcommands: Readonly<Record<string, NormalEntry & { classification: string }>>\n\t\t},\n\t\tconst Operations extends DomainImplementations<\n\t\t\tDomain<Resolve>,\n\t\t\tContract['commands'],\n\t\t\ttrue,\n\t\t\ttrue\n\t\t>,\n\t>(\n\t\tconfiguration: {\n\t\t\tcontract: Contract &\n\t\t\t\tNoInfer<\n\t\t\t\t\tOperations extends ExactOperations<Operations, Contract['commands']> &\n\t\t\t\t\t\tValidatedOperations<Operations>\n\t\t\t\t\t\t? unknown\n\t\t\t\t\t\t: never\n\t\t\t\t>\n\t\t\tcontext: Resolve\n\t\t\taudit?: never\n\t\t\toperations: (\n\t\t\t\tdefinitions: DomainFactory<Domain<Resolve>, Contract['commands'], true, true>,\n\t\t\t) => Operations\n\t\t\tdefaults?: Defaults<Domain<Resolve>>\n\t\t} & Compatible<Resolve>,\n\t): FoundationRegistry<Resolve, BoundOperations<Operations, Contract['commands']>>\n\tfunction Command<Resolve extends Resolver, const Operations extends Registry<Domain<Resolve>>>(\n\t\tconfiguration: {\n\t\t\tcontract?: never\n\t\t\tcontext: Resolve\n\t\t\taudit: (\n\t\t\t\tresolution: DomainAuditInput<Operations>,\n\t\t\t\tcontext: Domain<Resolve>,\n\t\t\t) => Supported<Audit>\n\t\t\toperations: (\n\t\t\t\tdefinitions: InlineFactory<Domain<Resolve>, false>,\n\t\t\t) => Operations & NoInfer<ValidatedOperations<Operations>>\n\t\t\tdefaults?: Defaults<Domain<Resolve>>\n\t\t} & Compatible<Resolve>,\n\t): FoundationRegistry<Resolve, Operations>\n\tfunction Command<\n\t\tResolve extends Resolver,\n\t\tconst Operations extends AuditedRegistry<Domain<Resolve>>,\n\t>(\n\t\tconfiguration: {\n\t\t\tcontract?: never\n\t\t\tcontext: Resolve\n\t\t\toperations: (\n\t\t\t\tdefinitions: InlineFactory<Domain<Resolve>, true>,\n\t\t\t) => Operations & NoInfer<ValidatedOperations<Operations>>\n\t\t\tdefaults?: Defaults<Domain<Resolve>>\n\t\t} & Compatible<Resolve>,\n\t): FoundationRegistry<Resolve, Operations>\n\tfunction Command(configuration: RuntimeConfiguration): unknown {\n\t\treturn registry(configuration, true)\n\t}\n\tfunction Query<\n\t\tResolve extends Resolver,\n\t\tconst Contract extends DomainContract & { queries: Readonly<Record<string, NormalEntry>> },\n\t\tconst Operations extends DomainImplementations<\n\t\t\tDomain<Resolve>,\n\t\t\tContract['queries'],\n\t\t\tfalse,\n\t\t\ttrue\n\t\t>,\n\t>(\n\t\tconfiguration: {\n\t\t\tcontract: Contract &\n\t\t\t\tNoInfer<\n\t\t\t\t\tOperations extends ExactOperations<Operations, Contract['queries']> &\n\t\t\t\t\t\tValidatedOperations<Operations>\n\t\t\t\t\t\t? unknown\n\t\t\t\t\t\t: never\n\t\t\t\t>\n\t\t\tcontext: Resolve\n\t\t\toperations: (\n\t\t\t\tdefinitions: DomainFactory<Domain<Resolve>, Contract['queries'], false, true>,\n\t\t\t) => Operations\n\t\t\tdefaults?: Defaults<Domain<Resolve>>\n\t\t} & Compatible<Resolve>,\n\t): FoundationRegistry<Resolve, BoundOperations<Operations, Contract['queries']>>\n\tfunction Query<Resolve extends Resolver, const Operations extends Registry<Domain<Resolve>>>(\n\t\tconfiguration: {\n\t\t\tcontract?: never\n\t\t\tcontext: Resolve\n\t\t\toperations: (\n\t\t\t\tdefinitions: InlineFactory<Domain<Resolve>, true>,\n\t\t\t) => Operations & NoInfer<ValidatedOperations<Operations>>\n\t\t\tdefaults?: Defaults<Domain<Resolve>>\n\t\t} & Compatible<Resolve>,\n\t): FoundationRegistry<Resolve, Operations>\n\tfunction Query(configuration: RuntimeConfiguration): unknown {\n\t\treturn registry(configuration, false)\n\t}\n\tfunction registry(configuration: RuntimeConfiguration, command: boolean) {\n\t\tconst section = command ? 'commands' : 'queries'\n\t\t// SAFETY: public overloads restrict Promise registries to neutral schemas.\n\t\tconst definitions = configuration.contract\n\t\t\t? domainFactory(\n\t\t\t\t\t// SAFETY: public helper signatures and the paired schema check this erased runtime invocation.\n\t\t\t\t\t(configuration.contract[section] as Readonly<Record<string, NormalEntry>>) ?? {},\n\t\t\t\t\tcommand,\n\t\t\t\t)\n\t\t\t: operationFactory()\n\t\t// SAFETY: helper overloads checked the selected callbacks; storage erases only their parameters.\n\t\tconst operations = snapshotOperations(\n\t\t\t// SAFETY: public helper signatures and the paired schema check this erased runtime invocation.\n\t\t\tconfiguration.operations(definitions as never),\n\t\t\tconfiguration.contract,\n\t\t\tsection,\n\t\t\tconfiguration.audit,\n\t\t)\n\t\tasync function exec(operation: string, input: unknown, host: never) {\n\t\t\tif (!Object.hasOwn(operations, operation))\n\t\t\t\tthrow Error(`The selected ${command ? 'command' : 'query'} operation is not configured`)\n\t\t\t// SAFETY: helpers verified callbacks against these paired schemas; only the runtime storage erases values.\n\t\t\tconst definition = operations[operation] as RuntimeDefinition\n\t\t\tconst parsed = await decode(definition.input, input)\n\t\t\treturn observability.observe(\n\t\t\t\t{ operation, classification: definition.classification ?? 'query' },\n\t\t\t\tasync () => {\n\t\t\t\t\tconst permission = async () => {\n\t\t\t\t\t\tif (!definition.permission) return\n\t\t\t\t\t\tif (!options.checkPermission) throw new CommandPermissionError(operation)\n\t\t\t\t\t\tawait options.checkPermission(host, { operation, permission: definition.permission })\n\t\t\t\t\t}\n\t\t\t\t\tif (!command) await permission()\n\t\t\t\t\tconst context = await configuration.context(host)\n\t\t\t\t\tconst run = (enriched: unknown) => Promise.resolve(definition.handler(parsed, enriched))\n\t\t\t\t\tconst guard = async (enriched: unknown) => {\n\t\t\t\t\t\t// SAFETY: base resolver context is the public default guard context.\n\t\t\t\t\t\tawait configuration.defaults?.guard?.(enriched as never)\n\t\t\t\t\t\tawait definition.guard?.(enriched, parsed)\n\t\t\t\t\t}\n\t\t\t\t\tif (command)\n\t\t\t\t\t\treturn executeCommandLifecycle<PromiseExecution, unknown, unknown, unknown, unknown>(\n\t\t\t\t\t\t\tpromiseLifecycle,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toperation,\n\t\t\t\t\t\t\t\tclassification: definition.classification!,\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\tcommand: parsed,\n\t\t\t\t\t\t\t\tpermission,\n\t\t\t\t\t\t\t\tprepare: async () => {\n\t\t\t\t\t\t\t\t\tconst prepared = await definition.prepare?.(context, parsed)\n\t\t\t\t\t\t\t\t\treturn prepared?.kind === 'execute'\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t...prepared,\n\t\t\t\t\t\t\t\t\t\t\t\tcomplete: prepared.complete\n\t\t\t\t\t\t\t\t\t\t\t\t\t? async (result) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tawait prepared.complete!(result)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t: prepared\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tmiddleware: definition.middleware\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t(input) =>\n\t\t\t\t\t\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefinition.middleware!({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...input,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tinput: parsed,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...configuration.defaults?.metadata,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...definition.metadata,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: [],\n\t\t\t\t\t\t\t\tdefaultGuard: async () => {},\n\t\t\t\t\t\t\t\tguard,\n\t\t\t\t\t\t\t\trun,\n\t\t\t\t\t\t\t\tdecodeReplay: (value) =>\n\t\t\t\t\t\t\t\t\tdecode(definition.replayResult ?? definition.result, value),\n\t\t\t\t\t\t\t\tdecodeResult: (value) => decode(definition.result, value),\n\t\t\t\t\t\t\t\taudit: async (result) => definition.audit({ command: parsed, result }, context),\n\t\t\t\t\t\t\t\twriteAudit: async (entry) => options.writeAudit(host, entry),\n\t\t\t\t\t\t\t\taggregates: definition.aggregates,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\tlet called = false\n\t\t\t\t\tconst next = async (enriched = context) => {\n\t\t\t\t\t\tif (called) throw Error('A query middleware called next() more than once')\n\t\t\t\t\t\tcalled = true\n\t\t\t\t\t\tawait guard(enriched)\n\t\t\t\t\t\treturn run(enriched)\n\t\t\t\t\t}\n\t\t\t\t\tconst raw = definition.middleware\n\t\t\t\t\t\t? await definition.middleware({\n\t\t\t\t\t\t\t\toperation,\n\t\t\t\t\t\t\t\tcommand: parsed,\n\t\t\t\t\t\t\t\tinput: parsed,\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\tmetadata: { ...configuration.defaults?.metadata, ...definition.metadata },\n\t\t\t\t\t\t\t\tnext: (settings) =>\n\t\t\t\t\t\t\t\t\tnext(\n\t\t\t\t\t\t\t\t\t\t// SAFETY: public helper signatures and the paired schema check this erased runtime invocation.\n\t\t\t\t\t\t\t\t\t\tsettings?.context ? { ...(context as object), ...settings.context } : context,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: await next()\n\t\t\t\t\treturn decode(definition.result, raw)\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\treturn {\n\t\t\texec,\n\t\t\twithContext: (host: never) => ({\n\t\t\t\texec: (operation: string, input: unknown) => exec(operation, input, host),\n\t\t\t}),\n\t\t\texpose: (owner: symbol, operation: string) => {\n\t\t\t\tif (!Object.hasOwn(operations, operation))\n\t\t\t\t\tthrow Error('The selected operation is not configured')\n\t\t\t\treturn selectOperation(\n\t\t\t\t\towner,\n\t\t\t\t\tcommand ? 'mutation' : 'query',\n\t\t\t\t\toperation,\n\t\t\t\t\t// SAFETY: public helper signatures and the paired schema check this erased runtime invocation.\n\t\t\t\t\toperations[operation] as RuntimeDefinition,\n\t\t\t\t)\n\t\t\t},\n\t\t}\n\t}\n\treturn { Command, Query, observability }\n}\n\nasync function decode(schema: NeutralSchema, value: unknown) {\n\tif ('kind' in schema && schema.kind !== 'contract')\n\t\tthrow Error('Effect contracts require the Effect registry')\n\tconst decoded = await decodeContract(schema, value)\n\tif (decoded.issues) throw Error(decoded.issues.map((issue) => issue.message).join('; '))\n\treturn decoded.value\n}\n"],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import { ContractInput, ContractOutput, NeutralSchema } from "../contracts/contract.mjs";
2
+ import { AuditEntryInput } from "../../components/foundation/client.mjs";
3
+ import { DomainOperationContract, ExactOperationKeys } from "../contracts/domain.mjs";
4
+ import { DeclaredSchemas } from "../contracts/binding.mjs";
5
+ //#region src/modules/foundation/operation.d.ts
6
+ type Supported<A> = A | PromiseLike<A>;
7
+ export type Audit = Omit<AuditEntryInput, 'classification'> | null;
8
+ export type NormalEntry = DomainOperationContract & {
9
+ input: NeutralSchema;
10
+ result: NeutralSchema;
11
+ replayResult?: NeutralSchema;
12
+ wire?: {
13
+ schema: NeutralSchema;
14
+ project: Function;
15
+ };
16
+ };
17
+ declare const checkedOperation: unique symbol;
18
+ export type CheckedDefinition<Context, Definition, Key = unknown> = NoInfer<Definition> & {
19
+ readonly [checkedOperation]: {
20
+ context: (context: Context) => void;
21
+ definition: Definition;
22
+ key: Key;
23
+ };
24
+ };
25
+ export type CheckedOperation<Context> = {
26
+ readonly [checkedOperation]: {
27
+ context: (context: Context) => void;
28
+ definition: unknown;
29
+ key: unknown;
30
+ };
31
+ };
32
+ export type ValidatedOperations<Operations> = { [Key in keyof Operations]: Operations[Key] extends {
33
+ readonly [checkedOperation]: {
34
+ definition: infer Definition;
35
+ };
36
+ } ? Operations[Key] extends Definition ? Operations[Key] : never : never; };
37
+ export type ExactOperations<Operations, Entries> = ExactOperationKeys<Operations, Entries> & { [Key in keyof Operations]: Operations[Key] extends {
38
+ readonly [checkedOperation]: {
39
+ key: Key;
40
+ };
41
+ } ? Operations[Key] : never; };
42
+ type Definition<Context, Entry extends NormalEntry> = {
43
+ handler: (input: ContractOutput<Entry['input']>, context: Context) => Supported<ContractInput<Entry['result']>>;
44
+ permission?: string;
45
+ metadata?: object;
46
+ aggregates?: readonly string[];
47
+ guard?: (context: Context, input: ContractOutput<Entry['input']>) => Supported<void>;
48
+ prepare?: (context: Context, input: ContractOutput<Entry['input']>) => Supported<{
49
+ kind: 'replay';
50
+ result: unknown;
51
+ } | {
52
+ kind: 'execute';
53
+ complete?: (result: ContractOutput<Entry['result']>) => Supported<void>;
54
+ }>;
55
+ audit?: (resolution: {
56
+ command: ContractOutput<Entry['input']>;
57
+ result: ContractOutput<Entry['result']>;
58
+ }, context: Context) => Supported<Audit>;
59
+ middleware?: (input: {
60
+ operation: string;
61
+ input: ContractOutput<Entry['input']>;
62
+ command: ContractOutput<Entry['input']>;
63
+ context: Context;
64
+ metadata: object;
65
+ next: (options?: {
66
+ context?: object;
67
+ }) => Promise<ContractInput<Entry['result']>>;
68
+ }) => Supported<ContractInput<Entry['result']>>;
69
+ };
70
+ type CommandRules<Context, Entry extends NormalEntry, Command extends boolean, Required extends boolean> = Command extends false ? {
71
+ audit?: never;
72
+ prepare?: never;
73
+ aggregates?: never;
74
+ replayResult?: never;
75
+ } : Required extends true ? {
76
+ audit: NonNullable<Definition<Context, Entry>['audit']>;
77
+ } : {};
78
+ type Forbidden = {
79
+ input?: never;
80
+ result?: never;
81
+ classification?: never;
82
+ replayResult?: never;
83
+ wire?: never;
84
+ };
85
+ type HandlerOptions<Context, Input extends NeutralSchema, Result extends NeutralSchema, Command extends boolean, Required extends boolean> = Omit<Definition<Context, {
86
+ input: Input;
87
+ result: Result;
88
+ }>, 'handler'> & Forbidden & {
89
+ handler?: never;
90
+ } & CommandRules<Context, {
91
+ input: Input;
92
+ result: Result;
93
+ }, Command, Required>;
94
+ type HandlerArguments<Options, Required extends boolean> = Required extends true ? [options: Options] : [options?: Options];
95
+ export type DomainFactory<Context, Entries extends Readonly<Record<string, NormalEntry>>, Command extends boolean, Required extends boolean> = { [Kind in Command extends true ? 'command' : 'query']: { [Key in keyof Entries]: <const Implementation extends object>(implementation: Implementation & Definition<Context, Entries[Key]> & Forbidden & CommandRules<Context, Entries[Key], Command, Required>) => DeclaredSchemas<Pick<Entries[Key], 'input' | 'result'>> & CheckedDefinition<Context, Entries[Key] & Implementation, Key>; } & {
96
+ handler: <const Input extends NeutralSchema, const Result extends NeutralSchema, Key extends keyof Entries, Handler extends Supported<ContractInput<Result>>, const Implementation extends object = Record<never, never>>(handler: (input: ContractOutput<Input>, context: Context) => Handler, ...options: HandlerArguments<Implementation & HandlerOptions<Context, Input, Result, Command, Required>, Command extends true ? Required : false>) => DeclaredSchemas<{
97
+ input: Input;
98
+ result: Result;
99
+ }> & CheckedDefinition<Context, NoInfer<Implementation> & {
100
+ handler: (input: ContractOutput<Input>, context: Context) => Handler;
101
+ }, Key>;
102
+ }; };
103
+ export type DomainImplementations<Context, Entries extends Readonly<Record<string, NormalEntry>>, Command extends boolean, Required extends boolean> = { [Key in keyof Entries]: DeclaredSchemas<Pick<Entries[Key], 'input' | 'result'>> & CheckedDefinition<Context, Definition<Context, Entries[Key]> & CommandRules<Context, Entries[Key], Command, Required>, Key>; };
104
+ export declare function domainFactory<Context, Entries extends Readonly<Record<string, NormalEntry>>, Command extends boolean, Required extends boolean>(entries: Entries, command: Command): DomainFactory<Context, Entries, Command, Required>;
105
+ export declare function operationFactory<Context, Required extends boolean = true>(): {
106
+ command: <const Input extends NeutralSchema, const Result extends NeutralSchema, const Wire extends NeutralSchema, const Replay extends NeutralSchema, const Implementation extends object>(implementation: Implementation & {
107
+ input: Input;
108
+ result: Result;
109
+ classification: string;
110
+ replayResult?: Replay & (ContractOutput<Replay> extends ContractOutput<Result> ? unknown : never);
111
+ wire?: {
112
+ schema: Wire;
113
+ project: (result: ContractOutput<Result>) => ContractInput<Wire>;
114
+ };
115
+ } & Definition<Context, {
116
+ input: Input;
117
+ result: Result;
118
+ }> & CommandRules<Context, {
119
+ input: Input;
120
+ result: Result;
121
+ }, true, Required>) => CheckedDefinition<Context, typeof implementation>;
122
+ query: <const Input extends NeutralSchema, const Result extends NeutralSchema, const Wire extends NeutralSchema, const Implementation extends object>(implementation: Implementation & {
123
+ input: Input;
124
+ result: Result;
125
+ classification?: string;
126
+ wire?: {
127
+ schema: Wire;
128
+ project: (result: ContractOutput<Result>) => ContractInput<Wire>;
129
+ };
130
+ } & Definition<Context, {
131
+ input: Input;
132
+ result: Result;
133
+ }> & CommandRules<Context, {
134
+ input: Input;
135
+ result: Result;
136
+ }, false, true>) => CheckedDefinition<Context, typeof implementation>;
137
+ };
138
+ export type InlineFactory<Context, Required extends boolean> = ReturnType<typeof operationFactory<Context, Required>>;
139
+ //#endregion
140
+ //# sourceMappingURL=operation.d.mts.map
@@ -0,0 +1,2 @@
1
+ import{domainHelpers as e}from"../contracts/binding.mjs";function t(t,n){let r=e(t);return{[n?`command`:`query`]:r}}function n(){function e(e){return e}function t(e){return e}return{command:e,query:t}}export{t as domainFactory,n as operationFactory};
2
+ //# sourceMappingURL=operation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.mjs","names":["domainFactory","helpers","domainHelpers","entries","command","operationFactory","implementation","query"],"sources":["../../../src/modules/foundation/operation.ts"],"sourcesContent":["/* oxlint-disable anti-slop/no-object-parameters -- Internal helper storage is heterogeneous; the exported mapped signatures validate the schema-paired implementation. */\nimport type { AuditEntryInput } from '../../components/foundation/client'\nimport type { ContractInput, ContractOutput, NeutralSchema } from '../contracts/contract'\nimport type { DomainOperationContract, ExactOperationKeys } from '../contracts/domain'\nimport { domainHelpers, type DeclaredSchemas } from '../contracts/binding'\n\ntype Supported<A> = A | PromiseLike<A>\nexport type Audit = Omit<AuditEntryInput, 'classification'> | null\nexport type NormalEntry = DomainOperationContract & {\n\tinput: NeutralSchema\n\tresult: NeutralSchema\n\treplayResult?: NeutralSchema\n\twire?: { schema: NeutralSchema; project: Function }\n}\ndeclare const checkedOperation: unique symbol\nexport type CheckedDefinition<Context, Definition, Key = unknown> = NoInfer<Definition> & {\n\treadonly [checkedOperation]: {\n\t\tcontext: (context: Context) => void\n\t\tdefinition: Definition\n\t\tkey: Key\n\t}\n}\nexport type CheckedOperation<Context> = {\n\treadonly [checkedOperation]: {\n\t\tcontext: (context: Context) => void\n\t\tdefinition: unknown\n\t\tkey: unknown\n\t}\n}\nexport type ValidatedOperations<Operations> = {\n\t[Key in keyof Operations]: Operations[Key] extends {\n\t\treadonly [checkedOperation]: { definition: infer Definition }\n\t}\n\t\t? Operations[Key] extends Definition\n\t\t\t? Operations[Key]\n\t\t\t: never\n\t\t: never\n}\nexport type ExactOperations<Operations, Entries> = ExactOperationKeys<Operations, Entries> & {\n\t[Key in keyof Operations]: Operations[Key] extends { readonly [checkedOperation]: { key: Key } }\n\t\t? Operations[Key]\n\t\t: never\n}\ntype Definition<Context, Entry extends NormalEntry> = {\n\thandler: (\n\t\tinput: ContractOutput<Entry['input']>,\n\t\tcontext: Context,\n\t) => Supported<ContractInput<Entry['result']>>\n\tpermission?: string\n\tmetadata?: object\n\taggregates?: readonly string[]\n\tguard?: (context: Context, input: ContractOutput<Entry['input']>) => Supported<void>\n\tprepare?: (\n\t\tcontext: Context,\n\t\tinput: ContractOutput<Entry['input']>,\n\t) => Supported<\n\t\t| { kind: 'replay'; result: unknown }\n\t\t| { kind: 'execute'; complete?: (result: ContractOutput<Entry['result']>) => Supported<void> }\n\t>\n\taudit?: (\n\t\tresolution: {\n\t\t\tcommand: ContractOutput<Entry['input']>\n\t\t\tresult: ContractOutput<Entry['result']>\n\t\t},\n\t\tcontext: Context,\n\t) => Supported<Audit>\n\tmiddleware?: (input: {\n\t\toperation: string\n\t\tinput: ContractOutput<Entry['input']>\n\t\tcommand: ContractOutput<Entry['input']>\n\t\tcontext: Context\n\t\tmetadata: object\n\t\tnext: (options?: { context?: object }) => Promise<ContractInput<Entry['result']>>\n\t}) => Supported<ContractInput<Entry['result']>>\n}\ntype CommandRules<\n\tContext,\n\tEntry extends NormalEntry,\n\tCommand extends boolean,\n\tRequired extends boolean,\n> = Command extends false\n\t? { audit?: never; prepare?: never; aggregates?: never; replayResult?: never }\n\t: Required extends true\n\t\t? { audit: NonNullable<Definition<Context, Entry>['audit']> }\n\t\t: {}\ntype Forbidden = {\n\tinput?: never\n\tresult?: never\n\tclassification?: never\n\treplayResult?: never\n\twire?: never\n}\ntype HandlerOptions<\n\tContext,\n\tInput extends NeutralSchema,\n\tResult extends NeutralSchema,\n\tCommand extends boolean,\n\tRequired extends boolean,\n> = Omit<Definition<Context, { input: Input; result: Result }>, 'handler'> &\n\tForbidden & { handler?: never } & CommandRules<\n\t\tContext,\n\t\t{ input: Input; result: Result },\n\t\tCommand,\n\t\tRequired\n\t>\ntype HandlerArguments<Options, Required extends boolean> = Required extends true\n\t? [options: Options]\n\t: [options?: Options]\n\nexport type DomainFactory<\n\tContext,\n\tEntries extends Readonly<Record<string, NormalEntry>>,\n\tCommand extends boolean,\n\tRequired extends boolean,\n> = {\n\t[Kind in Command extends true ? 'command' : 'query']: {\n\t\t[Key in keyof Entries]: <const Implementation extends object>(\n\t\t\timplementation: Implementation &\n\t\t\t\tDefinition<Context, Entries[Key]> &\n\t\t\t\tForbidden &\n\t\t\t\tCommandRules<Context, Entries[Key], Command, Required>,\n\t\t) => DeclaredSchemas<Pick<Entries[Key], 'input' | 'result'>> &\n\t\t\tCheckedDefinition<Context, Entries[Key] & Implementation, Key>\n\t} & {\n\t\thandler: <\n\t\t\tconst Input extends NeutralSchema,\n\t\t\tconst Result extends NeutralSchema,\n\t\t\tKey extends keyof Entries,\n\t\t\tHandler extends Supported<ContractInput<Result>>,\n\t\t\tconst Implementation extends object = Record<never, never>,\n\t\t>(\n\t\t\thandler: (input: ContractOutput<Input>, context: Context) => Handler,\n\t\t\t...options: HandlerArguments<\n\t\t\t\tImplementation & HandlerOptions<Context, Input, Result, Command, Required>,\n\t\t\t\tCommand extends true ? Required : false\n\t\t\t>\n\t\t) => DeclaredSchemas<{ input: Input; result: Result }> &\n\t\t\tCheckedDefinition<\n\t\t\t\tContext,\n\t\t\t\tNoInfer<Implementation> & {\n\t\t\t\t\thandler: (input: ContractOutput<Input>, context: Context) => Handler\n\t\t\t\t},\n\t\t\t\tKey\n\t\t\t>\n\t}\n}\nexport type DomainImplementations<\n\tContext,\n\tEntries extends Readonly<Record<string, NormalEntry>>,\n\tCommand extends boolean,\n\tRequired extends boolean,\n> = {\n\t[Key in keyof Entries]: DeclaredSchemas<Pick<Entries[Key], 'input' | 'result'>> &\n\t\tCheckedDefinition<\n\t\t\tContext,\n\t\t\tDefinition<Context, Entries[Key]> & CommandRules<Context, Entries[Key], Command, Required>,\n\t\t\tKey\n\t\t>\n}\nexport function domainFactory<\n\tContext,\n\tEntries extends Readonly<Record<string, NormalEntry>>,\n\tCommand extends boolean,\n\tRequired extends boolean,\n>(entries: Entries, command: Command): DomainFactory<Context, Entries, Command, Required> {\n\tconst helpers = domainHelpers(entries)\n\t// SAFETY: helper signatures check callbacks; registration pairs drafts with their declarations.\n\treturn { [command ? 'command' : 'query']: helpers } as DomainFactory<\n\t\tContext,\n\t\tEntries,\n\t\tCommand,\n\t\tRequired\n\t>\n}\nexport function operationFactory<Context, Required extends boolean = true>() {\n\tfunction command<\n\t\tconst Input extends NeutralSchema,\n\t\tconst Result extends NeutralSchema,\n\t\tconst Wire extends NeutralSchema,\n\t\tconst Replay extends NeutralSchema,\n\t\tconst Implementation extends object,\n\t>(\n\t\timplementation: Implementation & {\n\t\t\tinput: Input\n\t\t\tresult: Result\n\t\t\tclassification: string\n\t\t\treplayResult?: Replay &\n\t\t\t\t(ContractOutput<Replay> extends ContractOutput<Result> ? unknown : never)\n\t\t\twire?: { schema: Wire; project: (result: ContractOutput<Result>) => ContractInput<Wire> }\n\t\t} & Definition<Context, { input: Input; result: Result }> &\n\t\t\tCommandRules<Context, { input: Input; result: Result }, true, Required>,\n\t) {\n\t\t// SAFETY: this type-only evidence records the complete helper-checked definition.\n\t\treturn implementation as CheckedDefinition<Context, typeof implementation>\n\t}\n\tfunction query<\n\t\tconst Input extends NeutralSchema,\n\t\tconst Result extends NeutralSchema,\n\t\tconst Wire extends NeutralSchema,\n\t\tconst Implementation extends object,\n\t>(\n\t\timplementation: Implementation & {\n\t\t\tinput: Input\n\t\t\tresult: Result\n\t\t\tclassification?: string\n\t\t\twire?: { schema: Wire; project: (result: ContractOutput<Result>) => ContractInput<Wire> }\n\t\t} & Definition<Context, { input: Input; result: Result }> &\n\t\t\tCommandRules<Context, { input: Input; result: Result }, false, true>,\n\t) {\n\t\t// SAFETY: this type-only evidence records the complete helper-checked definition.\n\t\treturn implementation as CheckedDefinition<Context, typeof implementation>\n\t}\n\treturn { command, query }\n}\nexport type InlineFactory<Context, Required extends boolean> = ReturnType<\n\ttypeof operationFactory<Context, Required>\n>\n"],"mappings":"yDA+JA,SAAgBA,EAKd,EAAkB,EAAsE,CACzF,IAAMC,EAAUC,EAAcC,CAAO,EAErC,MAAO,EAAGC,EAAU,UAAY,SAAUH,CAAQ,CAMnD,CACA,SAAgBI,GAA6D,CAC5E,SAASD,EAOR,EASC,CAED,OAAOE,CACR,CACA,SAASC,EAMR,EAOC,CAED,OAAOD,CACR,CACA,MAAO,CAAE,UAAS,OAAM,CACzB"}
@@ -1,2 +1,2 @@
1
- import{architectureAnchor as e,createResolver as t,inspectArchitecture as n,resolveImport as r}from"./architecture.mjs";import{appFile as i,binding as a,componentRoot as o,consumerOptions as s,containsComponentReference as c,delegatingBody as l,exportedNames as u,imported as d,isDbAccess as f,isDbWrite as p,isExternalCall as m,isFunctionsImport as h,memberPath as g,metadata as _,propertyName as v,rootMember as y,sourceVisitors as b,typeOnlySource as x}from"./ast.mjs";import{basename as S,resolve as C}from"node:path";import{existsSync as w,realpathSync as T}from"node:fs";const E={"project-structure":{meta:_(`Validate the application tree, colocated tests, and module cycles.`,{structure:`{{file}}: {{message}}`}),create(t){let r=s.parse(t.options[0]??{}),i=C(t.cwd,r.convexDir);return(w(t.filename)?T(t.filename):C(t.filename))===e(i)?{Program(e){for(let i of n({cwd:t.cwd,convexDir:r.convexDir}))t.report({node:e,messageId:`structure`,data:{file:i.file,message:i.message}})}}:{}}},"root-wiring-only":{meta:_(`Keep root files limited to configuration, assembly, and component facades.`,{ownership:`Root files only wire configuration and components. Move behavior into domain/<module>/: {{reason}}.`}),create(e){let t=i(e);if(!t||t.includes(`/`))return{};let n=null,r=`business implementation`,a=!1,o=/^(?:convex\.config|auth\.config|vite\.config|vitest\.config|auth|schema|functions|triggers|foundation|http|crons)\.[cm]?[jt]s$/.test(t);function s(e){n??=e}return{Program(e){e.body.some(e=>e.type===`FunctionDeclaration`||e.type===`ExportNamedDeclaration`&&e.declaration?.type===`FunctionDeclaration`)&&s(e)},NewExpression(t){d(e,t.callee)&&t.arguments.some(t=>c(e,t))&&(a=!0)},CallExpression(n){d(e,n.callee)&&n.arguments.some(t=>c(e,t))&&(a=!0),(p(n)||m(e,n)||t===`schema.ts`&&d(e,n.callee)?.name!==`defineSchema`)&&s(n)},ArrowFunctionExpression(e){(!e.body||!l(e.body))&&s(e)},FunctionExpression(e){(!e.body||!l(e.body))&&s(e)},IfStatement:s,SwitchStatement:s,ConditionalExpression:s,ForStatement:s,ForOfStatement:s,WhileStatement:s,"Program:exit"(t){!o&&!a&&(n=t,r=`unknown root file; only declared component facades may add root source files`),n&&e.report({node:n,messageId:`ownership`,data:{reason:r}})}}}},"application-orchestration":{meta:_(`Reserve application/ for thin cross-domain coordination.`,{ownership:`application/ only coordinates two or more domains. Move schemas, providers, storage access, helpers, and business decisions into their owning domain.`}),create(e){if(!i(e)?.startsWith(`application/`))return{};let n=/* @__PURE__ */ new Set,a=t(),o=null;function s(e){o??=e}let c=b(e,(t,o)=>{if(x(t))return;let c=r(a,e.filename,o),l=c&&i(e,c),u=l?.match(/^domain\/([^/]+)\/(?:commands|queries|rules)(?:\.[cm]?[jt]s)?$/);u&&u[1]!==`shared`&&n.add(u[1]),l?.startsWith(`domain/`)&&!u&&!l.startsWith(`domain/shared/`)&&s(t),!l&&![`cvx-kit`,`cvx-kit/components/foundation`,`@convex-dev/workflow`,`convex/values`].includes(o)&&s(t)});return{...c,Program(e){let t=u(e);for(let n of e.body){n.type===`FunctionDeclaration`&&n.id&&!t.has(n.id.name)&&s(n);let e=n.type===`ExportNamedDeclaration`?n.declaration:n;if((e?.type===`TSTypeAliasDeclaration`||e?.type===`TSInterfaceDeclaration`)&&s(n),e?.type===`VariableDeclaration`)for(let r of e.declarations)r.init&&[`ObjectExpression`,`ArrayExpression`,`Literal`].includes(r.init.type)&&s(r),n.type===`VariableDeclaration`&&r.id.type===`Identifier`&&!t.has(r.id.name)&&[`ArrowFunctionExpression`,`FunctionExpression`].includes(r.init?.type??``)&&s(r)}},CallExpression(t){c.CallExpression?.(t),(f(t)||m(e,t))&&s(t);let n=d(e,t.callee);n&&[`zod`,`zod/v4`].includes(n.source)&&s(t)},MemberExpression(t){let r=g(t);if(r.length>=4&&r[1]===`domain`){let i=d(e,y(t));i?.name===`internal`&&/_generated\/api/.test(i.source)&&n.add(r[2])}},NewExpression:s,IfStatement:s,SwitchStatement:s,ConditionalExpression:s,"Program:exit"(t){(n.size<2||o)&&e.report({node:o??t,messageId:`ownership`})}}}},"internal-function-ownership":{meta:_(`Place internal handlers with their owner, never in root, api/, or shared/.`,{ownership:`Declare system/internal handlers in domain/<module>/, cross-domain application/, migrations/, or an isolated component.`}),create(e){let t=i(e)??``;return o(e,e.filename)||/^(?:domain\/(?!shared\/)[^/]+\/|application\/|migrations\/)/.test(t)?{}:{CallExpression(t){if(t.callee.type===`CallExpression`)return;let n=d(e,t.callee);n&&(h(e,n.source)&&/^system(Query|Mutation|Action)$/.test(n.name)||/(?:_generated\/server|convex\/server)/.test(n.source)&&/^internal(Query|Mutation|Action)(Generic)?$/.test(n.name))&&e.report({node:t,messageId:`ownership`})}}}},"domain-file-responsibilities":{meta:_(`Keep invariants pure, reads read-only, shapes declarative, and I/O action-side.`,{ownership:`Respect this domain file responsibility: pure rules, read-only queries, declarative schemas/tables/constants, and external I/O only in actions or integrations.`}),create(e){let n=i(e)??``,o=n===`domain/table.ts`;if(!o&&!/^domain\/[^/]+\//.test(n))return{};let s=S(n).replace(/\.[cm]?[jt]s$/,``),c=s===`rules`,l=s===`queries`,u=[`schema`,`table`,`constants`].includes(s),g=/(?:^|\/)(?:actions|integrations|providers)(?:\/|\.)/.test(n)||/(?:^|_)actions\./.test(n),_=t(),y=null;function C(e){y??=e}let w=b(e,(t,n)=>{if(x(t))return;let a=r(_,e.filename,n),s=a&&i(e,a);o&&n!==`cvx-kit/zod-table`&&!/^domain\/[^/]+\/table(?:\.[cm]?[jt]s)?$/.test(s??``)&&C(t),c&&s&&!/(?:^|\/)(?:rules|constants)(?:\.[cm]?[jt]s)?$/.test(s)&&C(t),(c||l||u)&&!s&&![`zod`,`zod/v4`,`convex/values`,`cvx-kit`,`cvx-kit/zod-table`,`cvx-kit/errors`].includes(n)&&C(t),l&&s&&/(?:^|\/)(?:commands|actions|integrations|providers)(?:[./]|$)/.test(s)&&C(t)});return{...w,Program(e){if(o)for(let t of e.body){if(t.type===`ImportDeclaration`||t.type===`EmptyStatement`)continue;let e=t.type===`ExportNamedDeclaration`?t.declaration:t;(e?.type!==`VariableDeclaration`||e.declarations.some(e=>e.init?.type!==`CallExpression`))&&C(t)}},CallExpression(t){if(w.CallExpression?.(t),o){let n=d(e,t.callee);(n?.source!==`cvx-kit/zod-table`||n.name!==`createModule`)&&C(t)}let n=t.callee.type===`MemberExpression`?v(t.callee):null;(c||u)&&(f(t)||[`runQuery`,`runMutation`,`runAction`,`runAfter`,`runAt`].includes(n??``))&&C(t),l&&(p(t)||[`runMutation`,`runAction`,`runAfter`,`runAt`].includes(n??``))&&C(t);let r=d(e,t.callee);r&&h(e,r.source)&&(c||u||l&&/(?:Mutation|Action)$/.test(r.name))&&C(t),l&&t.callee.type===`MemberExpression`&&v(t.callee.object)===`storage`&&[`store`,`delete`,`generateUploadUrl`].includes(n??``)&&C(t),!g&&m(e,t)&&C(t),c&&t.callee.type===`MemberExpression`&&t.callee.object.type===`Identifier`&&!a(e,t.callee.object)?.defs.length&&(t.callee.object.name===`Date`&&n===`now`||t.callee.object.name===`Math`&&n===`random`)&&C(t)},MemberExpression(e){c&&[`db`,`storage`,`scheduler`,`env`].includes(v(e)??``)&&C(e)},NewExpression(t){(c||l||u)&&(t.callee.type!==`Identifier`||a(e,t.callee)?.defs.length||![`Error`,`TypeError`,`RangeError`,`Set`,`Map`,`RegExp`].includes(t.callee.name))&&C(t)},"Program:exit"(){y&&e.report({node:y,messageId:`ownership`})}}}}};export{E as ownershipRules};
1
+ import{architectureAnchor as e,createResolver as t,inspectArchitecture as n,resolveImport as r}from"./architecture.mjs";import{appFile as i,binding as a,componentRoot as o,consumerOptions as s,containsComponentReference as c,delegatingBody as l,exportedNames as u,imported as d,isDbAccess as f,isDbWrite as p,isExternalCall as m,isFunctionsImport as h,memberPath as g,metadata as _,propertyName as v,rootMember as y,sourceVisitors as b,typeOnlySource as x}from"./ast.mjs";import{basename as S,resolve as C}from"node:path";import{existsSync as w,realpathSync as T}from"node:fs";const E={"project-structure":{meta:_(`Validate the application tree, colocated tests, and module cycles.`,{structure:`{{file}}: {{message}}`}),create(t){let r=s.parse(t.options[0]??{}),i=C(t.cwd,r.convexDir);return(w(t.filename)?T(t.filename):C(t.filename))===e(i)?{Program(e){for(let i of n({cwd:t.cwd,convexDir:r.convexDir}))t.report({node:e,messageId:`structure`,data:{file:i.file,message:i.message}})}}:{}}},"root-wiring-only":{meta:_(`Keep root files limited to configuration, assembly, and component facades.`,{ownership:`Root files only wire configuration and components. Move behavior into domain/<module>/: {{reason}}.`}),create(e){let t=i(e);if(!t||t.includes(`/`))return{};let n=null,r=`business implementation`,a=!1,o=/^(?:convex\.config|auth\.config|vite\.config|vitest\.config|auth|schema|functions|triggers|foundation|http|crons)\.[cm]?[jt]s$/.test(t);function s(e){n??=e}return{Program(e){e.body.some(e=>e.type===`FunctionDeclaration`||e.type===`ExportNamedDeclaration`&&e.declaration?.type===`FunctionDeclaration`)&&s(e)},NewExpression(t){d(e,t.callee)&&t.arguments.some(t=>c(e,t))&&(a=!0)},CallExpression(n){d(e,n.callee)&&n.arguments.some(t=>c(e,t))&&(a=!0),(p(n)||m(e,n)||t===`schema.ts`&&d(e,n.callee)?.name!==`defineSchema`)&&s(n)},ArrowFunctionExpression(e){(!e.body||!l(e.body))&&s(e)},FunctionExpression(e){(!e.body||!l(e.body))&&s(e)},IfStatement:s,SwitchStatement:s,ConditionalExpression:s,ForStatement:s,ForOfStatement:s,WhileStatement:s,"Program:exit"(t){!o&&!a&&(n=t,r=`unknown root file; only declared component facades may add root source files`),n&&e.report({node:n,messageId:`ownership`,data:{reason:r}})}}}},"application-orchestration":{meta:_(`Reserve application/ for thin cross-domain coordination.`,{ownership:`application/ only coordinates two or more domains. Move schemas, providers, storage access, helpers, and business decisions into their owning domain.`}),create(e){if(!i(e)?.startsWith(`application/`))return{};let n=/* @__PURE__ */ new Set,a=t(),o=null;function s(e){o??=e}let c=b(e,(t,o)=>{if(x(t))return;let c=r(a,e.filename,o),l=c&&i(e,c),u=l?.match(/^domain\/([^/]+)\/(?:commands|queries|rules)(?:\.[cm]?[jt]s)?$/);u&&u[1]!==`shared`&&n.add(u[1]),l?.startsWith(`domain/`)&&!u&&!l.startsWith(`domain/shared/`)&&s(t),!l&&![`cvx-kit`,`cvx-kit/components/foundation`,`@convex-dev/workflow`,`convex/values`].includes(o)&&s(t)});return{...c,Program(e){let t=u(e);for(let n of e.body){n.type===`FunctionDeclaration`&&n.id&&!t.has(n.id.name)&&s(n);let e=n.type===`ExportNamedDeclaration`?n.declaration:n;if((e?.type===`TSTypeAliasDeclaration`||e?.type===`TSInterfaceDeclaration`)&&s(n),e?.type===`VariableDeclaration`)for(let r of e.declarations)r.init&&[`ObjectExpression`,`ArrayExpression`,`Literal`].includes(r.init.type)&&s(r),n.type===`VariableDeclaration`&&r.id.type===`Identifier`&&!t.has(r.id.name)&&[`ArrowFunctionExpression`,`FunctionExpression`].includes(r.init?.type??``)&&s(r)}},CallExpression(t){c.CallExpression?.(t),(f(t)||m(e,t))&&s(t);let n=d(e,t.callee);n&&[`zod`,`zod/v4`].includes(n.source)&&s(t)},MemberExpression(t){let r=g(t);if(r.length>=4&&r[1]===`domain`){let i=d(e,y(t));i?.name===`internal`&&/_generated\/api/.test(i.source)&&n.add(r[2])}},NewExpression:s,IfStatement:s,SwitchStatement:s,ConditionalExpression:s,"Program:exit"(t){(n.size<2||o)&&e.report({node:o??t,messageId:`ownership`})}}}},"internal-function-ownership":{meta:_(`Place internal handlers with their owner, never in root, api/, or shared/.`,{ownership:`Declare system/internal handlers in domain/<module>/, cross-domain application/, migrations/, or an isolated component.`}),create(e){let t=i(e)??``;return o(e,e.filename)||/^(?:domain\/(?!shared\/)[^/]+\/|application\/|migrations\/)/.test(t)?{}:{CallExpression(t){if(t.callee.type===`CallExpression`)return;let n=d(e,t.callee);n&&(h(e,n.source)&&/^system(Query|Mutation|Action)$/.test(n.name)||/(?:_generated\/server|convex\/server)/.test(n.source)&&/^internal(Query|Mutation|Action)(Generic)?$/.test(n.name))&&e.report({node:t,messageId:`ownership`})}}}},"domain-file-responsibilities":{meta:_(`Keep invariants pure, reads read-only, shapes declarative, and I/O action-side.`,{ownership:`Respect this domain file responsibility: pure rules, read-only queries, declarative schemas/tables/constants, and external I/O only in actions or integrations.`}),create(e){let n=i(e)??``,o=n===`domain/table.ts`;if(!o&&!/^domain\/[^/]+\//.test(n))return{};let s=S(n).replace(/\.[cm]?[jt]s$/,``),c=s===`rules`,l=s===`queries`,u=[`schema`,`table`,`contracts`,`constants`].includes(s),g=/(?:^|\/)(?:actions|integrations|providers)(?:\/|\.)/.test(n)||/(?:^|_)actions\./.test(n),_=t(),y=null;function C(e){y??=e}let w=b(e,(t,n)=>{if(x(t))return;let a=r(_,e.filename,n),s=a&&i(e,a);o&&n!==`cvx-kit/zod-table`&&!/^domain\/[^/]+\/table(?:\.[cm]?[jt]s)?$/.test(s??``)&&C(t),c&&s&&!/(?:^|\/)(?:rules|constants)(?:\.[cm]?[jt]s)?$/.test(s)&&C(t),(c||l||u)&&!s&&![`zod`,`zod/v4`,`convex/values`,`cvx-kit`,`cvx-kit/zod-table`,`cvx-kit/errors`,`cvx-kit/contracts`].includes(n)&&C(t),l&&s&&/(?:^|\/)(?:commands|actions|integrations|providers)(?:[./]|$)/.test(s)&&C(t)});return{...w,Program(e){if(o)for(let t of e.body){if(t.type===`ImportDeclaration`||t.type===`EmptyStatement`)continue;let e=t.type===`ExportNamedDeclaration`?t.declaration:t;(e?.type!==`VariableDeclaration`||e.declarations.some(e=>e.init?.type!==`CallExpression`))&&C(t)}},CallExpression(t){if(w.CallExpression?.(t),o){let n=d(e,t.callee);(n?.source!==`cvx-kit/zod-table`||n.name!==`createModule`)&&C(t)}let n=t.callee.type===`MemberExpression`?v(t.callee):null;(c||u)&&(f(t)||[`runQuery`,`runMutation`,`runAction`,`runAfter`,`runAt`].includes(n??``))&&C(t),l&&(p(t)||[`runMutation`,`runAction`,`runAfter`,`runAt`].includes(n??``))&&C(t);let r=d(e,t.callee);r&&h(e,r.source)&&(c||u||l&&/(?:Mutation|Action)$/.test(r.name))&&C(t),l&&t.callee.type===`MemberExpression`&&v(t.callee.object)===`storage`&&[`store`,`delete`,`generateUploadUrl`].includes(n??``)&&C(t),!g&&m(e,t)&&C(t),c&&t.callee.type===`MemberExpression`&&t.callee.object.type===`Identifier`&&!a(e,t.callee.object)?.defs.length&&(t.callee.object.name===`Date`&&n===`now`||t.callee.object.name===`Math`&&n===`random`)&&C(t)},Property(e){s===`contracts`&&[`handler`,`context`,`audit`,`prepare`,`middleware`,`guard`].includes(e.key.type===`Identifier`?e.key.name:String(e.key.type===`Literal`?e.key.value:``))&&C(e)},MemberExpression(e){c&&[`db`,`storage`,`scheduler`,`env`].includes(v(e)??``)&&C(e)},NewExpression(t){(c||l||u)&&(t.callee.type!==`Identifier`||a(e,t.callee)?.defs.length||![`Error`,`TypeError`,`RangeError`,`Set`,`Map`,`RegExp`].includes(t.callee.name))&&C(t)},"Program:exit"(){y&&e.report({node:y,messageId:`ownership`})}}}}};export{E as ownershipRules};
2
2
  //# sourceMappingURL=ownership.mjs.map