UNPKG

@aws-amplify/datastore

Version:

AppSyncLocal support for aws-amplify

198 lines (197 loc) • 10.4 kB
import { ULID } from 'ulid'; import { Patch } from 'immer'; import { ModelInstanceCreator } from './datastore/datastore'; import { AllOperators, DeferredCallbackResolverOptions, IndexesType, ModelAssociation, ModelAttribute, ModelAttributes, ModelKeys, NonModelTypeConstructor, PaginationInput, PersistentModel, PersistentModelConstructor, PredicateGroups, PredicateObject, PredicatesGroup, RelationType, RelationshipType, SchemaModel, SchemaNamespace, SortPredicatesGroup } from './types'; export declare const ID = "id"; /** * Used by the Async Storage Adapter to concatenate key values * for a record. For instance, if a model has the following keys: * `customId: ID! @primaryKey(sortKeyFields: ["createdAt"])`, * we concatenate the `customId` and `createdAt` as: * `12-234-5#2022-09-28T00:00:00.000Z` */ export declare const DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR = "#"; /** * Used for generating spinal-cased index name from an array of * key field names. * E.g. for keys `[id, title]` => 'id-title' */ export declare const IDENTIFIER_KEY_SEPARATOR = "-"; export declare const errorMessages: { idEmptyString: string; queryByPkWithCompositeKeyPresent: string; deleteByPkWithCompositeKeyPresent: string; observeWithObjectLiteral: string; }; export declare enum NAMESPACES { DATASTORE = "datastore", USER = "user", SYNC = "sync", STORAGE = "storage" } declare const DATASTORE: NAMESPACES; declare const USER: NAMESPACES; declare const SYNC: NAMESPACES; declare const STORAGE: NAMESPACES; export { USER, SYNC, STORAGE, DATASTORE }; export declare const exhaustiveCheck: (obj: never, throwOnError?: boolean) => void; export declare const isNullOrUndefined: (val: any) => boolean; export declare const validatePredicate: <T extends PersistentModel>(model: T, groupType: keyof PredicateGroups<T>, predicatesOrGroups: (PredicateObject<T> | PredicatesGroup<T>)[]) => any; export declare const validatePredicateField: <T>(value: T, operator: keyof AllOperators, operand: T | [T, T]) => boolean; export declare const isModelConstructor: <T extends PersistentModel>(obj: any) => obj is PersistentModelConstructor<T>; export declare function registerNonModelClass(clazz: NonModelTypeConstructor<any>): void; export declare const isNonModelConstructor: (obj: any) => obj is NonModelTypeConstructor<any>; export declare const traverseModel: <T extends PersistentModel>(srcModelName: string, instance: T, namespace: SchemaNamespace, modelInstanceCreator: ModelInstanceCreator, getModelConstructorByModelName: (namsespaceName: NAMESPACES, modelName: string) => PersistentModelConstructor<any>) => { modelName: string; item: T; instance: T; }[]; export declare const isPrivateMode: () => Promise<unknown>; /** * Whether the browser's implementation of IndexedDB breaks on array lookups * against composite indexes whose keypath contains a single column. * * E.g., Whether `store.createIndex(indexName, ['id'])` followed by * `store.index(indexName).get([1])` will *ever* return records. * * In all known, modern Safari browsers as of Q4 2022, the query against an index like * this will *always* return `undefined`. So, the index needs to be created as a scalar. */ export declare const isSafariCompatabilityMode: () => Promise<boolean>; export declare function monotonicUlidFactory(seed?: number): ULID; /** * Uses performance.now() if available, otherwise, uses Date.now() (e.g. react native without a polyfill) * * The values returned by performance.now() always increase at a constant rate, * independent of the system clock (which might be adjusted manually or skewed * by software like NTP). * * Otherwise, performance.timing.navigationStart + performance.now() will be * approximately equal to Date.now() * * See: https://developer.mozilla.org/en-US/docs/Web/API/Performance/now#Example */ export declare function getNow(): number; export declare function sortCompareFunction<T extends PersistentModel>(sortPredicates: SortPredicatesGroup<T>): (a: any, b: any) => number; export declare function directedValueEquality(fromObject: object, againstObject: object, nullish?: boolean): boolean; export declare function valuesEqual(valA: any, valB: any, nullish?: boolean): boolean; /** * Statelessly extracts the specified page from an array. * * @param records - The source array to extract a page from. * @param pagination - A definition of the page to extract. * @returns This items from `records` matching the `pagination` definition. */ export declare function inMemoryPagination<T extends PersistentModel>(records: T[], pagination?: PaginationInput<T>): T[]; /** * An `aysnc` implementation of `Array.some()`. Returns as soon as a match is found. * @param items The items to check. * @param matches The async matcher function, expected to * return Promise<boolean>: `true` for a matching item, `false` otherwise. * @returns A `Promise<boolean>`, `true` if "some" items match; `false` otherwise. */ export declare function asyncSome(items: Record<string, any>[], matches: (item: Record<string, any>) => Promise<boolean>): Promise<boolean>; /** * An `aysnc` implementation of `Array.every()`. Returns as soon as a non-match is found. * @param items The items to check. * @param matches The async matcher function, expected to * return Promise<boolean>: `true` for a matching item, `false` otherwise. * @returns A `Promise<boolean>`, `true` if every item matches; `false` otherwise. */ export declare function asyncEvery(items: Record<string, any>[], matches: (item: Record<string, any>) => Promise<boolean>): Promise<boolean>; /** * An `async` implementation of `Array.filter()`. Returns after all items have been filtered. * TODO: Return AsyncIterable. * @param items The items to filter. * @param matches The `async` matcher function, expected to * return Promise<boolean>: `true` for a matching item, `false` otherwise. * @returns A `Promise<T>` of matching items. */ export declare function asyncFilter<T>(items: T[], matches: (item: T) => Promise<boolean>): Promise<T[]>; export declare const isAWSDate: (val: string) => boolean; export declare const isAWSTime: (val: string) => boolean; export declare const isAWSDateTime: (val: string) => boolean; export declare const isAWSTimestamp: (val: number) => boolean; export declare const isAWSEmail: (val: string) => boolean; export declare const isAWSJSON: (val: string) => boolean; export declare const isAWSURL: (val: string) => boolean; export declare const isAWSPhone: (val: string) => boolean; export declare const isAWSIPAddress: (val: string) => boolean; export declare class DeferredPromise { promise: Promise<string>; resolve: (value: string | PromiseLike<string>) => void; reject: () => void; constructor(); } export declare class DeferredCallbackResolver { private limitPromise; private timerPromise; private maxInterval; private timer; private raceInFlight; private callback; private errorHandler; private defaultErrorHandler; constructor(options: DeferredCallbackResolverOptions); private startTimer; private racePromises; start(): void; clear(): void; resolve(): void; } /** * merge two sets of patches created by immer produce. * newPatches take precedent over oldPatches for patches modifying the same path. * In the case many consecutive pathces are merged the original model should * always be the root model. * * Example: * A -> B, patches1 * B -> C, patches2 * * mergePatches(A, patches1, patches2) to get patches for A -> C * * @param originalSource the original Model the patches should be applied to * @param oldPatches immer produce patch list * @param newPatches immer produce patch list (will take precedence) * @return merged patches */ export declare function mergePatches<T>(originalSource: T, oldPatches: Patch[], newPatches: Patch[]): Patch[]; export declare const getStorename: (namespace: string, modelName: string) => string; export declare const processCompositeKeys: (attributes: ModelAttributes) => Set<string>[]; export declare const extractKeyIfExists: (modelDefinition: SchemaModel) => ModelAttribute | undefined; export declare const extractPrimaryKeyFieldNames: (modelDefinition: SchemaModel) => string[]; export declare const extractPrimaryKeyValues: <T extends PersistentModel>(model: T, keyFields: string[]) => string[]; export declare const extractPrimaryKeysAndValues: <T extends PersistentModel>(model: T, keyFields: string[]) => any; export declare const isIdManaged: (modelDefinition: SchemaModel) => boolean; export declare const isIdOptionallyManaged: (modelDefinition: SchemaModel) => boolean; export declare const establishRelationAndKeys: (namespace: SchemaNamespace) => [RelationshipType, ModelKeys]; export declare const getIndex: (rel: RelationType[], src: string) => string | undefined; export declare const getIndexFromAssociation: (indexes: IndexesType, src: string | string[]) => string | undefined; /** * Backwards-compatability for schema generated prior to custom primary key support: the single field `targetName` has been replaced with an array of `targetNames`. `targetName` and `targetNames` are exclusive (will never exist on the same schema) * @param src {RelationType | ModelAssociation | undefined} * @returns array of targetNames, or `undefined` */ export declare const extractTargetNamesFromSrc: (src: RelationType | ModelAssociation | undefined) => string[] | undefined; export declare const indexNameFromKeys: (keys: string[]) => string; export declare const keysEqual: (keysA: any, keysB: any) => boolean; export declare const getIndexKeys: (namespace: SchemaNamespace, modelName: string) => string[]; /** * Determine what the managed timestamp field names are for the given model definition * and return the mapping. * * All timestamp fields are included in the mapping, regardless of whether the final field * names are the defaults or customized in the `@model` directive. * * @see https://docs.amplify.aws/cli/graphql/data-modeling/#customize-creation-and-update-timestamps * * @param definition modelDefinition to inspect. * @returns An object mapping `createdAt` and `updatedAt` to their field names. */ export declare const getTimestampFields: (definition: SchemaModel) => { createdAt: string; updatedAt: string; };