import { EntityConstructor, EntityInterface } from './Entity.types.js'; export type NymphOptions = { /** * The URL of your Nymph REST server. */ restUrl: string; /** * The URL of your Nymph PubSub server. */ pubsubUrl?: string; /** * A fetch implementation. */ fetch?: WindowOrWorkerGlobalScope['fetch']; /** * A WebSocket implementation. */ WebSocket?: typeof WebSocket; /** * Return `null` or empty array instead of error when entity/ies not found. */ returnNullOnNotFound?: boolean; /** * Whether to not output status messages to the console. */ noConsole?: boolean; /** * Don't automatically try to connect to PubSub server. */ noAutoconnect?: boolean; /** * Use a WeakRef based cache of entities. * * This ensures all entities returned are the same instance if they have the * same class and GUID. This also means that whenever an entity is returned * from the server, the single instance in memory will be refreshed. This * could have annoying results, like destroying dirty data (the dreaded * triple-D). * * This could also be a potential source of memory leaks. Although the * entities themselves are referenced weakly so they get garbage collected, * the GUID used as a key and the WeakRef object itself are not weak * references, so not destroyed when the instance is garbage collected. * * However, even with these caveats, this might help you if you have a big app * with the same entities stored in several different places in memory. This * can help to synchronize them correctly and avoid data conflicts. */ weakCache?: boolean; /** * Whether to renew tokens when a request is made. * * If you turn this off, the client will request that the server not renew an * authentication token, even if it is within the renewal time of the * expiration date. * * This defaults to true. */ renewTokens?: boolean; }; export type EventType = 'request' | 'response'; export type RequestCallback = (url: string, options: RequestInit) => void; export type ResponseCallback = (response: Response, text: string) => void; export type Options = { /** * The Entity class to query. */ class: T; /** * The limit of entities to be returned. Not needed when using `getEntity`, as * it always returns only one. */ limit?: number; /** * The offset from the first matching entity, in order, to start retrieving. */ offset?: number; /** * If true, entities will be retrieved from newest to oldest/largest to * smallest (with regard to `sort`). */ reverse?: boolean; /** * How to sort the entities. Should be "cdate", "mdate", the name of a * property, or null. */ sort?: 'cdate' | 'mdate' | string | null; /** * What to return, the entities with their data, just the GUIDs, or just a * count. */ return?: 'entity' | 'guid' | 'count'; /** * If true, Nymph will skip the cache and retrieve the entity from the DB. */ skipCache?: boolean; /** * The level(s) of access control requested. * * Limiting the access control can significantly improve the performance of * the query. */ acRequest?: TilmeldAccessRequest; }; export type Clause = C | Exclude[]; export type OrWithTime = T | [string, null, string]; type PrimitiveSelector = { guid?: string; '!guid'?: PrimitiveSelector['guid']; tag?: string; '!tag'?: PrimitiveSelector['tag']; defined?: string; '!defined'?: PrimitiveSelector['defined']; truthy?: string; '!truthy'?: PrimitiveSelector['truthy']; equal?: [string, any]; '!equal'?: PrimitiveSelector['equal']; contain?: [string, any]; '!contain'?: PrimitiveSelector['contain']; search?: [string, string]; '!search'?: PrimitiveSelector['search']; match?: [string, string]; '!match'?: PrimitiveSelector['match']; imatch?: [string, string]; '!imatch'?: PrimitiveSelector['imatch']; like?: [string, string]; '!like'?: PrimitiveSelector['like']; ilike?: [string, string]; '!ilike'?: PrimitiveSelector['ilike']; gt?: [string, number]; '!gt'?: PrimitiveSelector['gt']; gte?: [string, number]; '!gte'?: PrimitiveSelector['gte']; lt?: [string, number]; '!lt'?: PrimitiveSelector['lt']; lte?: [string, number]; '!lte'?: PrimitiveSelector['lte']; ref?: [string, EntityInterface | string]; '!ref'?: PrimitiveSelector['ref']; qref?: [string, [Options, ...PrimitiveSelector[]]]; '!qref'?: PrimitiveSelector['qref']; selector?: PrimitiveSelector; '!selector'?: PrimitiveSelector['selector']; }; export type Selector = { type: '&' | '|' | '!&' | '!|'; guid?: Clause; '!guid'?: Clause; tag?: Clause; '!tag'?: Clause; defined?: Clause; '!defined'?: Clause; truthy?: Clause; '!truthy'?: Clause; equal?: Clause>; '!equal'?: Clause>; contain?: Clause>; '!contain'?: Clause>; search?: Clause; '!search'?: Clause; match?: Clause; '!match'?: Clause; imatch?: Clause; '!imatch'?: Clause; like?: Clause; '!like'?: Clause; ilike?: Clause; '!ilike'?: Clause; gt?: Clause>; '!gt'?: Clause>; gte?: Clause>; '!gte'?: Clause>; lt?: Clause>; '!lt'?: Clause>; lte?: Clause>; '!lte'?: Clause>; ref?: Clause; '!ref'?: Clause; qref?: Clause<[string, [Options, ...Selector[]]]>; '!qref'?: Selector['qref']; selector?: Clause; '!selector'?: Selector['selector']; }; export enum TilmeldAccessRequest { /** * The default level, any possible entity readable by the user. * * This is the same as or-ing together all of the levels listed below. */ ALL_LEVELS = 0, /** * Owned by and accessible to the user. * * This is always enabled, so not including it has no effect. It's here to * allow the selection of _only_ user owned entities. */ USER_OWNED = 1, /** * Owned by and accessible to the user's primary group. */ PRIMARY_GROUP_OWNED = 2, /** * Owned by and accessible to one of the user's secondary groups. */ SECONDARY_GROUP_OWNED = 4, /** * The user is listed in an access control list. */ USER_ACCESSIBLE = 8, /** * The user's primary group is listed in an access control list. */ PRIMARY_GROUP_ACCESSIBLE = 16, /** * One of the user's secondary groups is listed in an access control list. */ SECONDARY_GROUP_ACCESSIBLE = 32, /** * The entity is accessible to any user. */ OTHER_ACCESSIBLE = 64, /** * The entity is not owned by anyone. */ UNOWNED = 128, }