@epam/uui-db 6.1.2 → 6.1.3
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.
- package/index.esm.js.map +1 -1
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/readme.md +17 -17
- package/stats.html +1 -1
package/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["rollup://@epam/uui-db/./src/types.ts","rollup://@epam/uui-db/./src/utils.ts","rollup://@epam/uui-db/./src/Db.ts","rollup://@epam/uui-db/./src/DbTable.ts","rollup://@epam/uui-db/./src/patchHelpers.ts","rollup://@epam/uui-db/./src/tempIds.tsx","rollup://@epam/uui-db/./src/Loader.ts","rollup://@epam/uui-db/./src/SimpleLoadingTracker.ts","rollup://@epam/uui-db/./src/ListLoadingTracker.ts","rollup://@epam/uui-db/./src/batch.ts","rollup://@epam/uui-db/./src/DbRef.ts","rollup://@epam/uui-db/./src/reactHooks.ts"],"sourcesContent":["import { DataQuery } from '@epam/uui-core';\nimport { DbTable } from './DbTable';\nimport { IClientIdsMap } from './tempIds';\n\nexport type DbTablesSet<TTables extends DbTablesSet<TTables>> = { [TEntityName in keyof TTables]: DbTable<any, any, TTables> };\n\nexport type DbTablePatch<TEntity> = Partial<TEntity>[];\n\nexport type DbTableEntityByTable<TTable, TTables extends DbTablesSet<TTables>> = TTable extends DbTable<infer TEntity, any, TTables> ? TEntity : void;\nexport type DbTableIdByTable<TTable, TTables extends DbTablesSet<TTables>> = TTable extends DbTable<any, infer TId, TTables> ? TId : void;\ntype DbTablePatchByTable<TTable, TTables extends DbTablesSet<TTables>> = DbTablePatch<DbTableEntityByTable<TTable, TTables>>;\n\nexport type DbPatch<TTables extends DbTablesSet<TTables>> = { [TEntityName in keyof TTables]?: DbTablePatchByTable<TTables[TEntityName], TTables> };\n\nexport enum DbRelationType {\n Aggregation,\n Association\n}\n\nexport type DbFieldFk<TEntity> = {\n tableName: string | ((entity: TEntity) => string);\n relationType: DbRelationType;\n};\n\nexport interface DbFieldSchema<TField extends keyof TEntity, TEntity> {\n fk?: DbFieldFk<TEntity>;\n isGenerated?: boolean;\n isClientOnly?: boolean;\n isReadOnly?: boolean;\n default?: TEntity[TField];\n toServer?: (value: TEntity[TField]) => TEntity[TField];\n toClient?: (value: TEntity[TField]) => TEntity[TField];\n disableFlatten?: boolean;\n}\n\nexport type DbPkFieldType = string | number | (string | number)[];\n\nexport type BeforeUpdateContext<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> = {\n clientIdsMap: IClientIdsMap;\n schema: DbEntitySchema<TEntity, TId, TTables>;\n tables: DbTablesSet<TTables>;\n};\n\ntype DbEntityBeforeUpdateResult<TEntity, TTables extends DbTablesSet<TTables>> = {\n entity: TEntity;\n dependentEntities?: DbPatch<TTables>;\n};\n\ntype DbTableIndexDefinition<TEntity> = keyof TEntity;\n\nexport type DbEntitySchema<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> = {\n tableName: keyof TTables;\n typeName: string;\n searchBy?: (keyof TEntity)[];\n fields?: Partial<{ [TField in keyof TEntity]: DbFieldSchema<TField, TEntity> }>;\n isClientOnly?: boolean | ((entity: Partial<TEntity>) => boolean);\n beforeUpdate?: (entity: TEntity, context: BeforeUpdateContext<TEntity, TId, TTables>) => DbEntityBeforeUpdateResult<TEntity, TTables>;\n primaryKey: TId extends any[] ? KeysOfType<TEntity, string | number>[] : KeysOfType<TEntity, string | number>;\n indexes?: DbTableIndexDefinition<TEntity>[];\n deleteFlag?: keyof TEntity;\n};\n\nexport type DbSchema<TTables extends DbTablesSet<TTables>> = {\n [TTypeName in keyof TTables]: DbEntitySchema<any, any, TTables>;\n};\n\nexport interface DbQuery<TEntity> extends DataQuery<TEntity> {}\n\nexport interface IQueryable<TEntity, TId> {\n query(q: DbQuery<TEntity>): TEntity[];\n byId(id: TId): TEntity;\n}\n\nexport interface ServerError {\n message?: string;\n}\n\ntype DbSaveEntityResponse<TEntity, TId> = {\n id: TId;\n payload: Partial<TEntity>;\n};\n\nexport interface DbSaveResponse<TTables extends DbTablesSet<TTables>> {\n submit: {\n [EntityName in keyof TTables]?: DbSaveEntityResponse<DbTableEntityByTable<TTables[EntityName], TTables>, DbTableIdByTable<TTables[EntityName], TTables>>[];\n };\n}\n\nexport type DbViewFunction<TDb, TResult, TParams = void, TDependencies = void> = (db: TDb, parameters?: TParams, dependencies?: TDependencies) => TResult;\n\nexport interface DbViewOptions<TDb, TResult, TParams, TDependencies = void> {\n getKey?: (parameters: TParams) => string;\n getDependencies?: (db: TDb, parameters: TParams) => TDependencies;\n compareDependencies?: (prev: TDependencies, next: TDependencies) => boolean;\n compareResults?: (prev: TResult, current: TResult) => boolean;\n traceDiff?: boolean;\n}\n\nexport interface DbView<TDb, TResult, TParams = void, TDependencies = void> extends DbViewOptions<TDb, TResult, TParams, TDependencies> {\n compute: DbViewFunction<TDb, TResult, TParams, TDependencies>;\n}\n\nexport type KeysOfType<T, TProp> = { [P in keyof T]: T[P] extends TProp ? P : never }[keyof T];\n\nexport interface DbSubscription<TValue, TParams> {\n update(params: TParams): TValue;\n currentValue: TValue;\n currentParams: TParams;\n onUpdate: (newValue: TValue) => void;\n unsubscribe: () => void;\n}\n\nexport type ViewCacheItem = { dependencies: any; currentValue: any; computedOnDb: any };\n\nexport interface LoadingState<TRequest> {\n isLoading: boolean;\n isComplete: boolean;\n request: TRequest;\n missing?: TRequest;\n}\n\nexport interface ILoadingTracker<TRequest, TResult> {\n diff(request: TRequest): TRequest;\n append(request: TRequest, result?: TResult): void;\n count?(request: TRequest): { knownCount: number; exactCount: number };\n}\n","import shallowEqual from 'shallowequal';\nimport zip from 'lodash.zip';\nimport transform from 'lodash.transform';\nimport isEqual from 'react-fast-compare';\n\n// TBD: New typescript would contain better typing for this. Remove this hack after update.\nexport const objectKeys: <T>(obj: T) => (keyof T)[] = Object.keys as any;\n\nexport function defaultCompareViewDependencies<T>(prev: T, next: T): boolean {\n if (Array.isArray(prev) && Array.isArray(next)) {\n if (prev.length === next.length) {\n return zip(prev, next).every(([p, n]) => shallowEqual(p, n));\n }\n return false;\n }\n return shallowEqual(prev, next);\n}\n\n/**\n * Deep diff between two object, using lodash\n * @param {Object} object Object compared\n * @param {Object} base Object to compare with\n * @return {Object} Return a new object who represent the diff\n */\nexport function difference(obj: any, baseObj: any) {\n function changes(object: any, base: any) {\n return transform(object, function (result: any, value: any, key: any) {\n if (!isEqual(value, base[key])) {\n result[key] = (typeof value === 'object' && typeof base[key] === 'object') ? changes(value, base[key]) : value;\n }\n });\n }\n return changes(obj, baseObj);\n}\n","import {\n DbPatch, DbTablesSet, DbTableEntityByTable, DbView, DbRelationType, ViewCacheItem,\n} from './types';\nimport { objectKeys, defaultCompareViewDependencies, difference } from './utils';\nimport isEqual from 'react-fast-compare';\n\ntype ViewCache = Map<DbView<any, any, any, any>, Map<string, ViewCacheItem>>;\n\nexport abstract class Db<TTables extends DbTablesSet<TTables>> {\n private viewCache: ViewCache = new Map();\n constructor(public tables: TTables, reusedCache?: ViewCache) {\n if (reusedCache) {\n this.viewCache = new Map(reusedCache);\n } else {\n this.viewCache = new Map();\n }\n }\n\n private update(mutate: (db: this) => void): this {\n const clone = new (this.constructor as any)(this.tables, this.viewCache);\n clone.tables = { ...this.tables };\n mutate(clone);\n return clone;\n }\n\n public with(patch: DbPatch<TTables>): this {\n return this.update((db) => {\n objectKeys(db.tables).forEach((entityName) => {\n if (patch[entityName]) {\n db.tables[entityName] = db.tables[entityName].with(patch[entityName]);\n }\n });\n });\n }\n\n /* Views (cached db projections) */\n\n valueAbsent = Symbol('ValueAbsent');\n public runView<TResult, TParams = void, TDependencies = void>(view: DbView<this, TResult, TParams, TDependencies>, params?: TParams) {\n let cache = this.viewCache.get(view);\n\n if (!cache) {\n cache = new Map();\n this.viewCache.set(view, cache);\n }\n\n const key = view.getKey ? view.getKey(params) : JSON.stringify(params);\n\n let cacheItem: ViewCacheItem = cache.get(key);\n\n if (!cacheItem) {\n cacheItem = {\n dependencies: this.valueAbsent,\n currentValue: this.valueAbsent,\n computedOnDb: this.valueAbsent,\n };\n cache.set(key, cacheItem);\n }\n\n let shouldUpdate = this !== cacheItem.computedOnDb;\n let dependencies: any = this.valueAbsent;\n\n if (view.getDependencies) {\n const compare = view.compareDependencies || defaultCompareViewDependencies;\n dependencies = view.getDependencies(this, params);\n shouldUpdate = !compare(cacheItem.dependencies, dependencies);\n }\n\n const previousValue = cacheItem.currentValue;\n\n if (shouldUpdate) {\n cacheItem.dependencies = dependencies;\n const newValue = view.compute(this, params, dependencies);\n cacheItem.computedOnDb = this;\n\n const compareResults = view.compareResults || isEqual;\n\n if (!compareResults(previousValue, newValue)) {\n if (view.traceDiff) {\n console.debug(difference(previousValue, newValue));\n }\n\n cacheItem.currentValue = newValue;\n }\n }\n\n return cacheItem.currentValue as TResult;\n }\n}\n","import {\n DbTablePatch, DbQuery, DbEntitySchema, DbPkFieldType, DbTablesSet,\n} from './types';\nimport * as I from 'immutable';\nimport {\n SortDirection, getFilterPredicate, getOrderComparer, DataQueryFilter, SortingOption, getSearchFilter, DataQuery,\n} from '@epam/uui-core';\nimport { Seq } from 'immutable';\n\ninterface DbIndex<TEntity> {\n field: keyof TEntity;\n map: I.Map<any, I.Set<any>>;\n}\n\ninterface DbTableState<TEntity, TTables extends DbTablesSet<TTables>> {\n pk: I.Map<any, TEntity>;\n indexes: DbIndex<TEntity>[];\n}\n\nexport class DbTable<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> {\n constructor(public readonly schema: DbEntitySchema<TEntity, TId, TTables>, private state?: DbTableState<TEntity, TTables>, private q?: DbQuery<TEntity>) {\n if (!state) {\n const indexes: DbIndex<TEntity>[] = (schema.indexes || []).map((indexDef) => {\n return {\n field: indexDef,\n map: I.Map(),\n };\n });\n\n this.state = { pk: I.Map(), indexes };\n }\n\n if (!q) {\n this.q = {};\n }\n }\n\n protected keyToImmutable(id: TId): any {\n if (Array.isArray(id)) {\n return I.List(id);\n } else {\n return id;\n }\n }\n\n public byId(id: TId): TEntity {\n return this.state.pk.get(this.keyToImmutable(id));\n }\n\n public getId(entity: Partial<TEntity>): TId {\n if (Array.isArray(this.schema.primaryKey)) {\n return this.schema.primaryKey.map((key: keyof TEntity) => entity[key]) as any as TId;\n }\n return entity[this.schema.primaryKey as keyof TEntity] as any as TId;\n }\n\n private update(mutate: (t: DbTable<TEntity, TId, TTables>) => void): this {\n const clone = new (this.constructor as any)(this.schema, this.state, this.q);\n mutate(clone);\n return clone;\n }\n\n /* Mutation */\n\n public with(patch: DbTablePatch<TEntity>) {\n const updates = patch.map((entityPatch) => {\n const id = this.getId(entityPatch);\n const immId = this.keyToImmutable(id);\n const existing = this.state.pk.get(immId);\n let isDeleted = false;\n let updated = entityPatch as TEntity;\n if (existing) {\n updated = { ...existing, ...entityPatch };\n\n if (this.schema.deleteFlag) {\n isDeleted = (updated[this.schema.deleteFlag] as unknown) === true;\n }\n }\n\n return {\n id, immId, patch: entityPatch, existing, updated, isNew: !existing, isDeleted,\n };\n });\n\n const idVal = Seq.Keyed<TId, TEntity>(updates.map((entity) => [entity.immId, entity.updated]));\n let newPk = this.state.pk.merge(idVal);\n\n // TBD: replace with deleteAll after migrating to immutable 4\n updates\n .filter((u) => u.isDeleted)\n .forEach((u) => {\n newPk = newPk.delete(u.immId);\n });\n\n const newIndexes = this.state.indexes.map((index) => {\n let newMap = index.map;\n\n for (let n = 0; n < updates.length; n++) {\n const update = updates[n];\n\n const newKey = update.updated[index.field];\n\n if (update.existing) {\n const oldKey = update.existing[index.field];\n\n if (oldKey !== newKey || update.isDeleted) {\n newMap = newMap.update(oldKey, (set) => set.remove(update.immId));\n }\n }\n\n if (!update.isDeleted) {\n newMap = newMap.update(newKey, I.Set(), (set) => set.add(update.immId));\n }\n }\n\n return { ...index, map: newMap };\n });\n\n const newState: DbTableState<TEntity, TTables> = { pk: newPk, indexes: newIndexes };\n\n return this.update((t) => (t.state = newState));\n }\n\n /* Query */\n\n public find(filter: DataQueryFilter<TEntity>): DbTable<TEntity, TId, TTables> {\n return this.update((t) => (t.q = { ...t.q, filter: { ...(this.q.filter as any), ...(filter as any) } }));\n }\n\n public order(order: SortingOption[]) {\n return this.update((t) => (t.q = { ...t.q, sorting: order }));\n }\n\n public orderBy(field: Extract<keyof TEntity, string>, direction: SortDirection = 'asc') {\n return this.update((t) => (t.q = { ...t.q, sorting: [{ field, direction }] }));\n }\n\n public thenBy(field: Extract<keyof TEntity, string>, direction?: SortDirection) {\n return this.update((t) => (t.q = { ...t.q, sorting: [...t.q.sorting, { field, direction }] }));\n }\n\n public search(text: string) {\n if (!this.schema.searchBy) {\n throw new Error(`Can't search in the ${this.schema.typeName} table - searchBy is not defined in the schema.`);\n }\n return this.update((t) => (t.q = { ...t.q, search: text }));\n }\n\n /* Materializing */\n\n public range(from: number, count: number): TEntity[] {\n return this.runQuery({ ...this.q, range: { from, count } });\n }\n\n public count() {\n return this.runQuery(this.q).length;\n }\n\n public one(): TEntity {\n return this.runQuery(this.q)[0] || null;\n }\n\n public toArray(): TEntity[] {\n return this.runQuery(this.q);\n }\n\n public map<T>(fn: (item: TEntity, index?: number) => T) {\n return this.toArray().map(fn);\n }\n\n /* Query implementation */\n\n private runQuery(q: DataQuery<TEntity>) {\n let result: TEntity[] = null;\n let filter = q.filter;\n\n if (filter) {\n const indexes = this.state.indexes;\n\n // Try to use indexes to fulfill filter conditions\n for (let n = 0; n < indexes.length; n++) {\n const index = indexes[n];\n\n if (index.field in filter) {\n const { [index.field]: condition, ...rest } = filter as any;\n let conditionValues: any[] = null;\n\n if (condition != null && typeof condition === 'object') {\n // Attempt to use index for 'in' and 'isNull' criteria.\n // We need to be very conservative here, indexed field should work the same way as getPatternPredicate. So\n // - it's better to leave corner cases to getPatternPredicate\n\n const { in: inCriteria, isNull: nullCriteria, ...restCriteria } = condition as any;\n if (inCriteria && Array.isArray(inCriteria)) {\n conditionValues = inCriteria;\n } else {\n restCriteria.in = inCriteria;\n }\n\n // Conditions in getPatternPredicate are composed with 'and' logic,\n // For now, let's not attempt to handle tricky cases like { in: [1,2] isNull: true }, or { in: [1, null] isNull: false }\n // - just leave this to getPatternPredicate.\n // Let's just handle the a most common case { isNull: true } - find all null and undefined\n if (nullCriteria === true && !conditionValues) {\n conditionValues = [null, undefined];\n } else {\n restCriteria.in = inCriteria;\n }\n\n // Keep other conditions, e.g. { in: [1,2,3], isNull: true } - in works via index, isNull - via filter\n if (Object.keys(restCriteria).length > 0) {\n rest[index.field] = restCriteria;\n }\n } else {\n conditionValues = [condition];\n }\n\n if (conditionValues) {\n result = [];\n\n for (let i = 0; i < conditionValues.length; i++) {\n const idsSet = index.map.get(conditionValues[i]);\n if (idsSet) {\n const idsArray = idsSet.toArray();\n for (let j = 0; j < idsArray.length; j++) {\n const item = this.state.pk.get(idsArray[j]);\n result.push(item);\n }\n }\n }\n\n filter = Object.keys(rest).length > 0 ? (rest as any) : null;\n break;\n }\n }\n }\n }\n\n if (!result) {\n result = this.state.pk.toArray();\n }\n\n if (filter) {\n const predicate = getFilterPredicate<TEntity>(q.filter);\n result = result.filter(predicate);\n }\n\n if (q.search) {\n const searchFilter = getSearchFilter(q.search);\n result = result.filter((item) => searchFilter(this.schema.searchBy.map((field) => (item as any)[field])));\n }\n\n if (q.sorting) {\n const comparer = getOrderComparer(q.sorting);\n result = result.sort(comparer);\n }\n\n if (q.range) {\n result = result.slice(q.range.from, q.range.from + q.range.count);\n }\n\n return result;\n }\n}\n","import { Db } from './Db';\nimport {\n DbPatch, DbTablesSet, DbRelationType, DbEntitySchema, DbPkFieldType,\n} from './types';\nimport { DbTable } from './DbTable';\nimport * as I from 'immutable';\nimport { objectKeys } from './utils';\nimport groupBy from 'lodash.groupby';\nimport map from 'lodash.map';\nimport merge from 'lodash.merge';\nimport countBy from 'lodash.countby';\nimport filter from 'lodash.filter';\nimport forEach from 'lodash.foreach';\nimport pick from 'lodash.pick';\nimport { IClientIdsMap } from './tempIds';\n\nexport function unionPatches<TTables extends DbTablesSet<TTables>>(patches: DbPatch<TTables>[]): DbPatch<TTables> {\n const result: DbPatch<TTables> = {};\n\n patches.forEach((patch) => {\n objectKeys(patch).forEach((tableName) => {\n result[tableName] = result[tableName] ? [...result[tableName], ...patch[tableName]] : patch[tableName];\n });\n });\n\n return result;\n}\n\nexport function mergeEntityPatches<TTables extends DbTablesSet<TTables>>(tables: TTables, patch: DbPatch<TTables>): DbPatch<TTables> {\n const result: DbPatch<TTables> = {};\n\n objectKeys(patch).forEach((key) => {\n const table = tables[key];\n const groupedEntities = groupBy(patch[key], (item) => table.getId(item));\n const tablePatch = map(groupedEntities, (entities) => {\n const tablePatchResult = merge({}, ...entities);\n\n if (process.env.NODE_ENV !== 'production') {\n const props = objectKeys(tablePatchResult).filter(\n (prop) =>\n Object.keys(\n countBy(\n entities.filter((entity) => entity[prop as string] !== undefined),\n (entity) => entity[prop as string],\n ),\n ).length > 1,\n );\n if (props.length) {\n console.warn('mergeEntityPatches: Different property values found for the same entity.\\nProperty names:\\n', props, '\\nEntities:\\n', ...entities);\n }\n }\n\n return tablePatchResult;\n });\n\n result[key] = tablePatch;\n });\n\n return result;\n}\n\nfunction flattenResponseHelper<TTables extends DbTablesSet<any>>(result: DbPatch<TTables>, object: any, tablesByTypeName: Record<string, DbTable<any, any, any>>) {\n if (Array.isArray(object)) {\n object.forEach((item) => flattenResponseHelper(result, item, tablesByTypeName));\n } else if (typeof object === 'object') {\n const clone: any = {};\n let tableKey;\n let fields: { [id: string]: any } = {};\n\n if ('__typename' in object) {\n const table = tablesByTypeName[object.__typename];\n if (table) {\n tableKey = table.schema.tableName as string;\n fields = table.schema.fields;\n }\n }\n\n for (const key in object) {\n const value = object[key];\n const field = fields[key];\n\n if (\n (field && !!field.disableFlatten)\n || typeof value !== 'object'\n || value === null\n || (Array.isArray(value) && value.every((item) => typeof item !== 'object'))\n ) {\n clone[key] = value;\n } else {\n flattenResponseHelper(result, value, tablesByTypeName);\n }\n }\n\n if (tableKey) {\n result[tableKey].push(clone);\n }\n }\n}\n\nexport function flattenResponse<TTables extends DbTablesSet<any>>(response: any, tables: TTables): DbPatch<TTables> {\n const result: DbPatch<TTables> = {};\n\n const tablesByTypeName: Record<string, DbTable<any, any, any>> = {};\n Object.values(tables).forEach((table) => (tablesByTypeName[table.schema.typeName] = table));\n objectKeys(tables).forEach(() => tablesByTypeName);\n\n objectKeys(tables).forEach((key) => (result[key] = []));\n\n flattenResponseHelper(result, response, tablesByTypeName);\n return result;\n}\n\nexport function isPatchBlank<TTables extends DbTablesSet<TTables>>(patch: DbPatch<TTables>): boolean {\n return !objectKeys(patch).some((key) => patch[key].length > 0);\n}\n\n/**\n * Given several patches, creates a new single patch with all fields from all entities in all patches.\n */\nexport function makeCumulativePatch<TTables extends DbTablesSet<TTables>>(\n updatedDb: Db<TTables>,\n patches: DbPatch<TTables>[],\n clientIdsMap: IClientIdsMap,\n): DbPatch<TTables> {\n const result: DbPatch<TTables> = {};\n\n objectKeys(updatedDb.tables).forEach((entityName) => {\n const table = updatedDb.tables[entityName];\n const schema = table.schema;\n\n let ids = I.Set();\n patches.forEach((patch) => {\n const filteredPatch = (patch[entityName] || []).filter((entity) => hasServerFields(entity, schema, clientIdsMap, updatedDb.tables));\n ids = ids.union(filteredPatch.map((e) => table.getId(e)));\n });\n\n const entities = ids\n .map((id) => table.byId(id))\n .filter((e) => !isClientOnly(e, schema))\n .toArray();\n\n if (entities.length > 0) {\n result[entityName] = entities;\n }\n });\n\n return result;\n}\n\nexport function isClientOnly<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(entity: T, schema: DbEntitySchema<T, TId, TTables>) {\n if (typeof schema.isClientOnly === 'function') {\n return schema.isClientOnly(entity);\n }\n\n return !!schema.isClientOnly;\n}\n\nexport function getId<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(entity: Partial<T>, schema: DbEntitySchema<T, TId, TTables>): TId {\n if (typeof schema.primaryKey == 'string') {\n return (entity as any)[schema.primaryKey] as TId;\n }\n\n const result: (string | number)[] = [];\n forEach(pick(entity, schema.primaryKey), (value) => {\n result.push(value as unknown as string | number);\n });\n\n return result as TId;\n}\n\nexport function isNew<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(\n entity: Partial<T>,\n schema: DbEntitySchema<T, TId, TTables>,\n clientIdsMap: IClientIdsMap,\n) {\n const id = getId(entity, schema);\n return !clientIdsMap.clientToServer(id as number);\n}\n\nexport function hasServerFields<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(\n entity: Partial<T>,\n schema: DbEntitySchema<T, TId, TTables>,\n clientIdsMap: IClientIdsMap,\n tables: TTables,\n) {\n const fullEntity = {\n ...(tables[schema.tableName].byId((entity as any).id) || {}),\n ...entity,\n };\n\n if (isClientOnly(fullEntity, schema)) {\n return false;\n }\n\n return objectKeys(entity).some((fieldName) => {\n const fieldSchema = schema.fields[fieldName];\n return !fieldSchema || !(fieldSchema.isClientOnly || fieldSchema.isReadOnly || (fieldSchema.isGenerated && !isNew(entity, schema, clientIdsMap)));\n });\n}\n\nexport function getParentEntities<TTables extends DbTablesSet<TTables>>(patch: DbPatch<TTables>, tables: TTables): DbPatch<TTables> {\n const dependenciesPatch: DbPatch<TTables> = {};\n objectKeys(patch).forEach((key) => {\n const table = tables[key];\n const tableSchema = table.schema;\n\n const fields = filter(\n map(tableSchema.fields, (field, name) => ({ ...field, name })),\n (field) => field.fk && field.fk.relationType == DbRelationType.Aggregation,\n );\n\n const tablePatch = patch[key];\n fields.forEach((field) => {\n const {\n fk: { tableName },\n name,\n } = field;\n tablePatch.forEach((entity) => {\n const actualTableName = (typeof tableName == 'function' ? tableName(entity) : tableName) as keyof TTables;\n const dbEntity = table.byId(table.getId(entity));\n const parentEntity = tables[actualTableName].byId(dbEntity[name]);\n const idFields = pick(parentEntity, tables[actualTableName].schema.primaryKey);\n if (parentEntity) {\n dependenciesPatch[actualTableName] = dependenciesPatch[actualTableName] || [];\n dependenciesPatch[actualTableName].push(idFields as any);\n }\n });\n });\n });\n return dependenciesPatch;\n}\n\nexport function getEntityParentDependencies<TEntity, TTables extends DbTablesSet<TTables>>(\n entity: Partial<TEntity>,\n entityName: keyof TTables,\n tables: TTables,\n): DbPatch<TTables> {\n let patch = { [entityName]: [entity] } as DbPatch<TTables>;\n const resultPatches: DbPatch<TTables>[] = [];\n\n while (true) {\n const parents = getParentEntities(patch, tables);\n if (isPatchBlank(parents)) {\n break;\n }\n resultPatches.push(parents);\n patch = parents;\n }\n\n let result = unionPatches([patch, ...resultPatches]);\n result = mergeEntityPatches(tables, result);\n\n return result;\n}\n","import {\n DbTablePatch, DbTablesSet, DbPatch, DbFieldSchema, DbSaveResponse,\n} from './types';\nimport { Db } from './Db';\nimport { objectKeys } from './utils';\nimport { DataQueryFilter, DataQueryFilterCondition } from '@epam/uui-core';\n\nlet lastTempId = -1;\n\nexport function getTempId() {\n return --lastTempId;\n}\n\nexport function isTempId(val: any): val is number {\n return typeof val === 'number' && val < 0;\n}\n\nexport interface IClientIdsMap {\n clientToServer(id: number): any;\n serverToClient(tableName: string, id: any): number;\n clientToServerRequest<T>(request: T): T;\n clientToServerDataFilter(filter: DataQueryFilter<any>): DataQueryFilter<any>;\n}\n\nexport class TempIdMap<TTables extends DbTablesSet<TTables>> implements IClientIdsMap {\n private serverToClientIds = new Map<keyof TTables, Map<any, number>>();\n private clientToServerIds = new Map<number, any>();\n constructor(private db: Db<TTables>) {}\n public clientToServer = (id: number): any => this.clientToServerIds.get(id);\n public serverToClient = (tableName: string, id: any): number => this.getServerToClientMap(tableName as any).get(id);\n public clientToServerRequest = (request: any) => {\n request = { ...request };\n\n if (request.filter) {\n request.filter = this.clientToServerDataFilter(request.filter);\n }\n\n return request;\n };\n\n public clientToServerDataFilter = (filter: DataQueryFilter<any>) => {\n filter = { ...filter };\n const keys = Object.keys(filter);\n\n // I hope that we can rely that there won't be any negative numbers, which are not IDs, in queries.\n // We need to invent better heuristics or a schema otherwise.\n const clientToServer = (id: number) => {\n const found = this.clientToServer(id);\n if (found) {\n return found;\n } else {\n return id;\n }\n };\n\n for (let n = 0; n < keys.length; n++) {\n const key = keys[n];\n let condition = filter[key] as DataQueryFilterCondition<any>;\n if (condition != null && typeof condition === 'object') {\n condition = { ...condition };\n if ('in' in condition && Array.isArray(condition.in) && condition.in.length) {\n condition.in = condition.in.map(clientToServer);\n }\n } else {\n condition = clientToServer(condition);\n }\n filter[key] = condition;\n }\n return filter;\n };\n\n private copyPatch(patch: DbPatch<TTables>) {\n const newPatch = { ...patch };\n\n objectKeys(patch).forEach((tableName) => {\n const tablePatch: DbTablePatch<any> = patch[tableName].map((entityPatch) => ({ ...entityPatch }));\n newPatch[tableName] = tablePatch;\n });\n\n return newPatch;\n }\n\n // Iterate thru every field in every patch for every table, matching certain field criteria. The patch is mutated!\n protected mapFields(\n patch: DbPatch<TTables>,\n filter: (schema: DbFieldSchema<any, any>, name: string) => boolean,\n callback: (fieldName: any, fieldSchema: DbFieldSchema<any, any>, fieldValue: any, entityPatch: any, tableName: keyof TTables) => void,\n ): void {\n objectKeys(patch).forEach((tableName) => {\n const schema = this.db.tables[tableName].schema;\n const fields = objectKeys(schema.fields || [])\n .map((fieldName) => {\n const fieldSchema = schema.fields[fieldName as any];\n if (filter(fieldSchema, fieldName as string)) {\n return { name: fieldName, schema: fieldSchema };\n }\n })\n .filter((f) => !!f);\n\n if (!fields.length) {\n return;\n }\n\n patch[tableName].forEach((entityPatch) => {\n for (let n = 0; n < fields.length; n++) {\n const field = fields[n];\n\n const fieldValue = entityPatch[field.name as any];\n\n callback(field.name, field.schema, fieldValue, entityPatch, tableName);\n }\n });\n });\n }\n\n protected getServerToClientMap(tableName: keyof TTables) {\n const existing = this.serverToClientIds.get(tableName);\n\n if (existing) {\n return existing;\n } else {\n const newMap = new Map();\n this.serverToClientIds.set(tableName, newMap);\n return newMap;\n }\n }\n\n public serverToClientPatch(patch: DbPatch<TTables>) {\n patch = this.copyPatch(patch);\n\n // We map PK in a separate pass, as we need to remap all PKs before re-mapping FKs\n this.mapFields(\n patch,\n (f) => f.isGenerated,\n (fieldName, fieldSchema, fieldValue, entityPatch, tableName) => {\n let clientId = this.getServerToClientMap(tableName).get(fieldValue);\n if (!clientId) {\n clientId = getTempId();\n this.clientToServerIds.set(clientId, fieldValue);\n this.getServerToClientMap(tableName).set(fieldValue, clientId);\n }\n entityPatch[fieldName] = clientId;\n },\n );\n\n this.mapFields(\n patch,\n (f) => !!(f.fk || f.default != null || f.toClient),\n (fieldName, fieldSchema, fieldValue, entityPatch) => {\n let isUndefined = typeof fieldValue === 'undefined';\n\n if (fieldSchema.default != null && fieldValue == null) {\n fieldValue = fieldSchema.default;\n isUndefined = false;\n }\n\n if (fieldSchema.fk && fieldValue != null) {\n const fkTableName = typeof fieldSchema.fk.tableName === 'function' ? fieldSchema.fk.tableName(entityPatch) : fieldSchema.fk.tableName;\n let clientId = this.getServerToClientMap(fkTableName as keyof TTables).get(fieldValue);\n if (!clientId) {\n clientId = getTempId();\n this.clientToServerIds.set(clientId, fieldValue);\n this.getServerToClientMap(fkTableName as keyof TTables).set(fieldValue, clientId);\n }\n fieldValue = clientId;\n }\n\n if (!isUndefined && fieldSchema.toClient) {\n fieldValue = fieldSchema.toClient(fieldValue);\n }\n\n if (!isUndefined) {\n entityPatch[fieldName] = fieldValue;\n }\n },\n );\n\n return patch;\n }\n\n public clientToServerPatch(patch: DbPatch<TTables>) {\n patch = this.copyPatch(patch);\n\n this.mapFields(\n patch,\n (f) => f.isGenerated || !!f.fk,\n (fieldName, fieldSchema, fieldValue, entityPatch) => {\n if (fieldValue != null) {\n const existingId = this.clientToServerIds.get(fieldValue);\n if (existingId) {\n entityPatch[fieldName] = existingId;\n }\n }\n },\n );\n\n this.mapFields(\n patch,\n (f) => !(f.isClientOnly || f.isReadOnly) && !!f.toServer,\n (fieldName, fieldSchema, _, entityPatch) => {\n entityPatch[fieldName] = fieldSchema.toServer(entityPatch[fieldName]);\n },\n );\n\n this.mapFields(\n patch,\n (meta) => meta.isClientOnly || meta.isReadOnly,\n (fieldName, _, __, entityPatch) => {\n delete entityPatch[fieldName];\n },\n );\n\n return patch;\n }\n\n public appendServerMapping(response: DbSaveResponse<TTables>) {\n objectKeys(response.submit).forEach((tableName) => {\n if (this.db.tables[tableName]) {\n const tablePatch = response.submit[tableName];\n if (tablePatch) {\n const serverToClientIds = this.getServerToClientMap(tableName);\n const table = this.db.tables[tableName];\n\n tablePatch.forEach((patch) => {\n if (isTempId(patch.id)) {\n const clientId = patch.id;\n const serverId = table.getId(patch.payload);\n serverToClientIds.set(serverId, clientId);\n this.clientToServerIds.set(clientId, serverId);\n }\n });\n }\n }\n });\n }\n}\n","import { DbRef } from './DbRef';\nimport {\n DbPatch, DbTablesSet, LoadingState, ILoadingTracker,\n} from './types';\n\nexport interface LoaderOptions<TTables extends DbTablesSet<TTables>, TResult, TRequest> {\n api: (request: TRequest) => Promise<TResult>;\n convertToPatch?: (result: TResult) => DbPatch<TTables>;\n postProcess?: (patch: DbPatch<TTables>) => DbPatch<TTables>;\n clientToServerRequest?: (request: TRequest) => TRequest;\n}\n\nexport interface LoaderResult<TRequest> extends LoadingState<TRequest> {\n promise: Promise<void>;\n reload: () => void;\n}\n\nexport class Loader<TTables extends DbTablesSet<TTables>, TResult, TRequest> {\n private currentRequests: Set<Promise<void>> = new Set();\n public loaded: ILoadingTracker<TRequest, TResult>;\n private loadedAndLoading: ILoadingTracker<TRequest, TResult>;\n constructor(\n private dbRef: DbRef<TTables, any>,\n private getTracker: () => ILoadingTracker<TRequest, TResult>,\n private options: LoaderOptions<TTables, TResult, TRequest>,\n ) {\n this.loaded = getTracker();\n this.loadedAndLoading = getTracker();\n }\n\n private loadImpl(state: LoaderResult<TRequest>) {\n this.loadedAndLoading.append(state.missing);\n state.isLoading = true;\n let serverRequest = state.missing;\n if (this.options.clientToServerRequest) {\n serverRequest = this.options.clientToServerRequest(serverRequest);\n }\n state.promise = this.options.api(serverRequest).then((result) => {\n this.loaded.append(state.missing, result);\n this.loadedAndLoading.append(state.missing, result);\n state.missing = null;\n state.isLoading = false;\n state.isComplete = true;\n state.promise = Promise.resolve();\n const flatten = this.options.convertToPatch(result);\n this.options.postProcess && this.options.postProcess(flatten);\n this.dbRef.commitFetch(flatten);\n });\n\n this.currentRequests.add(state.promise);\n\n state.promise.finally(() => {\n this.currentRequests.delete(state.promise);\n });\n\n return state.promise;\n }\n\n public load = (inputRequest: TRequest) => {\n const result: LoaderResult<TRequest> = {\n isComplete: this.loaded.diff(inputRequest) == null,\n isLoading: false,\n request: inputRequest,\n missing: this.loadedAndLoading.diff(inputRequest),\n promise: null,\n reload: null,\n };\n\n result.reload = () => {\n result.missing = inputRequest;\n this.loadImpl(result);\n };\n\n if (result.isComplete) {\n // Everything requested is already loaded\n result.isComplete = true;\n result.isLoading = false;\n result.promise = Promise.resolve();\n return result;\n } else {\n if (result.missing == null) {\n // Everything requested is either loaded already, or being loaded\n result.isComplete = false;\n result.isLoading = true;\n // There's no good way to tell which of current requests is querying requested data - there actually can be 2 of them.\n // So we track all running requests, and await all of them in such case.\n result.promise = Promise.all(this.currentRequests.entries()).then(() => {});\n return result;\n } else {\n // Something requested is not loaded, nor being loaded. Need to perform a new request.\n this.loadImpl(result);\n return result;\n }\n }\n };\n}\n","import { ILoadingTracker } from './types';\n\nexport class SimpleLoadingTracker<TRequest, TResult> implements ILoadingTracker<TRequest, TResult> {\n private set: Set<string> = new Set();\n constructor() {}\n private getKey(request: TRequest) {\n return JSON.stringify(request);\n }\n\n public diff(request: TRequest) {\n return this.set.has(this.getKey(request)) ? null : request;\n }\n\n public append(request: TRequest, result: TResult) {\n this.set.add(this.getKey(request));\n }\n}\n","import { DataQuery, LazyDataSourceApiResponse } from '@epam/uui-core';\nimport { ILoadingTracker } from './types';\n\ninterface ListRecord<TItem> {\n options: DataQuery<TItem>;\n count: number;\n maxCount: number;\n isComplete: boolean;\n}\n\nexport interface ListLoadingTrackerOptions<TItem, TResponse> {\n extractList?: (response: TResponse) => LazyDataSourceApiResponse<TItem>;\n}\n\nexport class ListLoadingTracker<TItem, TRequest extends DataQuery<TItem> = DataQuery<TItem>, TResponse = LazyDataSourceApiResponse<TItem>>\nimplements ILoadingTracker<TRequest, TResponse> {\n private cache: Map<string, ListRecord<TItem>> = new Map();\n private extractList: (res: TResponse) => LazyDataSourceApiResponse<TItem>;\n constructor(private options?: ListLoadingTrackerOptions<TItem, TResponse>) {\n this.extractList = options?.extractList || ((r: any) => r);\n }\n\n private prepare(request: DataQuery<TItem>) {\n const {\n filter, sorting, search, range, ...unknownFields\n } = request;\n const options: DataQuery<TItem> = {};\n\n if (filter) {\n options.filter = filter;\n }\n\n if (sorting) {\n options.sorting = sorting;\n }\n\n if (search) {\n options.search = search;\n }\n\n const keyObject = { ...options, ...unknownFields };\n\n const key = JSON.stringify(keyObject);\n let entry = this.cache.get(key);\n if (!entry) {\n entry = {\n options, count: 0, maxCount: null, isComplete: false,\n };\n this.cache.set(key, entry);\n }\n\n return {\n options, range, unknownFields, entry,\n };\n }\n\n public diff(request: TRequest): TRequest {\n const {\n options, range, unknownFields, entry,\n } = this.prepare(request);\n\n if (entry.isComplete) {\n return null;\n }\n\n if (!request.range) {\n return request;\n } else {\n const requestedMax = request.range.from + request.range.count;\n let missingCount = requestedMax - entry.count;\n\n if (entry.maxCount) {\n missingCount = Math.min(missingCount, entry.maxCount);\n }\n\n if (missingCount > 0) {\n return {\n ...options,\n ...unknownFields,\n range: { from: entry.count, count: requestedMax - entry.count },\n } as TRequest;\n } else {\n return null;\n }\n }\n }\n\n public count(request: TRequest) {\n const { entry } = this.prepare(request);\n\n return { knownCount: Math.max(entry.count, entry.maxCount), exactCount: entry.maxCount };\n }\n\n public append(request: TRequest, response?: TResponse) {\n const {\n options, range, unknownFields, entry,\n } = this.prepare(request);\n\n if (response) {\n const list = this.extractList(response);\n\n if (list.count) {\n entry.maxCount = list.count;\n }\n\n if (!range) {\n entry.count = list.items.length;\n entry.maxCount = list.items.length;\n entry.isComplete = true;\n } else {\n const from = list.from == null ? range.from : list.from;\n\n if (list.items.length > 0) {\n entry.count = Math.max(entry.count, from + list.items.length);\n }\n\n if (list.items.length < range.count) {\n entry.maxCount = from + list.items.length;\n entry.count = entry.maxCount;\n entry.isComplete = true;\n }\n }\n } else {\n if (range) {\n entry.count = Math.max(entry.count, request.range.from + request.range.count);\n } else {\n entry.isComplete = true;\n }\n }\n }\n}\n","export interface BatchPromiseOptions {\n /** Minimum time (in ms) to pass after the last call, before triggering the batch */\n throttleMs?: number;\n}\n\nconst delay = (ms: number = 0): Promise<void> => {\n if (ms <= 0) {\n return Promise.resolve();\n } else {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n }\n};\n\n/** Creates an async function, which can collect several calls to it, and execute them in a single batch via provided callback. */\nexport function batch<TArg = void, TRes = void>(\n runBatch: (batch?: TArg[]) => Promise<TRes[]> | Promise<void> | undefined | void,\n options?: BatchPromiseOptions,\n): { (arg: TArg, options?: BatchPromiseOptions): Promise<TRes>; isBusy: boolean } {\n let delayPromise: Promise<void> = Promise.resolve();\n let batchPromise: any = null;\n let queue: TArg[] = [];\n\n let nextCallPossibleAtMs = new Date().getTime();\n\n async function batchedFn(arg: TArg, callOptions?: BatchPromiseOptions) {\n options = { ...options, ...callOptions };\n options.throttleMs = options.throttleMs || 0;\n\n // Enqueue request\n queue.push(arg);\n const resultIndex = queue.length - 1; // an index of current item in queue. Result should be on the same index in batch.\n batchedFn.isBusy = true;\n\n // Wait current batch to complete\n try {\n await batchPromise;\n } catch {\n // ignore errors here. They are thrown to previous batch\n }\n\n // Wait for throttling delay to pass\n await delayPromise;\n\n try {\n // Start a batch if there are items.\n // All calls that was awaiting will run this code.\n // Only the first call will run batch, immediately clear the queue, and set batchPromise value\n // Other calls will just await results of this call\n if (queue.length > 0) {\n nextCallPossibleAtMs = new Date().getTime() + options.throttleMs;\n batchPromise = runBatch(queue);\n queue = [];\n }\n\n const results = await batchPromise;\n\n return results?.[resultIndex];\n } finally {\n const nowMs = new Date().getTime();\n const delayMs = Math.max(0, nextCallPossibleAtMs - nowMs);\n // It's safe to replace currentPromise here. All other requests are already awaiting\n delayPromise = delay(delayMs);\n batchedFn.isBusy = queue.length > 0;\n }\n }\n\n batchedFn.isBusy = false;\n\n return batchedFn;\n}\n","import { Db } from './Db';\nimport {\n DbPatch, DbTablesSet, DbSaveResponse, DbView, DbSubscription,\n} from './types';\nimport {\n makeCumulativePatch, unionPatches, mergeEntityPatches, flattenResponse,\n} from './patchHelpers';\nimport { TempIdMap, IClientIdsMap } from './tempIds';\nimport { objectKeys } from './utils';\nimport isEmpty from 'lodash.isempty';\nimport { Loader, LoaderOptions } from './Loader';\nimport { DataQuery } from '@epam/uui-core';\nimport { SimpleLoadingTracker } from './SimpleLoadingTracker';\nimport { ListLoadingTracker, ListLoadingTrackerOptions } from './ListLoadingTracker';\nimport { batch } from './batch';\n\nexport class DbRef<TTables extends DbTablesSet<TTables>, TDb extends Db<TTables>> {\n private base: TDb;\n private log: { patch: DbPatch<TTables> }[] = [];\n private autoSave = true;\n private savedPoint = 0;\n private tempIdMap: TempIdMap<TTables>;\n public db: TDb;\n protected throttleSaveMs = 1000;\n public readonly idMap: IClientIdsMap;\n constructor(public blank: TDb) {\n this.db = blank;\n this.base = blank;\n this.tempIdMap = new TempIdMap(blank);\n this.idMap = this.tempIdMap;\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n }\n\n /** Saves all committed patches. Useful only if autoSave is off. */\n public save() {\n return this.enqueueSave();\n }\n\n public getAutoSave() {\n return this.autoSave;\n }\n\n public setAutoSave(val: boolean) {\n if (this.autoSave != val) {\n this.autoSave = val;\n this.autoSave && this.enqueueSave();\n this.update();\n }\n }\n\n public revert() {\n this.db = this.base;\n this.log = this.log.slice(0, this.savedPoint);\n this.update();\n }\n\n /** Concrete DbRef instances should override and implement their save logic in this method */\n protected savePatch(patch: DbPatch<TTables>): Promise<DbSaveResponse<TTables>> {\n return Promise.resolve({ submit: {} });\n }\n\n /* Db Update logic */\n\n public commit(patch: DbPatch<TTables>): void {\n const dbBeforeUpdate = this.db.with(patch);\n patch = this.beforeUpdate(patch, dbBeforeUpdate.tables, this.db.tables);\n patch = mergeEntityPatches(this.db.tables, patch);\n this.log.push({ patch });\n this.db = this.db.with(patch);\n\n this.autoSave && this.enqueueSave(null, { throttleMs: this.throttleSaveMs });\n this.update();\n }\n\n private beforeUpdate(patch: DbPatch<TTables>, tables: TTables, prevTables: TTables): DbPatch<TTables> {\n let patchAndDependencies: DbPatch<TTables> = {};\n\n objectKeys(tables)\n .filter((entityName) => patch[entityName] && !tables[entityName].schema.beforeUpdate)\n .forEach((entityName) => {\n patchAndDependencies[entityName] = patch[entityName];\n });\n\n objectKeys(tables)\n .filter((entityName) => patch[entityName] && tables[entityName].schema.beforeUpdate)\n .forEach((entityName) => {\n const schema = tables[entityName].schema;\n const { beforeUpdate } = schema;\n const context = {\n clientIdsMap: this.tempIdMap,\n schema,\n tables,\n prevTables,\n };\n\n const results = patch[entityName].map((e) => beforeUpdate(e, context));\n const updatedPatch = { [entityName]: results.map((result) => result.entity) } as DbPatch<TTables>;\n const dependentEntityPatchesForUpdate = unionPatches(results.filter((result) => result.dependentEntities).map((result) => result.dependentEntities));\n const dependentEntityPatches = this.beforeUpdate(dependentEntityPatchesForUpdate, tables, prevTables);\n\n patchAndDependencies = mergeEntityPatches(tables, unionPatches([\n patchAndDependencies, updatedPatch, dependentEntityPatches,\n ]));\n });\n return patchAndDependencies;\n }\n\n public commitFetch(patch: DbPatch<TTables>): void {\n patch = this.tempIdMap.serverToClientPatch(patch);\n this.rebase(this.base.with(patch));\n this.update();\n }\n\n private rebase(newBase: TDb) {\n this.base = newBase;\n this.db = newBase;\n for (let n = this.savedPoint; n < this.log.length; n++) {\n this.db = this.db.with(this.log[n].patch);\n }\n }\n\n private makeCumulativePatch() {\n const lastLogEntry = this.log.length;\n const logEntriesToSave = this.log.slice(this.savedPoint, lastLogEntry);\n let cumulativePatch = makeCumulativePatch(\n this.db,\n logEntriesToSave.map((t) => t.patch),\n this.tempIdMap,\n );\n cumulativePatch = this.tempIdMap.clientToServerPatch(cumulativePatch);\n\n return cumulativePatch;\n }\n\n private applyResponse(response: DbSaveResponse<TTables>, newSavedPoint: number) {\n this.tempIdMap.appendServerMapping(response);\n\n let serverPatch = flattenResponse(response.submit, this.db.tables);\n serverPatch = mergeEntityPatches(this.db.tables, serverPatch);\n this.savedPoint = newSavedPoint;\n this.base = this.db;\n this.commitFetch(serverPatch);\n }\n\n /* Update subscriptions (aka live views) */\n\n private lastSubscriptionId = 1;\n private subscriptions: Map<number, DbSubscription<any, any>> = new Map();\n public subscribe<TValue, TParams, TDependencies>(\n view: DbView<TDb, TValue, TParams, TDependencies>,\n params: TParams,\n onUpdate: (newValue: TValue) => any,\n ): DbSubscription<TValue, TParams> {\n const id = this.lastSubscriptionId++;\n\n const subscription: DbSubscription<TValue, TParams> = {\n update: (subscriptionParams: TParams) => {\n subscription.currentParams = subscriptionParams;\n subscription.currentValue = this.db.runView(view, subscriptionParams);\n return subscription.currentValue;\n },\n currentParams: null,\n currentValue: null,\n onUpdate,\n unsubscribe: () => {\n this.subscriptions.delete(id);\n },\n };\n\n subscription.update(params);\n\n this.subscriptions.set(id, subscription);\n\n return subscription;\n }\n\n updateHandlers: (() => any)[] = [];\n public onUpdate(handler: () => any) {\n this.subscribe(\n {\n compute: (db) => db,\n compareResults: (a, b) => a === b,\n },\n null,\n handler,\n );\n }\n\n private update() {\n this.subscriptions.forEach((subscription) => {\n const previousValue = subscription.currentValue;\n subscription.update(subscription.currentParams);\n if (subscription.currentValue !== previousValue && subscription.onUpdate) {\n subscription.onUpdate(subscription.currentValue);\n }\n });\n }\n\n /* Error Subscriptions */\n\n public saveErrorHandlers: ((request: DbPatch<TTables>, error: any) => void)[] = [];\n public onSaveError(handler: (request: DbPatch<TTables>, error: any) => void) {\n this.saveErrorHandlers.push(handler);\n }\n\n private saveError(request: DbPatch<TTables>, error: any) {\n this.saveErrorHandlers.forEach((handler) => handler(request, error));\n }\n\n /* Save scheduling */\n\n private enqueueSave = batch(async () => {\n const cumulativePatch = this.makeCumulativePatch();\n const lastLogEntry = this.log.length;\n if (isEmpty(cumulativePatch)) {\n return;\n }\n try {\n const response = await this.savePatch(cumulativePatch);\n this.applyResponse(response, lastLogEntry);\n this.update();\n } catch (error) {\n this.saveError(cumulativePatch, error);\n this.update();\n throw error;\n }\n });\n\n private handleBeforeUnload = (e: BeforeUnloadEvent) => {\n if (this.enqueueSave.isBusy) {\n e.returnValue = false;\n return false;\n }\n };\n\n loaders: Loader<TTables, any, any>[] = [];\n protected makeLoader<TResponse, TRequest>(options: LoaderOptions<TTables, TResponse, TRequest>) {\n const loader = new Loader<TTables, TResponse, TRequest>(this as any, () => new SimpleLoadingTracker<TRequest, TResponse>(), options);\n this.loaders.push(loader);\n return loader;\n }\n\n protected makeListLoader<TItem, TResponse = DataQuery<TItem>, TRequest extends DataQuery<TItem> = DataQuery<TItem>>(\n options: LoaderOptions<TTables, TResponse, TRequest> & ListLoadingTrackerOptions<TItem, TResponse>,\n ) {\n const loader = new Loader<TTables, TResponse, TRequest>(this as any, () => new ListLoadingTracker<TItem, TRequest, TResponse>(), options);\n this.loaders.push(loader);\n return loader;\n }\n\n reload() {\n this.loaders = [];\n }\n}\n","import {\n useState, createContext, useContext, useMemo, useEffect,\n} from 'react';\nimport { DbRef } from './DbRef';\nimport { DbViewOptions } from '.';\n\nexport const DbContext = createContext(null);\n\nexport function useDbRef<TDbRef extends DbRef<any, any>>() {\n return useContext(DbContext) as TDbRef;\n}\n\nexport function useDbView<TDb, TResult, TParams = void, TDependencies = void>(\n fn: (db: TDb, params: TParams, dependencies: TDependencies) => TResult,\n params?: TParams,\n options?: DbViewOptions<TDb, TResult, TParams, TDependencies>,\n): TResult {\n const dbRef = useDbRef();\n const [state, setState] = useState<TResult>();\n const subscription = useMemo(() => dbRef.subscribe<TResult, TParams, TDependencies>({ compute: fn, ...options }, params, setState), []);\n subscription.update(params);\n\n useEffect(() => {\n return () => subscription.unsubscribe();\n }, []);\n\n return subscription.currentValue;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["rollup://@epam/uui-db/./src/types.ts","rollup://@epam/uui-db/./src/utils.ts","rollup://@epam/uui-db/./src/Db.ts","rollup://@epam/uui-db/./src/DbTable.ts","rollup://@epam/uui-db/./src/patchHelpers.ts","rollup://@epam/uui-db/./src/tempIds.tsx","rollup://@epam/uui-db/./src/Loader.ts","rollup://@epam/uui-db/./src/SimpleLoadingTracker.ts","rollup://@epam/uui-db/./src/ListLoadingTracker.ts","rollup://@epam/uui-db/./src/batch.ts","rollup://@epam/uui-db/./src/DbRef.ts","rollup://@epam/uui-db/./src/reactHooks.ts"],"sourcesContent":["import { DataQuery } from '@epam/uui-core';\r\nimport { DbTable } from './DbTable';\r\nimport { IClientIdsMap } from './tempIds';\r\n\r\nexport type DbTablesSet<TTables extends DbTablesSet<TTables>> = { [TEntityName in keyof TTables]: DbTable<any, any, TTables> };\r\n\r\nexport type DbTablePatch<TEntity> = Partial<TEntity>[];\r\n\r\nexport type DbTableEntityByTable<TTable, TTables extends DbTablesSet<TTables>> = TTable extends DbTable<infer TEntity, any, TTables> ? TEntity : void;\r\nexport type DbTableIdByTable<TTable, TTables extends DbTablesSet<TTables>> = TTable extends DbTable<any, infer TId, TTables> ? TId : void;\r\ntype DbTablePatchByTable<TTable, TTables extends DbTablesSet<TTables>> = DbTablePatch<DbTableEntityByTable<TTable, TTables>>;\r\n\r\nexport type DbPatch<TTables extends DbTablesSet<TTables>> = { [TEntityName in keyof TTables]?: DbTablePatchByTable<TTables[TEntityName], TTables> };\r\n\r\nexport enum DbRelationType {\r\n Aggregation,\r\n Association\r\n}\r\n\r\nexport type DbFieldFk<TEntity> = {\r\n tableName: string | ((entity: TEntity) => string);\r\n relationType: DbRelationType;\r\n};\r\n\r\nexport interface DbFieldSchema<TField extends keyof TEntity, TEntity> {\r\n fk?: DbFieldFk<TEntity>;\r\n isGenerated?: boolean;\r\n isClientOnly?: boolean;\r\n isReadOnly?: boolean;\r\n default?: TEntity[TField];\r\n toServer?: (value: TEntity[TField]) => TEntity[TField];\r\n toClient?: (value: TEntity[TField]) => TEntity[TField];\r\n disableFlatten?: boolean;\r\n}\r\n\r\nexport type DbPkFieldType = string | number | (string | number)[];\r\n\r\nexport type BeforeUpdateContext<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> = {\r\n clientIdsMap: IClientIdsMap;\r\n schema: DbEntitySchema<TEntity, TId, TTables>;\r\n tables: DbTablesSet<TTables>;\r\n};\r\n\r\ntype DbEntityBeforeUpdateResult<TEntity, TTables extends DbTablesSet<TTables>> = {\r\n entity: TEntity;\r\n dependentEntities?: DbPatch<TTables>;\r\n};\r\n\r\ntype DbTableIndexDefinition<TEntity> = keyof TEntity;\r\n\r\nexport type DbEntitySchema<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> = {\r\n tableName: keyof TTables;\r\n typeName: string;\r\n searchBy?: (keyof TEntity)[];\r\n fields?: Partial<{ [TField in keyof TEntity]: DbFieldSchema<TField, TEntity> }>;\r\n isClientOnly?: boolean | ((entity: Partial<TEntity>) => boolean);\r\n beforeUpdate?: (entity: TEntity, context: BeforeUpdateContext<TEntity, TId, TTables>) => DbEntityBeforeUpdateResult<TEntity, TTables>;\r\n primaryKey: TId extends any[] ? KeysOfType<TEntity, string | number>[] : KeysOfType<TEntity, string | number>;\r\n indexes?: DbTableIndexDefinition<TEntity>[];\r\n deleteFlag?: keyof TEntity;\r\n};\r\n\r\nexport type DbSchema<TTables extends DbTablesSet<TTables>> = {\r\n [TTypeName in keyof TTables]: DbEntitySchema<any, any, TTables>;\r\n};\r\n\r\nexport interface DbQuery<TEntity> extends DataQuery<TEntity> {}\r\n\r\nexport interface IQueryable<TEntity, TId> {\r\n query(q: DbQuery<TEntity>): TEntity[];\r\n byId(id: TId): TEntity;\r\n}\r\n\r\nexport interface ServerError {\r\n message?: string;\r\n}\r\n\r\ntype DbSaveEntityResponse<TEntity, TId> = {\r\n id: TId;\r\n payload: Partial<TEntity>;\r\n};\r\n\r\nexport interface DbSaveResponse<TTables extends DbTablesSet<TTables>> {\r\n submit: {\r\n [EntityName in keyof TTables]?: DbSaveEntityResponse<DbTableEntityByTable<TTables[EntityName], TTables>, DbTableIdByTable<TTables[EntityName], TTables>>[];\r\n };\r\n}\r\n\r\nexport type DbViewFunction<TDb, TResult, TParams = void, TDependencies = void> = (db: TDb, parameters?: TParams, dependencies?: TDependencies) => TResult;\r\n\r\nexport interface DbViewOptions<TDb, TResult, TParams, TDependencies = void> {\r\n getKey?: (parameters: TParams) => string;\r\n getDependencies?: (db: TDb, parameters: TParams) => TDependencies;\r\n compareDependencies?: (prev: TDependencies, next: TDependencies) => boolean;\r\n compareResults?: (prev: TResult, current: TResult) => boolean;\r\n traceDiff?: boolean;\r\n}\r\n\r\nexport interface DbView<TDb, TResult, TParams = void, TDependencies = void> extends DbViewOptions<TDb, TResult, TParams, TDependencies> {\r\n compute: DbViewFunction<TDb, TResult, TParams, TDependencies>;\r\n}\r\n\r\nexport type KeysOfType<T, TProp> = { [P in keyof T]: T[P] extends TProp ? P : never }[keyof T];\r\n\r\nexport interface DbSubscription<TValue, TParams> {\r\n update(params: TParams): TValue;\r\n currentValue: TValue;\r\n currentParams: TParams;\r\n onUpdate: (newValue: TValue) => void;\r\n unsubscribe: () => void;\r\n}\r\n\r\nexport type ViewCacheItem = { dependencies: any; currentValue: any; computedOnDb: any };\r\n\r\nexport interface LoadingState<TRequest> {\r\n isLoading: boolean;\r\n isComplete: boolean;\r\n request: TRequest;\r\n missing?: TRequest;\r\n}\r\n\r\nexport interface ILoadingTracker<TRequest, TResult> {\r\n diff(request: TRequest): TRequest;\r\n append(request: TRequest, result?: TResult): void;\r\n count?(request: TRequest): { knownCount: number; exactCount: number };\r\n}\r\n","import shallowEqual from 'shallowequal';\r\nimport zip from 'lodash.zip';\r\nimport transform from 'lodash.transform';\r\nimport isEqual from 'react-fast-compare';\r\n\r\n// TBD: New typescript would contain better typing for this. Remove this hack after update.\r\nexport const objectKeys: <T>(obj: T) => (keyof T)[] = Object.keys as any;\r\n\r\nexport function defaultCompareViewDependencies<T>(prev: T, next: T): boolean {\r\n if (Array.isArray(prev) && Array.isArray(next)) {\r\n if (prev.length === next.length) {\r\n return zip(prev, next).every(([p, n]) => shallowEqual(p, n));\r\n }\r\n return false;\r\n }\r\n return shallowEqual(prev, next);\r\n}\r\n\r\n/**\r\n * Deep diff between two object, using lodash\r\n * @param {Object} object Object compared\r\n * @param {Object} base Object to compare with\r\n * @return {Object} Return a new object who represent the diff\r\n */\r\nexport function difference(obj: any, baseObj: any) {\r\n function changes(object: any, base: any) {\r\n return transform(object, function (result: any, value: any, key: any) {\r\n if (!isEqual(value, base[key])) {\r\n result[key] = (typeof value === 'object' && typeof base[key] === 'object') ? changes(value, base[key]) : value;\r\n }\r\n });\r\n }\r\n return changes(obj, baseObj);\r\n}\r\n","import {\r\n DbPatch, DbTablesSet, DbTableEntityByTable, DbView, DbRelationType, ViewCacheItem,\r\n} from './types';\r\nimport { objectKeys, defaultCompareViewDependencies, difference } from './utils';\r\nimport isEqual from 'react-fast-compare';\r\n\r\ntype ViewCache = Map<DbView<any, any, any, any>, Map<string, ViewCacheItem>>;\r\n\r\nexport abstract class Db<TTables extends DbTablesSet<TTables>> {\r\n private viewCache: ViewCache = new Map();\r\n constructor(public tables: TTables, reusedCache?: ViewCache) {\r\n if (reusedCache) {\r\n this.viewCache = new Map(reusedCache);\r\n } else {\r\n this.viewCache = new Map();\r\n }\r\n }\r\n\r\n private update(mutate: (db: this) => void): this {\r\n const clone = new (this.constructor as any)(this.tables, this.viewCache);\r\n clone.tables = { ...this.tables };\r\n mutate(clone);\r\n return clone;\r\n }\r\n\r\n public with(patch: DbPatch<TTables>): this {\r\n return this.update((db) => {\r\n objectKeys(db.tables).forEach((entityName) => {\r\n if (patch[entityName]) {\r\n db.tables[entityName] = db.tables[entityName].with(patch[entityName]);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /* Views (cached db projections) */\r\n\r\n valueAbsent = Symbol('ValueAbsent');\r\n public runView<TResult, TParams = void, TDependencies = void>(view: DbView<this, TResult, TParams, TDependencies>, params?: TParams) {\r\n let cache = this.viewCache.get(view);\r\n\r\n if (!cache) {\r\n cache = new Map();\r\n this.viewCache.set(view, cache);\r\n }\r\n\r\n const key = view.getKey ? view.getKey(params) : JSON.stringify(params);\r\n\r\n let cacheItem: ViewCacheItem = cache.get(key);\r\n\r\n if (!cacheItem) {\r\n cacheItem = {\r\n dependencies: this.valueAbsent,\r\n currentValue: this.valueAbsent,\r\n computedOnDb: this.valueAbsent,\r\n };\r\n cache.set(key, cacheItem);\r\n }\r\n\r\n let shouldUpdate = this !== cacheItem.computedOnDb;\r\n let dependencies: any = this.valueAbsent;\r\n\r\n if (view.getDependencies) {\r\n const compare = view.compareDependencies || defaultCompareViewDependencies;\r\n dependencies = view.getDependencies(this, params);\r\n shouldUpdate = !compare(cacheItem.dependencies, dependencies);\r\n }\r\n\r\n const previousValue = cacheItem.currentValue;\r\n\r\n if (shouldUpdate) {\r\n cacheItem.dependencies = dependencies;\r\n const newValue = view.compute(this, params, dependencies);\r\n cacheItem.computedOnDb = this;\r\n\r\n const compareResults = view.compareResults || isEqual;\r\n\r\n if (!compareResults(previousValue, newValue)) {\r\n if (view.traceDiff) {\r\n console.debug(difference(previousValue, newValue));\r\n }\r\n\r\n cacheItem.currentValue = newValue;\r\n }\r\n }\r\n\r\n return cacheItem.currentValue as TResult;\r\n }\r\n}\r\n","import {\r\n DbTablePatch, DbQuery, DbEntitySchema, DbPkFieldType, DbTablesSet,\r\n} from './types';\r\nimport * as I from 'immutable';\r\nimport {\r\n SortDirection, getFilterPredicate, getOrderComparer, DataQueryFilter, SortingOption, getSearchFilter, DataQuery,\r\n} from '@epam/uui-core';\r\nimport { Seq } from 'immutable';\r\n\r\ninterface DbIndex<TEntity> {\r\n field: keyof TEntity;\r\n map: I.Map<any, I.Set<any>>;\r\n}\r\n\r\ninterface DbTableState<TEntity, TTables extends DbTablesSet<TTables>> {\r\n pk: I.Map<any, TEntity>;\r\n indexes: DbIndex<TEntity>[];\r\n}\r\n\r\nexport class DbTable<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> {\r\n constructor(public readonly schema: DbEntitySchema<TEntity, TId, TTables>, private state?: DbTableState<TEntity, TTables>, private q?: DbQuery<TEntity>) {\r\n if (!state) {\r\n const indexes: DbIndex<TEntity>[] = (schema.indexes || []).map((indexDef) => {\r\n return {\r\n field: indexDef,\r\n map: I.Map(),\r\n };\r\n });\r\n\r\n this.state = { pk: I.Map(), indexes };\r\n }\r\n\r\n if (!q) {\r\n this.q = {};\r\n }\r\n }\r\n\r\n protected keyToImmutable(id: TId): any {\r\n if (Array.isArray(id)) {\r\n return I.List(id);\r\n } else {\r\n return id;\r\n }\r\n }\r\n\r\n public byId(id: TId): TEntity {\r\n return this.state.pk.get(this.keyToImmutable(id));\r\n }\r\n\r\n public getId(entity: Partial<TEntity>): TId {\r\n if (Array.isArray(this.schema.primaryKey)) {\r\n return this.schema.primaryKey.map((key: keyof TEntity) => entity[key]) as any as TId;\r\n }\r\n return entity[this.schema.primaryKey as keyof TEntity] as any as TId;\r\n }\r\n\r\n private update(mutate: (t: DbTable<TEntity, TId, TTables>) => void): this {\r\n const clone = new (this.constructor as any)(this.schema, this.state, this.q);\r\n mutate(clone);\r\n return clone;\r\n }\r\n\r\n /* Mutation */\r\n\r\n public with(patch: DbTablePatch<TEntity>) {\r\n const updates = patch.map((entityPatch) => {\r\n const id = this.getId(entityPatch);\r\n const immId = this.keyToImmutable(id);\r\n const existing = this.state.pk.get(immId);\r\n let isDeleted = false;\r\n let updated = entityPatch as TEntity;\r\n if (existing) {\r\n updated = { ...existing, ...entityPatch };\r\n\r\n if (this.schema.deleteFlag) {\r\n isDeleted = (updated[this.schema.deleteFlag] as unknown) === true;\r\n }\r\n }\r\n\r\n return {\r\n id, immId, patch: entityPatch, existing, updated, isNew: !existing, isDeleted,\r\n };\r\n });\r\n\r\n const idVal = Seq.Keyed<TId, TEntity>(updates.map((entity) => [entity.immId, entity.updated]));\r\n let newPk = this.state.pk.merge(idVal);\r\n\r\n // TBD: replace with deleteAll after migrating to immutable 4\r\n updates\r\n .filter((u) => u.isDeleted)\r\n .forEach((u) => {\r\n newPk = newPk.delete(u.immId);\r\n });\r\n\r\n const newIndexes = this.state.indexes.map((index) => {\r\n let newMap = index.map;\r\n\r\n for (let n = 0; n < updates.length; n++) {\r\n const update = updates[n];\r\n\r\n const newKey = update.updated[index.field];\r\n\r\n if (update.existing) {\r\n const oldKey = update.existing[index.field];\r\n\r\n if (oldKey !== newKey || update.isDeleted) {\r\n newMap = newMap.update(oldKey, (set) => set.remove(update.immId));\r\n }\r\n }\r\n\r\n if (!update.isDeleted) {\r\n newMap = newMap.update(newKey, I.Set(), (set) => set.add(update.immId));\r\n }\r\n }\r\n\r\n return { ...index, map: newMap };\r\n });\r\n\r\n const newState: DbTableState<TEntity, TTables> = { pk: newPk, indexes: newIndexes };\r\n\r\n return this.update((t) => (t.state = newState));\r\n }\r\n\r\n /* Query */\r\n\r\n public find(filter: DataQueryFilter<TEntity>): DbTable<TEntity, TId, TTables> {\r\n return this.update((t) => (t.q = { ...t.q, filter: { ...(this.q.filter as any), ...(filter as any) } }));\r\n }\r\n\r\n public order(order: SortingOption[]) {\r\n return this.update((t) => (t.q = { ...t.q, sorting: order }));\r\n }\r\n\r\n public orderBy(field: Extract<keyof TEntity, string>, direction: SortDirection = 'asc') {\r\n return this.update((t) => (t.q = { ...t.q, sorting: [{ field, direction }] }));\r\n }\r\n\r\n public thenBy(field: Extract<keyof TEntity, string>, direction?: SortDirection) {\r\n return this.update((t) => (t.q = { ...t.q, sorting: [...t.q.sorting, { field, direction }] }));\r\n }\r\n\r\n public search(text: string) {\r\n if (!this.schema.searchBy) {\r\n throw new Error(`Can't search in the ${this.schema.typeName} table - searchBy is not defined in the schema.`);\r\n }\r\n return this.update((t) => (t.q = { ...t.q, search: text }));\r\n }\r\n\r\n /* Materializing */\r\n\r\n public range(from: number, count: number): TEntity[] {\r\n return this.runQuery({ ...this.q, range: { from, count } });\r\n }\r\n\r\n public count() {\r\n return this.runQuery(this.q).length;\r\n }\r\n\r\n public one(): TEntity {\r\n return this.runQuery(this.q)[0] || null;\r\n }\r\n\r\n public toArray(): TEntity[] {\r\n return this.runQuery(this.q);\r\n }\r\n\r\n public map<T>(fn: (item: TEntity, index?: number) => T) {\r\n return this.toArray().map(fn);\r\n }\r\n\r\n /* Query implementation */\r\n\r\n private runQuery(q: DataQuery<TEntity>) {\r\n let result: TEntity[] = null;\r\n let filter = q.filter;\r\n\r\n if (filter) {\r\n const indexes = this.state.indexes;\r\n\r\n // Try to use indexes to fulfill filter conditions\r\n for (let n = 0; n < indexes.length; n++) {\r\n const index = indexes[n];\r\n\r\n if (index.field in filter) {\r\n const { [index.field]: condition, ...rest } = filter as any;\r\n let conditionValues: any[] = null;\r\n\r\n if (condition != null && typeof condition === 'object') {\r\n // Attempt to use index for 'in' and 'isNull' criteria.\r\n // We need to be very conservative here, indexed field should work the same way as getPatternPredicate. So\r\n // - it's better to leave corner cases to getPatternPredicate\r\n\r\n const { in: inCriteria, isNull: nullCriteria, ...restCriteria } = condition as any;\r\n if (inCriteria && Array.isArray(inCriteria)) {\r\n conditionValues = inCriteria;\r\n } else {\r\n restCriteria.in = inCriteria;\r\n }\r\n\r\n // Conditions in getPatternPredicate are composed with 'and' logic,\r\n // For now, let's not attempt to handle tricky cases like { in: [1,2] isNull: true }, or { in: [1, null] isNull: false }\r\n // - just leave this to getPatternPredicate.\r\n // Let's just handle the a most common case { isNull: true } - find all null and undefined\r\n if (nullCriteria === true && !conditionValues) {\r\n conditionValues = [null, undefined];\r\n } else {\r\n restCriteria.in = inCriteria;\r\n }\r\n\r\n // Keep other conditions, e.g. { in: [1,2,3], isNull: true } - in works via index, isNull - via filter\r\n if (Object.keys(restCriteria).length > 0) {\r\n rest[index.field] = restCriteria;\r\n }\r\n } else {\r\n conditionValues = [condition];\r\n }\r\n\r\n if (conditionValues) {\r\n result = [];\r\n\r\n for (let i = 0; i < conditionValues.length; i++) {\r\n const idsSet = index.map.get(conditionValues[i]);\r\n if (idsSet) {\r\n const idsArray = idsSet.toArray();\r\n for (let j = 0; j < idsArray.length; j++) {\r\n const item = this.state.pk.get(idsArray[j]);\r\n result.push(item);\r\n }\r\n }\r\n }\r\n\r\n filter = Object.keys(rest).length > 0 ? (rest as any) : null;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!result) {\r\n result = this.state.pk.toArray();\r\n }\r\n\r\n if (filter) {\r\n const predicate = getFilterPredicate<TEntity>(q.filter);\r\n result = result.filter(predicate);\r\n }\r\n\r\n if (q.search) {\r\n const searchFilter = getSearchFilter(q.search);\r\n result = result.filter((item) => searchFilter(this.schema.searchBy.map((field) => (item as any)[field])));\r\n }\r\n\r\n if (q.sorting) {\r\n const comparer = getOrderComparer(q.sorting);\r\n result = result.sort(comparer);\r\n }\r\n\r\n if (q.range) {\r\n result = result.slice(q.range.from, q.range.from + q.range.count);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Db } from './Db';\r\nimport {\r\n DbPatch, DbTablesSet, DbRelationType, DbEntitySchema, DbPkFieldType,\r\n} from './types';\r\nimport { DbTable } from './DbTable';\r\nimport * as I from 'immutable';\r\nimport { objectKeys } from './utils';\r\nimport groupBy from 'lodash.groupby';\r\nimport map from 'lodash.map';\r\nimport merge from 'lodash.merge';\r\nimport countBy from 'lodash.countby';\r\nimport filter from 'lodash.filter';\r\nimport forEach from 'lodash.foreach';\r\nimport pick from 'lodash.pick';\r\nimport { IClientIdsMap } from './tempIds';\r\n\r\nexport function unionPatches<TTables extends DbTablesSet<TTables>>(patches: DbPatch<TTables>[]): DbPatch<TTables> {\r\n const result: DbPatch<TTables> = {};\r\n\r\n patches.forEach((patch) => {\r\n objectKeys(patch).forEach((tableName) => {\r\n result[tableName] = result[tableName] ? [...result[tableName], ...patch[tableName]] : patch[tableName];\r\n });\r\n });\r\n\r\n return result;\r\n}\r\n\r\nexport function mergeEntityPatches<TTables extends DbTablesSet<TTables>>(tables: TTables, patch: DbPatch<TTables>): DbPatch<TTables> {\r\n const result: DbPatch<TTables> = {};\r\n\r\n objectKeys(patch).forEach((key) => {\r\n const table = tables[key];\r\n const groupedEntities = groupBy(patch[key], (item) => table.getId(item));\r\n const tablePatch = map(groupedEntities, (entities) => {\r\n const tablePatchResult = merge({}, ...entities);\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n const props = objectKeys(tablePatchResult).filter(\r\n (prop) =>\r\n Object.keys(\r\n countBy(\r\n entities.filter((entity) => entity[prop as string] !== undefined),\r\n (entity) => entity[prop as string],\r\n ),\r\n ).length > 1,\r\n );\r\n if (props.length) {\r\n console.warn('mergeEntityPatches: Different property values found for the same entity.\\nProperty names:\\n', props, '\\nEntities:\\n', ...entities);\r\n }\r\n }\r\n\r\n return tablePatchResult;\r\n });\r\n\r\n result[key] = tablePatch;\r\n });\r\n\r\n return result;\r\n}\r\n\r\nfunction flattenResponseHelper<TTables extends DbTablesSet<any>>(result: DbPatch<TTables>, object: any, tablesByTypeName: Record<string, DbTable<any, any, any>>) {\r\n if (Array.isArray(object)) {\r\n object.forEach((item) => flattenResponseHelper(result, item, tablesByTypeName));\r\n } else if (typeof object === 'object') {\r\n const clone: any = {};\r\n let tableKey;\r\n let fields: { [id: string]: any } = {};\r\n\r\n if ('__typename' in object) {\r\n const table = tablesByTypeName[object.__typename];\r\n if (table) {\r\n tableKey = table.schema.tableName as string;\r\n fields = table.schema.fields;\r\n }\r\n }\r\n\r\n for (const key in object) {\r\n const value = object[key];\r\n const field = fields[key];\r\n\r\n if (\r\n (field && !!field.disableFlatten)\r\n || typeof value !== 'object'\r\n || value === null\r\n || (Array.isArray(value) && value.every((item) => typeof item !== 'object'))\r\n ) {\r\n clone[key] = value;\r\n } else {\r\n flattenResponseHelper(result, value, tablesByTypeName);\r\n }\r\n }\r\n\r\n if (tableKey) {\r\n result[tableKey].push(clone);\r\n }\r\n }\r\n}\r\n\r\nexport function flattenResponse<TTables extends DbTablesSet<any>>(response: any, tables: TTables): DbPatch<TTables> {\r\n const result: DbPatch<TTables> = {};\r\n\r\n const tablesByTypeName: Record<string, DbTable<any, any, any>> = {};\r\n Object.values(tables).forEach((table) => (tablesByTypeName[table.schema.typeName] = table));\r\n objectKeys(tables).forEach(() => tablesByTypeName);\r\n\r\n objectKeys(tables).forEach((key) => (result[key] = []));\r\n\r\n flattenResponseHelper(result, response, tablesByTypeName);\r\n return result;\r\n}\r\n\r\nexport function isPatchBlank<TTables extends DbTablesSet<TTables>>(patch: DbPatch<TTables>): boolean {\r\n return !objectKeys(patch).some((key) => patch[key].length > 0);\r\n}\r\n\r\n/**\r\n * Given several patches, creates a new single patch with all fields from all entities in all patches.\r\n */\r\nexport function makeCumulativePatch<TTables extends DbTablesSet<TTables>>(\r\n updatedDb: Db<TTables>,\r\n patches: DbPatch<TTables>[],\r\n clientIdsMap: IClientIdsMap,\r\n): DbPatch<TTables> {\r\n const result: DbPatch<TTables> = {};\r\n\r\n objectKeys(updatedDb.tables).forEach((entityName) => {\r\n const table = updatedDb.tables[entityName];\r\n const schema = table.schema;\r\n\r\n let ids = I.Set();\r\n patches.forEach((patch) => {\r\n const filteredPatch = (patch[entityName] || []).filter((entity) => hasServerFields(entity, schema, clientIdsMap, updatedDb.tables));\r\n ids = ids.union(filteredPatch.map((e) => table.getId(e)));\r\n });\r\n\r\n const entities = ids\r\n .map((id) => table.byId(id))\r\n .filter((e) => !isClientOnly(e, schema))\r\n .toArray();\r\n\r\n if (entities.length > 0) {\r\n result[entityName] = entities;\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n\r\nexport function isClientOnly<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(entity: T, schema: DbEntitySchema<T, TId, TTables>) {\r\n if (typeof schema.isClientOnly === 'function') {\r\n return schema.isClientOnly(entity);\r\n }\r\n\r\n return !!schema.isClientOnly;\r\n}\r\n\r\nexport function getId<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(entity: Partial<T>, schema: DbEntitySchema<T, TId, TTables>): TId {\r\n if (typeof schema.primaryKey == 'string') {\r\n return (entity as any)[schema.primaryKey] as TId;\r\n }\r\n\r\n const result: (string | number)[] = [];\r\n forEach(pick(entity, schema.primaryKey), (value) => {\r\n result.push(value as unknown as string | number);\r\n });\r\n\r\n return result as TId;\r\n}\r\n\r\nexport function isNew<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(\r\n entity: Partial<T>,\r\n schema: DbEntitySchema<T, TId, TTables>,\r\n clientIdsMap: IClientIdsMap,\r\n) {\r\n const id = getId(entity, schema);\r\n return !clientIdsMap.clientToServer(id as number);\r\n}\r\n\r\nexport function hasServerFields<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(\r\n entity: Partial<T>,\r\n schema: DbEntitySchema<T, TId, TTables>,\r\n clientIdsMap: IClientIdsMap,\r\n tables: TTables,\r\n) {\r\n const fullEntity = {\r\n ...(tables[schema.tableName].byId((entity as any).id) || {}),\r\n ...entity,\r\n };\r\n\r\n if (isClientOnly(fullEntity, schema)) {\r\n return false;\r\n }\r\n\r\n return objectKeys(entity).some((fieldName) => {\r\n const fieldSchema = schema.fields[fieldName];\r\n return !fieldSchema || !(fieldSchema.isClientOnly || fieldSchema.isReadOnly || (fieldSchema.isGenerated && !isNew(entity, schema, clientIdsMap)));\r\n });\r\n}\r\n\r\nexport function getParentEntities<TTables extends DbTablesSet<TTables>>(patch: DbPatch<TTables>, tables: TTables): DbPatch<TTables> {\r\n const dependenciesPatch: DbPatch<TTables> = {};\r\n objectKeys(patch).forEach((key) => {\r\n const table = tables[key];\r\n const tableSchema = table.schema;\r\n\r\n const fields = filter(\r\n map(tableSchema.fields, (field, name) => ({ ...field, name })),\r\n (field) => field.fk && field.fk.relationType == DbRelationType.Aggregation,\r\n );\r\n\r\n const tablePatch = patch[key];\r\n fields.forEach((field) => {\r\n const {\r\n fk: { tableName },\r\n name,\r\n } = field;\r\n tablePatch.forEach((entity) => {\r\n const actualTableName = (typeof tableName == 'function' ? tableName(entity) : tableName) as keyof TTables;\r\n const dbEntity = table.byId(table.getId(entity));\r\n const parentEntity = tables[actualTableName].byId(dbEntity[name]);\r\n const idFields = pick(parentEntity, tables[actualTableName].schema.primaryKey);\r\n if (parentEntity) {\r\n dependenciesPatch[actualTableName] = dependenciesPatch[actualTableName] || [];\r\n dependenciesPatch[actualTableName].push(idFields as any);\r\n }\r\n });\r\n });\r\n });\r\n return dependenciesPatch;\r\n}\r\n\r\nexport function getEntityParentDependencies<TEntity, TTables extends DbTablesSet<TTables>>(\r\n entity: Partial<TEntity>,\r\n entityName: keyof TTables,\r\n tables: TTables,\r\n): DbPatch<TTables> {\r\n let patch = { [entityName]: [entity] } as DbPatch<TTables>;\r\n const resultPatches: DbPatch<TTables>[] = [];\r\n\r\n while (true) {\r\n const parents = getParentEntities(patch, tables);\r\n if (isPatchBlank(parents)) {\r\n break;\r\n }\r\n resultPatches.push(parents);\r\n patch = parents;\r\n }\r\n\r\n let result = unionPatches([patch, ...resultPatches]);\r\n result = mergeEntityPatches(tables, result);\r\n\r\n return result;\r\n}\r\n","import {\r\n DbTablePatch, DbTablesSet, DbPatch, DbFieldSchema, DbSaveResponse,\r\n} from './types';\r\nimport { Db } from './Db';\r\nimport { objectKeys } from './utils';\r\nimport { DataQueryFilter, DataQueryFilterCondition } from '@epam/uui-core';\r\n\r\nlet lastTempId = -1;\r\n\r\nexport function getTempId() {\r\n return --lastTempId;\r\n}\r\n\r\nexport function isTempId(val: any): val is number {\r\n return typeof val === 'number' && val < 0;\r\n}\r\n\r\nexport interface IClientIdsMap {\r\n clientToServer(id: number): any;\r\n serverToClient(tableName: string, id: any): number;\r\n clientToServerRequest<T>(request: T): T;\r\n clientToServerDataFilter(filter: DataQueryFilter<any>): DataQueryFilter<any>;\r\n}\r\n\r\nexport class TempIdMap<TTables extends DbTablesSet<TTables>> implements IClientIdsMap {\r\n private serverToClientIds = new Map<keyof TTables, Map<any, number>>();\r\n private clientToServerIds = new Map<number, any>();\r\n constructor(private db: Db<TTables>) {}\r\n public clientToServer = (id: number): any => this.clientToServerIds.get(id);\r\n public serverToClient = (tableName: string, id: any): number => this.getServerToClientMap(tableName as any).get(id);\r\n public clientToServerRequest = (request: any) => {\r\n request = { ...request };\r\n\r\n if (request.filter) {\r\n request.filter = this.clientToServerDataFilter(request.filter);\r\n }\r\n\r\n return request;\r\n };\r\n\r\n public clientToServerDataFilter = (filter: DataQueryFilter<any>) => {\r\n filter = { ...filter };\r\n const keys = Object.keys(filter);\r\n\r\n // I hope that we can rely that there won't be any negative numbers, which are not IDs, in queries.\r\n // We need to invent better heuristics or a schema otherwise.\r\n const clientToServer = (id: number) => {\r\n const found = this.clientToServer(id);\r\n if (found) {\r\n return found;\r\n } else {\r\n return id;\r\n }\r\n };\r\n\r\n for (let n = 0; n < keys.length; n++) {\r\n const key = keys[n];\r\n let condition = filter[key] as DataQueryFilterCondition<any>;\r\n if (condition != null && typeof condition === 'object') {\r\n condition = { ...condition };\r\n if ('in' in condition && Array.isArray(condition.in) && condition.in.length) {\r\n condition.in = condition.in.map(clientToServer);\r\n }\r\n } else {\r\n condition = clientToServer(condition);\r\n }\r\n filter[key] = condition;\r\n }\r\n return filter;\r\n };\r\n\r\n private copyPatch(patch: DbPatch<TTables>) {\r\n const newPatch = { ...patch };\r\n\r\n objectKeys(patch).forEach((tableName) => {\r\n const tablePatch: DbTablePatch<any> = patch[tableName].map((entityPatch) => ({ ...entityPatch }));\r\n newPatch[tableName] = tablePatch;\r\n });\r\n\r\n return newPatch;\r\n }\r\n\r\n // Iterate thru every field in every patch for every table, matching certain field criteria. The patch is mutated!\r\n protected mapFields(\r\n patch: DbPatch<TTables>,\r\n filter: (schema: DbFieldSchema<any, any>, name: string) => boolean,\r\n callback: (fieldName: any, fieldSchema: DbFieldSchema<any, any>, fieldValue: any, entityPatch: any, tableName: keyof TTables) => void,\r\n ): void {\r\n objectKeys(patch).forEach((tableName) => {\r\n const schema = this.db.tables[tableName].schema;\r\n const fields = objectKeys(schema.fields || [])\r\n .map((fieldName) => {\r\n const fieldSchema = schema.fields[fieldName as any];\r\n if (filter(fieldSchema, fieldName as string)) {\r\n return { name: fieldName, schema: fieldSchema };\r\n }\r\n })\r\n .filter((f) => !!f);\r\n\r\n if (!fields.length) {\r\n return;\r\n }\r\n\r\n patch[tableName].forEach((entityPatch) => {\r\n for (let n = 0; n < fields.length; n++) {\r\n const field = fields[n];\r\n\r\n const fieldValue = entityPatch[field.name as any];\r\n\r\n callback(field.name, field.schema, fieldValue, entityPatch, tableName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n protected getServerToClientMap(tableName: keyof TTables) {\r\n const existing = this.serverToClientIds.get(tableName);\r\n\r\n if (existing) {\r\n return existing;\r\n } else {\r\n const newMap = new Map();\r\n this.serverToClientIds.set(tableName, newMap);\r\n return newMap;\r\n }\r\n }\r\n\r\n public serverToClientPatch(patch: DbPatch<TTables>) {\r\n patch = this.copyPatch(patch);\r\n\r\n // We map PK in a separate pass, as we need to remap all PKs before re-mapping FKs\r\n this.mapFields(\r\n patch,\r\n (f) => f.isGenerated,\r\n (fieldName, fieldSchema, fieldValue, entityPatch, tableName) => {\r\n let clientId = this.getServerToClientMap(tableName).get(fieldValue);\r\n if (!clientId) {\r\n clientId = getTempId();\r\n this.clientToServerIds.set(clientId, fieldValue);\r\n this.getServerToClientMap(tableName).set(fieldValue, clientId);\r\n }\r\n entityPatch[fieldName] = clientId;\r\n },\r\n );\r\n\r\n this.mapFields(\r\n patch,\r\n (f) => !!(f.fk || f.default != null || f.toClient),\r\n (fieldName, fieldSchema, fieldValue, entityPatch) => {\r\n let isUndefined = typeof fieldValue === 'undefined';\r\n\r\n if (fieldSchema.default != null && fieldValue == null) {\r\n fieldValue = fieldSchema.default;\r\n isUndefined = false;\r\n }\r\n\r\n if (fieldSchema.fk && fieldValue != null) {\r\n const fkTableName = typeof fieldSchema.fk.tableName === 'function' ? fieldSchema.fk.tableName(entityPatch) : fieldSchema.fk.tableName;\r\n let clientId = this.getServerToClientMap(fkTableName as keyof TTables).get(fieldValue);\r\n if (!clientId) {\r\n clientId = getTempId();\r\n this.clientToServerIds.set(clientId, fieldValue);\r\n this.getServerToClientMap(fkTableName as keyof TTables).set(fieldValue, clientId);\r\n }\r\n fieldValue = clientId;\r\n }\r\n\r\n if (!isUndefined && fieldSchema.toClient) {\r\n fieldValue = fieldSchema.toClient(fieldValue);\r\n }\r\n\r\n if (!isUndefined) {\r\n entityPatch[fieldName] = fieldValue;\r\n }\r\n },\r\n );\r\n\r\n return patch;\r\n }\r\n\r\n public clientToServerPatch(patch: DbPatch<TTables>) {\r\n patch = this.copyPatch(patch);\r\n\r\n this.mapFields(\r\n patch,\r\n (f) => f.isGenerated || !!f.fk,\r\n (fieldName, fieldSchema, fieldValue, entityPatch) => {\r\n if (fieldValue != null) {\r\n const existingId = this.clientToServerIds.get(fieldValue);\r\n if (existingId) {\r\n entityPatch[fieldName] = existingId;\r\n }\r\n }\r\n },\r\n );\r\n\r\n this.mapFields(\r\n patch,\r\n (f) => !(f.isClientOnly || f.isReadOnly) && !!f.toServer,\r\n (fieldName, fieldSchema, _, entityPatch) => {\r\n entityPatch[fieldName] = fieldSchema.toServer(entityPatch[fieldName]);\r\n },\r\n );\r\n\r\n this.mapFields(\r\n patch,\r\n (meta) => meta.isClientOnly || meta.isReadOnly,\r\n (fieldName, _, __, entityPatch) => {\r\n delete entityPatch[fieldName];\r\n },\r\n );\r\n\r\n return patch;\r\n }\r\n\r\n public appendServerMapping(response: DbSaveResponse<TTables>) {\r\n objectKeys(response.submit).forEach((tableName) => {\r\n if (this.db.tables[tableName]) {\r\n const tablePatch = response.submit[tableName];\r\n if (tablePatch) {\r\n const serverToClientIds = this.getServerToClientMap(tableName);\r\n const table = this.db.tables[tableName];\r\n\r\n tablePatch.forEach((patch) => {\r\n if (isTempId(patch.id)) {\r\n const clientId = patch.id;\r\n const serverId = table.getId(patch.payload);\r\n serverToClientIds.set(serverId, clientId);\r\n this.clientToServerIds.set(clientId, serverId);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import { DbRef } from './DbRef';\r\nimport {\r\n DbPatch, DbTablesSet, LoadingState, ILoadingTracker,\r\n} from './types';\r\n\r\nexport interface LoaderOptions<TTables extends DbTablesSet<TTables>, TResult, TRequest> {\r\n api: (request: TRequest) => Promise<TResult>;\r\n convertToPatch?: (result: TResult) => DbPatch<TTables>;\r\n postProcess?: (patch: DbPatch<TTables>) => DbPatch<TTables>;\r\n clientToServerRequest?: (request: TRequest) => TRequest;\r\n}\r\n\r\nexport interface LoaderResult<TRequest> extends LoadingState<TRequest> {\r\n promise: Promise<void>;\r\n reload: () => void;\r\n}\r\n\r\nexport class Loader<TTables extends DbTablesSet<TTables>, TResult, TRequest> {\r\n private currentRequests: Set<Promise<void>> = new Set();\r\n public loaded: ILoadingTracker<TRequest, TResult>;\r\n private loadedAndLoading: ILoadingTracker<TRequest, TResult>;\r\n constructor(\r\n private dbRef: DbRef<TTables, any>,\r\n private getTracker: () => ILoadingTracker<TRequest, TResult>,\r\n private options: LoaderOptions<TTables, TResult, TRequest>,\r\n ) {\r\n this.loaded = getTracker();\r\n this.loadedAndLoading = getTracker();\r\n }\r\n\r\n private loadImpl(state: LoaderResult<TRequest>) {\r\n this.loadedAndLoading.append(state.missing);\r\n state.isLoading = true;\r\n let serverRequest = state.missing;\r\n if (this.options.clientToServerRequest) {\r\n serverRequest = this.options.clientToServerRequest(serverRequest);\r\n }\r\n state.promise = this.options.api(serverRequest).then((result) => {\r\n this.loaded.append(state.missing, result);\r\n this.loadedAndLoading.append(state.missing, result);\r\n state.missing = null;\r\n state.isLoading = false;\r\n state.isComplete = true;\r\n state.promise = Promise.resolve();\r\n const flatten = this.options.convertToPatch(result);\r\n this.options.postProcess && this.options.postProcess(flatten);\r\n this.dbRef.commitFetch(flatten);\r\n });\r\n\r\n this.currentRequests.add(state.promise);\r\n\r\n state.promise.finally(() => {\r\n this.currentRequests.delete(state.promise);\r\n });\r\n\r\n return state.promise;\r\n }\r\n\r\n public load = (inputRequest: TRequest) => {\r\n const result: LoaderResult<TRequest> = {\r\n isComplete: this.loaded.diff(inputRequest) == null,\r\n isLoading: false,\r\n request: inputRequest,\r\n missing: this.loadedAndLoading.diff(inputRequest),\r\n promise: null,\r\n reload: null,\r\n };\r\n\r\n result.reload = () => {\r\n result.missing = inputRequest;\r\n this.loadImpl(result);\r\n };\r\n\r\n if (result.isComplete) {\r\n // Everything requested is already loaded\r\n result.isComplete = true;\r\n result.isLoading = false;\r\n result.promise = Promise.resolve();\r\n return result;\r\n } else {\r\n if (result.missing == null) {\r\n // Everything requested is either loaded already, or being loaded\r\n result.isComplete = false;\r\n result.isLoading = true;\r\n // There's no good way to tell which of current requests is querying requested data - there actually can be 2 of them.\r\n // So we track all running requests, and await all of them in such case.\r\n result.promise = Promise.all(this.currentRequests.entries()).then(() => {});\r\n return result;\r\n } else {\r\n // Something requested is not loaded, nor being loaded. Need to perform a new request.\r\n this.loadImpl(result);\r\n return result;\r\n }\r\n }\r\n };\r\n}\r\n","import { ILoadingTracker } from './types';\r\n\r\nexport class SimpleLoadingTracker<TRequest, TResult> implements ILoadingTracker<TRequest, TResult> {\r\n private set: Set<string> = new Set();\r\n constructor() {}\r\n private getKey(request: TRequest) {\r\n return JSON.stringify(request);\r\n }\r\n\r\n public diff(request: TRequest) {\r\n return this.set.has(this.getKey(request)) ? null : request;\r\n }\r\n\r\n public append(request: TRequest, result: TResult) {\r\n this.set.add(this.getKey(request));\r\n }\r\n}\r\n","import { DataQuery, LazyDataSourceApiResponse } from '@epam/uui-core';\r\nimport { ILoadingTracker } from './types';\r\n\r\ninterface ListRecord<TItem> {\r\n options: DataQuery<TItem>;\r\n count: number;\r\n maxCount: number;\r\n isComplete: boolean;\r\n}\r\n\r\nexport interface ListLoadingTrackerOptions<TItem, TResponse> {\r\n extractList?: (response: TResponse) => LazyDataSourceApiResponse<TItem>;\r\n}\r\n\r\nexport class ListLoadingTracker<TItem, TRequest extends DataQuery<TItem> = DataQuery<TItem>, TResponse = LazyDataSourceApiResponse<TItem>>\r\nimplements ILoadingTracker<TRequest, TResponse> {\r\n private cache: Map<string, ListRecord<TItem>> = new Map();\r\n private extractList: (res: TResponse) => LazyDataSourceApiResponse<TItem>;\r\n constructor(private options?: ListLoadingTrackerOptions<TItem, TResponse>) {\r\n this.extractList = options?.extractList || ((r: any) => r);\r\n }\r\n\r\n private prepare(request: DataQuery<TItem>) {\r\n const {\r\n filter, sorting, search, range, ...unknownFields\r\n } = request;\r\n const options: DataQuery<TItem> = {};\r\n\r\n if (filter) {\r\n options.filter = filter;\r\n }\r\n\r\n if (sorting) {\r\n options.sorting = sorting;\r\n }\r\n\r\n if (search) {\r\n options.search = search;\r\n }\r\n\r\n const keyObject = { ...options, ...unknownFields };\r\n\r\n const key = JSON.stringify(keyObject);\r\n let entry = this.cache.get(key);\r\n if (!entry) {\r\n entry = {\r\n options, count: 0, maxCount: null, isComplete: false,\r\n };\r\n this.cache.set(key, entry);\r\n }\r\n\r\n return {\r\n options, range, unknownFields, entry,\r\n };\r\n }\r\n\r\n public diff(request: TRequest): TRequest {\r\n const {\r\n options, range, unknownFields, entry,\r\n } = this.prepare(request);\r\n\r\n if (entry.isComplete) {\r\n return null;\r\n }\r\n\r\n if (!request.range) {\r\n return request;\r\n } else {\r\n const requestedMax = request.range.from + request.range.count;\r\n let missingCount = requestedMax - entry.count;\r\n\r\n if (entry.maxCount) {\r\n missingCount = Math.min(missingCount, entry.maxCount);\r\n }\r\n\r\n if (missingCount > 0) {\r\n return {\r\n ...options,\r\n ...unknownFields,\r\n range: { from: entry.count, count: requestedMax - entry.count },\r\n } as TRequest;\r\n } else {\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n public count(request: TRequest) {\r\n const { entry } = this.prepare(request);\r\n\r\n return { knownCount: Math.max(entry.count, entry.maxCount), exactCount: entry.maxCount };\r\n }\r\n\r\n public append(request: TRequest, response?: TResponse) {\r\n const {\r\n options, range, unknownFields, entry,\r\n } = this.prepare(request);\r\n\r\n if (response) {\r\n const list = this.extractList(response);\r\n\r\n if (list.count) {\r\n entry.maxCount = list.count;\r\n }\r\n\r\n if (!range) {\r\n entry.count = list.items.length;\r\n entry.maxCount = list.items.length;\r\n entry.isComplete = true;\r\n } else {\r\n const from = list.from == null ? range.from : list.from;\r\n\r\n if (list.items.length > 0) {\r\n entry.count = Math.max(entry.count, from + list.items.length);\r\n }\r\n\r\n if (list.items.length < range.count) {\r\n entry.maxCount = from + list.items.length;\r\n entry.count = entry.maxCount;\r\n entry.isComplete = true;\r\n }\r\n }\r\n } else {\r\n if (range) {\r\n entry.count = Math.max(entry.count, request.range.from + request.range.count);\r\n } else {\r\n entry.isComplete = true;\r\n }\r\n }\r\n }\r\n}\r\n","export interface BatchPromiseOptions {\r\n /** Minimum time (in ms) to pass after the last call, before triggering the batch */\r\n throttleMs?: number;\r\n}\r\n\r\nconst delay = (ms: number = 0): Promise<void> => {\r\n if (ms <= 0) {\r\n return Promise.resolve();\r\n } else {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n }\r\n};\r\n\r\n/** Creates an async function, which can collect several calls to it, and execute them in a single batch via provided callback. */\r\nexport function batch<TArg = void, TRes = void>(\r\n runBatch: (batch?: TArg[]) => Promise<TRes[]> | Promise<void> | undefined | void,\r\n options?: BatchPromiseOptions,\r\n): { (arg: TArg, options?: BatchPromiseOptions): Promise<TRes>; isBusy: boolean } {\r\n let delayPromise: Promise<void> = Promise.resolve();\r\n let batchPromise: any = null;\r\n let queue: TArg[] = [];\r\n\r\n let nextCallPossibleAtMs = new Date().getTime();\r\n\r\n async function batchedFn(arg: TArg, callOptions?: BatchPromiseOptions) {\r\n options = { ...options, ...callOptions };\r\n options.throttleMs = options.throttleMs || 0;\r\n\r\n // Enqueue request\r\n queue.push(arg);\r\n const resultIndex = queue.length - 1; // an index of current item in queue. Result should be on the same index in batch.\r\n batchedFn.isBusy = true;\r\n\r\n // Wait current batch to complete\r\n try {\r\n await batchPromise;\r\n } catch {\r\n // ignore errors here. They are thrown to previous batch\r\n }\r\n\r\n // Wait for throttling delay to pass\r\n await delayPromise;\r\n\r\n try {\r\n // Start a batch if there are items.\r\n // All calls that was awaiting will run this code.\r\n // Only the first call will run batch, immediately clear the queue, and set batchPromise value\r\n // Other calls will just await results of this call\r\n if (queue.length > 0) {\r\n nextCallPossibleAtMs = new Date().getTime() + options.throttleMs;\r\n batchPromise = runBatch(queue);\r\n queue = [];\r\n }\r\n\r\n const results = await batchPromise;\r\n\r\n return results?.[resultIndex];\r\n } finally {\r\n const nowMs = new Date().getTime();\r\n const delayMs = Math.max(0, nextCallPossibleAtMs - nowMs);\r\n // It's safe to replace currentPromise here. All other requests are already awaiting\r\n delayPromise = delay(delayMs);\r\n batchedFn.isBusy = queue.length > 0;\r\n }\r\n }\r\n\r\n batchedFn.isBusy = false;\r\n\r\n return batchedFn;\r\n}\r\n","import { Db } from './Db';\r\nimport {\r\n DbPatch, DbTablesSet, DbSaveResponse, DbView, DbSubscription,\r\n} from './types';\r\nimport {\r\n makeCumulativePatch, unionPatches, mergeEntityPatches, flattenResponse,\r\n} from './patchHelpers';\r\nimport { TempIdMap, IClientIdsMap } from './tempIds';\r\nimport { objectKeys } from './utils';\r\nimport isEmpty from 'lodash.isempty';\r\nimport { Loader, LoaderOptions } from './Loader';\r\nimport { DataQuery } from '@epam/uui-core';\r\nimport { SimpleLoadingTracker } from './SimpleLoadingTracker';\r\nimport { ListLoadingTracker, ListLoadingTrackerOptions } from './ListLoadingTracker';\r\nimport { batch } from './batch';\r\n\r\nexport class DbRef<TTables extends DbTablesSet<TTables>, TDb extends Db<TTables>> {\r\n private base: TDb;\r\n private log: { patch: DbPatch<TTables> }[] = [];\r\n private autoSave = true;\r\n private savedPoint = 0;\r\n private tempIdMap: TempIdMap<TTables>;\r\n public db: TDb;\r\n protected throttleSaveMs = 1000;\r\n public readonly idMap: IClientIdsMap;\r\n constructor(public blank: TDb) {\r\n this.db = blank;\r\n this.base = blank;\r\n this.tempIdMap = new TempIdMap(blank);\r\n this.idMap = this.tempIdMap;\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n }\r\n\r\n /** Saves all committed patches. Useful only if autoSave is off. */\r\n public save() {\r\n return this.enqueueSave();\r\n }\r\n\r\n public getAutoSave() {\r\n return this.autoSave;\r\n }\r\n\r\n public setAutoSave(val: boolean) {\r\n if (this.autoSave != val) {\r\n this.autoSave = val;\r\n this.autoSave && this.enqueueSave();\r\n this.update();\r\n }\r\n }\r\n\r\n public revert() {\r\n this.db = this.base;\r\n this.log = this.log.slice(0, this.savedPoint);\r\n this.update();\r\n }\r\n\r\n /** Concrete DbRef instances should override and implement their save logic in this method */\r\n protected savePatch(patch: DbPatch<TTables>): Promise<DbSaveResponse<TTables>> {\r\n return Promise.resolve({ submit: {} });\r\n }\r\n\r\n /* Db Update logic */\r\n\r\n public commit(patch: DbPatch<TTables>): void {\r\n const dbBeforeUpdate = this.db.with(patch);\r\n patch = this.beforeUpdate(patch, dbBeforeUpdate.tables, this.db.tables);\r\n patch = mergeEntityPatches(this.db.tables, patch);\r\n this.log.push({ patch });\r\n this.db = this.db.with(patch);\r\n\r\n this.autoSave && this.enqueueSave(null, { throttleMs: this.throttleSaveMs });\r\n this.update();\r\n }\r\n\r\n private beforeUpdate(patch: DbPatch<TTables>, tables: TTables, prevTables: TTables): DbPatch<TTables> {\r\n let patchAndDependencies: DbPatch<TTables> = {};\r\n\r\n objectKeys(tables)\r\n .filter((entityName) => patch[entityName] && !tables[entityName].schema.beforeUpdate)\r\n .forEach((entityName) => {\r\n patchAndDependencies[entityName] = patch[entityName];\r\n });\r\n\r\n objectKeys(tables)\r\n .filter((entityName) => patch[entityName] && tables[entityName].schema.beforeUpdate)\r\n .forEach((entityName) => {\r\n const schema = tables[entityName].schema;\r\n const { beforeUpdate } = schema;\r\n const context = {\r\n clientIdsMap: this.tempIdMap,\r\n schema,\r\n tables,\r\n prevTables,\r\n };\r\n\r\n const results = patch[entityName].map((e) => beforeUpdate(e, context));\r\n const updatedPatch = { [entityName]: results.map((result) => result.entity) } as DbPatch<TTables>;\r\n const dependentEntityPatchesForUpdate = unionPatches(results.filter((result) => result.dependentEntities).map((result) => result.dependentEntities));\r\n const dependentEntityPatches = this.beforeUpdate(dependentEntityPatchesForUpdate, tables, prevTables);\r\n\r\n patchAndDependencies = mergeEntityPatches(tables, unionPatches([\r\n patchAndDependencies, updatedPatch, dependentEntityPatches,\r\n ]));\r\n });\r\n return patchAndDependencies;\r\n }\r\n\r\n public commitFetch(patch: DbPatch<TTables>): void {\r\n patch = this.tempIdMap.serverToClientPatch(patch);\r\n this.rebase(this.base.with(patch));\r\n this.update();\r\n }\r\n\r\n private rebase(newBase: TDb) {\r\n this.base = newBase;\r\n this.db = newBase;\r\n for (let n = this.savedPoint; n < this.log.length; n++) {\r\n this.db = this.db.with(this.log[n].patch);\r\n }\r\n }\r\n\r\n private makeCumulativePatch() {\r\n const lastLogEntry = this.log.length;\r\n const logEntriesToSave = this.log.slice(this.savedPoint, lastLogEntry);\r\n let cumulativePatch = makeCumulativePatch(\r\n this.db,\r\n logEntriesToSave.map((t) => t.patch),\r\n this.tempIdMap,\r\n );\r\n cumulativePatch = this.tempIdMap.clientToServerPatch(cumulativePatch);\r\n\r\n return cumulativePatch;\r\n }\r\n\r\n private applyResponse(response: DbSaveResponse<TTables>, newSavedPoint: number) {\r\n this.tempIdMap.appendServerMapping(response);\r\n\r\n let serverPatch = flattenResponse(response.submit, this.db.tables);\r\n serverPatch = mergeEntityPatches(this.db.tables, serverPatch);\r\n this.savedPoint = newSavedPoint;\r\n this.base = this.db;\r\n this.commitFetch(serverPatch);\r\n }\r\n\r\n /* Update subscriptions (aka live views) */\r\n\r\n private lastSubscriptionId = 1;\r\n private subscriptions: Map<number, DbSubscription<any, any>> = new Map();\r\n public subscribe<TValue, TParams, TDependencies>(\r\n view: DbView<TDb, TValue, TParams, TDependencies>,\r\n params: TParams,\r\n onUpdate: (newValue: TValue) => any,\r\n ): DbSubscription<TValue, TParams> {\r\n const id = this.lastSubscriptionId++;\r\n\r\n const subscription: DbSubscription<TValue, TParams> = {\r\n update: (subscriptionParams: TParams) => {\r\n subscription.currentParams = subscriptionParams;\r\n subscription.currentValue = this.db.runView(view, subscriptionParams);\r\n return subscription.currentValue;\r\n },\r\n currentParams: null,\r\n currentValue: null,\r\n onUpdate,\r\n unsubscribe: () => {\r\n this.subscriptions.delete(id);\r\n },\r\n };\r\n\r\n subscription.update(params);\r\n\r\n this.subscriptions.set(id, subscription);\r\n\r\n return subscription;\r\n }\r\n\r\n updateHandlers: (() => any)[] = [];\r\n public onUpdate(handler: () => any) {\r\n this.subscribe(\r\n {\r\n compute: (db) => db,\r\n compareResults: (a, b) => a === b,\r\n },\r\n null,\r\n handler,\r\n );\r\n }\r\n\r\n private update() {\r\n this.subscriptions.forEach((subscription) => {\r\n const previousValue = subscription.currentValue;\r\n subscription.update(subscription.currentParams);\r\n if (subscription.currentValue !== previousValue && subscription.onUpdate) {\r\n subscription.onUpdate(subscription.currentValue);\r\n }\r\n });\r\n }\r\n\r\n /* Error Subscriptions */\r\n\r\n public saveErrorHandlers: ((request: DbPatch<TTables>, error: any) => void)[] = [];\r\n public onSaveError(handler: (request: DbPatch<TTables>, error: any) => void) {\r\n this.saveErrorHandlers.push(handler);\r\n }\r\n\r\n private saveError(request: DbPatch<TTables>, error: any) {\r\n this.saveErrorHandlers.forEach((handler) => handler(request, error));\r\n }\r\n\r\n /* Save scheduling */\r\n\r\n private enqueueSave = batch(async () => {\r\n const cumulativePatch = this.makeCumulativePatch();\r\n const lastLogEntry = this.log.length;\r\n if (isEmpty(cumulativePatch)) {\r\n return;\r\n }\r\n try {\r\n const response = await this.savePatch(cumulativePatch);\r\n this.applyResponse(response, lastLogEntry);\r\n this.update();\r\n } catch (error) {\r\n this.saveError(cumulativePatch, error);\r\n this.update();\r\n throw error;\r\n }\r\n });\r\n\r\n private handleBeforeUnload = (e: BeforeUnloadEvent) => {\r\n if (this.enqueueSave.isBusy) {\r\n e.returnValue = false;\r\n return false;\r\n }\r\n };\r\n\r\n loaders: Loader<TTables, any, any>[] = [];\r\n protected makeLoader<TResponse, TRequest>(options: LoaderOptions<TTables, TResponse, TRequest>) {\r\n const loader = new Loader<TTables, TResponse, TRequest>(this as any, () => new SimpleLoadingTracker<TRequest, TResponse>(), options);\r\n this.loaders.push(loader);\r\n return loader;\r\n }\r\n\r\n protected makeListLoader<TItem, TResponse = DataQuery<TItem>, TRequest extends DataQuery<TItem> = DataQuery<TItem>>(\r\n options: LoaderOptions<TTables, TResponse, TRequest> & ListLoadingTrackerOptions<TItem, TResponse>,\r\n ) {\r\n const loader = new Loader<TTables, TResponse, TRequest>(this as any, () => new ListLoadingTracker<TItem, TRequest, TResponse>(), options);\r\n this.loaders.push(loader);\r\n return loader;\r\n }\r\n\r\n reload() {\r\n this.loaders = [];\r\n }\r\n}\r\n","import {\r\n useState, createContext, useContext, useMemo, useEffect,\r\n} from 'react';\r\nimport { DbRef } from './DbRef';\r\nimport { DbViewOptions } from '.';\r\n\r\nexport const DbContext = createContext(null);\r\n\r\nexport function useDbRef<TDbRef extends DbRef<any, any>>() {\r\n return useContext(DbContext) as TDbRef;\r\n}\r\n\r\nexport function useDbView<TDb, TResult, TParams = void, TDependencies = void>(\r\n fn: (db: TDb, params: TParams, dependencies: TDependencies) => TResult,\r\n params?: TParams,\r\n options?: DbViewOptions<TDb, TResult, TParams, TDependencies>,\r\n): TResult {\r\n const dbRef = useDbRef();\r\n const [state, setState] = useState<TResult>();\r\n const subscription = useMemo(() => dbRef.subscribe<TResult, TParams, TDependencies>({ compute: fn, ...options }, params, setState), []);\r\n subscription.update(params);\r\n\r\n useEffect(() => {\r\n return () => subscription.unsubscribe();\r\n }, []);\r\n\r\n return subscription.currentValue;\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["rollup://@epam/uui-db/./src/types.ts","rollup://@epam/uui-db/./src/utils.ts","rollup://@epam/uui-db/./src/Db.ts","rollup://@epam/uui-db/./src/DbTable.ts","rollup://@epam/uui-db/./src/patchHelpers.ts","rollup://@epam/uui-db/./src/tempIds.tsx","rollup://@epam/uui-db/./src/Loader.ts","rollup://@epam/uui-db/./src/SimpleLoadingTracker.ts","rollup://@epam/uui-db/./src/ListLoadingTracker.ts","rollup://@epam/uui-db/./src/batch.ts","rollup://@epam/uui-db/./src/DbRef.ts","rollup://@epam/uui-db/./src/reactHooks.ts"],"sourcesContent":["import { DataQuery } from '@epam/uui-core';\nimport { DbTable } from './DbTable';\nimport { IClientIdsMap } from './tempIds';\n\nexport type DbTablesSet<TTables extends DbTablesSet<TTables>> = { [TEntityName in keyof TTables]: DbTable<any, any, TTables> };\n\nexport type DbTablePatch<TEntity> = Partial<TEntity>[];\n\nexport type DbTableEntityByTable<TTable, TTables extends DbTablesSet<TTables>> = TTable extends DbTable<infer TEntity, any, TTables> ? TEntity : void;\nexport type DbTableIdByTable<TTable, TTables extends DbTablesSet<TTables>> = TTable extends DbTable<any, infer TId, TTables> ? TId : void;\ntype DbTablePatchByTable<TTable, TTables extends DbTablesSet<TTables>> = DbTablePatch<DbTableEntityByTable<TTable, TTables>>;\n\nexport type DbPatch<TTables extends DbTablesSet<TTables>> = { [TEntityName in keyof TTables]?: DbTablePatchByTable<TTables[TEntityName], TTables> };\n\nexport enum DbRelationType {\n Aggregation,\n Association\n}\n\nexport type DbFieldFk<TEntity> = {\n tableName: string | ((entity: TEntity) => string);\n relationType: DbRelationType;\n};\n\nexport interface DbFieldSchema<TField extends keyof TEntity, TEntity> {\n fk?: DbFieldFk<TEntity>;\n isGenerated?: boolean;\n isClientOnly?: boolean;\n isReadOnly?: boolean;\n default?: TEntity[TField];\n toServer?: (value: TEntity[TField]) => TEntity[TField];\n toClient?: (value: TEntity[TField]) => TEntity[TField];\n disableFlatten?: boolean;\n}\n\nexport type DbPkFieldType = string | number | (string | number)[];\n\nexport type BeforeUpdateContext<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> = {\n clientIdsMap: IClientIdsMap;\n schema: DbEntitySchema<TEntity, TId, TTables>;\n tables: DbTablesSet<TTables>;\n};\n\ntype DbEntityBeforeUpdateResult<TEntity, TTables extends DbTablesSet<TTables>> = {\n entity: TEntity;\n dependentEntities?: DbPatch<TTables>;\n};\n\ntype DbTableIndexDefinition<TEntity> = keyof TEntity;\n\nexport type DbEntitySchema<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> = {\n tableName: keyof TTables;\n typeName: string;\n searchBy?: (keyof TEntity)[];\n fields?: Partial<{ [TField in keyof TEntity]: DbFieldSchema<TField, TEntity> }>;\n isClientOnly?: boolean | ((entity: Partial<TEntity>) => boolean);\n beforeUpdate?: (entity: TEntity, context: BeforeUpdateContext<TEntity, TId, TTables>) => DbEntityBeforeUpdateResult<TEntity, TTables>;\n primaryKey: TId extends any[] ? KeysOfType<TEntity, string | number>[] : KeysOfType<TEntity, string | number>;\n indexes?: DbTableIndexDefinition<TEntity>[];\n deleteFlag?: keyof TEntity;\n};\n\nexport type DbSchema<TTables extends DbTablesSet<TTables>> = {\n [TTypeName in keyof TTables]: DbEntitySchema<any, any, TTables>;\n};\n\nexport interface DbQuery<TEntity> extends DataQuery<TEntity> {}\n\nexport interface IQueryable<TEntity, TId> {\n query(q: DbQuery<TEntity>): TEntity[];\n byId(id: TId): TEntity;\n}\n\nexport interface ServerError {\n message?: string;\n}\n\ntype DbSaveEntityResponse<TEntity, TId> = {\n id: TId;\n payload: Partial<TEntity>;\n};\n\nexport interface DbSaveResponse<TTables extends DbTablesSet<TTables>> {\n submit: {\n [EntityName in keyof TTables]?: DbSaveEntityResponse<DbTableEntityByTable<TTables[EntityName], TTables>, DbTableIdByTable<TTables[EntityName], TTables>>[];\n };\n}\n\nexport type DbViewFunction<TDb, TResult, TParams = void, TDependencies = void> = (db: TDb, parameters?: TParams, dependencies?: TDependencies) => TResult;\n\nexport interface DbViewOptions<TDb, TResult, TParams, TDependencies = void> {\n getKey?: (parameters: TParams) => string;\n getDependencies?: (db: TDb, parameters: TParams) => TDependencies;\n compareDependencies?: (prev: TDependencies, next: TDependencies) => boolean;\n compareResults?: (prev: TResult, current: TResult) => boolean;\n traceDiff?: boolean;\n}\n\nexport interface DbView<TDb, TResult, TParams = void, TDependencies = void> extends DbViewOptions<TDb, TResult, TParams, TDependencies> {\n compute: DbViewFunction<TDb, TResult, TParams, TDependencies>;\n}\n\nexport type KeysOfType<T, TProp> = { [P in keyof T]: T[P] extends TProp ? P : never }[keyof T];\n\nexport interface DbSubscription<TValue, TParams> {\n update(params: TParams): TValue;\n currentValue: TValue;\n currentParams: TParams;\n onUpdate: (newValue: TValue) => void;\n unsubscribe: () => void;\n}\n\nexport type ViewCacheItem = { dependencies: any; currentValue: any; computedOnDb: any };\n\nexport interface LoadingState<TRequest> {\n isLoading: boolean;\n isComplete: boolean;\n request: TRequest;\n missing?: TRequest;\n}\n\nexport interface ILoadingTracker<TRequest, TResult> {\n diff(request: TRequest): TRequest;\n append(request: TRequest, result?: TResult): void;\n count?(request: TRequest): { knownCount: number; exactCount: number };\n}\n","import shallowEqual from 'shallowequal';\nimport zip from 'lodash.zip';\nimport transform from 'lodash.transform';\nimport isEqual from 'react-fast-compare';\n\n// TBD: New typescript would contain better typing for this. Remove this hack after update.\nexport const objectKeys: <T>(obj: T) => (keyof T)[] = Object.keys as any;\n\nexport function defaultCompareViewDependencies<T>(prev: T, next: T): boolean {\n if (Array.isArray(prev) && Array.isArray(next)) {\n if (prev.length === next.length) {\n return zip(prev, next).every(([p, n]) => shallowEqual(p, n));\n }\n return false;\n }\n return shallowEqual(prev, next);\n}\n\n/**\n * Deep diff between two object, using lodash\n * @param {Object} object Object compared\n * @param {Object} base Object to compare with\n * @return {Object} Return a new object who represent the diff\n */\nexport function difference(obj: any, baseObj: any) {\n function changes(object: any, base: any) {\n return transform(object, function (result: any, value: any, key: any) {\n if (!isEqual(value, base[key])) {\n result[key] = (typeof value === 'object' && typeof base[key] === 'object') ? changes(value, base[key]) : value;\n }\n });\n }\n return changes(obj, baseObj);\n}\n","import {\n DbPatch, DbTablesSet, DbTableEntityByTable, DbView, DbRelationType, ViewCacheItem,\n} from './types';\nimport { objectKeys, defaultCompareViewDependencies, difference } from './utils';\nimport isEqual from 'react-fast-compare';\n\ntype ViewCache = Map<DbView<any, any, any, any>, Map<string, ViewCacheItem>>;\n\nexport abstract class Db<TTables extends DbTablesSet<TTables>> {\n private viewCache: ViewCache = new Map();\n constructor(public tables: TTables, reusedCache?: ViewCache) {\n if (reusedCache) {\n this.viewCache = new Map(reusedCache);\n } else {\n this.viewCache = new Map();\n }\n }\n\n private update(mutate: (db: this) => void): this {\n const clone = new (this.constructor as any)(this.tables, this.viewCache);\n clone.tables = { ...this.tables };\n mutate(clone);\n return clone;\n }\n\n public with(patch: DbPatch<TTables>): this {\n return this.update((db) => {\n objectKeys(db.tables).forEach((entityName) => {\n if (patch[entityName]) {\n db.tables[entityName] = db.tables[entityName].with(patch[entityName]);\n }\n });\n });\n }\n\n /* Views (cached db projections) */\n\n valueAbsent = Symbol('ValueAbsent');\n public runView<TResult, TParams = void, TDependencies = void>(view: DbView<this, TResult, TParams, TDependencies>, params?: TParams) {\n let cache = this.viewCache.get(view);\n\n if (!cache) {\n cache = new Map();\n this.viewCache.set(view, cache);\n }\n\n const key = view.getKey ? view.getKey(params) : JSON.stringify(params);\n\n let cacheItem: ViewCacheItem = cache.get(key);\n\n if (!cacheItem) {\n cacheItem = {\n dependencies: this.valueAbsent,\n currentValue: this.valueAbsent,\n computedOnDb: this.valueAbsent,\n };\n cache.set(key, cacheItem);\n }\n\n let shouldUpdate = this !== cacheItem.computedOnDb;\n let dependencies: any = this.valueAbsent;\n\n if (view.getDependencies) {\n const compare = view.compareDependencies || defaultCompareViewDependencies;\n dependencies = view.getDependencies(this, params);\n shouldUpdate = !compare(cacheItem.dependencies, dependencies);\n }\n\n const previousValue = cacheItem.currentValue;\n\n if (shouldUpdate) {\n cacheItem.dependencies = dependencies;\n const newValue = view.compute(this, params, dependencies);\n cacheItem.computedOnDb = this;\n\n const compareResults = view.compareResults || isEqual;\n\n if (!compareResults(previousValue, newValue)) {\n if (view.traceDiff) {\n console.debug(difference(previousValue, newValue));\n }\n\n cacheItem.currentValue = newValue;\n }\n }\n\n return cacheItem.currentValue as TResult;\n }\n}\n","import {\n DbTablePatch, DbQuery, DbEntitySchema, DbPkFieldType, DbTablesSet,\n} from './types';\nimport * as I from 'immutable';\nimport {\n SortDirection, getFilterPredicate, getOrderComparer, DataQueryFilter, SortingOption, getSearchFilter, DataQuery,\n} from '@epam/uui-core';\nimport { Seq } from 'immutable';\n\ninterface DbIndex<TEntity> {\n field: keyof TEntity;\n map: I.Map<any, I.Set<any>>;\n}\n\ninterface DbTableState<TEntity, TTables extends DbTablesSet<TTables>> {\n pk: I.Map<any, TEntity>;\n indexes: DbIndex<TEntity>[];\n}\n\nexport class DbTable<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> {\n constructor(public readonly schema: DbEntitySchema<TEntity, TId, TTables>, private state?: DbTableState<TEntity, TTables>, private q?: DbQuery<TEntity>) {\n if (!state) {\n const indexes: DbIndex<TEntity>[] = (schema.indexes || []).map((indexDef) => {\n return {\n field: indexDef,\n map: I.Map(),\n };\n });\n\n this.state = { pk: I.Map(), indexes };\n }\n\n if (!q) {\n this.q = {};\n }\n }\n\n protected keyToImmutable(id: TId): any {\n if (Array.isArray(id)) {\n return I.List(id);\n } else {\n return id;\n }\n }\n\n public byId(id: TId): TEntity {\n return this.state.pk.get(this.keyToImmutable(id));\n }\n\n public getId(entity: Partial<TEntity>): TId {\n if (Array.isArray(this.schema.primaryKey)) {\n return this.schema.primaryKey.map((key: keyof TEntity) => entity[key]) as any as TId;\n }\n return entity[this.schema.primaryKey as keyof TEntity] as any as TId;\n }\n\n private update(mutate: (t: DbTable<TEntity, TId, TTables>) => void): this {\n const clone = new (this.constructor as any)(this.schema, this.state, this.q);\n mutate(clone);\n return clone;\n }\n\n /* Mutation */\n\n public with(patch: DbTablePatch<TEntity>) {\n const updates = patch.map((entityPatch) => {\n const id = this.getId(entityPatch);\n const immId = this.keyToImmutable(id);\n const existing = this.state.pk.get(immId);\n let isDeleted = false;\n let updated = entityPatch as TEntity;\n if (existing) {\n updated = { ...existing, ...entityPatch };\n\n if (this.schema.deleteFlag) {\n isDeleted = (updated[this.schema.deleteFlag] as unknown) === true;\n }\n }\n\n return {\n id, immId, patch: entityPatch, existing, updated, isNew: !existing, isDeleted,\n };\n });\n\n const idVal = Seq.Keyed<TId, TEntity>(updates.map((entity) => [entity.immId, entity.updated]));\n let newPk = this.state.pk.merge(idVal);\n\n // TBD: replace with deleteAll after migrating to immutable 4\n updates\n .filter((u) => u.isDeleted)\n .forEach((u) => {\n newPk = newPk.delete(u.immId);\n });\n\n const newIndexes = this.state.indexes.map((index) => {\n let newMap = index.map;\n\n for (let n = 0; n < updates.length; n++) {\n const update = updates[n];\n\n const newKey = update.updated[index.field];\n\n if (update.existing) {\n const oldKey = update.existing[index.field];\n\n if (oldKey !== newKey || update.isDeleted) {\n newMap = newMap.update(oldKey, (set) => set.remove(update.immId));\n }\n }\n\n if (!update.isDeleted) {\n newMap = newMap.update(newKey, I.Set(), (set) => set.add(update.immId));\n }\n }\n\n return { ...index, map: newMap };\n });\n\n const newState: DbTableState<TEntity, TTables> = { pk: newPk, indexes: newIndexes };\n\n return this.update((t) => (t.state = newState));\n }\n\n /* Query */\n\n public find(filter: DataQueryFilter<TEntity>): DbTable<TEntity, TId, TTables> {\n return this.update((t) => (t.q = { ...t.q, filter: { ...(this.q.filter as any), ...(filter as any) } }));\n }\n\n public order(order: SortingOption[]) {\n return this.update((t) => (t.q = { ...t.q, sorting: order }));\n }\n\n public orderBy(field: Extract<keyof TEntity, string>, direction: SortDirection = 'asc') {\n return this.update((t) => (t.q = { ...t.q, sorting: [{ field, direction }] }));\n }\n\n public thenBy(field: Extract<keyof TEntity, string>, direction?: SortDirection) {\n return this.update((t) => (t.q = { ...t.q, sorting: [...t.q.sorting, { field, direction }] }));\n }\n\n public search(text: string) {\n if (!this.schema.searchBy) {\n throw new Error(`Can't search in the ${this.schema.typeName} table - searchBy is not defined in the schema.`);\n }\n return this.update((t) => (t.q = { ...t.q, search: text }));\n }\n\n /* Materializing */\n\n public range(from: number, count: number): TEntity[] {\n return this.runQuery({ ...this.q, range: { from, count } });\n }\n\n public count() {\n return this.runQuery(this.q).length;\n }\n\n public one(): TEntity {\n return this.runQuery(this.q)[0] || null;\n }\n\n public toArray(): TEntity[] {\n return this.runQuery(this.q);\n }\n\n public map<T>(fn: (item: TEntity, index?: number) => T) {\n return this.toArray().map(fn);\n }\n\n /* Query implementation */\n\n private runQuery(q: DataQuery<TEntity>) {\n let result: TEntity[] = null;\n let filter = q.filter;\n\n if (filter) {\n const indexes = this.state.indexes;\n\n // Try to use indexes to fulfill filter conditions\n for (let n = 0; n < indexes.length; n++) {\n const index = indexes[n];\n\n if (index.field in filter) {\n const { [index.field]: condition, ...rest } = filter as any;\n let conditionValues: any[] = null;\n\n if (condition != null && typeof condition === 'object') {\n // Attempt to use index for 'in' and 'isNull' criteria.\n // We need to be very conservative here, indexed field should work the same way as getPatternPredicate. So\n // - it's better to leave corner cases to getPatternPredicate\n\n const { in: inCriteria, isNull: nullCriteria, ...restCriteria } = condition as any;\n if (inCriteria && Array.isArray(inCriteria)) {\n conditionValues = inCriteria;\n } else {\n restCriteria.in = inCriteria;\n }\n\n // Conditions in getPatternPredicate are composed with 'and' logic,\n // For now, let's not attempt to handle tricky cases like { in: [1,2] isNull: true }, or { in: [1, null] isNull: false }\n // - just leave this to getPatternPredicate.\n // Let's just handle the a most common case { isNull: true } - find all null and undefined\n if (nullCriteria === true && !conditionValues) {\n conditionValues = [null, undefined];\n } else {\n restCriteria.in = inCriteria;\n }\n\n // Keep other conditions, e.g. { in: [1,2,3], isNull: true } - in works via index, isNull - via filter\n if (Object.keys(restCriteria).length > 0) {\n rest[index.field] = restCriteria;\n }\n } else {\n conditionValues = [condition];\n }\n\n if (conditionValues) {\n result = [];\n\n for (let i = 0; i < conditionValues.length; i++) {\n const idsSet = index.map.get(conditionValues[i]);\n if (idsSet) {\n const idsArray = idsSet.toArray();\n for (let j = 0; j < idsArray.length; j++) {\n const item = this.state.pk.get(idsArray[j]);\n result.push(item);\n }\n }\n }\n\n filter = Object.keys(rest).length > 0 ? (rest as any) : null;\n break;\n }\n }\n }\n }\n\n if (!result) {\n result = this.state.pk.toArray();\n }\n\n if (filter) {\n const predicate = getFilterPredicate<TEntity>(q.filter);\n result = result.filter(predicate);\n }\n\n if (q.search) {\n const searchFilter = getSearchFilter(q.search);\n result = result.filter((item) => searchFilter(this.schema.searchBy.map((field) => (item as any)[field])));\n }\n\n if (q.sorting) {\n const comparer = getOrderComparer(q.sorting);\n result = result.sort(comparer);\n }\n\n if (q.range) {\n result = result.slice(q.range.from, q.range.from + q.range.count);\n }\n\n return result;\n }\n}\n","import { Db } from './Db';\nimport {\n DbPatch, DbTablesSet, DbRelationType, DbEntitySchema, DbPkFieldType,\n} from './types';\nimport { DbTable } from './DbTable';\nimport * as I from 'immutable';\nimport { objectKeys } from './utils';\nimport groupBy from 'lodash.groupby';\nimport map from 'lodash.map';\nimport merge from 'lodash.merge';\nimport countBy from 'lodash.countby';\nimport filter from 'lodash.filter';\nimport forEach from 'lodash.foreach';\nimport pick from 'lodash.pick';\nimport { IClientIdsMap } from './tempIds';\n\nexport function unionPatches<TTables extends DbTablesSet<TTables>>(patches: DbPatch<TTables>[]): DbPatch<TTables> {\n const result: DbPatch<TTables> = {};\n\n patches.forEach((patch) => {\n objectKeys(patch).forEach((tableName) => {\n result[tableName] = result[tableName] ? [...result[tableName], ...patch[tableName]] : patch[tableName];\n });\n });\n\n return result;\n}\n\nexport function mergeEntityPatches<TTables extends DbTablesSet<TTables>>(tables: TTables, patch: DbPatch<TTables>): DbPatch<TTables> {\n const result: DbPatch<TTables> = {};\n\n objectKeys(patch).forEach((key) => {\n const table = tables[key];\n const groupedEntities = groupBy(patch[key], (item) => table.getId(item));\n const tablePatch = map(groupedEntities, (entities) => {\n const tablePatchResult = merge({}, ...entities);\n\n if (process.env.NODE_ENV !== 'production') {\n const props = objectKeys(tablePatchResult).filter(\n (prop) =>\n Object.keys(\n countBy(\n entities.filter((entity) => entity[prop as string] !== undefined),\n (entity) => entity[prop as string],\n ),\n ).length > 1,\n );\n if (props.length) {\n console.warn('mergeEntityPatches: Different property values found for the same entity.\\nProperty names:\\n', props, '\\nEntities:\\n', ...entities);\n }\n }\n\n return tablePatchResult;\n });\n\n result[key] = tablePatch;\n });\n\n return result;\n}\n\nfunction flattenResponseHelper<TTables extends DbTablesSet<any>>(result: DbPatch<TTables>, object: any, tablesByTypeName: Record<string, DbTable<any, any, any>>) {\n if (Array.isArray(object)) {\n object.forEach((item) => flattenResponseHelper(result, item, tablesByTypeName));\n } else if (typeof object === 'object') {\n const clone: any = {};\n let tableKey;\n let fields: { [id: string]: any } = {};\n\n if ('__typename' in object) {\n const table = tablesByTypeName[object.__typename];\n if (table) {\n tableKey = table.schema.tableName as string;\n fields = table.schema.fields;\n }\n }\n\n for (const key in object) {\n const value = object[key];\n const field = fields[key];\n\n if (\n (field && !!field.disableFlatten)\n || typeof value !== 'object'\n || value === null\n || (Array.isArray(value) && value.every((item) => typeof item !== 'object'))\n ) {\n clone[key] = value;\n } else {\n flattenResponseHelper(result, value, tablesByTypeName);\n }\n }\n\n if (tableKey) {\n result[tableKey].push(clone);\n }\n }\n}\n\nexport function flattenResponse<TTables extends DbTablesSet<any>>(response: any, tables: TTables): DbPatch<TTables> {\n const result: DbPatch<TTables> = {};\n\n const tablesByTypeName: Record<string, DbTable<any, any, any>> = {};\n Object.values(tables).forEach((table) => (tablesByTypeName[table.schema.typeName] = table));\n objectKeys(tables).forEach(() => tablesByTypeName);\n\n objectKeys(tables).forEach((key) => (result[key] = []));\n\n flattenResponseHelper(result, response, tablesByTypeName);\n return result;\n}\n\nexport function isPatchBlank<TTables extends DbTablesSet<TTables>>(patch: DbPatch<TTables>): boolean {\n return !objectKeys(patch).some((key) => patch[key].length > 0);\n}\n\n/**\n * Given several patches, creates a new single patch with all fields from all entities in all patches.\n */\nexport function makeCumulativePatch<TTables extends DbTablesSet<TTables>>(\n updatedDb: Db<TTables>,\n patches: DbPatch<TTables>[],\n clientIdsMap: IClientIdsMap,\n): DbPatch<TTables> {\n const result: DbPatch<TTables> = {};\n\n objectKeys(updatedDb.tables).forEach((entityName) => {\n const table = updatedDb.tables[entityName];\n const schema = table.schema;\n\n let ids = I.Set();\n patches.forEach((patch) => {\n const filteredPatch = (patch[entityName] || []).filter((entity) => hasServerFields(entity, schema, clientIdsMap, updatedDb.tables));\n ids = ids.union(filteredPatch.map((e) => table.getId(e)));\n });\n\n const entities = ids\n .map((id) => table.byId(id))\n .filter((e) => !isClientOnly(e, schema))\n .toArray();\n\n if (entities.length > 0) {\n result[entityName] = entities;\n }\n });\n\n return result;\n}\n\nexport function isClientOnly<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(entity: T, schema: DbEntitySchema<T, TId, TTables>) {\n if (typeof schema.isClientOnly === 'function') {\n return schema.isClientOnly(entity);\n }\n\n return !!schema.isClientOnly;\n}\n\nexport function getId<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(entity: Partial<T>, schema: DbEntitySchema<T, TId, TTables>): TId {\n if (typeof schema.primaryKey == 'string') {\n return (entity as any)[schema.primaryKey] as TId;\n }\n\n const result: (string | number)[] = [];\n forEach(pick(entity, schema.primaryKey), (value) => {\n result.push(value as unknown as string | number);\n });\n\n return result as TId;\n}\n\nexport function isNew<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(\n entity: Partial<T>,\n schema: DbEntitySchema<T, TId, TTables>,\n clientIdsMap: IClientIdsMap,\n) {\n const id = getId(entity, schema);\n return !clientIdsMap.clientToServer(id as number);\n}\n\nexport function hasServerFields<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(\n entity: Partial<T>,\n schema: DbEntitySchema<T, TId, TTables>,\n clientIdsMap: IClientIdsMap,\n tables: TTables,\n) {\n const fullEntity = {\n ...(tables[schema.tableName].byId((entity as any).id) || {}),\n ...entity,\n };\n\n if (isClientOnly(fullEntity, schema)) {\n return false;\n }\n\n return objectKeys(entity).some((fieldName) => {\n const fieldSchema = schema.fields[fieldName];\n return !fieldSchema || !(fieldSchema.isClientOnly || fieldSchema.isReadOnly || (fieldSchema.isGenerated && !isNew(entity, schema, clientIdsMap)));\n });\n}\n\nexport function getParentEntities<TTables extends DbTablesSet<TTables>>(patch: DbPatch<TTables>, tables: TTables): DbPatch<TTables> {\n const dependenciesPatch: DbPatch<TTables> = {};\n objectKeys(patch).forEach((key) => {\n const table = tables[key];\n const tableSchema = table.schema;\n\n const fields = filter(\n map(tableSchema.fields, (field, name) => ({ ...field, name })),\n (field) => field.fk && field.fk.relationType == DbRelationType.Aggregation,\n );\n\n const tablePatch = patch[key];\n fields.forEach((field) => {\n const {\n fk: { tableName },\n name,\n } = field;\n tablePatch.forEach((entity) => {\n const actualTableName = (typeof tableName == 'function' ? tableName(entity) : tableName) as keyof TTables;\n const dbEntity = table.byId(table.getId(entity));\n const parentEntity = tables[actualTableName].byId(dbEntity[name]);\n const idFields = pick(parentEntity, tables[actualTableName].schema.primaryKey);\n if (parentEntity) {\n dependenciesPatch[actualTableName] = dependenciesPatch[actualTableName] || [];\n dependenciesPatch[actualTableName].push(idFields as any);\n }\n });\n });\n });\n return dependenciesPatch;\n}\n\nexport function getEntityParentDependencies<TEntity, TTables extends DbTablesSet<TTables>>(\n entity: Partial<TEntity>,\n entityName: keyof TTables,\n tables: TTables,\n): DbPatch<TTables> {\n let patch = { [entityName]: [entity] } as DbPatch<TTables>;\n const resultPatches: DbPatch<TTables>[] = [];\n\n while (true) {\n const parents = getParentEntities(patch, tables);\n if (isPatchBlank(parents)) {\n break;\n }\n resultPatches.push(parents);\n patch = parents;\n }\n\n let result = unionPatches([patch, ...resultPatches]);\n result = mergeEntityPatches(tables, result);\n\n return result;\n}\n","import {\n DbTablePatch, DbTablesSet, DbPatch, DbFieldSchema, DbSaveResponse,\n} from './types';\nimport { Db } from './Db';\nimport { objectKeys } from './utils';\nimport { DataQueryFilter, DataQueryFilterCondition } from '@epam/uui-core';\n\nlet lastTempId = -1;\n\nexport function getTempId() {\n return --lastTempId;\n}\n\nexport function isTempId(val: any): val is number {\n return typeof val === 'number' && val < 0;\n}\n\nexport interface IClientIdsMap {\n clientToServer(id: number): any;\n serverToClient(tableName: string, id: any): number;\n clientToServerRequest<T>(request: T): T;\n clientToServerDataFilter(filter: DataQueryFilter<any>): DataQueryFilter<any>;\n}\n\nexport class TempIdMap<TTables extends DbTablesSet<TTables>> implements IClientIdsMap {\n private serverToClientIds = new Map<keyof TTables, Map<any, number>>();\n private clientToServerIds = new Map<number, any>();\n constructor(private db: Db<TTables>) {}\n public clientToServer = (id: number): any => this.clientToServerIds.get(id);\n public serverToClient = (tableName: string, id: any): number => this.getServerToClientMap(tableName as any).get(id);\n public clientToServerRequest = (request: any) => {\n request = { ...request };\n\n if (request.filter) {\n request.filter = this.clientToServerDataFilter(request.filter);\n }\n\n return request;\n };\n\n public clientToServerDataFilter = (filter: DataQueryFilter<any>) => {\n filter = { ...filter };\n const keys = Object.keys(filter);\n\n // I hope that we can rely that there won't be any negative numbers, which are not IDs, in queries.\n // We need to invent better heuristics or a schema otherwise.\n const clientToServer = (id: number) => {\n const found = this.clientToServer(id);\n if (found) {\n return found;\n } else {\n return id;\n }\n };\n\n for (let n = 0; n < keys.length; n++) {\n const key = keys[n];\n let condition = filter[key] as DataQueryFilterCondition<any>;\n if (condition != null && typeof condition === 'object') {\n condition = { ...condition };\n if ('in' in condition && Array.isArray(condition.in) && condition.in.length) {\n condition.in = condition.in.map(clientToServer);\n }\n } else {\n condition = clientToServer(condition);\n }\n filter[key] = condition;\n }\n return filter;\n };\n\n private copyPatch(patch: DbPatch<TTables>) {\n const newPatch = { ...patch };\n\n objectKeys(patch).forEach((tableName) => {\n const tablePatch: DbTablePatch<any> = patch[tableName].map((entityPatch) => ({ ...entityPatch }));\n newPatch[tableName] = tablePatch;\n });\n\n return newPatch;\n }\n\n // Iterate thru every field in every patch for every table, matching certain field criteria. The patch is mutated!\n protected mapFields(\n patch: DbPatch<TTables>,\n filter: (schema: DbFieldSchema<any, any>, name: string) => boolean,\n callback: (fieldName: any, fieldSchema: DbFieldSchema<any, any>, fieldValue: any, entityPatch: any, tableName: keyof TTables) => void,\n ): void {\n objectKeys(patch).forEach((tableName) => {\n const schema = this.db.tables[tableName].schema;\n const fields = objectKeys(schema.fields || [])\n .map((fieldName) => {\n const fieldSchema = schema.fields[fieldName as any];\n if (filter(fieldSchema, fieldName as string)) {\n return { name: fieldName, schema: fieldSchema };\n }\n })\n .filter((f) => !!f);\n\n if (!fields.length) {\n return;\n }\n\n patch[tableName].forEach((entityPatch) => {\n for (let n = 0; n < fields.length; n++) {\n const field = fields[n];\n\n const fieldValue = entityPatch[field.name as any];\n\n callback(field.name, field.schema, fieldValue, entityPatch, tableName);\n }\n });\n });\n }\n\n protected getServerToClientMap(tableName: keyof TTables) {\n const existing = this.serverToClientIds.get(tableName);\n\n if (existing) {\n return existing;\n } else {\n const newMap = new Map();\n this.serverToClientIds.set(tableName, newMap);\n return newMap;\n }\n }\n\n public serverToClientPatch(patch: DbPatch<TTables>) {\n patch = this.copyPatch(patch);\n\n // We map PK in a separate pass, as we need to remap all PKs before re-mapping FKs\n this.mapFields(\n patch,\n (f) => f.isGenerated,\n (fieldName, fieldSchema, fieldValue, entityPatch, tableName) => {\n let clientId = this.getServerToClientMap(tableName).get(fieldValue);\n if (!clientId) {\n clientId = getTempId();\n this.clientToServerIds.set(clientId, fieldValue);\n this.getServerToClientMap(tableName).set(fieldValue, clientId);\n }\n entityPatch[fieldName] = clientId;\n },\n );\n\n this.mapFields(\n patch,\n (f) => !!(f.fk || f.default != null || f.toClient),\n (fieldName, fieldSchema, fieldValue, entityPatch) => {\n let isUndefined = typeof fieldValue === 'undefined';\n\n if (fieldSchema.default != null && fieldValue == null) {\n fieldValue = fieldSchema.default;\n isUndefined = false;\n }\n\n if (fieldSchema.fk && fieldValue != null) {\n const fkTableName = typeof fieldSchema.fk.tableName === 'function' ? fieldSchema.fk.tableName(entityPatch) : fieldSchema.fk.tableName;\n let clientId = this.getServerToClientMap(fkTableName as keyof TTables).get(fieldValue);\n if (!clientId) {\n clientId = getTempId();\n this.clientToServerIds.set(clientId, fieldValue);\n this.getServerToClientMap(fkTableName as keyof TTables).set(fieldValue, clientId);\n }\n fieldValue = clientId;\n }\n\n if (!isUndefined && fieldSchema.toClient) {\n fieldValue = fieldSchema.toClient(fieldValue);\n }\n\n if (!isUndefined) {\n entityPatch[fieldName] = fieldValue;\n }\n },\n );\n\n return patch;\n }\n\n public clientToServerPatch(patch: DbPatch<TTables>) {\n patch = this.copyPatch(patch);\n\n this.mapFields(\n patch,\n (f) => f.isGenerated || !!f.fk,\n (fieldName, fieldSchema, fieldValue, entityPatch) => {\n if (fieldValue != null) {\n const existingId = this.clientToServerIds.get(fieldValue);\n if (existingId) {\n entityPatch[fieldName] = existingId;\n }\n }\n },\n );\n\n this.mapFields(\n patch,\n (f) => !(f.isClientOnly || f.isReadOnly) && !!f.toServer,\n (fieldName, fieldSchema, _, entityPatch) => {\n entityPatch[fieldName] = fieldSchema.toServer(entityPatch[fieldName]);\n },\n );\n\n this.mapFields(\n patch,\n (meta) => meta.isClientOnly || meta.isReadOnly,\n (fieldName, _, __, entityPatch) => {\n delete entityPatch[fieldName];\n },\n );\n\n return patch;\n }\n\n public appendServerMapping(response: DbSaveResponse<TTables>) {\n objectKeys(response.submit).forEach((tableName) => {\n if (this.db.tables[tableName]) {\n const tablePatch = response.submit[tableName];\n if (tablePatch) {\n const serverToClientIds = this.getServerToClientMap(tableName);\n const table = this.db.tables[tableName];\n\n tablePatch.forEach((patch) => {\n if (isTempId(patch.id)) {\n const clientId = patch.id;\n const serverId = table.getId(patch.payload);\n serverToClientIds.set(serverId, clientId);\n this.clientToServerIds.set(clientId, serverId);\n }\n });\n }\n }\n });\n }\n}\n","import { DbRef } from './DbRef';\nimport {\n DbPatch, DbTablesSet, LoadingState, ILoadingTracker,\n} from './types';\n\nexport interface LoaderOptions<TTables extends DbTablesSet<TTables>, TResult, TRequest> {\n api: (request: TRequest) => Promise<TResult>;\n convertToPatch?: (result: TResult) => DbPatch<TTables>;\n postProcess?: (patch: DbPatch<TTables>) => DbPatch<TTables>;\n clientToServerRequest?: (request: TRequest) => TRequest;\n}\n\nexport interface LoaderResult<TRequest> extends LoadingState<TRequest> {\n promise: Promise<void>;\n reload: () => void;\n}\n\nexport class Loader<TTables extends DbTablesSet<TTables>, TResult, TRequest> {\n private currentRequests: Set<Promise<void>> = new Set();\n public loaded: ILoadingTracker<TRequest, TResult>;\n private loadedAndLoading: ILoadingTracker<TRequest, TResult>;\n constructor(\n private dbRef: DbRef<TTables, any>,\n private getTracker: () => ILoadingTracker<TRequest, TResult>,\n private options: LoaderOptions<TTables, TResult, TRequest>,\n ) {\n this.loaded = getTracker();\n this.loadedAndLoading = getTracker();\n }\n\n private loadImpl(state: LoaderResult<TRequest>) {\n this.loadedAndLoading.append(state.missing);\n state.isLoading = true;\n let serverRequest = state.missing;\n if (this.options.clientToServerRequest) {\n serverRequest = this.options.clientToServerRequest(serverRequest);\n }\n state.promise = this.options.api(serverRequest).then((result) => {\n this.loaded.append(state.missing, result);\n this.loadedAndLoading.append(state.missing, result);\n state.missing = null;\n state.isLoading = false;\n state.isComplete = true;\n state.promise = Promise.resolve();\n const flatten = this.options.convertToPatch(result);\n this.options.postProcess && this.options.postProcess(flatten);\n this.dbRef.commitFetch(flatten);\n });\n\n this.currentRequests.add(state.promise);\n\n state.promise.finally(() => {\n this.currentRequests.delete(state.promise);\n });\n\n return state.promise;\n }\n\n public load = (inputRequest: TRequest) => {\n const result: LoaderResult<TRequest> = {\n isComplete: this.loaded.diff(inputRequest) == null,\n isLoading: false,\n request: inputRequest,\n missing: this.loadedAndLoading.diff(inputRequest),\n promise: null,\n reload: null,\n };\n\n result.reload = () => {\n result.missing = inputRequest;\n this.loadImpl(result);\n };\n\n if (result.isComplete) {\n // Everything requested is already loaded\n result.isComplete = true;\n result.isLoading = false;\n result.promise = Promise.resolve();\n return result;\n } else {\n if (result.missing == null) {\n // Everything requested is either loaded already, or being loaded\n result.isComplete = false;\n result.isLoading = true;\n // There's no good way to tell which of current requests is querying requested data - there actually can be 2 of them.\n // So we track all running requests, and await all of them in such case.\n result.promise = Promise.all(this.currentRequests.entries()).then(() => {});\n return result;\n } else {\n // Something requested is not loaded, nor being loaded. Need to perform a new request.\n this.loadImpl(result);\n return result;\n }\n }\n };\n}\n","import { ILoadingTracker } from './types';\n\nexport class SimpleLoadingTracker<TRequest, TResult> implements ILoadingTracker<TRequest, TResult> {\n private set: Set<string> = new Set();\n constructor() {}\n private getKey(request: TRequest) {\n return JSON.stringify(request);\n }\n\n public diff(request: TRequest) {\n return this.set.has(this.getKey(request)) ? null : request;\n }\n\n public append(request: TRequest, result: TResult) {\n this.set.add(this.getKey(request));\n }\n}\n","import { DataQuery, LazyDataSourceApiResponse } from '@epam/uui-core';\nimport { ILoadingTracker } from './types';\n\ninterface ListRecord<TItem> {\n options: DataQuery<TItem>;\n count: number;\n maxCount: number;\n isComplete: boolean;\n}\n\nexport interface ListLoadingTrackerOptions<TItem, TResponse> {\n extractList?: (response: TResponse) => LazyDataSourceApiResponse<TItem>;\n}\n\nexport class ListLoadingTracker<TItem, TRequest extends DataQuery<TItem> = DataQuery<TItem>, TResponse = LazyDataSourceApiResponse<TItem>>\nimplements ILoadingTracker<TRequest, TResponse> {\n private cache: Map<string, ListRecord<TItem>> = new Map();\n private extractList: (res: TResponse) => LazyDataSourceApiResponse<TItem>;\n constructor(private options?: ListLoadingTrackerOptions<TItem, TResponse>) {\n this.extractList = options?.extractList || ((r: any) => r);\n }\n\n private prepare(request: DataQuery<TItem>) {\n const {\n filter, sorting, search, range, ...unknownFields\n } = request;\n const options: DataQuery<TItem> = {};\n\n if (filter) {\n options.filter = filter;\n }\n\n if (sorting) {\n options.sorting = sorting;\n }\n\n if (search) {\n options.search = search;\n }\n\n const keyObject = { ...options, ...unknownFields };\n\n const key = JSON.stringify(keyObject);\n let entry = this.cache.get(key);\n if (!entry) {\n entry = {\n options, count: 0, maxCount: null, isComplete: false,\n };\n this.cache.set(key, entry);\n }\n\n return {\n options, range, unknownFields, entry,\n };\n }\n\n public diff(request: TRequest): TRequest {\n const {\n options, range, unknownFields, entry,\n } = this.prepare(request);\n\n if (entry.isComplete) {\n return null;\n }\n\n if (!request.range) {\n return request;\n } else {\n const requestedMax = request.range.from + request.range.count;\n let missingCount = requestedMax - entry.count;\n\n if (entry.maxCount) {\n missingCount = Math.min(missingCount, entry.maxCount);\n }\n\n if (missingCount > 0) {\n return {\n ...options,\n ...unknownFields,\n range: { from: entry.count, count: requestedMax - entry.count },\n } as TRequest;\n } else {\n return null;\n }\n }\n }\n\n public count(request: TRequest) {\n const { entry } = this.prepare(request);\n\n return { knownCount: Math.max(entry.count, entry.maxCount), exactCount: entry.maxCount };\n }\n\n public append(request: TRequest, response?: TResponse) {\n const {\n options, range, unknownFields, entry,\n } = this.prepare(request);\n\n if (response) {\n const list = this.extractList(response);\n\n if (list.count) {\n entry.maxCount = list.count;\n }\n\n if (!range) {\n entry.count = list.items.length;\n entry.maxCount = list.items.length;\n entry.isComplete = true;\n } else {\n const from = list.from == null ? range.from : list.from;\n\n if (list.items.length > 0) {\n entry.count = Math.max(entry.count, from + list.items.length);\n }\n\n if (list.items.length < range.count) {\n entry.maxCount = from + list.items.length;\n entry.count = entry.maxCount;\n entry.isComplete = true;\n }\n }\n } else {\n if (range) {\n entry.count = Math.max(entry.count, request.range.from + request.range.count);\n } else {\n entry.isComplete = true;\n }\n }\n }\n}\n","export interface BatchPromiseOptions {\n /** Minimum time (in ms) to pass after the last call, before triggering the batch */\n throttleMs?: number;\n}\n\nconst delay = (ms: number = 0): Promise<void> => {\n if (ms <= 0) {\n return Promise.resolve();\n } else {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n }\n};\n\n/** Creates an async function, which can collect several calls to it, and execute them in a single batch via provided callback. */\nexport function batch<TArg = void, TRes = void>(\n runBatch: (batch?: TArg[]) => Promise<TRes[]> | Promise<void> | undefined | void,\n options?: BatchPromiseOptions,\n): { (arg: TArg, options?: BatchPromiseOptions): Promise<TRes>; isBusy: boolean } {\n let delayPromise: Promise<void> = Promise.resolve();\n let batchPromise: any = null;\n let queue: TArg[] = [];\n\n let nextCallPossibleAtMs = new Date().getTime();\n\n async function batchedFn(arg: TArg, callOptions?: BatchPromiseOptions) {\n options = { ...options, ...callOptions };\n options.throttleMs = options.throttleMs || 0;\n\n // Enqueue request\n queue.push(arg);\n const resultIndex = queue.length - 1; // an index of current item in queue. Result should be on the same index in batch.\n batchedFn.isBusy = true;\n\n // Wait current batch to complete\n try {\n await batchPromise;\n } catch {\n // ignore errors here. They are thrown to previous batch\n }\n\n // Wait for throttling delay to pass\n await delayPromise;\n\n try {\n // Start a batch if there are items.\n // All calls that was awaiting will run this code.\n // Only the first call will run batch, immediately clear the queue, and set batchPromise value\n // Other calls will just await results of this call\n if (queue.length > 0) {\n nextCallPossibleAtMs = new Date().getTime() + options.throttleMs;\n batchPromise = runBatch(queue);\n queue = [];\n }\n\n const results = await batchPromise;\n\n return results?.[resultIndex];\n } finally {\n const nowMs = new Date().getTime();\n const delayMs = Math.max(0, nextCallPossibleAtMs - nowMs);\n // It's safe to replace currentPromise here. All other requests are already awaiting\n delayPromise = delay(delayMs);\n batchedFn.isBusy = queue.length > 0;\n }\n }\n\n batchedFn.isBusy = false;\n\n return batchedFn;\n}\n","import { Db } from './Db';\nimport {\n DbPatch, DbTablesSet, DbSaveResponse, DbView, DbSubscription,\n} from './types';\nimport {\n makeCumulativePatch, unionPatches, mergeEntityPatches, flattenResponse,\n} from './patchHelpers';\nimport { TempIdMap, IClientIdsMap } from './tempIds';\nimport { objectKeys } from './utils';\nimport isEmpty from 'lodash.isempty';\nimport { Loader, LoaderOptions } from './Loader';\nimport { DataQuery } from '@epam/uui-core';\nimport { SimpleLoadingTracker } from './SimpleLoadingTracker';\nimport { ListLoadingTracker, ListLoadingTrackerOptions } from './ListLoadingTracker';\nimport { batch } from './batch';\n\nexport class DbRef<TTables extends DbTablesSet<TTables>, TDb extends Db<TTables>> {\n private base: TDb;\n private log: { patch: DbPatch<TTables> }[] = [];\n private autoSave = true;\n private savedPoint = 0;\n private tempIdMap: TempIdMap<TTables>;\n public db: TDb;\n protected throttleSaveMs = 1000;\n public readonly idMap: IClientIdsMap;\n constructor(public blank: TDb) {\n this.db = blank;\n this.base = blank;\n this.tempIdMap = new TempIdMap(blank);\n this.idMap = this.tempIdMap;\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n }\n\n /** Saves all committed patches. Useful only if autoSave is off. */\n public save() {\n return this.enqueueSave();\n }\n\n public getAutoSave() {\n return this.autoSave;\n }\n\n public setAutoSave(val: boolean) {\n if (this.autoSave != val) {\n this.autoSave = val;\n this.autoSave && this.enqueueSave();\n this.update();\n }\n }\n\n public revert() {\n this.db = this.base;\n this.log = this.log.slice(0, this.savedPoint);\n this.update();\n }\n\n /** Concrete DbRef instances should override and implement their save logic in this method */\n protected savePatch(patch: DbPatch<TTables>): Promise<DbSaveResponse<TTables>> {\n return Promise.resolve({ submit: {} });\n }\n\n /* Db Update logic */\n\n public commit(patch: DbPatch<TTables>): void {\n const dbBeforeUpdate = this.db.with(patch);\n patch = this.beforeUpdate(patch, dbBeforeUpdate.tables, this.db.tables);\n patch = mergeEntityPatches(this.db.tables, patch);\n this.log.push({ patch });\n this.db = this.db.with(patch);\n\n this.autoSave && this.enqueueSave(null, { throttleMs: this.throttleSaveMs });\n this.update();\n }\n\n private beforeUpdate(patch: DbPatch<TTables>, tables: TTables, prevTables: TTables): DbPatch<TTables> {\n let patchAndDependencies: DbPatch<TTables> = {};\n\n objectKeys(tables)\n .filter((entityName) => patch[entityName] && !tables[entityName].schema.beforeUpdate)\n .forEach((entityName) => {\n patchAndDependencies[entityName] = patch[entityName];\n });\n\n objectKeys(tables)\n .filter((entityName) => patch[entityName] && tables[entityName].schema.beforeUpdate)\n .forEach((entityName) => {\n const schema = tables[entityName].schema;\n const { beforeUpdate } = schema;\n const context = {\n clientIdsMap: this.tempIdMap,\n schema,\n tables,\n prevTables,\n };\n\n const results = patch[entityName].map((e) => beforeUpdate(e, context));\n const updatedPatch = { [entityName]: results.map((result) => result.entity) } as DbPatch<TTables>;\n const dependentEntityPatchesForUpdate = unionPatches(results.filter((result) => result.dependentEntities).map((result) => result.dependentEntities));\n const dependentEntityPatches = this.beforeUpdate(dependentEntityPatchesForUpdate, tables, prevTables);\n\n patchAndDependencies = mergeEntityPatches(tables, unionPatches([\n patchAndDependencies, updatedPatch, dependentEntityPatches,\n ]));\n });\n return patchAndDependencies;\n }\n\n public commitFetch(patch: DbPatch<TTables>): void {\n patch = this.tempIdMap.serverToClientPatch(patch);\n this.rebase(this.base.with(patch));\n this.update();\n }\n\n private rebase(newBase: TDb) {\n this.base = newBase;\n this.db = newBase;\n for (let n = this.savedPoint; n < this.log.length; n++) {\n this.db = this.db.with(this.log[n].patch);\n }\n }\n\n private makeCumulativePatch() {\n const lastLogEntry = this.log.length;\n const logEntriesToSave = this.log.slice(this.savedPoint, lastLogEntry);\n let cumulativePatch = makeCumulativePatch(\n this.db,\n logEntriesToSave.map((t) => t.patch),\n this.tempIdMap,\n );\n cumulativePatch = this.tempIdMap.clientToServerPatch(cumulativePatch);\n\n return cumulativePatch;\n }\n\n private applyResponse(response: DbSaveResponse<TTables>, newSavedPoint: number) {\n this.tempIdMap.appendServerMapping(response);\n\n let serverPatch = flattenResponse(response.submit, this.db.tables);\n serverPatch = mergeEntityPatches(this.db.tables, serverPatch);\n this.savedPoint = newSavedPoint;\n this.base = this.db;\n this.commitFetch(serverPatch);\n }\n\n /* Update subscriptions (aka live views) */\n\n private lastSubscriptionId = 1;\n private subscriptions: Map<number, DbSubscription<any, any>> = new Map();\n public subscribe<TValue, TParams, TDependencies>(\n view: DbView<TDb, TValue, TParams, TDependencies>,\n params: TParams,\n onUpdate: (newValue: TValue) => any,\n ): DbSubscription<TValue, TParams> {\n const id = this.lastSubscriptionId++;\n\n const subscription: DbSubscription<TValue, TParams> = {\n update: (subscriptionParams: TParams) => {\n subscription.currentParams = subscriptionParams;\n subscription.currentValue = this.db.runView(view, subscriptionParams);\n return subscription.currentValue;\n },\n currentParams: null,\n currentValue: null,\n onUpdate,\n unsubscribe: () => {\n this.subscriptions.delete(id);\n },\n };\n\n subscription.update(params);\n\n this.subscriptions.set(id, subscription);\n\n return subscription;\n }\n\n updateHandlers: (() => any)[] = [];\n public onUpdate(handler: () => any) {\n this.subscribe(\n {\n compute: (db) => db,\n compareResults: (a, b) => a === b,\n },\n null,\n handler,\n );\n }\n\n private update() {\n this.subscriptions.forEach((subscription) => {\n const previousValue = subscription.currentValue;\n subscription.update(subscription.currentParams);\n if (subscription.currentValue !== previousValue && subscription.onUpdate) {\n subscription.onUpdate(subscription.currentValue);\n }\n });\n }\n\n /* Error Subscriptions */\n\n public saveErrorHandlers: ((request: DbPatch<TTables>, error: any) => void)[] = [];\n public onSaveError(handler: (request: DbPatch<TTables>, error: any) => void) {\n this.saveErrorHandlers.push(handler);\n }\n\n private saveError(request: DbPatch<TTables>, error: any) {\n this.saveErrorHandlers.forEach((handler) => handler(request, error));\n }\n\n /* Save scheduling */\n\n private enqueueSave = batch(async () => {\n const cumulativePatch = this.makeCumulativePatch();\n const lastLogEntry = this.log.length;\n if (isEmpty(cumulativePatch)) {\n return;\n }\n try {\n const response = await this.savePatch(cumulativePatch);\n this.applyResponse(response, lastLogEntry);\n this.update();\n } catch (error) {\n this.saveError(cumulativePatch, error);\n this.update();\n throw error;\n }\n });\n\n private handleBeforeUnload = (e: BeforeUnloadEvent) => {\n if (this.enqueueSave.isBusy) {\n e.returnValue = false;\n return false;\n }\n };\n\n loaders: Loader<TTables, any, any>[] = [];\n protected makeLoader<TResponse, TRequest>(options: LoaderOptions<TTables, TResponse, TRequest>) {\n const loader = new Loader<TTables, TResponse, TRequest>(this as any, () => new SimpleLoadingTracker<TRequest, TResponse>(), options);\n this.loaders.push(loader);\n return loader;\n }\n\n protected makeListLoader<TItem, TResponse = DataQuery<TItem>, TRequest extends DataQuery<TItem> = DataQuery<TItem>>(\n options: LoaderOptions<TTables, TResponse, TRequest> & ListLoadingTrackerOptions<TItem, TResponse>,\n ) {\n const loader = new Loader<TTables, TResponse, TRequest>(this as any, () => new ListLoadingTracker<TItem, TRequest, TResponse>(), options);\n this.loaders.push(loader);\n return loader;\n }\n\n reload() {\n this.loaders = [];\n }\n}\n","import {\n useState, createContext, useContext, useMemo, useEffect,\n} from 'react';\nimport { DbRef } from './DbRef';\nimport { DbViewOptions } from '.';\n\nexport const DbContext = createContext(null);\n\nexport function useDbRef<TDbRef extends DbRef<any, any>>() {\n return useContext(DbContext) as TDbRef;\n}\n\nexport function useDbView<TDb, TResult, TParams = void, TDependencies = void>(\n fn: (db: TDb, params: TParams, dependencies: TDependencies) => TResult,\n params?: TParams,\n options?: DbViewOptions<TDb, TResult, TParams, TDependencies>,\n): TResult {\n const dbRef = useDbRef();\n const [state, setState] = useState<TResult>();\n const subscription = useMemo(() => dbRef.subscribe<TResult, TParams, TDependencies>({ compute: fn, ...options }, params, setState), []);\n subscription.update(params);\n\n useEffect(() => {\n return () => subscription.unsubscribe();\n }, []);\n\n return subscription.currentValue;\n}\n"],"names":["DbRelationType","zip","shallowEqual","transform","isEqual","I","Seq","getFilterPredicate","getSearchFilter","getOrderComparer","groupBy","map","merge","countBy","forEach","pick","filter","isEmpty","createContext","useContext","useState","useMemo","useEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["rollup://@epam/uui-db/./src/types.ts","rollup://@epam/uui-db/./src/utils.ts","rollup://@epam/uui-db/./src/Db.ts","rollup://@epam/uui-db/./src/DbTable.ts","rollup://@epam/uui-db/./src/patchHelpers.ts","rollup://@epam/uui-db/./src/tempIds.tsx","rollup://@epam/uui-db/./src/Loader.ts","rollup://@epam/uui-db/./src/SimpleLoadingTracker.ts","rollup://@epam/uui-db/./src/ListLoadingTracker.ts","rollup://@epam/uui-db/./src/batch.ts","rollup://@epam/uui-db/./src/DbRef.ts","rollup://@epam/uui-db/./src/reactHooks.ts"],"sourcesContent":["import { DataQuery } from '@epam/uui-core';\r\nimport { DbTable } from './DbTable';\r\nimport { IClientIdsMap } from './tempIds';\r\n\r\nexport type DbTablesSet<TTables extends DbTablesSet<TTables>> = { [TEntityName in keyof TTables]: DbTable<any, any, TTables> };\r\n\r\nexport type DbTablePatch<TEntity> = Partial<TEntity>[];\r\n\r\nexport type DbTableEntityByTable<TTable, TTables extends DbTablesSet<TTables>> = TTable extends DbTable<infer TEntity, any, TTables> ? TEntity : void;\r\nexport type DbTableIdByTable<TTable, TTables extends DbTablesSet<TTables>> = TTable extends DbTable<any, infer TId, TTables> ? TId : void;\r\ntype DbTablePatchByTable<TTable, TTables extends DbTablesSet<TTables>> = DbTablePatch<DbTableEntityByTable<TTable, TTables>>;\r\n\r\nexport type DbPatch<TTables extends DbTablesSet<TTables>> = { [TEntityName in keyof TTables]?: DbTablePatchByTable<TTables[TEntityName], TTables> };\r\n\r\nexport enum DbRelationType {\r\n Aggregation,\r\n Association\r\n}\r\n\r\nexport type DbFieldFk<TEntity> = {\r\n tableName: string | ((entity: TEntity) => string);\r\n relationType: DbRelationType;\r\n};\r\n\r\nexport interface DbFieldSchema<TField extends keyof TEntity, TEntity> {\r\n fk?: DbFieldFk<TEntity>;\r\n isGenerated?: boolean;\r\n isClientOnly?: boolean;\r\n isReadOnly?: boolean;\r\n default?: TEntity[TField];\r\n toServer?: (value: TEntity[TField]) => TEntity[TField];\r\n toClient?: (value: TEntity[TField]) => TEntity[TField];\r\n disableFlatten?: boolean;\r\n}\r\n\r\nexport type DbPkFieldType = string | number | (string | number)[];\r\n\r\nexport type BeforeUpdateContext<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> = {\r\n clientIdsMap: IClientIdsMap;\r\n schema: DbEntitySchema<TEntity, TId, TTables>;\r\n tables: DbTablesSet<TTables>;\r\n};\r\n\r\ntype DbEntityBeforeUpdateResult<TEntity, TTables extends DbTablesSet<TTables>> = {\r\n entity: TEntity;\r\n dependentEntities?: DbPatch<TTables>;\r\n};\r\n\r\ntype DbTableIndexDefinition<TEntity> = keyof TEntity;\r\n\r\nexport type DbEntitySchema<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> = {\r\n tableName: keyof TTables;\r\n typeName: string;\r\n searchBy?: (keyof TEntity)[];\r\n fields?: Partial<{ [TField in keyof TEntity]: DbFieldSchema<TField, TEntity> }>;\r\n isClientOnly?: boolean | ((entity: Partial<TEntity>) => boolean);\r\n beforeUpdate?: (entity: TEntity, context: BeforeUpdateContext<TEntity, TId, TTables>) => DbEntityBeforeUpdateResult<TEntity, TTables>;\r\n primaryKey: TId extends any[] ? KeysOfType<TEntity, string | number>[] : KeysOfType<TEntity, string | number>;\r\n indexes?: DbTableIndexDefinition<TEntity>[];\r\n deleteFlag?: keyof TEntity;\r\n};\r\n\r\nexport type DbSchema<TTables extends DbTablesSet<TTables>> = {\r\n [TTypeName in keyof TTables]: DbEntitySchema<any, any, TTables>;\r\n};\r\n\r\nexport interface DbQuery<TEntity> extends DataQuery<TEntity> {}\r\n\r\nexport interface IQueryable<TEntity, TId> {\r\n query(q: DbQuery<TEntity>): TEntity[];\r\n byId(id: TId): TEntity;\r\n}\r\n\r\nexport interface ServerError {\r\n message?: string;\r\n}\r\n\r\ntype DbSaveEntityResponse<TEntity, TId> = {\r\n id: TId;\r\n payload: Partial<TEntity>;\r\n};\r\n\r\nexport interface DbSaveResponse<TTables extends DbTablesSet<TTables>> {\r\n submit: {\r\n [EntityName in keyof TTables]?: DbSaveEntityResponse<DbTableEntityByTable<TTables[EntityName], TTables>, DbTableIdByTable<TTables[EntityName], TTables>>[];\r\n };\r\n}\r\n\r\nexport type DbViewFunction<TDb, TResult, TParams = void, TDependencies = void> = (db: TDb, parameters?: TParams, dependencies?: TDependencies) => TResult;\r\n\r\nexport interface DbViewOptions<TDb, TResult, TParams, TDependencies = void> {\r\n getKey?: (parameters: TParams) => string;\r\n getDependencies?: (db: TDb, parameters: TParams) => TDependencies;\r\n compareDependencies?: (prev: TDependencies, next: TDependencies) => boolean;\r\n compareResults?: (prev: TResult, current: TResult) => boolean;\r\n traceDiff?: boolean;\r\n}\r\n\r\nexport interface DbView<TDb, TResult, TParams = void, TDependencies = void> extends DbViewOptions<TDb, TResult, TParams, TDependencies> {\r\n compute: DbViewFunction<TDb, TResult, TParams, TDependencies>;\r\n}\r\n\r\nexport type KeysOfType<T, TProp> = { [P in keyof T]: T[P] extends TProp ? P : never }[keyof T];\r\n\r\nexport interface DbSubscription<TValue, TParams> {\r\n update(params: TParams): TValue;\r\n currentValue: TValue;\r\n currentParams: TParams;\r\n onUpdate: (newValue: TValue) => void;\r\n unsubscribe: () => void;\r\n}\r\n\r\nexport type ViewCacheItem = { dependencies: any; currentValue: any; computedOnDb: any };\r\n\r\nexport interface LoadingState<TRequest> {\r\n isLoading: boolean;\r\n isComplete: boolean;\r\n request: TRequest;\r\n missing?: TRequest;\r\n}\r\n\r\nexport interface ILoadingTracker<TRequest, TResult> {\r\n diff(request: TRequest): TRequest;\r\n append(request: TRequest, result?: TResult): void;\r\n count?(request: TRequest): { knownCount: number; exactCount: number };\r\n}\r\n","import shallowEqual from 'shallowequal';\r\nimport zip from 'lodash.zip';\r\nimport transform from 'lodash.transform';\r\nimport isEqual from 'react-fast-compare';\r\n\r\n// TBD: New typescript would contain better typing for this. Remove this hack after update.\r\nexport const objectKeys: <T>(obj: T) => (keyof T)[] = Object.keys as any;\r\n\r\nexport function defaultCompareViewDependencies<T>(prev: T, next: T): boolean {\r\n if (Array.isArray(prev) && Array.isArray(next)) {\r\n if (prev.length === next.length) {\r\n return zip(prev, next).every(([p, n]) => shallowEqual(p, n));\r\n }\r\n return false;\r\n }\r\n return shallowEqual(prev, next);\r\n}\r\n\r\n/**\r\n * Deep diff between two object, using lodash\r\n * @param {Object} object Object compared\r\n * @param {Object} base Object to compare with\r\n * @return {Object} Return a new object who represent the diff\r\n */\r\nexport function difference(obj: any, baseObj: any) {\r\n function changes(object: any, base: any) {\r\n return transform(object, function (result: any, value: any, key: any) {\r\n if (!isEqual(value, base[key])) {\r\n result[key] = (typeof value === 'object' && typeof base[key] === 'object') ? changes(value, base[key]) : value;\r\n }\r\n });\r\n }\r\n return changes(obj, baseObj);\r\n}\r\n","import {\r\n DbPatch, DbTablesSet, DbTableEntityByTable, DbView, DbRelationType, ViewCacheItem,\r\n} from './types';\r\nimport { objectKeys, defaultCompareViewDependencies, difference } from './utils';\r\nimport isEqual from 'react-fast-compare';\r\n\r\ntype ViewCache = Map<DbView<any, any, any, any>, Map<string, ViewCacheItem>>;\r\n\r\nexport abstract class Db<TTables extends DbTablesSet<TTables>> {\r\n private viewCache: ViewCache = new Map();\r\n constructor(public tables: TTables, reusedCache?: ViewCache) {\r\n if (reusedCache) {\r\n this.viewCache = new Map(reusedCache);\r\n } else {\r\n this.viewCache = new Map();\r\n }\r\n }\r\n\r\n private update(mutate: (db: this) => void): this {\r\n const clone = new (this.constructor as any)(this.tables, this.viewCache);\r\n clone.tables = { ...this.tables };\r\n mutate(clone);\r\n return clone;\r\n }\r\n\r\n public with(patch: DbPatch<TTables>): this {\r\n return this.update((db) => {\r\n objectKeys(db.tables).forEach((entityName) => {\r\n if (patch[entityName]) {\r\n db.tables[entityName] = db.tables[entityName].with(patch[entityName]);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /* Views (cached db projections) */\r\n\r\n valueAbsent = Symbol('ValueAbsent');\r\n public runView<TResult, TParams = void, TDependencies = void>(view: DbView<this, TResult, TParams, TDependencies>, params?: TParams) {\r\n let cache = this.viewCache.get(view);\r\n\r\n if (!cache) {\r\n cache = new Map();\r\n this.viewCache.set(view, cache);\r\n }\r\n\r\n const key = view.getKey ? view.getKey(params) : JSON.stringify(params);\r\n\r\n let cacheItem: ViewCacheItem = cache.get(key);\r\n\r\n if (!cacheItem) {\r\n cacheItem = {\r\n dependencies: this.valueAbsent,\r\n currentValue: this.valueAbsent,\r\n computedOnDb: this.valueAbsent,\r\n };\r\n cache.set(key, cacheItem);\r\n }\r\n\r\n let shouldUpdate = this !== cacheItem.computedOnDb;\r\n let dependencies: any = this.valueAbsent;\r\n\r\n if (view.getDependencies) {\r\n const compare = view.compareDependencies || defaultCompareViewDependencies;\r\n dependencies = view.getDependencies(this, params);\r\n shouldUpdate = !compare(cacheItem.dependencies, dependencies);\r\n }\r\n\r\n const previousValue = cacheItem.currentValue;\r\n\r\n if (shouldUpdate) {\r\n cacheItem.dependencies = dependencies;\r\n const newValue = view.compute(this, params, dependencies);\r\n cacheItem.computedOnDb = this;\r\n\r\n const compareResults = view.compareResults || isEqual;\r\n\r\n if (!compareResults(previousValue, newValue)) {\r\n if (view.traceDiff) {\r\n console.debug(difference(previousValue, newValue));\r\n }\r\n\r\n cacheItem.currentValue = newValue;\r\n }\r\n }\r\n\r\n return cacheItem.currentValue as TResult;\r\n }\r\n}\r\n","import {\r\n DbTablePatch, DbQuery, DbEntitySchema, DbPkFieldType, DbTablesSet,\r\n} from './types';\r\nimport * as I from 'immutable';\r\nimport {\r\n SortDirection, getFilterPredicate, getOrderComparer, DataQueryFilter, SortingOption, getSearchFilter, DataQuery,\r\n} from '@epam/uui-core';\r\nimport { Seq } from 'immutable';\r\n\r\ninterface DbIndex<TEntity> {\r\n field: keyof TEntity;\r\n map: I.Map<any, I.Set<any>>;\r\n}\r\n\r\ninterface DbTableState<TEntity, TTables extends DbTablesSet<TTables>> {\r\n pk: I.Map<any, TEntity>;\r\n indexes: DbIndex<TEntity>[];\r\n}\r\n\r\nexport class DbTable<TEntity, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>> {\r\n constructor(public readonly schema: DbEntitySchema<TEntity, TId, TTables>, private state?: DbTableState<TEntity, TTables>, private q?: DbQuery<TEntity>) {\r\n if (!state) {\r\n const indexes: DbIndex<TEntity>[] = (schema.indexes || []).map((indexDef) => {\r\n return {\r\n field: indexDef,\r\n map: I.Map(),\r\n };\r\n });\r\n\r\n this.state = { pk: I.Map(), indexes };\r\n }\r\n\r\n if (!q) {\r\n this.q = {};\r\n }\r\n }\r\n\r\n protected keyToImmutable(id: TId): any {\r\n if (Array.isArray(id)) {\r\n return I.List(id);\r\n } else {\r\n return id;\r\n }\r\n }\r\n\r\n public byId(id: TId): TEntity {\r\n return this.state.pk.get(this.keyToImmutable(id));\r\n }\r\n\r\n public getId(entity: Partial<TEntity>): TId {\r\n if (Array.isArray(this.schema.primaryKey)) {\r\n return this.schema.primaryKey.map((key: keyof TEntity) => entity[key]) as any as TId;\r\n }\r\n return entity[this.schema.primaryKey as keyof TEntity] as any as TId;\r\n }\r\n\r\n private update(mutate: (t: DbTable<TEntity, TId, TTables>) => void): this {\r\n const clone = new (this.constructor as any)(this.schema, this.state, this.q);\r\n mutate(clone);\r\n return clone;\r\n }\r\n\r\n /* Mutation */\r\n\r\n public with(patch: DbTablePatch<TEntity>) {\r\n const updates = patch.map((entityPatch) => {\r\n const id = this.getId(entityPatch);\r\n const immId = this.keyToImmutable(id);\r\n const existing = this.state.pk.get(immId);\r\n let isDeleted = false;\r\n let updated = entityPatch as TEntity;\r\n if (existing) {\r\n updated = { ...existing, ...entityPatch };\r\n\r\n if (this.schema.deleteFlag) {\r\n isDeleted = (updated[this.schema.deleteFlag] as unknown) === true;\r\n }\r\n }\r\n\r\n return {\r\n id, immId, patch: entityPatch, existing, updated, isNew: !existing, isDeleted,\r\n };\r\n });\r\n\r\n const idVal = Seq.Keyed<TId, TEntity>(updates.map((entity) => [entity.immId, entity.updated]));\r\n let newPk = this.state.pk.merge(idVal);\r\n\r\n // TBD: replace with deleteAll after migrating to immutable 4\r\n updates\r\n .filter((u) => u.isDeleted)\r\n .forEach((u) => {\r\n newPk = newPk.delete(u.immId);\r\n });\r\n\r\n const newIndexes = this.state.indexes.map((index) => {\r\n let newMap = index.map;\r\n\r\n for (let n = 0; n < updates.length; n++) {\r\n const update = updates[n];\r\n\r\n const newKey = update.updated[index.field];\r\n\r\n if (update.existing) {\r\n const oldKey = update.existing[index.field];\r\n\r\n if (oldKey !== newKey || update.isDeleted) {\r\n newMap = newMap.update(oldKey, (set) => set.remove(update.immId));\r\n }\r\n }\r\n\r\n if (!update.isDeleted) {\r\n newMap = newMap.update(newKey, I.Set(), (set) => set.add(update.immId));\r\n }\r\n }\r\n\r\n return { ...index, map: newMap };\r\n });\r\n\r\n const newState: DbTableState<TEntity, TTables> = { pk: newPk, indexes: newIndexes };\r\n\r\n return this.update((t) => (t.state = newState));\r\n }\r\n\r\n /* Query */\r\n\r\n public find(filter: DataQueryFilter<TEntity>): DbTable<TEntity, TId, TTables> {\r\n return this.update((t) => (t.q = { ...t.q, filter: { ...(this.q.filter as any), ...(filter as any) } }));\r\n }\r\n\r\n public order(order: SortingOption[]) {\r\n return this.update((t) => (t.q = { ...t.q, sorting: order }));\r\n }\r\n\r\n public orderBy(field: Extract<keyof TEntity, string>, direction: SortDirection = 'asc') {\r\n return this.update((t) => (t.q = { ...t.q, sorting: [{ field, direction }] }));\r\n }\r\n\r\n public thenBy(field: Extract<keyof TEntity, string>, direction?: SortDirection) {\r\n return this.update((t) => (t.q = { ...t.q, sorting: [...t.q.sorting, { field, direction }] }));\r\n }\r\n\r\n public search(text: string) {\r\n if (!this.schema.searchBy) {\r\n throw new Error(`Can't search in the ${this.schema.typeName} table - searchBy is not defined in the schema.`);\r\n }\r\n return this.update((t) => (t.q = { ...t.q, search: text }));\r\n }\r\n\r\n /* Materializing */\r\n\r\n public range(from: number, count: number): TEntity[] {\r\n return this.runQuery({ ...this.q, range: { from, count } });\r\n }\r\n\r\n public count() {\r\n return this.runQuery(this.q).length;\r\n }\r\n\r\n public one(): TEntity {\r\n return this.runQuery(this.q)[0] || null;\r\n }\r\n\r\n public toArray(): TEntity[] {\r\n return this.runQuery(this.q);\r\n }\r\n\r\n public map<T>(fn: (item: TEntity, index?: number) => T) {\r\n return this.toArray().map(fn);\r\n }\r\n\r\n /* Query implementation */\r\n\r\n private runQuery(q: DataQuery<TEntity>) {\r\n let result: TEntity[] = null;\r\n let filter = q.filter;\r\n\r\n if (filter) {\r\n const indexes = this.state.indexes;\r\n\r\n // Try to use indexes to fulfill filter conditions\r\n for (let n = 0; n < indexes.length; n++) {\r\n const index = indexes[n];\r\n\r\n if (index.field in filter) {\r\n const { [index.field]: condition, ...rest } = filter as any;\r\n let conditionValues: any[] = null;\r\n\r\n if (condition != null && typeof condition === 'object') {\r\n // Attempt to use index for 'in' and 'isNull' criteria.\r\n // We need to be very conservative here, indexed field should work the same way as getPatternPredicate. So\r\n // - it's better to leave corner cases to getPatternPredicate\r\n\r\n const { in: inCriteria, isNull: nullCriteria, ...restCriteria } = condition as any;\r\n if (inCriteria && Array.isArray(inCriteria)) {\r\n conditionValues = inCriteria;\r\n } else {\r\n restCriteria.in = inCriteria;\r\n }\r\n\r\n // Conditions in getPatternPredicate are composed with 'and' logic,\r\n // For now, let's not attempt to handle tricky cases like { in: [1,2] isNull: true }, or { in: [1, null] isNull: false }\r\n // - just leave this to getPatternPredicate.\r\n // Let's just handle the a most common case { isNull: true } - find all null and undefined\r\n if (nullCriteria === true && !conditionValues) {\r\n conditionValues = [null, undefined];\r\n } else {\r\n restCriteria.in = inCriteria;\r\n }\r\n\r\n // Keep other conditions, e.g. { in: [1,2,3], isNull: true } - in works via index, isNull - via filter\r\n if (Object.keys(restCriteria).length > 0) {\r\n rest[index.field] = restCriteria;\r\n }\r\n } else {\r\n conditionValues = [condition];\r\n }\r\n\r\n if (conditionValues) {\r\n result = [];\r\n\r\n for (let i = 0; i < conditionValues.length; i++) {\r\n const idsSet = index.map.get(conditionValues[i]);\r\n if (idsSet) {\r\n const idsArray = idsSet.toArray();\r\n for (let j = 0; j < idsArray.length; j++) {\r\n const item = this.state.pk.get(idsArray[j]);\r\n result.push(item);\r\n }\r\n }\r\n }\r\n\r\n filter = Object.keys(rest).length > 0 ? (rest as any) : null;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!result) {\r\n result = this.state.pk.toArray();\r\n }\r\n\r\n if (filter) {\r\n const predicate = getFilterPredicate<TEntity>(q.filter);\r\n result = result.filter(predicate);\r\n }\r\n\r\n if (q.search) {\r\n const searchFilter = getSearchFilter(q.search);\r\n result = result.filter((item) => searchFilter(this.schema.searchBy.map((field) => (item as any)[field])));\r\n }\r\n\r\n if (q.sorting) {\r\n const comparer = getOrderComparer(q.sorting);\r\n result = result.sort(comparer);\r\n }\r\n\r\n if (q.range) {\r\n result = result.slice(q.range.from, q.range.from + q.range.count);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Db } from './Db';\r\nimport {\r\n DbPatch, DbTablesSet, DbRelationType, DbEntitySchema, DbPkFieldType,\r\n} from './types';\r\nimport { DbTable } from './DbTable';\r\nimport * as I from 'immutable';\r\nimport { objectKeys } from './utils';\r\nimport groupBy from 'lodash.groupby';\r\nimport map from 'lodash.map';\r\nimport merge from 'lodash.merge';\r\nimport countBy from 'lodash.countby';\r\nimport filter from 'lodash.filter';\r\nimport forEach from 'lodash.foreach';\r\nimport pick from 'lodash.pick';\r\nimport { IClientIdsMap } from './tempIds';\r\n\r\nexport function unionPatches<TTables extends DbTablesSet<TTables>>(patches: DbPatch<TTables>[]): DbPatch<TTables> {\r\n const result: DbPatch<TTables> = {};\r\n\r\n patches.forEach((patch) => {\r\n objectKeys(patch).forEach((tableName) => {\r\n result[tableName] = result[tableName] ? [...result[tableName], ...patch[tableName]] : patch[tableName];\r\n });\r\n });\r\n\r\n return result;\r\n}\r\n\r\nexport function mergeEntityPatches<TTables extends DbTablesSet<TTables>>(tables: TTables, patch: DbPatch<TTables>): DbPatch<TTables> {\r\n const result: DbPatch<TTables> = {};\r\n\r\n objectKeys(patch).forEach((key) => {\r\n const table = tables[key];\r\n const groupedEntities = groupBy(patch[key], (item) => table.getId(item));\r\n const tablePatch = map(groupedEntities, (entities) => {\r\n const tablePatchResult = merge({}, ...entities);\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n const props = objectKeys(tablePatchResult).filter(\r\n (prop) =>\r\n Object.keys(\r\n countBy(\r\n entities.filter((entity) => entity[prop as string] !== undefined),\r\n (entity) => entity[prop as string],\r\n ),\r\n ).length > 1,\r\n );\r\n if (props.length) {\r\n console.warn('mergeEntityPatches: Different property values found for the same entity.\\nProperty names:\\n', props, '\\nEntities:\\n', ...entities);\r\n }\r\n }\r\n\r\n return tablePatchResult;\r\n });\r\n\r\n result[key] = tablePatch;\r\n });\r\n\r\n return result;\r\n}\r\n\r\nfunction flattenResponseHelper<TTables extends DbTablesSet<any>>(result: DbPatch<TTables>, object: any, tablesByTypeName: Record<string, DbTable<any, any, any>>) {\r\n if (Array.isArray(object)) {\r\n object.forEach((item) => flattenResponseHelper(result, item, tablesByTypeName));\r\n } else if (typeof object === 'object') {\r\n const clone: any = {};\r\n let tableKey;\r\n let fields: { [id: string]: any } = {};\r\n\r\n if ('__typename' in object) {\r\n const table = tablesByTypeName[object.__typename];\r\n if (table) {\r\n tableKey = table.schema.tableName as string;\r\n fields = table.schema.fields;\r\n }\r\n }\r\n\r\n for (const key in object) {\r\n const value = object[key];\r\n const field = fields[key];\r\n\r\n if (\r\n (field && !!field.disableFlatten)\r\n || typeof value !== 'object'\r\n || value === null\r\n || (Array.isArray(value) && value.every((item) => typeof item !== 'object'))\r\n ) {\r\n clone[key] = value;\r\n } else {\r\n flattenResponseHelper(result, value, tablesByTypeName);\r\n }\r\n }\r\n\r\n if (tableKey) {\r\n result[tableKey].push(clone);\r\n }\r\n }\r\n}\r\n\r\nexport function flattenResponse<TTables extends DbTablesSet<any>>(response: any, tables: TTables): DbPatch<TTables> {\r\n const result: DbPatch<TTables> = {};\r\n\r\n const tablesByTypeName: Record<string, DbTable<any, any, any>> = {};\r\n Object.values(tables).forEach((table) => (tablesByTypeName[table.schema.typeName] = table));\r\n objectKeys(tables).forEach(() => tablesByTypeName);\r\n\r\n objectKeys(tables).forEach((key) => (result[key] = []));\r\n\r\n flattenResponseHelper(result, response, tablesByTypeName);\r\n return result;\r\n}\r\n\r\nexport function isPatchBlank<TTables extends DbTablesSet<TTables>>(patch: DbPatch<TTables>): boolean {\r\n return !objectKeys(patch).some((key) => patch[key].length > 0);\r\n}\r\n\r\n/**\r\n * Given several patches, creates a new single patch with all fields from all entities in all patches.\r\n */\r\nexport function makeCumulativePatch<TTables extends DbTablesSet<TTables>>(\r\n updatedDb: Db<TTables>,\r\n patches: DbPatch<TTables>[],\r\n clientIdsMap: IClientIdsMap,\r\n): DbPatch<TTables> {\r\n const result: DbPatch<TTables> = {};\r\n\r\n objectKeys(updatedDb.tables).forEach((entityName) => {\r\n const table = updatedDb.tables[entityName];\r\n const schema = table.schema;\r\n\r\n let ids = I.Set();\r\n patches.forEach((patch) => {\r\n const filteredPatch = (patch[entityName] || []).filter((entity) => hasServerFields(entity, schema, clientIdsMap, updatedDb.tables));\r\n ids = ids.union(filteredPatch.map((e) => table.getId(e)));\r\n });\r\n\r\n const entities = ids\r\n .map((id) => table.byId(id))\r\n .filter((e) => !isClientOnly(e, schema))\r\n .toArray();\r\n\r\n if (entities.length > 0) {\r\n result[entityName] = entities;\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n\r\nexport function isClientOnly<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(entity: T, schema: DbEntitySchema<T, TId, TTables>) {\r\n if (typeof schema.isClientOnly === 'function') {\r\n return schema.isClientOnly(entity);\r\n }\r\n\r\n return !!schema.isClientOnly;\r\n}\r\n\r\nexport function getId<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(entity: Partial<T>, schema: DbEntitySchema<T, TId, TTables>): TId {\r\n if (typeof schema.primaryKey == 'string') {\r\n return (entity as any)[schema.primaryKey] as TId;\r\n }\r\n\r\n const result: (string | number)[] = [];\r\n forEach(pick(entity, schema.primaryKey), (value) => {\r\n result.push(value as unknown as string | number);\r\n });\r\n\r\n return result as TId;\r\n}\r\n\r\nexport function isNew<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(\r\n entity: Partial<T>,\r\n schema: DbEntitySchema<T, TId, TTables>,\r\n clientIdsMap: IClientIdsMap,\r\n) {\r\n const id = getId(entity, schema);\r\n return !clientIdsMap.clientToServer(id as number);\r\n}\r\n\r\nexport function hasServerFields<T, TId extends DbPkFieldType, TTables extends DbTablesSet<TTables>>(\r\n entity: Partial<T>,\r\n schema: DbEntitySchema<T, TId, TTables>,\r\n clientIdsMap: IClientIdsMap,\r\n tables: TTables,\r\n) {\r\n const fullEntity = {\r\n ...(tables[schema.tableName].byId((entity as any).id) || {}),\r\n ...entity,\r\n };\r\n\r\n if (isClientOnly(fullEntity, schema)) {\r\n return false;\r\n }\r\n\r\n return objectKeys(entity).some((fieldName) => {\r\n const fieldSchema = schema.fields[fieldName];\r\n return !fieldSchema || !(fieldSchema.isClientOnly || fieldSchema.isReadOnly || (fieldSchema.isGenerated && !isNew(entity, schema, clientIdsMap)));\r\n });\r\n}\r\n\r\nexport function getParentEntities<TTables extends DbTablesSet<TTables>>(patch: DbPatch<TTables>, tables: TTables): DbPatch<TTables> {\r\n const dependenciesPatch: DbPatch<TTables> = {};\r\n objectKeys(patch).forEach((key) => {\r\n const table = tables[key];\r\n const tableSchema = table.schema;\r\n\r\n const fields = filter(\r\n map(tableSchema.fields, (field, name) => ({ ...field, name })),\r\n (field) => field.fk && field.fk.relationType == DbRelationType.Aggregation,\r\n );\r\n\r\n const tablePatch = patch[key];\r\n fields.forEach((field) => {\r\n const {\r\n fk: { tableName },\r\n name,\r\n } = field;\r\n tablePatch.forEach((entity) => {\r\n const actualTableName = (typeof tableName == 'function' ? tableName(entity) : tableName) as keyof TTables;\r\n const dbEntity = table.byId(table.getId(entity));\r\n const parentEntity = tables[actualTableName].byId(dbEntity[name]);\r\n const idFields = pick(parentEntity, tables[actualTableName].schema.primaryKey);\r\n if (parentEntity) {\r\n dependenciesPatch[actualTableName] = dependenciesPatch[actualTableName] || [];\r\n dependenciesPatch[actualTableName].push(idFields as any);\r\n }\r\n });\r\n });\r\n });\r\n return dependenciesPatch;\r\n}\r\n\r\nexport function getEntityParentDependencies<TEntity, TTables extends DbTablesSet<TTables>>(\r\n entity: Partial<TEntity>,\r\n entityName: keyof TTables,\r\n tables: TTables,\r\n): DbPatch<TTables> {\r\n let patch = { [entityName]: [entity] } as DbPatch<TTables>;\r\n const resultPatches: DbPatch<TTables>[] = [];\r\n\r\n while (true) {\r\n const parents = getParentEntities(patch, tables);\r\n if (isPatchBlank(parents)) {\r\n break;\r\n }\r\n resultPatches.push(parents);\r\n patch = parents;\r\n }\r\n\r\n let result = unionPatches([patch, ...resultPatches]);\r\n result = mergeEntityPatches(tables, result);\r\n\r\n return result;\r\n}\r\n","import {\r\n DbTablePatch, DbTablesSet, DbPatch, DbFieldSchema, DbSaveResponse,\r\n} from './types';\r\nimport { Db } from './Db';\r\nimport { objectKeys } from './utils';\r\nimport { DataQueryFilter, DataQueryFilterCondition } from '@epam/uui-core';\r\n\r\nlet lastTempId = -1;\r\n\r\nexport function getTempId() {\r\n return --lastTempId;\r\n}\r\n\r\nexport function isTempId(val: any): val is number {\r\n return typeof val === 'number' && val < 0;\r\n}\r\n\r\nexport interface IClientIdsMap {\r\n clientToServer(id: number): any;\r\n serverToClient(tableName: string, id: any): number;\r\n clientToServerRequest<T>(request: T): T;\r\n clientToServerDataFilter(filter: DataQueryFilter<any>): DataQueryFilter<any>;\r\n}\r\n\r\nexport class TempIdMap<TTables extends DbTablesSet<TTables>> implements IClientIdsMap {\r\n private serverToClientIds = new Map<keyof TTables, Map<any, number>>();\r\n private clientToServerIds = new Map<number, any>();\r\n constructor(private db: Db<TTables>) {}\r\n public clientToServer = (id: number): any => this.clientToServerIds.get(id);\r\n public serverToClient = (tableName: string, id: any): number => this.getServerToClientMap(tableName as any).get(id);\r\n public clientToServerRequest = (request: any) => {\r\n request = { ...request };\r\n\r\n if (request.filter) {\r\n request.filter = this.clientToServerDataFilter(request.filter);\r\n }\r\n\r\n return request;\r\n };\r\n\r\n public clientToServerDataFilter = (filter: DataQueryFilter<any>) => {\r\n filter = { ...filter };\r\n const keys = Object.keys(filter);\r\n\r\n // I hope that we can rely that there won't be any negative numbers, which are not IDs, in queries.\r\n // We need to invent better heuristics or a schema otherwise.\r\n const clientToServer = (id: number) => {\r\n const found = this.clientToServer(id);\r\n if (found) {\r\n return found;\r\n } else {\r\n return id;\r\n }\r\n };\r\n\r\n for (let n = 0; n < keys.length; n++) {\r\n const key = keys[n];\r\n let condition = filter[key] as DataQueryFilterCondition<any>;\r\n if (condition != null && typeof condition === 'object') {\r\n condition = { ...condition };\r\n if ('in' in condition && Array.isArray(condition.in) && condition.in.length) {\r\n condition.in = condition.in.map(clientToServer);\r\n }\r\n } else {\r\n condition = clientToServer(condition);\r\n }\r\n filter[key] = condition;\r\n }\r\n return filter;\r\n };\r\n\r\n private copyPatch(patch: DbPatch<TTables>) {\r\n const newPatch = { ...patch };\r\n\r\n objectKeys(patch).forEach((tableName) => {\r\n const tablePatch: DbTablePatch<any> = patch[tableName].map((entityPatch) => ({ ...entityPatch }));\r\n newPatch[tableName] = tablePatch;\r\n });\r\n\r\n return newPatch;\r\n }\r\n\r\n // Iterate thru every field in every patch for every table, matching certain field criteria. The patch is mutated!\r\n protected mapFields(\r\n patch: DbPatch<TTables>,\r\n filter: (schema: DbFieldSchema<any, any>, name: string) => boolean,\r\n callback: (fieldName: any, fieldSchema: DbFieldSchema<any, any>, fieldValue: any, entityPatch: any, tableName: keyof TTables) => void,\r\n ): void {\r\n objectKeys(patch).forEach((tableName) => {\r\n const schema = this.db.tables[tableName].schema;\r\n const fields = objectKeys(schema.fields || [])\r\n .map((fieldName) => {\r\n const fieldSchema = schema.fields[fieldName as any];\r\n if (filter(fieldSchema, fieldName as string)) {\r\n return { name: fieldName, schema: fieldSchema };\r\n }\r\n })\r\n .filter((f) => !!f);\r\n\r\n if (!fields.length) {\r\n return;\r\n }\r\n\r\n patch[tableName].forEach((entityPatch) => {\r\n for (let n = 0; n < fields.length; n++) {\r\n const field = fields[n];\r\n\r\n const fieldValue = entityPatch[field.name as any];\r\n\r\n callback(field.name, field.schema, fieldValue, entityPatch, tableName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n protected getServerToClientMap(tableName: keyof TTables) {\r\n const existing = this.serverToClientIds.get(tableName);\r\n\r\n if (existing) {\r\n return existing;\r\n } else {\r\n const newMap = new Map();\r\n this.serverToClientIds.set(tableName, newMap);\r\n return newMap;\r\n }\r\n }\r\n\r\n public serverToClientPatch(patch: DbPatch<TTables>) {\r\n patch = this.copyPatch(patch);\r\n\r\n // We map PK in a separate pass, as we need to remap all PKs before re-mapping FKs\r\n this.mapFields(\r\n patch,\r\n (f) => f.isGenerated,\r\n (fieldName, fieldSchema, fieldValue, entityPatch, tableName) => {\r\n let clientId = this.getServerToClientMap(tableName).get(fieldValue);\r\n if (!clientId) {\r\n clientId = getTempId();\r\n this.clientToServerIds.set(clientId, fieldValue);\r\n this.getServerToClientMap(tableName).set(fieldValue, clientId);\r\n }\r\n entityPatch[fieldName] = clientId;\r\n },\r\n );\r\n\r\n this.mapFields(\r\n patch,\r\n (f) => !!(f.fk || f.default != null || f.toClient),\r\n (fieldName, fieldSchema, fieldValue, entityPatch) => {\r\n let isUndefined = typeof fieldValue === 'undefined';\r\n\r\n if (fieldSchema.default != null && fieldValue == null) {\r\n fieldValue = fieldSchema.default;\r\n isUndefined = false;\r\n }\r\n\r\n if (fieldSchema.fk && fieldValue != null) {\r\n const fkTableName = typeof fieldSchema.fk.tableName === 'function' ? fieldSchema.fk.tableName(entityPatch) : fieldSchema.fk.tableName;\r\n let clientId = this.getServerToClientMap(fkTableName as keyof TTables).get(fieldValue);\r\n if (!clientId) {\r\n clientId = getTempId();\r\n this.clientToServerIds.set(clientId, fieldValue);\r\n this.getServerToClientMap(fkTableName as keyof TTables).set(fieldValue, clientId);\r\n }\r\n fieldValue = clientId;\r\n }\r\n\r\n if (!isUndefined && fieldSchema.toClient) {\r\n fieldValue = fieldSchema.toClient(fieldValue);\r\n }\r\n\r\n if (!isUndefined) {\r\n entityPatch[fieldName] = fieldValue;\r\n }\r\n },\r\n );\r\n\r\n return patch;\r\n }\r\n\r\n public clientToServerPatch(patch: DbPatch<TTables>) {\r\n patch = this.copyPatch(patch);\r\n\r\n this.mapFields(\r\n patch,\r\n (f) => f.isGenerated || !!f.fk,\r\n (fieldName, fieldSchema, fieldValue, entityPatch) => {\r\n if (fieldValue != null) {\r\n const existingId = this.clientToServerIds.get(fieldValue);\r\n if (existingId) {\r\n entityPatch[fieldName] = existingId;\r\n }\r\n }\r\n },\r\n );\r\n\r\n this.mapFields(\r\n patch,\r\n (f) => !(f.isClientOnly || f.isReadOnly) && !!f.toServer,\r\n (fieldName, fieldSchema, _, entityPatch) => {\r\n entityPatch[fieldName] = fieldSchema.toServer(entityPatch[fieldName]);\r\n },\r\n );\r\n\r\n this.mapFields(\r\n patch,\r\n (meta) => meta.isClientOnly || meta.isReadOnly,\r\n (fieldName, _, __, entityPatch) => {\r\n delete entityPatch[fieldName];\r\n },\r\n );\r\n\r\n return patch;\r\n }\r\n\r\n public appendServerMapping(response: DbSaveResponse<TTables>) {\r\n objectKeys(response.submit).forEach((tableName) => {\r\n if (this.db.tables[tableName]) {\r\n const tablePatch = response.submit[tableName];\r\n if (tablePatch) {\r\n const serverToClientIds = this.getServerToClientMap(tableName);\r\n const table = this.db.tables[tableName];\r\n\r\n tablePatch.forEach((patch) => {\r\n if (isTempId(patch.id)) {\r\n const clientId = patch.id;\r\n const serverId = table.getId(patch.payload);\r\n serverToClientIds.set(serverId, clientId);\r\n this.clientToServerIds.set(clientId, serverId);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import { DbRef } from './DbRef';\r\nimport {\r\n DbPatch, DbTablesSet, LoadingState, ILoadingTracker,\r\n} from './types';\r\n\r\nexport interface LoaderOptions<TTables extends DbTablesSet<TTables>, TResult, TRequest> {\r\n api: (request: TRequest) => Promise<TResult>;\r\n convertToPatch?: (result: TResult) => DbPatch<TTables>;\r\n postProcess?: (patch: DbPatch<TTables>) => DbPatch<TTables>;\r\n clientToServerRequest?: (request: TRequest) => TRequest;\r\n}\r\n\r\nexport interface LoaderResult<TRequest> extends LoadingState<TRequest> {\r\n promise: Promise<void>;\r\n reload: () => void;\r\n}\r\n\r\nexport class Loader<TTables extends DbTablesSet<TTables>, TResult, TRequest> {\r\n private currentRequests: Set<Promise<void>> = new Set();\r\n public loaded: ILoadingTracker<TRequest, TResult>;\r\n private loadedAndLoading: ILoadingTracker<TRequest, TResult>;\r\n constructor(\r\n private dbRef: DbRef<TTables, any>,\r\n private getTracker: () => ILoadingTracker<TRequest, TResult>,\r\n private options: LoaderOptions<TTables, TResult, TRequest>,\r\n ) {\r\n this.loaded = getTracker();\r\n this.loadedAndLoading = getTracker();\r\n }\r\n\r\n private loadImpl(state: LoaderResult<TRequest>) {\r\n this.loadedAndLoading.append(state.missing);\r\n state.isLoading = true;\r\n let serverRequest = state.missing;\r\n if (this.options.clientToServerRequest) {\r\n serverRequest = this.options.clientToServerRequest(serverRequest);\r\n }\r\n state.promise = this.options.api(serverRequest).then((result) => {\r\n this.loaded.append(state.missing, result);\r\n this.loadedAndLoading.append(state.missing, result);\r\n state.missing = null;\r\n state.isLoading = false;\r\n state.isComplete = true;\r\n state.promise = Promise.resolve();\r\n const flatten = this.options.convertToPatch(result);\r\n this.options.postProcess && this.options.postProcess(flatten);\r\n this.dbRef.commitFetch(flatten);\r\n });\r\n\r\n this.currentRequests.add(state.promise);\r\n\r\n state.promise.finally(() => {\r\n this.currentRequests.delete(state.promise);\r\n });\r\n\r\n return state.promise;\r\n }\r\n\r\n public load = (inputRequest: TRequest) => {\r\n const result: LoaderResult<TRequest> = {\r\n isComplete: this.loaded.diff(inputRequest) == null,\r\n isLoading: false,\r\n request: inputRequest,\r\n missing: this.loadedAndLoading.diff(inputRequest),\r\n promise: null,\r\n reload: null,\r\n };\r\n\r\n result.reload = () => {\r\n result.missing = inputRequest;\r\n this.loadImpl(result);\r\n };\r\n\r\n if (result.isComplete) {\r\n // Everything requested is already loaded\r\n result.isComplete = true;\r\n result.isLoading = false;\r\n result.promise = Promise.resolve();\r\n return result;\r\n } else {\r\n if (result.missing == null) {\r\n // Everything requested is either loaded already, or being loaded\r\n result.isComplete = false;\r\n result.isLoading = true;\r\n // There's no good way to tell which of current requests is querying requested data - there actually can be 2 of them.\r\n // So we track all running requests, and await all of them in such case.\r\n result.promise = Promise.all(this.currentRequests.entries()).then(() => {});\r\n return result;\r\n } else {\r\n // Something requested is not loaded, nor being loaded. Need to perform a new request.\r\n this.loadImpl(result);\r\n return result;\r\n }\r\n }\r\n };\r\n}\r\n","import { ILoadingTracker } from './types';\r\n\r\nexport class SimpleLoadingTracker<TRequest, TResult> implements ILoadingTracker<TRequest, TResult> {\r\n private set: Set<string> = new Set();\r\n constructor() {}\r\n private getKey(request: TRequest) {\r\n return JSON.stringify(request);\r\n }\r\n\r\n public diff(request: TRequest) {\r\n return this.set.has(this.getKey(request)) ? null : request;\r\n }\r\n\r\n public append(request: TRequest, result: TResult) {\r\n this.set.add(this.getKey(request));\r\n }\r\n}\r\n","import { DataQuery, LazyDataSourceApiResponse } from '@epam/uui-core';\r\nimport { ILoadingTracker } from './types';\r\n\r\ninterface ListRecord<TItem> {\r\n options: DataQuery<TItem>;\r\n count: number;\r\n maxCount: number;\r\n isComplete: boolean;\r\n}\r\n\r\nexport interface ListLoadingTrackerOptions<TItem, TResponse> {\r\n extractList?: (response: TResponse) => LazyDataSourceApiResponse<TItem>;\r\n}\r\n\r\nexport class ListLoadingTracker<TItem, TRequest extends DataQuery<TItem> = DataQuery<TItem>, TResponse = LazyDataSourceApiResponse<TItem>>\r\nimplements ILoadingTracker<TRequest, TResponse> {\r\n private cache: Map<string, ListRecord<TItem>> = new Map();\r\n private extractList: (res: TResponse) => LazyDataSourceApiResponse<TItem>;\r\n constructor(private options?: ListLoadingTrackerOptions<TItem, TResponse>) {\r\n this.extractList = options?.extractList || ((r: any) => r);\r\n }\r\n\r\n private prepare(request: DataQuery<TItem>) {\r\n const {\r\n filter, sorting, search, range, ...unknownFields\r\n } = request;\r\n const options: DataQuery<TItem> = {};\r\n\r\n if (filter) {\r\n options.filter = filter;\r\n }\r\n\r\n if (sorting) {\r\n options.sorting = sorting;\r\n }\r\n\r\n if (search) {\r\n options.search = search;\r\n }\r\n\r\n const keyObject = { ...options, ...unknownFields };\r\n\r\n const key = JSON.stringify(keyObject);\r\n let entry = this.cache.get(key);\r\n if (!entry) {\r\n entry = {\r\n options, count: 0, maxCount: null, isComplete: false,\r\n };\r\n this.cache.set(key, entry);\r\n }\r\n\r\n return {\r\n options, range, unknownFields, entry,\r\n };\r\n }\r\n\r\n public diff(request: TRequest): TRequest {\r\n const {\r\n options, range, unknownFields, entry,\r\n } = this.prepare(request);\r\n\r\n if (entry.isComplete) {\r\n return null;\r\n }\r\n\r\n if (!request.range) {\r\n return request;\r\n } else {\r\n const requestedMax = request.range.from + request.range.count;\r\n let missingCount = requestedMax - entry.count;\r\n\r\n if (entry.maxCount) {\r\n missingCount = Math.min(missingCount, entry.maxCount);\r\n }\r\n\r\n if (missingCount > 0) {\r\n return {\r\n ...options,\r\n ...unknownFields,\r\n range: { from: entry.count, count: requestedMax - entry.count },\r\n } as TRequest;\r\n } else {\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n public count(request: TRequest) {\r\n const { entry } = this.prepare(request);\r\n\r\n return { knownCount: Math.max(entry.count, entry.maxCount), exactCount: entry.maxCount };\r\n }\r\n\r\n public append(request: TRequest, response?: TResponse) {\r\n const {\r\n options, range, unknownFields, entry,\r\n } = this.prepare(request);\r\n\r\n if (response) {\r\n const list = this.extractList(response);\r\n\r\n if (list.count) {\r\n entry.maxCount = list.count;\r\n }\r\n\r\n if (!range) {\r\n entry.count = list.items.length;\r\n entry.maxCount = list.items.length;\r\n entry.isComplete = true;\r\n } else {\r\n const from = list.from == null ? range.from : list.from;\r\n\r\n if (list.items.length > 0) {\r\n entry.count = Math.max(entry.count, from + list.items.length);\r\n }\r\n\r\n if (list.items.length < range.count) {\r\n entry.maxCount = from + list.items.length;\r\n entry.count = entry.maxCount;\r\n entry.isComplete = true;\r\n }\r\n }\r\n } else {\r\n if (range) {\r\n entry.count = Math.max(entry.count, request.range.from + request.range.count);\r\n } else {\r\n entry.isComplete = true;\r\n }\r\n }\r\n }\r\n}\r\n","export interface BatchPromiseOptions {\r\n /** Minimum time (in ms) to pass after the last call, before triggering the batch */\r\n throttleMs?: number;\r\n}\r\n\r\nconst delay = (ms: number = 0): Promise<void> => {\r\n if (ms <= 0) {\r\n return Promise.resolve();\r\n } else {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n }\r\n};\r\n\r\n/** Creates an async function, which can collect several calls to it, and execute them in a single batch via provided callback. */\r\nexport function batch<TArg = void, TRes = void>(\r\n runBatch: (batch?: TArg[]) => Promise<TRes[]> | Promise<void> | undefined | void,\r\n options?: BatchPromiseOptions,\r\n): { (arg: TArg, options?: BatchPromiseOptions): Promise<TRes>; isBusy: boolean } {\r\n let delayPromise: Promise<void> = Promise.resolve();\r\n let batchPromise: any = null;\r\n let queue: TArg[] = [];\r\n\r\n let nextCallPossibleAtMs = new Date().getTime();\r\n\r\n async function batchedFn(arg: TArg, callOptions?: BatchPromiseOptions) {\r\n options = { ...options, ...callOptions };\r\n options.throttleMs = options.throttleMs || 0;\r\n\r\n // Enqueue request\r\n queue.push(arg);\r\n const resultIndex = queue.length - 1; // an index of current item in queue. Result should be on the same index in batch.\r\n batchedFn.isBusy = true;\r\n\r\n // Wait current batch to complete\r\n try {\r\n await batchPromise;\r\n } catch {\r\n // ignore errors here. They are thrown to previous batch\r\n }\r\n\r\n // Wait for throttling delay to pass\r\n await delayPromise;\r\n\r\n try {\r\n // Start a batch if there are items.\r\n // All calls that was awaiting will run this code.\r\n // Only the first call will run batch, immediately clear the queue, and set batchPromise value\r\n // Other calls will just await results of this call\r\n if (queue.length > 0) {\r\n nextCallPossibleAtMs = new Date().getTime() + options.throttleMs;\r\n batchPromise = runBatch(queue);\r\n queue = [];\r\n }\r\n\r\n const results = await batchPromise;\r\n\r\n return results?.[resultIndex];\r\n } finally {\r\n const nowMs = new Date().getTime();\r\n const delayMs = Math.max(0, nextCallPossibleAtMs - nowMs);\r\n // It's safe to replace currentPromise here. All other requests are already awaiting\r\n delayPromise = delay(delayMs);\r\n batchedFn.isBusy = queue.length > 0;\r\n }\r\n }\r\n\r\n batchedFn.isBusy = false;\r\n\r\n return batchedFn;\r\n}\r\n","import { Db } from './Db';\r\nimport {\r\n DbPatch, DbTablesSet, DbSaveResponse, DbView, DbSubscription,\r\n} from './types';\r\nimport {\r\n makeCumulativePatch, unionPatches, mergeEntityPatches, flattenResponse,\r\n} from './patchHelpers';\r\nimport { TempIdMap, IClientIdsMap } from './tempIds';\r\nimport { objectKeys } from './utils';\r\nimport isEmpty from 'lodash.isempty';\r\nimport { Loader, LoaderOptions } from './Loader';\r\nimport { DataQuery } from '@epam/uui-core';\r\nimport { SimpleLoadingTracker } from './SimpleLoadingTracker';\r\nimport { ListLoadingTracker, ListLoadingTrackerOptions } from './ListLoadingTracker';\r\nimport { batch } from './batch';\r\n\r\nexport class DbRef<TTables extends DbTablesSet<TTables>, TDb extends Db<TTables>> {\r\n private base: TDb;\r\n private log: { patch: DbPatch<TTables> }[] = [];\r\n private autoSave = true;\r\n private savedPoint = 0;\r\n private tempIdMap: TempIdMap<TTables>;\r\n public db: TDb;\r\n protected throttleSaveMs = 1000;\r\n public readonly idMap: IClientIdsMap;\r\n constructor(public blank: TDb) {\r\n this.db = blank;\r\n this.base = blank;\r\n this.tempIdMap = new TempIdMap(blank);\r\n this.idMap = this.tempIdMap;\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n }\r\n\r\n /** Saves all committed patches. Useful only if autoSave is off. */\r\n public save() {\r\n return this.enqueueSave();\r\n }\r\n\r\n public getAutoSave() {\r\n return this.autoSave;\r\n }\r\n\r\n public setAutoSave(val: boolean) {\r\n if (this.autoSave != val) {\r\n this.autoSave = val;\r\n this.autoSave && this.enqueueSave();\r\n this.update();\r\n }\r\n }\r\n\r\n public revert() {\r\n this.db = this.base;\r\n this.log = this.log.slice(0, this.savedPoint);\r\n this.update();\r\n }\r\n\r\n /** Concrete DbRef instances should override and implement their save logic in this method */\r\n protected savePatch(patch: DbPatch<TTables>): Promise<DbSaveResponse<TTables>> {\r\n return Promise.resolve({ submit: {} });\r\n }\r\n\r\n /* Db Update logic */\r\n\r\n public commit(patch: DbPatch<TTables>): void {\r\n const dbBeforeUpdate = this.db.with(patch);\r\n patch = this.beforeUpdate(patch, dbBeforeUpdate.tables, this.db.tables);\r\n patch = mergeEntityPatches(this.db.tables, patch);\r\n this.log.push({ patch });\r\n this.db = this.db.with(patch);\r\n\r\n this.autoSave && this.enqueueSave(null, { throttleMs: this.throttleSaveMs });\r\n this.update();\r\n }\r\n\r\n private beforeUpdate(patch: DbPatch<TTables>, tables: TTables, prevTables: TTables): DbPatch<TTables> {\r\n let patchAndDependencies: DbPatch<TTables> = {};\r\n\r\n objectKeys(tables)\r\n .filter((entityName) => patch[entityName] && !tables[entityName].schema.beforeUpdate)\r\n .forEach((entityName) => {\r\n patchAndDependencies[entityName] = patch[entityName];\r\n });\r\n\r\n objectKeys(tables)\r\n .filter((entityName) => patch[entityName] && tables[entityName].schema.beforeUpdate)\r\n .forEach((entityName) => {\r\n const schema = tables[entityName].schema;\r\n const { beforeUpdate } = schema;\r\n const context = {\r\n clientIdsMap: this.tempIdMap,\r\n schema,\r\n tables,\r\n prevTables,\r\n };\r\n\r\n const results = patch[entityName].map((e) => beforeUpdate(e, context));\r\n const updatedPatch = { [entityName]: results.map((result) => result.entity) } as DbPatch<TTables>;\r\n const dependentEntityPatchesForUpdate = unionPatches(results.filter((result) => result.dependentEntities).map((result) => result.dependentEntities));\r\n const dependentEntityPatches = this.beforeUpdate(dependentEntityPatchesForUpdate, tables, prevTables);\r\n\r\n patchAndDependencies = mergeEntityPatches(tables, unionPatches([\r\n patchAndDependencies, updatedPatch, dependentEntityPatches,\r\n ]));\r\n });\r\n return patchAndDependencies;\r\n }\r\n\r\n public commitFetch(patch: DbPatch<TTables>): void {\r\n patch = this.tempIdMap.serverToClientPatch(patch);\r\n this.rebase(this.base.with(patch));\r\n this.update();\r\n }\r\n\r\n private rebase(newBase: TDb) {\r\n this.base = newBase;\r\n this.db = newBase;\r\n for (let n = this.savedPoint; n < this.log.length; n++) {\r\n this.db = this.db.with(this.log[n].patch);\r\n }\r\n }\r\n\r\n private makeCumulativePatch() {\r\n const lastLogEntry = this.log.length;\r\n const logEntriesToSave = this.log.slice(this.savedPoint, lastLogEntry);\r\n let cumulativePatch = makeCumulativePatch(\r\n this.db,\r\n logEntriesToSave.map((t) => t.patch),\r\n this.tempIdMap,\r\n );\r\n cumulativePatch = this.tempIdMap.clientToServerPatch(cumulativePatch);\r\n\r\n return cumulativePatch;\r\n }\r\n\r\n private applyResponse(response: DbSaveResponse<TTables>, newSavedPoint: number) {\r\n this.tempIdMap.appendServerMapping(response);\r\n\r\n let serverPatch = flattenResponse(response.submit, this.db.tables);\r\n serverPatch = mergeEntityPatches(this.db.tables, serverPatch);\r\n this.savedPoint = newSavedPoint;\r\n this.base = this.db;\r\n this.commitFetch(serverPatch);\r\n }\r\n\r\n /* Update subscriptions (aka live views) */\r\n\r\n private lastSubscriptionId = 1;\r\n private subscriptions: Map<number, DbSubscription<any, any>> = new Map();\r\n public subscribe<TValue, TParams, TDependencies>(\r\n view: DbView<TDb, TValue, TParams, TDependencies>,\r\n params: TParams,\r\n onUpdate: (newValue: TValue) => any,\r\n ): DbSubscription<TValue, TParams> {\r\n const id = this.lastSubscriptionId++;\r\n\r\n const subscription: DbSubscription<TValue, TParams> = {\r\n update: (subscriptionParams: TParams) => {\r\n subscription.currentParams = subscriptionParams;\r\n subscription.currentValue = this.db.runView(view, subscriptionParams);\r\n return subscription.currentValue;\r\n },\r\n currentParams: null,\r\n currentValue: null,\r\n onUpdate,\r\n unsubscribe: () => {\r\n this.subscriptions.delete(id);\r\n },\r\n };\r\n\r\n subscription.update(params);\r\n\r\n this.subscriptions.set(id, subscription);\r\n\r\n return subscription;\r\n }\r\n\r\n updateHandlers: (() => any)[] = [];\r\n public onUpdate(handler: () => any) {\r\n this.subscribe(\r\n {\r\n compute: (db) => db,\r\n compareResults: (a, b) => a === b,\r\n },\r\n null,\r\n handler,\r\n );\r\n }\r\n\r\n private update() {\r\n this.subscriptions.forEach((subscription) => {\r\n const previousValue = subscription.currentValue;\r\n subscription.update(subscription.currentParams);\r\n if (subscription.currentValue !== previousValue && subscription.onUpdate) {\r\n subscription.onUpdate(subscription.currentValue);\r\n }\r\n });\r\n }\r\n\r\n /* Error Subscriptions */\r\n\r\n public saveErrorHandlers: ((request: DbPatch<TTables>, error: any) => void)[] = [];\r\n public onSaveError(handler: (request: DbPatch<TTables>, error: any) => void) {\r\n this.saveErrorHandlers.push(handler);\r\n }\r\n\r\n private saveError(request: DbPatch<TTables>, error: any) {\r\n this.saveErrorHandlers.forEach((handler) => handler(request, error));\r\n }\r\n\r\n /* Save scheduling */\r\n\r\n private enqueueSave = batch(async () => {\r\n const cumulativePatch = this.makeCumulativePatch();\r\n const lastLogEntry = this.log.length;\r\n if (isEmpty(cumulativePatch)) {\r\n return;\r\n }\r\n try {\r\n const response = await this.savePatch(cumulativePatch);\r\n this.applyResponse(response, lastLogEntry);\r\n this.update();\r\n } catch (error) {\r\n this.saveError(cumulativePatch, error);\r\n this.update();\r\n throw error;\r\n }\r\n });\r\n\r\n private handleBeforeUnload = (e: BeforeUnloadEvent) => {\r\n if (this.enqueueSave.isBusy) {\r\n e.returnValue = false;\r\n return false;\r\n }\r\n };\r\n\r\n loaders: Loader<TTables, any, any>[] = [];\r\n protected makeLoader<TResponse, TRequest>(options: LoaderOptions<TTables, TResponse, TRequest>) {\r\n const loader = new Loader<TTables, TResponse, TRequest>(this as any, () => new SimpleLoadingTracker<TRequest, TResponse>(), options);\r\n this.loaders.push(loader);\r\n return loader;\r\n }\r\n\r\n protected makeListLoader<TItem, TResponse = DataQuery<TItem>, TRequest extends DataQuery<TItem> = DataQuery<TItem>>(\r\n options: LoaderOptions<TTables, TResponse, TRequest> & ListLoadingTrackerOptions<TItem, TResponse>,\r\n ) {\r\n const loader = new Loader<TTables, TResponse, TRequest>(this as any, () => new ListLoadingTracker<TItem, TRequest, TResponse>(), options);\r\n this.loaders.push(loader);\r\n return loader;\r\n }\r\n\r\n reload() {\r\n this.loaders = [];\r\n }\r\n}\r\n","import {\r\n useState, createContext, useContext, useMemo, useEffect,\r\n} from 'react';\r\nimport { DbRef } from './DbRef';\r\nimport { DbViewOptions } from '.';\r\n\r\nexport const DbContext = createContext(null);\r\n\r\nexport function useDbRef<TDbRef extends DbRef<any, any>>() {\r\n return useContext(DbContext) as TDbRef;\r\n}\r\n\r\nexport function useDbView<TDb, TResult, TParams = void, TDependencies = void>(\r\n fn: (db: TDb, params: TParams, dependencies: TDependencies) => TResult,\r\n params?: TParams,\r\n options?: DbViewOptions<TDb, TResult, TParams, TDependencies>,\r\n): TResult {\r\n const dbRef = useDbRef();\r\n const [state, setState] = useState<TResult>();\r\n const subscription = useMemo(() => dbRef.subscribe<TResult, TParams, TDependencies>({ compute: fn, ...options }, params, setState), []);\r\n subscription.update(params);\r\n\r\n useEffect(() => {\r\n return () => subscription.unsubscribe();\r\n }, []);\r\n\r\n return subscription.currentValue;\r\n}\r\n"],"names":["DbRelationType","zip","shallowEqual","transform","isEqual","I","Seq","getFilterPredicate","getSearchFilter","getOrderComparer","groupBy","map","merge","countBy","forEach","pick","filter","isEmpty","createContext","useContext","useState","useMemo","useEffect"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@epam/uui-db",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.3",
|
|
4
4
|
"description": "UUI - client-side relational state cache",
|
|
5
5
|
"author": "EPAM",
|
|
6
6
|
"license": "MIT",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"prepublish": "yarn build"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@epam/uui-core": "6.1.
|
|
17
|
+
"@epam/uui-core": "6.1.3",
|
|
18
18
|
"@types/lodash.countby": "4.6.6",
|
|
19
19
|
"@types/lodash.filter": "4.6.6",
|
|
20
20
|
"@types/lodash.foreach": "4.5.6",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"type": "git",
|
|
55
55
|
"url": "https://github.com/epam/UUI"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "dde8d3f00eba908f98a13bcc042f3e3373a1c9eb",
|
|
58
58
|
"publishConfig": {
|
|
59
59
|
"directory": "build"
|
|
60
60
|
}
|
package/readme.md
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
# UUI DB package
|
|
2
|
-
|
|
3
|
-
This package is a part of [EPAM UUI](https://github.com/epam/UUI) library.
|
|
4
|
-
|
|
5
|
-
@epam/uui-db is an experimental state-management solution. It maintains immutable relational database on client, provides means to load data from server, update it both from client, and save it to server asynchronously with UI operations.
|
|
6
|
-
|
|
7
|
-
## Features
|
|
8
|
-
|
|
9
|
-
- relation data model for state, providing a normalized storage for UI state
|
|
10
|
-
- data loading from server, with automatic GraphQL response normalization into tables
|
|
11
|
-
- synchronous and transactional updates of state from UI
|
|
12
|
-
- asynchronous bi-directional state synchronization between UI and server. UI changes in terms of 'patches' are batched and sent to server. Server can also push updates to UI state
|
|
13
|
-
- GIT-like branch-rebase approach to handle state concurrency
|
|
14
|
-
- tables can be indexed to speed-up queries
|
|
15
|
-
- Views to build arbitrary state projections
|
|
16
|
-
- subscriptions to subscribe parts of UI to changes in Views
|
|
17
|
-
|
|
1
|
+
# UUI DB package
|
|
2
|
+
|
|
3
|
+
This package is a part of [EPAM UUI](https://github.com/epam/UUI) library.
|
|
4
|
+
|
|
5
|
+
@epam/uui-db is an experimental state-management solution. It maintains immutable relational database on client, provides means to load data from server, update it both from client, and save it to server asynchronously with UI operations.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- relation data model for state, providing a normalized storage for UI state
|
|
10
|
+
- data loading from server, with automatic GraphQL response normalization into tables
|
|
11
|
+
- synchronous and transactional updates of state from UI
|
|
12
|
+
- asynchronous bi-directional state synchronization between UI and server. UI changes in terms of 'patches' are batched and sent to server. Server can also push updates to UI state
|
|
13
|
+
- GIT-like branch-rebase approach to handle state concurrency
|
|
14
|
+
- tables can be indexed to speed-up queries
|
|
15
|
+
- Views to build arbitrary state projections
|
|
16
|
+
- subscriptions to subscribe parts of UI to changes in Views
|
|
17
|
+
|
package/stats.html
CHANGED
|
@@ -4822,7 +4822,7 @@ var drawChart = (function (exports) {
|
|
|
4822
4822
|
</script>
|
|
4823
4823
|
<script>
|
|
4824
4824
|
/*<!--*/
|
|
4825
|
-
const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.js","children":[{"name":"build/rollup:/@epam/uui-db/src","children":[{"uid":"
|
|
4825
|
+
const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.js","children":[{"name":"build/rollup:/@epam/uui-db/src","children":[{"uid":"449749ac-1","name":"types.ts"},{"uid":"449749ac-3","name":"utils.ts"},{"uid":"449749ac-5","name":"Db.ts"},{"uid":"449749ac-7","name":"DbTable.ts"},{"uid":"449749ac-9","name":"patchHelpers.ts"},{"uid":"449749ac-11","name":"tempIds.tsx"},{"uid":"449749ac-13","name":"Loader.ts"},{"uid":"449749ac-15","name":"SimpleLoadingTracker.ts"},{"uid":"449749ac-17","name":"ListLoadingTracker.ts"},{"uid":"449749ac-19","name":"batch.ts"},{"uid":"449749ac-21","name":"DbRef.ts"},{"uid":"449749ac-23","name":"reactHooks.ts"}]}]}],"isRoot":true},"nodeParts":{"449749ac-1":{"renderedLength":265,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-0"},"449749ac-3":{"renderedLength":827,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-2"},"449749ac-5":{"renderedLength":1983,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-4"},"449749ac-7":{"renderedLength":5580,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-6"},"449749ac-9":{"renderedLength":6021,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-8"},"449749ac-11":{"renderedLength":5775,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-10"},"449749ac-13":{"renderedLength":2182,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-12"},"449749ac-15":{"renderedLength":291,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-14"},"449749ac-17":{"renderedLength":2467,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-16"},"449749ac-19":{"renderedLength":1400,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-18"},"449749ac-21":{"renderedLength":5859,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-20"},"449749ac-23":{"renderedLength":475,"gzipLength":0,"brotliLength":0,"metaUid":"449749ac-22"}},"nodeMetas":{"449749ac-0":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\types.ts","moduleParts":{"index.js":"449749ac-1"},"imported":[],"importedBy":[]},"449749ac-2":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\utils.ts","moduleParts":{"index.js":"449749ac-3"},"imported":[],"importedBy":[]},"449749ac-4":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\Db.ts","moduleParts":{"index.js":"449749ac-5"},"imported":[],"importedBy":[]},"449749ac-6":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\DbTable.ts","moduleParts":{"index.js":"449749ac-7"},"imported":[],"importedBy":[]},"449749ac-8":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\patchHelpers.ts","moduleParts":{"index.js":"449749ac-9"},"imported":[],"importedBy":[]},"449749ac-10":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\tempIds.tsx","moduleParts":{"index.js":"449749ac-11"},"imported":[],"importedBy":[]},"449749ac-12":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\Loader.ts","moduleParts":{"index.js":"449749ac-13"},"imported":[],"importedBy":[]},"449749ac-14":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\SimpleLoadingTracker.ts","moduleParts":{"index.js":"449749ac-15"},"imported":[],"importedBy":[]},"449749ac-16":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\ListLoadingTracker.ts","moduleParts":{"index.js":"449749ac-17"},"imported":[],"importedBy":[]},"449749ac-18":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\batch.ts","moduleParts":{"index.js":"449749ac-19"},"imported":[],"importedBy":[]},"449749ac-20":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\DbRef.ts","moduleParts":{"index.js":"449749ac-21"},"imported":[],"importedBy":[]},"449749ac-22":{"id":"\\build\\rollup:\\@epam\\uui-db\\src\\reactHooks.ts","moduleParts":{"index.js":"449749ac-23"},"imported":[],"importedBy":[]},"449749ac-24":{"id":"\\index.tsx","moduleParts":{},"imported":[{"uid":"449749ac-25"}],"importedBy":[],"isEntry":true},"449749ac-25":{"id":"\\src\\index.ts","moduleParts":{},"imported":[{"uid":"449749ac-26"},{"uid":"449749ac-27"},{"uid":"449749ac-28"},{"uid":"449749ac-29"},{"uid":"449749ac-30"},{"uid":"449749ac-31"},{"uid":"449749ac-32"},{"uid":"449749ac-33"}],"importedBy":[{"uid":"449749ac-24"}]},"449749ac-26":{"id":"\\src\\types.ts","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-25"},{"uid":"449749ac-32"}]},"449749ac-27":{"id":"\\src\\Db.ts","moduleParts":{},"imported":[{"uid":"449749ac-31"},{"uid":"449749ac-34"}],"importedBy":[{"uid":"449749ac-25"}]},"449749ac-28":{"id":"\\src\\DbTable.ts","moduleParts":{},"imported":[{"uid":"449749ac-35"},{"uid":"449749ac-36"}],"importedBy":[{"uid":"449749ac-25"}]},"449749ac-29":{"id":"\\src\\DbRef.ts","moduleParts":{},"imported":[{"uid":"449749ac-32"},{"uid":"449749ac-30"},{"uid":"449749ac-31"},{"uid":"449749ac-37"},{"uid":"449749ac-38"},{"uid":"449749ac-39"},{"uid":"449749ac-40"},{"uid":"449749ac-41"}],"importedBy":[{"uid":"449749ac-25"}]},"449749ac-30":{"id":"\\src\\tempIds.tsx","moduleParts":{},"imported":[{"uid":"449749ac-31"}],"importedBy":[{"uid":"449749ac-25"},{"uid":"449749ac-29"}]},"449749ac-31":{"id":"\\src\\utils.ts","moduleParts":{},"imported":[{"uid":"449749ac-42"},{"uid":"449749ac-43"},{"uid":"449749ac-44"},{"uid":"449749ac-34"}],"importedBy":[{"uid":"449749ac-25"},{"uid":"449749ac-27"},{"uid":"449749ac-29"},{"uid":"449749ac-30"},{"uid":"449749ac-32"}]},"449749ac-32":{"id":"\\src\\patchHelpers.ts","moduleParts":{},"imported":[{"uid":"449749ac-26"},{"uid":"449749ac-35"},{"uid":"449749ac-31"},{"uid":"449749ac-45"},{"uid":"449749ac-46"},{"uid":"449749ac-47"},{"uid":"449749ac-48"},{"uid":"449749ac-49"},{"uid":"449749ac-50"},{"uid":"449749ac-51"}],"importedBy":[{"uid":"449749ac-25"},{"uid":"449749ac-29"}]},"449749ac-33":{"id":"\\src\\reactHooks.ts","moduleParts":{},"imported":[{"uid":"449749ac-52"}],"importedBy":[{"uid":"449749ac-25"}]},"449749ac-34":{"id":"react-fast-compare","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-27"},{"uid":"449749ac-31"}],"isExternal":true},"449749ac-35":{"id":"immutable","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-28"},{"uid":"449749ac-32"}],"isExternal":true},"449749ac-36":{"id":"@epam/uui-core","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-28"}],"isExternal":true},"449749ac-37":{"id":"lodash.isempty","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-29"}],"isExternal":true},"449749ac-38":{"id":"\\src\\Loader.ts","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-29"}]},"449749ac-39":{"id":"\\src\\SimpleLoadingTracker.ts","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-29"}]},"449749ac-40":{"id":"\\src\\ListLoadingTracker.ts","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-29"}]},"449749ac-41":{"id":"\\src\\batch.ts","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-29"}]},"449749ac-42":{"id":"shallowequal","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-31"}],"isExternal":true},"449749ac-43":{"id":"lodash.zip","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-31"}],"isExternal":true},"449749ac-44":{"id":"lodash.transform","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-31"}],"isExternal":true},"449749ac-45":{"id":"lodash.groupby","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-32"}],"isExternal":true},"449749ac-46":{"id":"lodash.map","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-32"}],"isExternal":true},"449749ac-47":{"id":"lodash.merge","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-32"}],"isExternal":true},"449749ac-48":{"id":"lodash.countby","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-32"}],"isExternal":true},"449749ac-49":{"id":"lodash.filter","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-32"}],"isExternal":true},"449749ac-50":{"id":"lodash.foreach","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-32"}],"isExternal":true},"449749ac-51":{"id":"lodash.pick","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-32"}],"isExternal":true},"449749ac-52":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"449749ac-33"}],"isExternal":true}},"env":{"rollup":"4.22.4"},"options":{"gzip":false,"brotli":false,"sourcemap":true}};
|
|
4826
4826
|
|
|
4827
4827
|
const run = () => {
|
|
4828
4828
|
const width = window.innerWidth;
|