import mongoose, { Schema } from 'mongoose'; import { Response, NextFunction, RequestHandler, Router } from 'express'; import { ag as GlobalOptions, Z as DefaultModelRouterOptions, aI as ModelRouterOptions, V as DataRouterOptions, a5 as ExtendedDefaultModelRouterOptions, a6 as ExtendedModelRouterOptions, a4 as ExtendedDataRouterOptions, A as AccessRouterBaseRequest, ai as GuardHook, aH as ModelRequest, T as DataRequest, cR as DataService, a7 as Filter, aS as Projection, bN as Sort, aP as Populate, cS as Service, cT as PublicService, cu as Validation, bE as RootRouterOptions } from './parsers-DppKW-Fd.mjs'; export { cU as AccessRouterPermissionMap, cV as AccessRouterPermissions, c as AccessRouterRequest, d as AccessRouterRequestExtensions, l as AjvErrorObjectLike, n as AjvValidatorLike, o as ArkTypeErrorsLike, p as ArkTypeLike, ah as GlobalPermissionValue, al as IoTsContextEntryLike, am as IoTsDecodeErrorLike, an as IoTsDecoderLike, ao as JoiSchemaLike, ap as JoiValidationErrorDetailLike, av as MaybePromise, aw as ModelBaseFilterHook, ay as ModelDeleteHook, az as ModelDocPermissionsHook, aB as ModelDocumentHook, aC as ModelHook, aE as ModelIdentifierHook, aF as ModelListHook, aG as ModelOverrideFilterHook, aJ as ModelValidateHook, cW as Permissions, b8 as RequestSchemaAdapter, b9 as RequestSchemaFailure, ba as RequestSchemaIssue, bb as RequestSchemaLike, bc as RequestSchemaOptions, bd as RequestSchemaResult, be as RequestSchemaSuccess, bf as RequestSchemaValidator, bH as RouteGuardAccess, bP as StandardSchemaFailure, bQ as StandardSchemaInferOutput, bR as StandardSchemaIssue, bS as StandardSchemaPathSegment, bT as StandardSchemaResult, bU as StandardSchemaSuccess, bV as StandardSchemaV1, ca as SuperstructFailureLike, cb as SuperstructValidateLike, co as ValibotIssueLike, cp as ValibotPathItemLike, cq as ValibotSafeParseLike, cr as ValibotSafeParseResult, cw as VineValidationErrorLike, cx as VineValidationMessageLike, cy as VineValidatorLike, cz as YupSchemaLike, cA as YupValidationErrorLike, cB as defineRequestSchema, cC as fromAjv, cD as fromArkType, cE as fromIoTs, cF as fromJoi, cG as fromStandardSchema, cH as fromSuperstruct, cI as fromValibot, cJ as fromVine, cK as fromYup, cL as fromZod } from './parsers-DppKW-Fd.mjs'; import JsonRouter from '@web-ts-toolkit/express-json-router'; import 'zod'; type OpenApiMethod = 'get' | 'post' | 'put' | 'patch' | 'delete'; type OpenApiSchema = Record; type OpenApiSchemaSource = unknown; type OpenApiParameter = { name: string; in: 'path' | 'query'; required?: boolean; description?: string; schema?: OpenApiSchema; }; type OpenApiResponse = { description: string; content?: Record; }; type OpenApiResponses = Record; type OpenApiRouteDescriptor = { method: OpenApiMethod; path: string; operationId?: string; summary?: string; description?: string; tags?: string[]; acl?: string; deprecated?: boolean; query?: OpenApiSchemaSource; body?: OpenApiSchemaSource; pathParams?: Record; responses?: OpenApiResponses; /** * When true, replaces an existing registration with the same method/path * even when the descriptors differ. When false (default), conflicting * registrations throw at registration time so consumers can detect * accidental route shadowing. */ allowReplace?: boolean; /** * When true, this exact descriptor is idempotent and registering the same * method/path with an equivalent descriptor again is silently accepted. * Differing re-registrations still throw unless {@link allowReplace} is set. * Additionally, an idempotent descriptor may share its operationId with * another idempotent descriptor mounted at a different path on the same * registry, so reserved operations (e.g. the root batch route) can be * exposed from multiple base paths without triggering strict-mode * duplicate-operationId rejection. */ idempotent?: boolean; }; type OpenApiRegistryOptions = { /** * Throw when the same method/path is registered twice with differing * descriptors, instead of silently replacing. Default: true (strict). * The {@link AccessRuntime} registry is constructed in strict mode by * default; construct {@link OpenApiRegistry} directly with * `rejectConflicts: false` for legacy replacement semantics. */ rejectConflicts?: boolean; /** * Throw when the same operationId is registered more than once, including * when {@link OpenApiRouteDescriptor.allowReplace} is set. Default: true. */ rejectDuplicateOperationIds?: boolean; }; type OpenApiDocumentOptions = { title: string; version: string; description?: string; servers?: Array<{ url: string; description?: string; }>; }; type OpenApiRouterOptions = Partial & { jsonPath?: string; docsPath?: string | false; swaggerUiCssUrl?: string; swaggerUiBundleUrl?: string; }; type ModelReferenceMap = { [key: string]: string | ModelReferenceMap; }; declare class AccessRuntime { private readonly allowGlobalModelLookup; constructor(options?: { allowGlobalModelLookup?: boolean; }); private readonly globalOptions; private readonly defaultModelOptions; private readonly modelOptions; private readonly modelJsonSchemas; private readonly dataOptions; private readonly modelRefs; private readonly modelSubs; private readonly modelAtts; private readonly modelInstances; private readonly openApiRegistry; registerModelInstance(modelName: string, model: mongoose.Model): void; hasModelInstance(modelName: string): boolean; getModelInstance(modelName: string): mongoose.Model | null; registerOpenApiRoute(route: OpenApiRouteDescriptor): void; /** * Enable strict OpenAPI collision detection for the remainder of this * runtime's lifetime. After this call, conflicting method/path * registrations and duplicate operationIds throw {@link OpenApiCollisionError} * instead of silently replacing. Existing already-registered routes are * not retroactively re-validated. */ enableOpenApiCollisionDetection(): void; getOpenApiRoutes(): OpenApiRouteDescriptor[]; clearOpenApiRoutes(): void; getOpenApiSpec(info: OpenApiDocumentOptions): { openapi: string; info: Omit; servers?: OpenApiDocumentOptions["servers"]; paths: Record; }; responses: OpenApiResponses; }>>; }; createBootstrapSnapshot(): { globalOptions: GlobalOptions; defaultModelOptions: DefaultModelRouterOptions; modelOptions: Record; dataOptions: Record; modelInstances: Record>; modelJsonSchemas: Record>; modelRefs: Record; modelSubs: Record; modelAtts: Record; openApi: { routes: OpenApiRouteDescriptor[]; options: Required; }; }; restoreBootstrapSnapshot(snapshot: ReturnType): void; setGlobalOptions(options: GlobalOptions): void; setGlobalOption(key: K, value: GlobalOptions[K]): void; getGlobalOptions(): GlobalOptions; getGlobalOption(key: K, defaultValue?: GlobalOptions[K]): GlobalOptions[K]; setDefaultModelOptions(options: DefaultModelRouterOptions): void; setDefaultModelOption(key: K, value: ExtendedDefaultModelRouterOptions[K]): void; getDefaultModelOptions(): DefaultModelRouterOptions; getDefaultModelOption(key: K, defaultValue?: ExtendedDefaultModelRouterOptions[K]): ExtendedDefaultModelRouterOptions[K]; private createModelOptions; private getOrCreateModelOptions; setModelOptions(modelName: string, options: ModelRouterOptions): void; setModelOption, TModel = unknown>(modelName: string, key: K, value: ExtendedModelRouterOptions[K]): void; getModelOptions(modelName: string): ModelRouterOptions; getModelOption, TModel = unknown>(modelName: string, key: K | string, defaultValue?: ExtendedModelRouterOptions[K]): ExtendedModelRouterOptions[K]; getExactModelOption, TModel = unknown>(modelName: string, key: K | string): ExtendedModelRouterOptions[K]; getModelNames(): string[]; hasModel(modelName: string): boolean; getModelJsonSchema(modelName: string): Record; private createDataOptions; private getOrCreateDataOptions; setDataOptions(dataName: string, options: DataRouterOptions): void; setDataOption, TData = unknown>(dataName: string, key: K, value: DataRouterOptions[K]): void; getDataOptions(dataName: string): DataRouterOptions; getDataSnapshot(dataName: string): readonly TData[]; getDataOption, TData = unknown>(dataName: string, key: K | string, defaultValue?: DataRouterOptions[K]): DataRouterOptions[K]; getExactDataOption, TData = unknown>(dataName: string, key: K | string): ExtendedDataRouterOptions[K]; getDataNames(): string[]; ensureModelMeta(modelName: string): void; getModelRef(modelName: string, refPath: string): string | null; getModelSub(modelName: string): string[]; getModelAtt(modelName: string): string[]; } declare const defaultRuntime: AccessRuntime; declare function macl(): (req: AccessRouterBaseRequest, res: Response, next: NextFunction) => Promise; interface GuardModelConditionID { type: 'param' | 'query'; key: string; } interface GuardModelCondition { modelName: string; id: string | GuardModelConditionID; condition: string | string[]; } declare function guard(condition: string): RequestHandler; declare function guard(conditions: string[]): RequestHandler; declare function guard(conditionFunc: GuardHook): RequestHandler; declare function guard(modelCondition: GuardModelCondition): RequestHandler; type SetTargetOption$1 = { (option: TOption): TRouter; (key: string, option: unknown): TRouter; }; declare class DataRouter { readonly runtime: AccessRuntime; readonly dataName: string; readonly router: JsonRouter; readonly options: DataRouterOptions; readonly fullBasePath: string; constructor(dataName: string, initialOptions: DataRouterOptions, runtime?: AccessRuntime); private getRequestSchema; getService(req: DataRequest): DataService; private assertAllowed; private registerOpenApiRoute; private setCollectionRoutes; private setDocumentRoutes; set>(key: K, value: DataRouterOptions[K]): this; set(options: DataRouterOptions): this; setOption>(key: K, option: DataRouterOptions[K]): this; setOptions(options: DataRouterOptions): this; data: SetTargetOption$1, DataRouterOptions['data']>; listHardLimit: SetTargetOption$1, DataRouterOptions['listHardLimit']>; permissionSchema: SetTargetOption$1, DataRouterOptions['permissionSchema']>; operationAccess: SetTargetOption$1, DataRouterOptions['operationAccess']>; baseFilter: SetTargetOption$1, DataRouterOptions['baseFilter']>; /** * Trusted filter replacements applied before base-filter composition. * They may replace ordinary filters, but cannot replace an existing `false` denial. * Returning `false` denies the transaction. */ overrideFilter: SetTargetOption$1, DataRouterOptions['overrideFilter']>; decorate: SetTargetOption$1, DataRouterOptions['decorate']>; decorateAll: SetTargetOption$1, DataRouterOptions['decorateAll']>; idField: SetTargetOption$1, DataRouterOptions['idField']>; resolveIdFilter: SetTargetOption$1, DataRouterOptions['resolveIdFilter']>; queryRouteSegment: SetTargetOption$1, DataRouterOptions['queryRouteSegment']>; get routes(): Router; } interface FindProps { filter: Filter; select?: Projection; sort?: Sort; populate?: Populate[] | string; limit?: string | number; hardLimit?: number; skip?: string | number; lean?: boolean; } interface FindOneProps { filter: Filter; select?: Projection; sort?: Sort; populate?: Populate[] | string; lean?: boolean; } declare class Model { modelName: string; mongooseModel: mongoose.Model; runtime: AccessRuntime | null; constructor(modelName: string, runtime?: AccessRuntime); new(): any; create(data: unknown): Promise; find({ filter, select, sort, populate, limit, hardLimit, skip, lean }: FindProps): mongoose.Query; findOne({ filter, select, sort, populate, lean }: FindOneProps): mongoose.Query; exists(filter: Filter): ReturnType | null; countDocuments(filter?: {}): mongoose.Query; distinct(field: string, conditions?: {}): mongoose.Query; aggregate(pipeline: unknown[]): mongoose.Aggregate; } type SetTargetOption = { (option: TOption): TRouter; (key: string, option: unknown): TRouter; }; declare class ModelRouter { readonly runtime: AccessRuntime; readonly modelName: string; readonly router: JsonRouter; readonly model: Model; readonly options: ModelRouterOptions; readonly fullBasePath: string; constructor(modelName: string, initialOptions: ModelRouterOptions, runtime?: AccessRuntime); static fromModel(model: mongoose.Model, initialOptions: ModelRouterOptions, runtime?: AccessRuntime): ModelRouter; private getRequestSchema; getService(req: ModelRequest): Service; getPublicService(req: ModelRequest): PublicService; private assertAllowed; private registerOpenApiRoute; private setCollectionRoutes; private setDocumentRoutes; private setSubDocumentRoutes; private logEndpoints; set>(key: K, value: ExtendedModelRouterOptions[K]): this; set(options: ModelRouterOptions): this; setOption>(key: K, option: ExtendedModelRouterOptions[K]): this; setOptions(options: ModelRouterOptions): this; /** * The maximum limit of the number of documents returned from the `list` operation. */ listHardLimit: SetTargetOption, ModelRouterOptions['listHardLimit']>; /** * The object schema to define the access control policy for each model field. */ permissionSchema: SetTargetOption, ModelRouterOptions['permissionSchema']>; /** * The object field to store the document permissions. */ documentPermissionField: SetTargetOption, ModelRouterOptions['documentPermissionField']>; /** * The model fields always selected for ACL and response shaping. */ alwaysSelectFields: SetTargetOption, ModelRouterOptions['alwaysSelectFields']>; /** * The function called in the process of generating document permissions. */ docPermissions: SetTargetOption, ModelRouterOptions['docPermissions']>; /** * The access control policy for router operations. * @operation `create`, `list`, `read`, `update`, `delete` */ operationAccess: SetTargetOption, ModelRouterOptions['operationAccess']>; /** * The base filter definitions applied in every query transaction. * @operation `list`, `read`, `update`, `delete` */ baseFilter: SetTargetOption, ModelRouterOptions['baseFilter']>; /** * Trusted filter replacements applied before base-filter composition. * They may replace ordinary filters, but cannot replace an existing `false` denial. * Returning `false` denies the transaction. * @operation `list`, `read`, `update`, `delete` */ overrideFilter: SetTargetOption, ModelRouterOptions['overrideFilter']>; /** * Hook * * The function called before a new/update document data is processed in `prepare` hooks. This method is used to validate `write data` and throw an error if not valid. * @operation `create`, `update` */ validate: SetTargetOption, ModelRouterOptions['validate']>; /** * Hook * * The function called before a new document is created or an existing document is updated. This method is used to process raw data passed into the API endpoints. * @operation `create`, `update` */ prepare: SetTargetOption, ModelRouterOptions['prepare']>; /** * Hook * * The function called before an updated document is saved. * @operation `update` */ transform: SetTargetOption, ModelRouterOptions['transform']>; /** * Hook * * The function called after a new document is created or an updated document is saved. * @operation `create`, `update` */ afterPersist: SetTargetOption, ModelRouterOptions['afterPersist']>; /** * Hook * * The function called after an updated document changes have been finalized. * @operation `update` */ onChange: SetTargetOption, ModelRouterOptions['onChange']>; /** * Hook * * The function called before a document is deleted. * @operation `delete` */ beforeDelete: SetTargetOption, ModelRouterOptions['beforeDelete']>; /** * Hook * * The function called after a document is deleted. * @operation `delete` */ afterDelete: SetTargetOption, ModelRouterOptions['afterDelete']>; /** * Hook * * The function called before response data is sent. This method is used to process raw data to apply custom logic before sending the result. * @operation `list`, `read`, `create`, `update` */ decorate: SetTargetOption, ModelRouterOptions['decorate']>; /** * Hook * * The functions are called before response data is sent and after `decorate` hooks run. This method is used to process and filter multiple document objects before sending the result. * @operation `list` */ decorateAll: SetTargetOption, ModelRouterOptions['decorateAll']>; /** * The field matched against the `id` route param. * @operation `read`, `update`, `delete` */ idField: SetTargetOption, ModelRouterOptions['idField']>; /** * The function used to resolve the `id` route param into a document filter. * @operation `read`, `update`, `delete` */ resolveIdFilter: SetTargetOption, ModelRouterOptions['resolveIdFilter']>; /** * The route segment used for advanced query endpoints. */ queryRouteSegment: SetTargetOption, ModelRouterOptions['queryRouteSegment']>; /** * The route segment used for advanced mutation endpoints. */ mutationRouteSegment: SetTargetOption, ModelRouterOptions['mutationRouteSegment']>; /** * The default values used when missing in the operations. */ defaults: SetTargetOption, ModelRouterOptions['defaults']>; get routes(): Router; } declare class RootRouter { readonly runtime: AccessRuntime; router: JsonRouter; basename: string; operationAccess: Validation; maxBatchEntries: number; maxOrderGroups: number; maxConcurrentOperations: number; private readonly modelOperations; private readonly dataOperations; constructor(options?: RootRouterOptions, runtime?: AccessRuntime); private registerOpenApiRoute; private wrapResult; private hasTarget; private isAllowed; private processOp; private groupItemsByOrder; private normalizePositiveLimit; private validateBatch; private runGroup; private assertAllowed; private setRoutes; get routes(): Router; } declare function createOpenApiRouter(runtime: AccessRuntime, options?: OpenApiRouterOptions): Router; declare class OpenApiRegistry { private readonly routes; private options; constructor(options?: OpenApiRegistryOptions); register(route: OpenApiRouteDescriptor): void; private assertOperationIdAvailable; getRoutes(): OpenApiRouteDescriptor[]; clear(): void; setStrictMode(enabled: boolean): void; getSpec(info: OpenApiDocumentOptions): { openapi: string; info: Omit; servers?: OpenApiDocumentOptions["servers"]; paths: Record; }; responses: OpenApiResponses; }>>; }; snapshot(): { routes: OpenApiRouteDescriptor[]; options: Required; }; restore(snapshot: { routes: OpenApiRouteDescriptor[]; options: Required; }): void; } type AccessRouterInstance = ModelRouter | DataRouter | RootRouter; type CombinedRouteInput = Router | AccessRouterInstance; declare function combineRoutes(...inputs: CombinedRouteInput[]): Router; declare class OpenApiCollisionError extends Error { readonly collisionKind: 'path' | 'operationId'; readonly method?: string; readonly path?: string; readonly operationId?: string; readonly existing?: unknown; readonly incoming?: unknown; constructor(message: string, details: { collisionKind: 'path' | 'operationId'; method?: string; path?: string; operationId?: string; existing?: unknown; incoming?: unknown; }); } declare const setGlobalOptions: (options: GlobalOptions) => void; declare const setGlobalOption: (key: K, value: GlobalOptions[K]) => void; declare const getGlobalOptions: () => GlobalOptions; declare const getGlobalOption: (key: K, defaultValue?: GlobalOptions[K]) => GlobalOptions[K]; declare const setModelOptions: (modelName: string, options: ModelRouterOptions) => void; declare const setModelOption: , TModel = unknown>(modelName: string, key: K, value: ExtendedModelRouterOptions[K]) => void; declare const getModelOptions: (modelName: string) => ModelRouterOptions; declare const getModelOption: , TModel = unknown>(modelName: string, key: K | string, defaultValue?: ExtendedModelRouterOptions[K]) => ExtendedModelRouterOptions[K]; declare const getModelNames: () => string[]; declare const getModelJsonSchema: (modelName: string) => Record; declare const registerModelInstance: (modelName: string, model: mongoose.Model) => void; declare const hasModelInstance: (modelName: string) => boolean; declare const getModelInstance: (modelName: string) => mongoose.Model | null; declare const setDefaultModelOptions: (options: DefaultModelRouterOptions) => void; declare const setDefaultModelOption: (key: K, value: ExtendedDefaultModelRouterOptions[K]) => void; declare const getDefaultModelOptions: () => DefaultModelRouterOptions; declare const getDefaultModelOption: (key: K, defaultValue?: ExtendedDefaultModelRouterOptions[K]) => ExtendedDefaultModelRouterOptions[K]; interface Options { virtualPermissionField?: string; modelName: string; } declare function permissionsPlugin(schema: Schema, options: Options): void; type LogLevel = 'debug' | 'info' | 'warn' | 'error'; declare const redactFilter: (filter: T) => T; declare const redactPayload: (payload: T) => T; declare const safeStringify: (value: unknown) => string; declare const isLevelEnabled: (level: LogLevel) => boolean; interface OpLogContext { op: string; modelName?: string; dataName?: string; populateCount?: number; selectCount?: number; page?: number; pageSize?: number; skip?: number; limit?: number; sort?: unknown; filterKeyValueCount?: number; startedAt?: number; durationMs?: number; resultCode?: string | number; } type CreateRouter = { (model: mongoose.Model, options: ModelRouterOptions): ModelRouter; (modelName: string, options: ModelRouterOptions): ModelRouter; (options: RootRouterOptions): RootRouter; }; type CreateDataRouter = { (dataName: string, options: DataRouterOptions): DataRouter; }; type CreateRuntimeOpenApiRouter = (options?: OpenApiRouterOptions) => Router; type WttSet = { (key: K, value: GlobalOptions[K]): void; (options: { [K in keyof GlobalOptions]: GlobalOptions[K]; }): void; }; interface Wtt { runtime: AccessRuntime; createRouter: CreateRouter; createDataRouter: CreateDataRouter; createOpenApiRouter: CreateRuntimeOpenApiRouter; combineRoutes: typeof combineRoutes; set: WttSet; setGlobalOptions: typeof setGlobalOptions; setGlobalOption: typeof setGlobalOption; getGlobalOptions: typeof getGlobalOptions; getGlobalOption: typeof getGlobalOption; setModelOptions: typeof setModelOptions; setModelOption: typeof setModelOption; getModelOptions: typeof getModelOptions; getModelOption: typeof getModelOption; getModelNames: typeof getModelNames; getModelJsonSchema: typeof getModelJsonSchema; setDefaultModelOptions: typeof setDefaultModelOptions; setDefaultModelOption: typeof setDefaultModelOption; getDefaultModelOptions: typeof getDefaultModelOptions; getDefaultModelOption: typeof getDefaultModelOption; registerModelInstance: (modelName: string, model: mongoose.Model) => void; hasModelInstance: (modelName: string) => boolean; getModelInstance: (modelName: string) => mongoose.Model | null; RootRouter: typeof RootRouter; ModelRouter: typeof ModelRouter; DataRouter: typeof DataRouter; } type AccessRuntimeApi = typeof macl & Wtt; declare function createAccessRuntime(): AccessRuntimeApi; declare const acl: AccessRuntimeApi; export { AccessRuntime, type AccessRuntimeApi, type CombinedRouteInput, DataRouter, DataRouterOptions, ExtendedDefaultModelRouterOptions, ExtendedModelRouterOptions, GlobalOptions, GuardHook, type GuardModelCondition, type GuardModelConditionID, ModelRouter, ModelRouterOptions, type OpLogContext, OpenApiCollisionError, type OpenApiDocumentOptions, type OpenApiMethod, OpenApiRegistry, type OpenApiRegistryOptions, type OpenApiRouteDescriptor, type OpenApiRouterOptions, RootRouter, RootRouterOptions, Validation, acl, combineRoutes, createAccessRuntime, createOpenApiRouter, acl as default, defaultRuntime, getDefaultModelOption, getDefaultModelOptions, getGlobalOption, getGlobalOptions, getModelInstance, getModelJsonSchema, getModelNames, getModelOption, getModelOptions, guard, hasModelInstance, isLevelEnabled, permissionsPlugin, redactFilter, redactPayload, registerModelInstance, safeStringify, setDefaultModelOption, setDefaultModelOptions, setGlobalOption, setGlobalOptions, setModelOption, setModelOptions };