@signalium/query 1.0.13 → 1.0.15
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/CHANGELOG.md +21 -0
- package/dist/cjs/development/index.js +2994 -0
- package/dist/cjs/development/index.js.map +1 -0
- package/dist/cjs/development/react/index.js +52 -0
- package/dist/cjs/development/react/index.js.map +1 -0
- package/dist/cjs/{stores/shared.js → development/shared-5acOO-tS.js} +11 -14
- package/dist/cjs/development/shared-5acOO-tS.js.map +1 -0
- package/dist/cjs/development/stores/async.js +304 -0
- package/dist/cjs/development/stores/async.js.map +1 -0
- package/dist/cjs/development/stores/sync.js +214 -0
- package/dist/cjs/development/stores/sync.js.map +1 -0
- package/dist/cjs/production/index.js +2994 -0
- package/dist/cjs/production/index.js.map +1 -0
- package/dist/cjs/production/package.json +3 -0
- package/dist/cjs/production/react/index.js +52 -0
- package/dist/cjs/production/react/index.js.map +1 -0
- package/dist/cjs/production/shared-5acOO-tS.js +20 -0
- package/dist/cjs/production/shared-5acOO-tS.js.map +1 -0
- package/dist/cjs/production/stores/async.js +304 -0
- package/dist/cjs/production/stores/async.js.map +1 -0
- package/dist/cjs/production/stores/sync.js +214 -0
- package/dist/cjs/production/stores/sync.js.map +1 -0
- package/dist/esm/EntityMap.d.ts +22 -0
- package/dist/esm/EntityMap.d.ts.map +1 -1
- package/dist/esm/MutationResult.d.ts +43 -0
- package/dist/esm/MutationResult.d.ts.map +1 -0
- package/dist/esm/QueryClient.d.ts +31 -2
- package/dist/esm/QueryClient.d.ts.map +1 -1
- package/dist/esm/development/index.js +2994 -0
- package/dist/esm/development/index.js.map +1 -0
- package/dist/esm/development/react/index.js +52 -0
- package/dist/esm/development/react/index.js.map +1 -0
- package/dist/esm/development/shared-Br5plsKm.js +21 -0
- package/dist/esm/development/shared-Br5plsKm.js.map +1 -0
- package/dist/esm/development/stores/async.js +304 -0
- package/dist/esm/development/stores/async.js.map +1 -0
- package/dist/esm/development/stores/sync.js +214 -0
- package/dist/esm/development/stores/sync.js.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/mutation.d.ts +82 -0
- package/dist/esm/mutation.d.ts.map +1 -0
- package/dist/esm/parseEntities.d.ts.map +1 -1
- package/dist/esm/production/index.js +2994 -0
- package/dist/esm/production/index.js.map +1 -0
- package/dist/esm/production/react/index.js +52 -0
- package/dist/esm/production/react/index.js.map +1 -0
- package/dist/esm/production/shared-Br5plsKm.js +21 -0
- package/dist/esm/production/shared-Br5plsKm.js.map +1 -0
- package/dist/esm/production/stores/async.js +304 -0
- package/dist/esm/production/stores/async.js.map +1 -0
- package/dist/esm/production/stores/sync.js +214 -0
- package/dist/esm/production/stores/sync.js.map +1 -0
- package/dist/esm/proxy.d.ts +9 -6
- package/dist/esm/proxy.d.ts.map +1 -1
- package/dist/esm/query.d.ts +3 -1
- package/dist/esm/query.d.ts.map +1 -1
- package/dist/esm/typeDefs.d.ts +4 -2
- package/dist/esm/typeDefs.d.ts.map +1 -1
- package/dist/esm/types.d.ts +71 -4
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/utils.d.ts +35 -0
- package/dist/esm/utils.d.ts.map +1 -1
- package/package.json +55 -21
- package/stores/async.js +1 -1
- package/stores/sync.js +1 -1
- package/dist/cjs/EntityMap.js +0 -103
- package/dist/cjs/EntityMap.js.map +0 -1
- package/dist/cjs/MemoryEvictionManager.js +0 -56
- package/dist/cjs/MemoryEvictionManager.js.map +0 -1
- package/dist/cjs/NetworkManager.js +0 -125
- package/dist/cjs/NetworkManager.js.map +0 -1
- package/dist/cjs/QueryClient.js +0 -162
- package/dist/cjs/QueryClient.js.map +0 -1
- package/dist/cjs/QueryResult.js +0 -920
- package/dist/cjs/QueryResult.js.map +0 -1
- package/dist/cjs/RefetchManager.js +0 -88
- package/dist/cjs/RefetchManager.js.map +0 -1
- package/dist/cjs/errors.js +0 -129
- package/dist/cjs/errors.js.map +0 -1
- package/dist/cjs/index.js +0 -43
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/parseEntities.js +0 -142
- package/dist/cjs/parseEntities.js.map +0 -1
- package/dist/cjs/pathInterpolator.js +0 -69
- package/dist/cjs/pathInterpolator.js.map +0 -1
- package/dist/cjs/proxy.js +0 -263
- package/dist/cjs/proxy.js.map +0 -1
- package/dist/cjs/query.js +0 -184
- package/dist/cjs/query.js.map +0 -1
- package/dist/cjs/react/index.js +0 -6
- package/dist/cjs/react/index.js.map +0 -1
- package/dist/cjs/react/use-query.js +0 -56
- package/dist/cjs/react/use-query.js.map +0 -1
- package/dist/cjs/stores/async.js +0 -344
- package/dist/cjs/stores/async.js.map +0 -1
- package/dist/cjs/stores/shared.js.map +0 -1
- package/dist/cjs/stores/sync.js +0 -240
- package/dist/cjs/stores/sync.js.map +0 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +0 -1
- package/dist/cjs/type-utils.js +0 -3
- package/dist/cjs/type-utils.js.map +0 -1
- package/dist/cjs/typeDefs.js +0 -620
- package/dist/cjs/typeDefs.js.map +0 -1
- package/dist/cjs/types.js +0 -33
- package/dist/cjs/types.js.map +0 -1
- package/dist/cjs/utils.js +0 -23
- package/dist/cjs/utils.js.map +0 -1
- package/dist/esm/EntityMap.js +0 -99
- package/dist/esm/EntityMap.js.map +0 -1
- package/dist/esm/MemoryEvictionManager.js +0 -51
- package/dist/esm/MemoryEvictionManager.js.map +0 -1
- package/dist/esm/NetworkManager.js +0 -120
- package/dist/esm/NetworkManager.js.map +0 -1
- package/dist/esm/QueryClient.js +0 -154
- package/dist/esm/QueryClient.js.map +0 -1
- package/dist/esm/QueryResult.js +0 -916
- package/dist/esm/QueryResult.js.map +0 -1
- package/dist/esm/RefetchManager.js +0 -83
- package/dist/esm/RefetchManager.js.map +0 -1
- package/dist/esm/errors.js +0 -125
- package/dist/esm/errors.js.map +0 -1
- package/dist/esm/index.js +0 -8
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/parseEntities.js +0 -135
- package/dist/esm/parseEntities.js.map +0 -1
- package/dist/esm/pathInterpolator.js +0 -66
- package/dist/esm/pathInterpolator.js.map +0 -1
- package/dist/esm/proxy.js +0 -254
- package/dist/esm/proxy.js.map +0 -1
- package/dist/esm/query.js +0 -177
- package/dist/esm/query.js.map +0 -1
- package/dist/esm/react/index.js +0 -2
- package/dist/esm/react/index.js.map +0 -1
- package/dist/esm/react/use-query.js +0 -53
- package/dist/esm/react/use-query.js.map +0 -1
- package/dist/esm/stores/async.js +0 -340
- package/dist/esm/stores/async.js.map +0 -1
- package/dist/esm/stores/shared.js +0 -13
- package/dist/esm/stores/shared.js.map +0 -1
- package/dist/esm/stores/sync.js +0 -234
- package/dist/esm/stores/sync.js.map +0 -1
- package/dist/esm/type-utils.js +0 -2
- package/dist/esm/type-utils.js.map +0 -1
- package/dist/esm/typeDefs.js +0 -606
- package/dist/esm/typeDefs.js.map +0 -1
- package/dist/esm/types.js +0 -30
- package/dist/esm/types.js.map +0 -1
- package/dist/esm/utils.js +0 -20
- package/dist/esm/utils.js.map +0 -1
- /package/dist/cjs/{package.json → development/package.json} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sources":["../../../../src/stores/sync.ts"],"sourcesContent":["import { EntityStore } from '../EntityMap.js';\nimport { CachedQuery, CachedQueryExtra, QueryDefinition, QueryStore } from '../QueryClient.js';\nimport {\n optimisticInsertRefsKeyFor,\n refCountKeyFor,\n refIdsKeyFor,\n streamOrphanRefsKeyFor,\n updatedAtKeyFor,\n valueKeyFor,\n} from './shared.js';\n\nexport interface SyncPersistentStore {\n has(key: string): boolean;\n\n getString(key: string): string | undefined;\n setString(key: string, value: string): void;\n\n getNumber(key: string): number | undefined;\n setNumber(key: string, value: number): void;\n\n getBuffer(key: string): Uint32Array | undefined;\n setBuffer(key: string, value: Uint32Array): void;\n\n delete(key: string): void;\n}\n\nconst DEFAULT_MAX_COUNT = 50;\nconst DEFAULT_GC_TIME = 1000 * 60 * 60 * 24; // 24 hours\n\nexport class MemoryPersistentStore implements SyncPersistentStore {\n private readonly kv: Record<string, unknown> = Object.create(null);\n\n has(key: string): boolean {\n return key in this.kv;\n }\n\n getString(key: string): string | undefined {\n return this.kv[key] as string | undefined;\n }\n\n setString(key: string, value: string): void {\n this.kv[key] = value;\n }\n\n getNumber(key: string): number | undefined {\n return this.kv[key] as number | undefined;\n }\n\n setNumber(key: string, value: number): void {\n this.kv[key] = value;\n }\n\n getBuffer(key: string): Uint32Array | undefined {\n return this.kv[key] as Uint32Array | undefined;\n }\n\n setBuffer(key: string, value: Uint32Array): void {\n this.kv[key] = value;\n }\n\n delete(key: string): void {\n delete this.kv[key];\n }\n}\n\n// Query Type keys\nexport const queueKeyFor = (queryDefId: string) => `sq:doc:queue:${queryDefId}`;\n\nexport class SyncQueryStore implements QueryStore {\n queues: Map<string, Uint32Array> = new Map();\n\n constructor(private readonly kv: SyncPersistentStore) {}\n\n loadQuery(\n queryDef: QueryDefinition<any, any, any>,\n queryKey: number,\n entityMap: EntityStore,\n ): CachedQuery | undefined {\n const updatedAt = this.kv.getNumber(updatedAtKeyFor(queryKey));\n\n if (updatedAt === undefined || updatedAt < Date.now() - (queryDef.cache?.gcTime ?? DEFAULT_GC_TIME)) {\n return;\n }\n\n const valueStr = this.kv.getString(valueKeyFor(queryKey));\n\n if (valueStr === undefined) {\n return;\n }\n\n const entityIds = this.kv.getBuffer(refIdsKeyFor(queryKey));\n\n if (entityIds !== undefined) {\n this.preloadEntities(entityIds, entityMap);\n }\n\n // Load extra data (stream orphans and optimistic inserts)\n const streamOrphanRefs = this.kv.getBuffer(streamOrphanRefsKeyFor(queryKey));\n const optimisticInsertRefs = this.kv.getBuffer(optimisticInsertRefsKeyFor(queryKey));\n\n // Preload entities for extra data\n if (streamOrphanRefs !== undefined) {\n this.preloadEntities(streamOrphanRefs, entityMap);\n }\n if (optimisticInsertRefs !== undefined) {\n this.preloadEntities(optimisticInsertRefs, entityMap);\n }\n\n let extra: CachedQueryExtra | undefined;\n if (streamOrphanRefs !== undefined || optimisticInsertRefs !== undefined) {\n extra = {};\n if (streamOrphanRefs !== undefined) {\n extra.streamOrphanRefs = Array.from(streamOrphanRefs);\n }\n if (optimisticInsertRefs !== undefined) {\n extra.optimisticInsertRefs = Array.from(optimisticInsertRefs);\n }\n }\n\n this.activateQuery(queryDef, queryKey);\n\n return {\n value: JSON.parse(valueStr) as Record<string, unknown>,\n refIds: entityIds === undefined ? undefined : new Set(entityIds ?? []),\n updatedAt,\n extra,\n };\n }\n\n private preloadEntities(entityIds: Uint32Array, entityMap: EntityStore): void {\n for (const entityId of entityIds) {\n const entityValue = this.kv.getString(valueKeyFor(entityId));\n\n if (entityValue === undefined) {\n continue;\n }\n\n const entity = JSON.parse(entityValue) as Record<string, unknown>;\n entityMap.setPreloadedEntity(entityId, entity);\n\n const childIds = this.kv.getBuffer(refIdsKeyFor(entityId));\n\n if (childIds === undefined) {\n continue;\n }\n\n this.preloadEntities(childIds, entityMap);\n }\n }\n\n saveQuery(\n queryDef: QueryDefinition<any, any, any>,\n queryKey: number,\n value: unknown,\n updatedAt: number,\n refIds?: Set<number>,\n extra?: CachedQueryExtra,\n ): void {\n this.setValue(queryKey, value, refIds);\n this.kv.setNumber(updatedAtKeyFor(queryKey), updatedAt);\n\n // Save extra data\n if (extra?.streamOrphanRefs !== undefined && extra.streamOrphanRefs.length > 0) {\n this.kv.setBuffer(streamOrphanRefsKeyFor(queryKey), new Uint32Array(extra.streamOrphanRefs));\n } else {\n this.kv.delete(streamOrphanRefsKeyFor(queryKey));\n }\n\n if (extra?.optimisticInsertRefs !== undefined && extra.optimisticInsertRefs.length > 0) {\n this.kv.setBuffer(optimisticInsertRefsKeyFor(queryKey), new Uint32Array(extra.optimisticInsertRefs));\n } else {\n this.kv.delete(optimisticInsertRefsKeyFor(queryKey));\n }\n\n this.activateQuery(queryDef, queryKey);\n }\n\n saveEntity(entityKey: number, value: unknown, refIds?: Set<number>): void {\n this.setValue(entityKey, value, refIds);\n }\n\n activateQuery(queryDef: QueryDefinition<any, any, any>, queryKey: number): void {\n if (!this.kv.has(valueKeyFor(queryKey))) {\n // Query not in store, nothing to do. This can happen if the query has\n // been evicted from the cache, but is still active in memory.\n return;\n }\n\n let queue = this.queues.get(queryDef.id);\n\n if (queue === undefined) {\n const maxCount = queryDef.cache?.maxCount ?? DEFAULT_MAX_COUNT;\n queue = this.kv.getBuffer(queueKeyFor(queryDef.id));\n\n if (queue === undefined) {\n queue = new Uint32Array(maxCount);\n this.kv.setBuffer(queueKeyFor(queryDef.id), queue);\n } else if (queue.length !== maxCount) {\n queue = new Uint32Array(queue.buffer, 0, maxCount);\n this.kv.setBuffer(queueKeyFor(queryDef.id), queue);\n }\n\n this.queues.set(queryDef.id, queue);\n }\n\n const indexOfKey = queue.indexOf(queryKey);\n\n // Item already in queue, move to front\n if (indexOfKey >= 0) {\n if (indexOfKey === 0) {\n // Already at front, nothing to do\n return;\n }\n // Shift items right to make space at front\n queue.copyWithin(1, 0, indexOfKey);\n queue[0] = queryKey;\n return;\n }\n\n // Item not in queue, add to front and evict tail\n const evicted = queue[queue.length - 1];\n queue.copyWithin(1, 0, queue.length - 1);\n queue[0] = queryKey;\n\n if (evicted !== 0) {\n this.deleteQuery(evicted);\n this.kv.delete(updatedAtKeyFor(evicted));\n }\n }\n\n private setValue(id: number, value: unknown, refIds?: Set<number>): void {\n const kv = this.kv;\n\n kv.setString(valueKeyFor(id), JSON.stringify(value));\n\n const refIdsKey = refIdsKeyFor(id);\n\n const prevRefIds = kv.getBuffer(refIdsKey);\n\n if (refIds === undefined || refIds.size === 0) {\n kv.delete(refIdsKey);\n\n // Decrement all previous refs\n if (prevRefIds !== undefined) {\n for (let i = 0; i < prevRefIds.length; i++) {\n const refId = prevRefIds[i];\n this.decrementRefCount(refId);\n }\n }\n } else {\n // Convert the set to a Uint32Array and capture all the refIds before we\n // delete previous ones from the set\n const newRefIds = new Uint32Array(refIds);\n\n if (prevRefIds !== undefined) {\n // Process new refs: increment if not in old\n for (let i = 0; i < prevRefIds.length; i++) {\n const refId = prevRefIds[i];\n\n if (refIds.has(refId)) {\n refIds.delete(refId);\n } else {\n this.decrementRefCount(refId);\n }\n }\n }\n\n // No previous refs, increment all unique new refs\n for (const refId of refIds) {\n this.incrementRefCount(refId);\n }\n\n kv.setBuffer(refIdsKey, newRefIds);\n }\n }\n\n deleteQuery(id: number): void {\n const kv = this.kv;\n\n kv.delete(valueKeyFor(id));\n kv.delete(refCountKeyFor(id));\n\n const refIds = kv.getBuffer(refIdsKeyFor(id));\n kv.delete(refIdsKeyFor(id)); // Clean up the refIds key\n\n if (refIds === undefined) {\n return;\n }\n\n // Decrement ref counts for all referenced entities\n for (const refId of refIds) {\n if (refId !== 0) {\n this.decrementRefCount(refId);\n }\n }\n }\n\n private incrementRefCount(refId: number): void {\n const refCountKey = refCountKeyFor(refId);\n const currentCount = this.kv.getNumber(refCountKey) ?? 0;\n const newCount = currentCount + 1;\n this.kv.setNumber(refCountKey, newCount);\n }\n\n private decrementRefCount(refId: number): void {\n const refCountKey = refCountKeyFor(refId);\n const currentCount = this.kv.getNumber(refCountKey);\n\n if (currentCount === undefined) {\n // Already deleted or never existed\n return;\n }\n\n const newCount = currentCount - 1;\n\n if (newCount === 0) {\n // Entity exists, cascade delete it\n this.deleteQuery(refId);\n } else {\n this.kv.setNumber(refCountKey, newCount);\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -3,7 +3,12 @@ export { QueryClient, QueryClientContext, addOptimisticInsert, removeOptimisticI
|
|
|
3
3
|
export type { QueryContext } from './QueryClient.js';
|
|
4
4
|
export { t, entity, registerFormat } from './typeDefs.js';
|
|
5
5
|
export { query, infiniteQuery, streamQuery } from './query.js';
|
|
6
|
+
export { mutation } from './mutation.js';
|
|
7
|
+
export type { MutationDefinition } from './mutation.js';
|
|
8
|
+
export { draft } from './utils.js';
|
|
9
|
+
export type { Draft } from './utils.js';
|
|
6
10
|
export { NetworkManager, NoOpNetworkManager, defaultNetworkManager, NetworkManagerContext } from './NetworkManager.js';
|
|
7
11
|
export { MemoryEvictionManager, NoOpMemoryEvictionManager } from './MemoryEvictionManager.js';
|
|
8
12
|
export { RefetchManager, NoOpRefetchManager } from './RefetchManager.js';
|
|
13
|
+
export { Entity } from './proxy.js';
|
|
9
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAChH,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAChH,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { MutationFn, ObjectFieldTypeDef, ExtractTypesFromObjectOrEntity, TypeDef, RetryConfig } from './types.js';
|
|
2
|
+
import { QueryContext } from './QueryClient.js';
|
|
3
|
+
type IsParameter<Part> = Part extends `[${infer ParamName}]` ? ParamName : never;
|
|
4
|
+
type FilteredParts<Path> = Path extends `${infer PartA}/${infer PartB}` ? IsParameter<PartA> | FilteredParts<PartB> : IsParameter<Path>;
|
|
5
|
+
type ParamValue<Key> = Key extends `...${infer Anything}` ? (string | number)[] : string | number;
|
|
6
|
+
type RemovePrefixDots<Key> = Key extends `...${infer Name}` ? Name : Key;
|
|
7
|
+
type PathParams<Path> = {
|
|
8
|
+
[Key in FilteredParts<Path> as RemovePrefixDots<Key>]: ParamValue<Key>;
|
|
9
|
+
};
|
|
10
|
+
export interface MutationCacheOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Retry configuration for failed mutations
|
|
13
|
+
*/
|
|
14
|
+
retry?: RetryConfig | number | false;
|
|
15
|
+
}
|
|
16
|
+
export interface MutationDefinition<Request, Response> {
|
|
17
|
+
id: string;
|
|
18
|
+
requestShape: TypeDef;
|
|
19
|
+
requestShapeKey: number;
|
|
20
|
+
responseShape: TypeDef;
|
|
21
|
+
responseShapeKey: number;
|
|
22
|
+
mutateFn: (context: QueryContext, request: Request) => Promise<Response>;
|
|
23
|
+
optimisticUpdates: boolean;
|
|
24
|
+
cache?: MutationCacheOptions;
|
|
25
|
+
}
|
|
26
|
+
export declare const mutationKeyFor: (fn: Function) => string;
|
|
27
|
+
interface RESTMutationDefinition<Path extends string, RequestDef extends Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef, ResponseDef extends Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef> {
|
|
28
|
+
/**
|
|
29
|
+
* The URL path for the mutation. Supports path parameters like `/users/[id]`.
|
|
30
|
+
*/
|
|
31
|
+
path: Path;
|
|
32
|
+
/**
|
|
33
|
+
* HTTP method for the mutation. Defaults to POST.
|
|
34
|
+
*/
|
|
35
|
+
method?: 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
36
|
+
/**
|
|
37
|
+
* TypeDef for the request body.
|
|
38
|
+
*/
|
|
39
|
+
request: RequestDef;
|
|
40
|
+
/**
|
|
41
|
+
* TypeDef for the response body.
|
|
42
|
+
*/
|
|
43
|
+
response: ResponseDef;
|
|
44
|
+
/**
|
|
45
|
+
* Whether to automatically apply optimistic updates.
|
|
46
|
+
* When true, entities in the request will be immediately updated in the store
|
|
47
|
+
* before the mutation completes, and reverted if the mutation fails.
|
|
48
|
+
* Defaults to false.
|
|
49
|
+
*/
|
|
50
|
+
optimisticUpdates?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Cache options including retry configuration.
|
|
53
|
+
*/
|
|
54
|
+
cache?: MutationCacheOptions;
|
|
55
|
+
}
|
|
56
|
+
type ExtractMutationRequest<Path extends string, RequestDef extends Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef> = PathParams<Path> & ExtractTypesFromObjectOrEntity<RequestDef>;
|
|
57
|
+
/**
|
|
58
|
+
* Creates a mutation function that returns a MutationResult.
|
|
59
|
+
* Mutations must be explicitly run via `.run(request)`.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* const updateUser = mutation(() => ({
|
|
64
|
+
* path: '/users/[id]',
|
|
65
|
+
* method: 'PUT',
|
|
66
|
+
* request: {
|
|
67
|
+
* id: t.id,
|
|
68
|
+
* name: t.string,
|
|
69
|
+
* email: t.string,
|
|
70
|
+
* },
|
|
71
|
+
* response: User,
|
|
72
|
+
* optimisticUpdates: true,
|
|
73
|
+
* }));
|
|
74
|
+
*
|
|
75
|
+
* // Usage:
|
|
76
|
+
* const mutation = updateUser();
|
|
77
|
+
* await mutation.run({ id: '123', name: 'John', email: 'john@example.com' });
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function mutation<Path extends string, RequestDef extends Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef, ResponseDef extends Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef>(mutationDefinitionBuilder: () => RESTMutationDefinition<Path, RequestDef, ResponseDef>): MutationFn<ExtractMutationRequest<Path, RequestDef>, ResponseDef>;
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=mutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/mutation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseEntities.d.ts","sourceRoot":"","sources":["../../src/parseEntities.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAGL,cAAc,EACd,SAAS,EAET,SAAS,
|
|
1
|
+
{"version":3,"file":"parseEntities.d.ts","sourceRoot":"","sources":["../../src/parseEntities.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAGL,cAAc,EACd,SAAS,EAET,SAAS,EAKT,QAAQ,EACT,MAAM,YAAY,CAAC;AAKpB,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,EACzB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,OAAO,CAkDT;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EAAE,EAChB,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,OAAO,EAAE,CAgBX;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,EAAE,cAAc,EAC3B,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,SAAS,GAAG,SAAS,EAClC,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwEzB;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,OAAO,CA2DT"}
|