dinah 0.3.0 → 0.4.0
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/dist/cdk.cjs +2 -2
- package/dist/cdk.d.cts +1 -1
- package/dist/cdk.d.mts +1 -1
- package/dist/cdk.mjs +1 -1
- package/dist/index.cjs +9 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +8 -13
- package/dist/index.mjs.map +1 -1
- package/dist/streams.cjs +1 -1
- package/dist/{table-DBf8kWHl.d.cts → table-DHIwU2MI.d.mts} +24 -31
- package/dist/table-DHIwU2MI.d.mts.map +1 -0
- package/dist/{table-DqJt-sXI.d.mts → table-dYCEZk4c.d.cts} +24 -31
- package/dist/table-dYCEZk4c.d.cts.map +1 -0
- package/dist/{util-DDOj_NRD.mjs → util-B4dDuxlC.mjs} +3 -2
- package/dist/util-B4dDuxlC.mjs.map +1 -0
- package/dist/{util-zAG7brd9.cjs → util-CduXXDLh.cjs} +9 -8
- package/dist/util-CduXXDLh.cjs.map +1 -0
- package/package.json +6 -10
- package/dist/table-DBf8kWHl.d.cts.map +0 -1
- package/dist/table-DqJt-sXI.d.mts.map +0 -1
- package/dist/util-DDOj_NRD.mjs.map +0 -1
- package/dist/util-zAG7brd9.cjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/expression-builder.ts","../src/repo.ts","../src/db.ts","../src/table.ts"],"sourcesContent":["import type { Obj } from \"./types\";\n\nconst attrTypes = [\"S\", \"SS\", \"N\", \"NS\", \"B\", \"BS\", \"BOOL\", \"NULL\", \"L\", \"M\"] as const;\nconst comparatorOps: Obj<string> = {\n $eq: \"=\",\n $ne: \"<>\",\n $gt: \">\",\n $gte: \">=\",\n $lt: \"<\",\n $lte: \"<=\",\n};\n\n// TODO should { $eq: undefined } and { $ne: undefined } be converted into attribute_not_exists and attribute_exists ?\n\nexport const isOperation = (val: unknown): val is Obj => {\n if (!val || typeof val !== \"object\" || Array.isArray(val)) return false;\n return Object.keys(val).every((op) => op.startsWith(\"$\"));\n};\n\nexport class ExpressionBuilder {\n protected readonly attrNames = new Map<string, string>();\n protected readonly attrValues = new Map<unknown, string>();\n\n get attributeNames(): Obj<string> | undefined {\n return this.attrNames.size\n ? Object.fromEntries(\n [...this.attrNames.entries()].map(([name, placeholder]) => [placeholder, name]),\n )\n : undefined;\n }\n\n get attributeValues(): Obj | undefined {\n return this.attrValues.size\n ? Object.fromEntries(\n [...this.attrValues.entries()].map(([value, placeholder]) => [placeholder, value]),\n )\n : undefined;\n }\n\n reset(): void {\n this.attrNames.clear();\n this.attrValues.clear();\n }\n\n getPathSub(path: string): string {\n const segments = path.split(\".\");\n const placeholders: string[] = [];\n\n for (const segment of segments) {\n let placeholder = this.attrNames.get(segment);\n if (!placeholder) {\n placeholder = `#${this.attrNames.size}`;\n this.attrNames.set(segment, placeholder);\n }\n\n placeholders.push(placeholder);\n }\n\n return placeholders.join(\".\");\n }\n\n getValueSub(value: unknown): string {\n let placeholder = this.attrValues.get(value);\n if (!placeholder) {\n placeholder = `:${this.attrValues.size}`;\n this.attrValues.set(value, placeholder);\n }\n\n return placeholder;\n }\n\n getValueOrPathSub(pathOrValue: unknown): string {\n if (isOperation(pathOrValue)) {\n if (pathOrValue.$path) return this.getPathSub(pathOrValue.$path);\n throw new Error(\"Expected $path or operand.\");\n }\n\n return this.getValueSub(pathOrValue);\n }\n\n projection<T extends string[] | undefined>(paths: T): T extends undefined ? undefined : string {\n return paths?.map((path) => this.getPathSub(path)).join(\", \") as never;\n }\n\n condition<T extends Obj | undefined>(expression: T): T extends undefined ? undefined : string {\n if (!expression) return undefined as never;\n\n const expressions: string[] = [];\n for (const [key, val] of Object.entries(expression)) {\n if (key === \"$and\") {\n if (!Array.isArray(val)) throw new Error(\"$and expects an array operand.\");\n expressions.push(`(${val.map((v) => this.condition(v)).join(\" AND \")})`);\n } else if (key === \"$or\" && Array.isArray(val)) {\n if (!Array.isArray(val)) throw new Error(\"$or expects an array operand.\");\n expressions.push(`(${val.map((v) => this.condition(v)).join(\" OR \")})`);\n } else if (key === \"$not\") {\n if (!val || typeof val !== \"object\") throw new Error(\"$not expects an object operand.\");\n expressions.push(`NOT ${this.condition(val)}`);\n } else if (!key.startsWith(\"$\")) {\n expressions.push(this.resolveCondition(key, val));\n } else {\n throw new Error(\n `Unexpected operator \"${key}\". Expected attribute path or compound operator.`,\n );\n }\n }\n\n return expressions.join(\" AND \") as never;\n }\n\n update<T extends Obj | undefined>(expression: T): T extends undefined ? undefined : string {\n if (expression === undefined) return undefined as never;\n\n const setOperations: string[] = [];\n const removeOperations: string[] = [];\n const setAddOperations: string[] = [];\n const setDelOperations: string[] = [];\n\n for (const [path, valOrOperation] of Object.entries(expression)) {\n const placeholder = this.getPathSub(path);\n\n if (valOrOperation === undefined) {\n removeOperations.push(placeholder);\n } else if (isOperation(valOrOperation)) {\n if (valOrOperation.$remove === true) {\n removeOperations.push(placeholder);\n } else if (valOrOperation.$setAdd !== undefined || valOrOperation.$setDel !== undefined) {\n const operations = valOrOperation.$setAdd ? setAddOperations : setDelOperations;\n const operand = valOrOperation.$setAdd ?? valOrOperation.$setDel;\n operations.push(\n `${placeholder} ${this.getValueSub(operand instanceof Set ? operand : new Set([operand].flat()))}`,\n );\n } else {\n setOperations.push(`${placeholder} = ${this.resolveSetOperand(path, valOrOperation)}`);\n }\n } else {\n setOperations.push(`${placeholder} = ${this.getValueSub(valOrOperation)}`);\n }\n }\n\n let updateExpression = \"\";\n if (setOperations.length) {\n updateExpression += `SET ${setOperations.join(\", \")} `;\n }\n\n if (removeOperations.length) {\n updateExpression += `REMOVE ${removeOperations.join(\", \")} `;\n }\n\n if (setAddOperations.length) {\n updateExpression += `ADD ${setAddOperations.join(\", \")} `;\n }\n\n if (setDelOperations.length) {\n updateExpression += `DELETE ${setDelOperations.join(\", \")} `;\n }\n\n return updateExpression as never;\n }\n\n protected resolveCondition(path: string, exp: unknown): string {\n if (!exp || typeof exp !== \"object\" || !Object.keys(exp).at(0)?.startsWith(\"$\")) {\n return this.resolveCondition(path, { $eq: exp });\n }\n\n const placeholder = this.getPathSub(path);\n const [operator, operand] = Object.entries(exp).at(0) ?? [\"\"];\n\n if (comparatorOps[operator]) {\n if (isOperation(operand) && operand.$path) {\n return `${placeholder} ${comparatorOps[operator]} ${this.getPathSub(operand.$path)}`;\n }\n\n if (![\"string\", \"boolean\", \"number\"].includes(typeof operand)) {\n throw new Error(`${operator} expects a primitive/scalar operand.`);\n }\n return `${placeholder} ${comparatorOps[operator]} ${this.getValueSub(operand)}`;\n }\n\n switch (operator) {\n case \"$in\":\n if (!Array.isArray(operand)) {\n throw new Error(\"$in operator expects an array operand.\");\n }\n return `${placeholder} IN (${operand.map((op) => this.getValueSub(op)).join(\", \")})`;\n\n case \"$nin\":\n if (!Array.isArray(operand)) {\n throw new Error(\"$nin operator expects an array operand.\");\n }\n return `${placeholder} NOT IN (${operand.map((op) => this.getValueSub(op)).join(\", \")})`;\n\n case \"$prefix\":\n if (typeof operand !== \"string\") {\n throw new Error(\"$prefix operator expects a string operand.\");\n }\n return `begins_with(${placeholder}, ${this.getValueSub(operand)})`;\n\n case \"$includes\":\n return `contains(${placeholder}, ${this.getValueSub(operand)})`;\n\n case \"$between\":\n if (!Array.isArray(operand) || operand.length !== 2) {\n throw new Error(\"$between operator expects an array operand of exactly two values.\");\n }\n return `${placeholder} BETWEEN ${this.getValueSub(operand[0])} AND ${this.getValueSub(operand[1])}`;\n\n case \"$exists\":\n if (typeof operand !== \"boolean\") {\n throw new Error(\"$exists operator expects a boolean operand.\");\n }\n return operand\n ? `attribute_exists(${placeholder})`\n : `attribute_not_exists(${placeholder})`;\n\n case \"$type\":\n if (!attrTypes.includes(operand as any)) {\n throw new Error(`$type operator expects operand to be one of ${attrTypes.join(\",\")}`);\n }\n return `attribute_type(${placeholder})`;\n\n case \"$size\": {\n const sizeExp = typeof operand === \"number\" ? { $eq: operand } : operand;\n if (\n !sizeExp ||\n typeof sizeExp !== \"object\" ||\n !Object.keys(sizeExp).at(0)?.startsWith(\"$\")\n ) {\n throw new Error(\"$size operator expects a number operand or a comparator object.\");\n }\n const [sizeOperator, sizeOperand] = Object.entries(sizeExp).at(0) ?? [\"\"];\n\n if (!comparatorOps[sizeOperator]) {\n throw new Error(\"$size operator expects a number operand or a comparator object.\");\n }\n\n if (![\"string\", \"boolean\", \"number\"].includes(typeof sizeOperand)) {\n throw new Error(`${operator} expects a primitive/scalar operand.`);\n }\n\n return `size(${placeholder}) ${comparatorOps[sizeOperator]} ${this.getValueSub(sizeOperand)}`;\n }\n\n default:\n throw new Error(`Invalid operator \"${operator}\"`);\n }\n }\n\n protected resolveSetOperand(path: string, operand: unknown): string {\n if (isOperation(operand)) {\n if (operand.$ifNotExists) {\n const params = Array.isArray(operand.$ifNotExists)\n ? operand.$ifNotExists\n : [path, operand.$ifNotExists];\n return `if_not_exists(${this.getPathSub(params[0])}, ${this.resolveSetOperand(path, params[1])})`;\n }\n\n if (operand.$set) {\n return this.resolveSetOperand(path, operand.$set);\n }\n\n if (operand.$plus !== undefined || operand.$minus !== undefined) {\n const mathOperator = operand.$plus ? \"+\" : \"-\";\n const mathOperand = operand.$plus ?? operand.$minus;\n const params = Array.isArray(mathOperand) ? mathOperand : [{ $path: path }, mathOperand];\n return `${params.map((param) => this.resolveSetOperand(path, param)).join(` ${mathOperator} `)}`;\n }\n\n if (operand.$append !== undefined || operand.$prepend !== undefined) {\n const listOperand = operand.$append ?? operand.$prepend;\n const resolvedListOperand = isOperation(listOperand) ? listOperand : [listOperand].flat();\n const params = operand.$append\n ? [{ $path: path }, resolvedListOperand]\n : [resolvedListOperand, { $path: path }];\n return `list_append(${params.map((param) => this.resolveSetOperand(path, param)).join(\", \")})`;\n }\n }\n\n return this.getValueOrPathSub(operand);\n }\n}\n","import type { Db } from \"./db\";\nimport type { Table } from \"./table\";\nimport type {\n Condition,\n DbTrxGetRequest,\n DbTrxWriteRequest,\n ExtractTableDef,\n ExtractTableSchema,\n TableGsiNames,\n Obj,\n RepoBatchGetOptions,\n RepoBatchGetOrThrowResult,\n RepoBatchGetResult,\n RepoBatchWrite,\n RepoBatchWriteResult,\n RepoCreateOptions,\n RepoCreateItem,\n RepoCreateResult,\n RepoDeleteOptions,\n RepoDeleteOrThrowResult,\n RepoDeleteResult,\n RepoExistsOptions,\n RepoGetOptions,\n RepoGetOrThrowResult,\n RepoGetResult,\n RepoKey,\n RepoPutOptions,\n RepoPutItem,\n RepoPutResult,\n RepoQueryOptions,\n RepoQueryGsiOptions,\n RepoQueryGsiPagedResult,\n RepoQueryGsiResult,\n RepoQueryPagedResult,\n RepoQueryResult,\n RepoScanOptions,\n RepoScanGsiOptions,\n RepoScanGsiPagedResult,\n RepoScanGsiResult,\n RepoScanPagedResult,\n RepoScanResult,\n RepoTrxGetOptions,\n RepoTrxGetOrThrowResult,\n RepoTrxGetResult,\n RepoTrxWriteRequest,\n RepoUpdateOptions,\n RepoUpdateData,\n RepoUpdateResult,\n RepoQueryGsiQuery,\n RepoQueryQuery,\n} from \"./types\";\n\n// TODO: query/queryGsi needs strongly typed \"key\" argument\n// allows =,>,>=,<,<=,begins_with, between on sort key\n// util -> extractExclusiveStartKey(item)\n\nexport abstract class AbstractRepo<T extends Table> {\n // these phantom properties are used to pre-compute types derived from T\n // which allows easy lookups using the \"this\" AbstractRepo type\n declare readonly $schema: ExtractTableSchema<T>;\n declare readonly $def: ExtractTableDef<T>;\n\n abstract readonly table: T;\n readonly db: Db;\n constructor(db: Db) {\n this.db = db;\n }\n\n get tableName(): string {\n return `${this.db.config?.tableNamePrefix ?? \"\"}${this.table.def.name}`;\n }\n\n get defaultPutData(): Partial<ExtractTableSchema<T>> {\n return {};\n }\n\n get defaultUpdateData(): Partial<ExtractTableSchema<T>> {\n return {};\n }\n\n transformItem(item: ExtractTableSchema<T>): ExtractTableSchema<T> {\n return item;\n }\n\n // TODO: should this throw if pk is missing?\n // should return type by narrower?\n extractKey(item: RepoKey<this>): RepoKey<this> {\n const { partitionKey, sortKey } = this.table.def;\n if (sortKey) {\n return {\n [partitionKey]: item[partitionKey as keyof RepoKey<this>],\n [sortKey]: item[sortKey as keyof RepoKey<this>],\n } as RepoKey<this>;\n }\n\n return { [partitionKey]: item[partitionKey as keyof RepoKey<this>] } as RepoKey<this>;\n }\n\n async get<O extends RepoGetOptions<this>>(\n key: RepoKey<this>,\n options?: O,\n ): Promise<RepoGetResult<this, O>> {\n const item = await this.db.get({\n table: this.tableName,\n key: this.extractKey(key),\n ...options,\n });\n return item && this.applyTransformIfNeeded(item, options);\n }\n\n async getOrThrow<O extends RepoGetOptions<this>>(\n key: RepoKey<this>,\n options?: O,\n ): Promise<RepoGetOrThrowResult<this, O>> {\n const item = await this.db.getOrThrow({\n table: this.tableName,\n key: this.extractKey(key),\n ...options,\n });\n return this.applyTransformIfNeeded(item, options);\n }\n\n async put(item: RepoPutItem<this>, options?: RepoPutOptions<this>): Promise<RepoPutResult<this>> {\n const itemWithDefaults = { ...this.defaultPutData, ...item };\n const result = await this.db.put({ table: this.tableName, item: itemWithDefaults, ...options });\n return this.applyTransformIfNeeded(result);\n }\n\n async update(\n key: RepoKey<this>,\n update: RepoUpdateData,\n options?: RepoUpdateOptions<this>,\n ): Promise<RepoUpdateResult<this>> {\n const updateWithDefaults = { ...this.defaultUpdateData, ...update };\n const result = await this.db.update({\n table: this.tableName,\n key: this.extractKey(key),\n update: updateWithDefaults,\n ...options,\n });\n return this.applyTransformIfNeeded(result);\n }\n\n async create(\n item: RepoPutItem<this>,\n options?: RepoCreateOptions<this>,\n ): Promise<RepoCreateResult<this>> {\n const { condition: otherCondition, ...otherOptions } = options ?? {};\n\n const condition = { $and: [{ [this.table.def.partitionKey]: { $exists: false } }] } as any;\n\n if (otherCondition) {\n condition.$and.push(otherCondition);\n }\n\n return this.put(item, { condition, ...otherOptions });\n }\n\n async delete(\n key: RepoKey<this>,\n options?: RepoDeleteOptions<this>,\n ): Promise<RepoDeleteResult<this>> {\n const item = await this.db.delete({\n table: this.tableName,\n key: this.extractKey(key),\n ...options,\n });\n return item && this.applyTransformIfNeeded(item);\n }\n\n async deleteOrThrow(\n key: RepoKey<this>,\n options?: Omit<RepoDeleteOptions<this>, \"return\">,\n ): Promise<RepoDeleteOrThrowResult<this>> {\n const item = await this.db.deleteOrThrow({\n table: this.tableName,\n key: this.extractKey(key),\n ...options,\n });\n return this.applyTransformIfNeeded(item);\n }\n\n async query<O extends RepoQueryOptions<this>>(\n query: RepoQueryQuery<this>,\n options?: O,\n ): Promise<RepoQueryResult<this, O>> {\n const items = await this.db.query({ table: this.tableName, query, ...options });\n return this.applyTransformsIfNeeded(items, options);\n }\n\n async *queryPaged<O extends RepoQueryOptions<this>>(\n query: RepoQueryQuery<this>,\n options?: O,\n ): RepoQueryPagedResult<this, O> {\n for await (const page of this.db.queryPaged({ table: this.tableName, query, ...options })) {\n yield this.applyTransformsIfNeeded(page, options);\n }\n }\n\n async queryGsi<G extends TableGsiNames<T>, O extends RepoQueryGsiOptions<this, T, G>>(\n gsi: G,\n query: RepoQueryGsiQuery<T, G>,\n options?: O,\n ): Promise<RepoQueryGsiResult<this, O, G>> {\n const items = await this.db.query({ table: this.tableName, index: gsi, query, ...options });\n return this.applyTransformsIfNeeded(items, { ...options, gsi });\n }\n\n async *queryGsiPaged<G extends TableGsiNames<T>, O extends RepoQueryGsiOptions<this, T, G>>(\n gsi: G,\n query: RepoQueryGsiQuery<T, G>,\n options?: O,\n ): RepoQueryGsiPagedResult<this, O, G> {\n for await (const page of this.db.queryPaged({\n table: this.tableName,\n index: gsi,\n query,\n ...options,\n })) {\n yield this.applyTransformsIfNeeded(page, { ...options, gsi });\n }\n }\n\n async scan<O extends RepoScanOptions<this>>(options?: O): Promise<RepoScanResult<this, O>> {\n const items = await this.db.scan({ table: this.tableName, ...options });\n return this.applyTransformsIfNeeded(items, options);\n }\n\n async *scanPaged<O extends RepoScanOptions<this>>(options?: O): RepoScanPagedResult<this, O> {\n for await (const page of this.db.scanPaged({ table: this.tableName, ...options })) {\n yield this.applyTransformsIfNeeded(page, options);\n }\n }\n\n async scanGsi<G extends TableGsiNames<T>, O extends RepoScanGsiOptions<this, T, G>>(\n gsi: G,\n options?: O,\n ): Promise<RepoScanGsiResult<this, O, G>> {\n const items = await this.db.scan({ table: this.tableName, index: gsi, ...options });\n return this.applyTransformsIfNeeded(items, { ...options, gsi });\n }\n\n async *scanGsiPaged<G extends TableGsiNames<T>, O extends RepoScanGsiOptions<this, T, G>>(\n gsi: G,\n options?: O,\n ): RepoScanGsiPagedResult<this, O, G> {\n for await (const page of this.db.scanPaged({\n table: this.tableName,\n index: gsi,\n ...options,\n })) {\n yield this.applyTransformsIfNeeded(page, { ...options, gsi });\n }\n }\n\n async exists(options?: RepoExistsOptions<this>): Promise<boolean> {\n return this.db.exists({\n table: this.tableName,\n projection: [this.table.def.partitionKey],\n ...options,\n });\n }\n\n async existsGsi(gsi: TableGsiNames<T>, options?: RepoExistsOptions<this>): Promise<boolean> {\n return this.db.exists({\n table: this.tableName,\n index: gsi,\n projection: [this.table.def.partitionKey],\n ...options,\n });\n }\n\n async batchGet<O extends RepoBatchGetOptions<this>>(\n keys: RepoKey<this>[],\n options?: O,\n ): Promise<RepoBatchGetResult<this, O>> {\n const { items, unprocessed } = await this.db.batchGet({\n [this.tableName]: { keys: keys.map((key) => this.extractKey(key)), ...options },\n });\n const tableItems = items[this.tableName];\n return {\n items: tableItems && this.applyTransformsIfNeeded(tableItems, options),\n unprocessed: unprocessed?.[this.tableName]?.keys,\n } as RepoBatchGetResult<this, O>;\n }\n\n async batchGetOrThrow<O extends RepoBatchGetOptions<this>>(\n keys: RepoKey<this>[],\n options?: O,\n ): Promise<RepoBatchGetOrThrowResult<this, O>> {\n const result = await this.db.batchGetOrThrow({\n [this.tableName]: { keys: keys.map((key) => this.extractKey(key)), ...options },\n });\n return this.applyTransformsIfNeeded(result[this.tableName] ?? [], options);\n }\n\n async batchWrite(requests: RepoBatchWrite<this>): Promise<RepoBatchWriteResult<this>> {\n const { items, unprocessed } = await this.db.batchWrite({\n [this.tableName]: requests.map((request) => {\n if (request.type === \"DELETE\") {\n return { type: \"DELETE\", key: this.extractKey(request.key) };\n } else {\n const itemWithDefaults = { ...this.defaultPutData, ...request.item };\n return { type: \"PUT\", item: itemWithDefaults };\n }\n }),\n });\n\n return {\n items: items[this.tableName],\n unprocessed: unprocessed?.[this.tableName],\n } as RepoBatchWriteResult<this>;\n }\n\n async trxGet<O extends RepoTrxGetOptions<this>>(\n keys: RepoKey<this>[],\n options?: O,\n ): Promise<RepoTrxGetResult<this, O>> {\n const items = await this.db.trxGet(\n ...keys.map((key) => ({ table: this.tableName, key: this.extractKey(key), ...options })),\n );\n return items.map((item: any) => item && this.applyTransformIfNeeded(item, options)) as any;\n }\n\n async trxGetOrThrow<O extends RepoTrxGetOptions<this>>(\n keys: RepoKey<this>[],\n options?: O,\n ): Promise<RepoTrxGetOrThrowResult<this, O>> {\n const items = await this.db.trxGetOrThrow(\n ...keys.map((key) => ({ table: this.tableName, key: this.extractKey(key), ...options })),\n );\n return this.applyTransformsIfNeeded(items, options);\n }\n\n async trxWrite(...requests: RepoTrxWriteRequest<this>[]): Promise<void> {\n await this.db.trxWrite(\n ...requests.map((request) => {\n switch (request.type) {\n case \"CONDITION\": {\n const { key, condition, ...options } = request;\n return this.trxConditionRequest(key, condition, options);\n }\n\n case \"DELETE\": {\n const { key, ...options } = request;\n return this.trxDeleteRequest(key, options);\n }\n\n case \"PUT\": {\n const { item, ...options } = request;\n return this.trxPutRequest(item, options);\n }\n\n case \"UPDATE\": {\n const { key, update, ...options } = request;\n return this.trxUpdateRequest(key, update, options);\n }\n\n default:\n throw new Error(\"Unexpected request type.\");\n }\n }),\n );\n }\n\n async trxDelete(\n keys: RepoKey<this>[],\n options?: Omit<RepoDeleteOptions<this>, \"return\">,\n ): Promise<void> {\n return this.db.trxWrite(...keys.map((key) => this.trxDeleteRequest(key, options)));\n }\n\n // todo: return items\n async trxPut(\n items: RepoPutItem<this>[],\n options?: Omit<RepoPutOptions<this>, \"return\">,\n ): Promise<void> {\n return this.db.trxWrite(...items.map((item) => this.trxPutRequest(item, options)));\n }\n\n async trxUpdate(\n keys: RepoKey<this>[],\n update: RepoUpdateData,\n options?: Omit<RepoUpdateOptions<this>, \"return\">,\n ): Promise<void> {\n return this.db.trxWrite(...keys.map((key) => this.trxUpdateRequest(key, update, options)));\n }\n\n // todo: return items\n async trxCreate(items: RepoCreateItem<this>[], options?: RepoCreateOptions<this>): Promise<void> {\n return this.db.trxWrite(...items.map((item) => this.trxCreateRequest(item, options)));\n }\n\n trxGetRequest<O extends RepoGetOptions<this>>(\n key: RepoKey<this>,\n options?: O,\n ): DbTrxGetRequest<RepoGetOrThrowResult<this, O>> {\n return { table: this.tableName, key: this.extractKey(key), ...options };\n }\n\n trxDeleteRequest(\n key: RepoKey<this>,\n options?: Omit<RepoDeleteOptions<this>, \"return\">,\n ): DbTrxWriteRequest {\n return { table: this.tableName, type: \"DELETE\", key: this.extractKey(key), ...options };\n }\n\n trxConditionRequest(\n key: RepoKey<this>,\n condition: Condition<ExtractTableSchema<T>>,\n options?: Omit<RepoDeleteOptions<this>, \"return\" | \"condition\">,\n ): DbTrxWriteRequest {\n return {\n table: this.tableName,\n type: \"CONDITION\",\n key: this.extractKey(key),\n condition,\n ...options,\n };\n }\n\n trxPutRequest(\n item: RepoPutItem<this>,\n options?: Omit<RepoPutOptions<this>, \"return\">,\n ): DbTrxWriteRequest {\n const itemWithDefaults = { ...this.defaultPutData, ...item };\n return { table: this.tableName, type: \"PUT\", item: itemWithDefaults, ...options };\n }\n\n trxUpdateRequest(\n key: RepoKey<this>,\n update: RepoUpdateData,\n options?: Omit<RepoUpdateOptions<this>, \"return\">,\n ): DbTrxWriteRequest {\n const updateWithDefaults = { ...this.defaultUpdateData, ...update };\n return {\n table: this.tableName,\n type: \"UPDATE\",\n key: this.extractKey(key),\n update: updateWithDefaults,\n ...options,\n };\n }\n\n trxCreateRequest(\n item: RepoCreateItem<this>,\n options?: RepoCreateOptions<this>,\n ): DbTrxWriteRequest {\n const { condition: otherCondition, ...otherOptions } = options ?? {};\n\n const condition = { $and: [{ [this.table.def.partitionKey]: { $exists: false } }] } as any;\n\n if (otherCondition) {\n condition.$and.push(otherCondition);\n }\n\n const itemWithDefaults = { ...this.defaultPutData, ...item };\n\n return {\n table: this.tableName,\n type: \"PUT\",\n item: itemWithDefaults,\n condition,\n ...otherOptions,\n };\n }\n\n private applyTransformsIfNeeded(\n items: Obj[],\n options?: { projection?: any[]; gsi?: string },\n ): any[] {\n // transforms aren't applied when applying a projection\n if (options?.projection?.length) return items;\n if (options?.gsi) {\n // projections inherited to GSIs also prevent transformation\n const gsiProj = this.table.def.gsis?.[options.gsi]?.projection;\n if (gsiProj === \"KEYS_ONLY\" || Array.isArray(gsiProj)) return items;\n }\n\n return items.map((item) => this.transformItem(item as ExtractTableSchema<T>));\n }\n\n private applyTransformIfNeeded(item: Obj, options?: { projection?: any[]; gsi?: string }): any {\n const [transformedItem] = this.applyTransformsIfNeeded([item], options);\n return transformedItem;\n }\n}\n\nexport class Repo<T extends Table<any, any>> extends AbstractRepo<T> {\n readonly table: T;\n\n constructor(db: Db, table: T) {\n super(db);\n this.table = table;\n }\n}\n","import {\n type BatchGetItemInput,\n type BatchWriteItemInput,\n CreateTableCommand,\n DeleteTableCommand,\n DynamoDB,\n DynamoDBClient,\n type DynamoDBClientConfig,\n ListTablesCommand,\n type WriteRequest,\n} from \"@aws-sdk/client-dynamodb\";\n//import { DynamoDBStreams } from '@aws-sdk/client-dynamodb-streams';\nimport type { TransactGetCommandInput, TransactWriteCommandInput } from \"@aws-sdk/lib-dynamodb\";\nimport * as Lib from \"@aws-sdk/lib-dynamodb\";\nimport sift from \"sift\";\nimport { ExpressionBuilder } from \"./expression-builder\";\nimport { Repo } from \"./repo\";\nimport type { Table } from \"./table\";\nimport type {\n DbBatchGet,\n DbBatchGetResponse,\n DbBatchWrite,\n DbBatchWriteResponse,\n DbConfig,\n DbDelete,\n DbExists,\n DbGet,\n DbListTables,\n DbPut,\n DbQuery,\n DbScan,\n DbTrxGetOrThrowResult,\n DbTrxGetRequest,\n DbTrxGetResult,\n DbTrxWriteRequest,\n DbUpdate,\n Obj,\n} from \"./types\";\nimport { extractTableDesc, removeUndefined } from \"./util\";\n\n// TODO\n// - caching support?\n// - consider special \"limit\" handling for paged scans, maybe have \"scanLimit\" too\n// - consider \"sort\" shorthand for methods that return unpaginated collections\n// i.e. sort: { by: 'createdAt', dir: 'ASC' } or sort: (a,b) => a.createdAt - b.createdAt\n// - consider support for batchUpdates leveraging BatchExecute and PartiQL\n// - consider batchPut (batchPutOrThrow) and batchDelete that operate on a single table\n// - getGsi? throws if > 1 result, allows for assert, and filtering\n// - bug $in doesn't handle empty arrays, I imagine other operators are affected\n// - consider beforeCreate, beforePut, beforeUpdate, beforeDelete, after, etc.\n// - type out repo update data\n\nexport class Db {\n readonly client: Lib.DynamoDBDocumentClient;\n readonly config: DbConfig | undefined;\n\n //protected streamEventListeners: DbStreamEventListener[] = [];\n\n constructor(\n clientOrConfig: DynamoDBClient | DynamoDB | DynamoDBClientConfig,\n dbConfig?: DbConfig,\n ) {\n if (clientOrConfig instanceof DynamoDBClient || clientOrConfig instanceof DynamoDB) {\n this.client = Lib.DynamoDBDocumentClient.from(new DynamoDBClient(clientOrConfig));\n } else {\n const { endpoint, ...clientConfig } = clientOrConfig;\n // client doesn't interpret an empty string endpoint as falsy so normalize things\n // here so consumers don't have to worry about that quirk\n this.client = Lib.DynamoDBDocumentClient.from(\n new DynamoDBClient({\n endpoint: endpoint || undefined,\n ...clientConfig,\n }),\n );\n }\n\n this.config = dbConfig;\n }\n\n createRepo<T extends Table>(table: T): Repo<T> {\n return new Repo(this, table);\n }\n\n async createTable(table: Table): Promise<void> {\n await this.client.send(new CreateTableCommand(extractTableDesc(table)));\n }\n\n async deleteTable(tableName: string): Promise<void> {\n await this.client.send(new DeleteTableCommand({ TableName: tableName }));\n }\n\n async listTables(data?: DbListTables): Promise<string[]> {\n const tables: string[] = [];\n let lastEvaluatedTableName: string | undefined;\n do {\n const output = await this.client.send(\n new ListTablesCommand({\n Limit: data?.limit,\n ExclusiveStartTableName: lastEvaluatedTableName,\n }),\n );\n\n tables.push(...(output.TableNames ?? []));\n lastEvaluatedTableName = output.LastEvaluatedTableName;\n } while (lastEvaluatedTableName);\n return tables;\n }\n\n async get<R = Obj>(data: DbGet): Promise<R | undefined> {\n const exp = new ExpressionBuilder();\n\n const input = new Lib.GetCommand({\n TableName: data.table,\n Key: data.key,\n ConsistentRead: data.consistent,\n ProjectionExpression: exp.projection(data.projection),\n ExpressionAttributeNames: exp.attributeNames,\n });\n\n const output = await this.client.send(input);\n\n if (output.Item && data.condition) {\n if (!sift(data.condition)(output.Item)) {\n return undefined;\n }\n }\n\n return output.Item as R;\n }\n\n async getOrThrow<R = Obj>(data: DbGet): Promise<R> {\n const item = await this.get(data);\n if (!item) {\n throw new Error(`Item not found in \"${data.table}\" table.`);\n }\n return item as R;\n }\n\n async put<R = Obj>(data: DbPut): Promise<R> {\n const exp = new ExpressionBuilder();\n\n const item = removeUndefined(data.item);\n\n const input = new Lib.PutCommand({\n TableName: data.table,\n Item: item,\n ReturnValues: data.returnOld ? \"ALL_OLD\" : \"NONE\",\n ReturnValuesOnConditionCheckFailure: \"ALL_OLD\",\n ConditionExpression: exp.condition(data.condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n\n return (data.returnOld ? output.Attributes : item) as R;\n }\n\n async update<R = Obj>(data: DbUpdate): Promise<R> {\n const exp = new ExpressionBuilder();\n\n const condition = {\n $and: Object.keys(data.key).map((field) => ({\n [field]: { $exists: true },\n })),\n };\n\n if (data.condition) {\n condition.$and.push(data.condition);\n }\n\n const input = new Lib.UpdateCommand({\n TableName: data.table,\n Key: data.key,\n ReturnValues: \"ALL_NEW\",\n ReturnValuesOnConditionCheckFailure: \"ALL_OLD\",\n UpdateExpression: exp.update(data.update),\n ConditionExpression: exp.condition(condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n\n return output.Attributes as R;\n }\n\n async delete<R = Obj>(data: DbDelete): Promise<R | undefined> {\n const exp = new ExpressionBuilder();\n\n const input = new Lib.DeleteCommand({\n TableName: data.table,\n Key: data.key,\n ReturnValues: \"ALL_OLD\",\n ConditionExpression: exp.condition(data.condition),\n ReturnValuesOnConditionCheckFailure: \"ALL_OLD\",\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n\n return output.Attributes as R | undefined;\n }\n\n async deleteOrThrow<R = Obj>(data: DbDelete): Promise<R> {\n const item = await this.delete<R>(data);\n if (!item) {\n throw new Error(`Item not found in \"${data.table}\" table.`);\n }\n return item;\n }\n\n async *queryPaged<R = Obj>(data: DbQuery): AsyncGenerator<R[]> {\n const exp = new ExpressionBuilder();\n\n let lastEvaluatedKey = data.startKey;\n do {\n const input = new Lib.QueryCommand({\n TableName: data.table,\n IndexName: data.index,\n ExclusiveStartKey: lastEvaluatedKey,\n Limit: data.limit,\n ScanIndexForward: data.sort !== \"DESC\",\n ConsistentRead: data.consistent,\n KeyConditionExpression: exp.condition(data.query),\n ProjectionExpression: exp.projection(data.projection),\n FilterExpression: exp.condition(data.filter),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n\n if (output.Items?.length) {\n yield output.Items as R[];\n }\n lastEvaluatedKey = output.LastEvaluatedKey;\n } while (lastEvaluatedKey);\n }\n\n async query<R = Obj>(data: DbQuery): Promise<R[]> {\n const items: Obj[] = [];\n\n for await (const page of this.queryPaged(data)) {\n items.push(...page);\n }\n\n return items as R[];\n }\n\n async *scanPaged<R = Obj>(data: DbScan): AsyncGenerator<R[]> {\n const exp = new ExpressionBuilder();\n\n const totalSegments = data.parallel ?? 1;\n const segments = [...Array(totalSegments).keys()];\n\n // undefined: initial value when a start key isn't specified\n // null: scanning a particular segment is finished\n const lastEvaluatedKeys: (Obj | undefined | null)[] = segments.map(() => data.startKey);\n do {\n const results = await Promise.all(\n segments.map(async (segment) => {\n if (lastEvaluatedKeys[segment] === null) return [];\n\n const input = new Lib.ScanCommand({\n ExclusiveStartKey: lastEvaluatedKeys[segment],\n Segment: segment,\n TotalSegments: totalSegments,\n TableName: data.table,\n IndexName: data.index,\n Limit: data.limit,\n ConsistentRead: data.consistent,\n ProjectionExpression: exp.projection(data.projection),\n FilterExpression: exp.condition(data.filter),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n lastEvaluatedKeys[segment] = output.LastEvaluatedKey ?? null;\n return output.Items ?? [];\n }),\n );\n\n const items = results.flat();\n\n if (items.length) {\n yield items as R[];\n }\n } while (lastEvaluatedKeys.some((key) => key !== null));\n }\n\n async scan<R = Obj>(data: DbScan): Promise<R[]> {\n const items: R[] = [];\n\n for await (const page of this.scanPaged(data)) {\n items.push(...(page as R[]));\n }\n\n return items;\n }\n\n async exists(data: DbExists): Promise<boolean> {\n const { query, ...otherOptions } = data;\n\n // we can't rely on the limit when a filter is being applied, since the filter is\n // applied after the scan/query page, so we only apply a limit of 1 when there is no filter.\n // otherwise, we page through the results and return true as soon as we see a single item\n const sharedOptions = {\n ...otherOptions,\n limit: data.filter ? undefined : 1,\n };\n\n const pagedItems = query\n ? this.queryPaged({ query, ...sharedOptions })\n : this.scanPaged(sharedOptions);\n\n for await (const items of pagedItems) {\n if (items.length) return true;\n }\n\n return false;\n }\n\n // TODO: test wildly different item sizes to make\n // sure retry algorithm works properly\n async batchGet(data: DbBatchGet): Promise<DbBatchGetResponse> {\n const result: DbBatchGetResponse = { items: {} };\n\n const tableData = Object.fromEntries(\n Object.entries(data).map(([table, request]) => {\n const exp = new ExpressionBuilder();\n const sifter = request?.condition ? sift(request?.condition) : undefined;\n\n result.items[table] = [];\n\n return [\n table,\n {\n request: {\n ConsistentRead: request?.consistent,\n ProjectionExpression: exp.projection(request?.projection),\n ExpressionAttributeNames: exp.attributeNames,\n },\n keyNames: Object.keys(request.keys.at(0) ?? {}),\n itemIndexMap: new Map<string, number>(),\n sifter,\n },\n ];\n }),\n );\n\n const flattenedBatches = Object.entries(data).flatMap(([table, request]) => {\n return request.keys.map((key, i) => {\n const itemIndexKey =\n tableData[table]?.keyNames.map((keyName) => key[keyName]).join(\"|\") ?? \"\";\n tableData[table]?.itemIndexMap.set(itemIndexKey, i);\n return [table, key] as const;\n });\n });\n\n let batchSize = 100;\n let retryCount = 0;\n\n while (flattenedBatches.length && retryCount < 5) {\n const batch = flattenedBatches.splice(0, batchSize || 1);\n\n const request: BatchGetItemInput[\"RequestItems\"] = {};\n for (const [table, key] of batch) {\n if (!request[table]) {\n request[table] = { ...tableData[table]?.request, Keys: [] };\n }\n\n request[table].Keys?.push(key);\n }\n\n const input = new Lib.BatchGetCommand({ RequestItems: request });\n const output = await this.client.send(input);\n\n for (const [table, items] of Object.entries(output.Responses ?? {})) {\n //just to appease typescript\n if (!result.items[table]) continue;\n\n for (const item of items) {\n // items that fail the condition are treated the same as non-existent keys,\n // i.e. they are not present in items/unprocessed arrays\n if (tableData[table]?.sifter && !tableData[table].sifter(item)) {\n continue;\n }\n\n result.items[table].push(item);\n }\n }\n\n // handle unprocessed requests\n let unprocessedKeyCount = 0;\n for (const [table, request] of Object.entries(output.UnprocessedKeys ?? {})) {\n const unprocessed = (request.Keys ?? []).map((key) => [table, key] as const);\n flattenedBatches.push(...unprocessed);\n unprocessedKeyCount += unprocessed.length;\n }\n\n //move immediately to next batch if all requests were processed\n if (!unprocessedKeyCount) {\n retryCount = 0;\n continue;\n }\n\n // reduce batch size so we don't continue to overfetch,\n // but do it gradually by only splitting the difference\n batchSize -= Math.floor(unprocessedKeyCount / 2);\n\n retryCount++;\n }\n\n // anything left in flattened batches needs to be returned in unprocessed\n if (flattenedBatches.length) {\n result.unprocessed = {};\n for (const [table, key] of flattenedBatches) {\n if (!result.unprocessed[table]) {\n result.unprocessed[table] = {\n ...tableData[table]?.request,\n keys: [],\n };\n }\n result.unprocessed[table].keys.push(key);\n }\n }\n\n // finally, sort any returned items by their original index to preserve order\n for (const [table, items] of Object.entries(result.items)) {\n const itemIndexMap = tableData[table]?.itemIndexMap;\n const keyNames = tableData[table]?.keyNames;\n\n if (!itemIndexMap || !keyNames) continue;\n\n items.sort((item1, item2) => {\n const item1IndexKey = keyNames.map((keyName) => item1[keyName]).join(\"|\");\n const item2IndexKey = keyNames.map((keyName) => item2[keyName]).join(\"|\");\n\n return (itemIndexMap.get(item1IndexKey) ?? 0) - (itemIndexMap.get(item2IndexKey) ?? 0);\n });\n }\n\n return result;\n }\n\n async batchGetOrThrow(data: DbBatchGet): Promise<DbBatchGetResponse[\"items\"]> {\n const { items, unprocessed } = await this.batchGet(data);\n\n for (const table of Object.keys(data)) {\n if (unprocessed?.[table]) {\n throw new Error(`One or more batch get requests were not processed in \"${table}\" table.`);\n }\n\n if (items[table]?.length !== data[table]?.keys?.length) {\n throw new Error(`One or more items were not found in \"${table}\" table.`);\n }\n }\n\n return items;\n }\n\n // TODO: test wildly different item sizes to make\n // sure retry algorithm works properly\n async batchWrite(data: DbBatchWrite): Promise<DbBatchWriteResponse> {\n const result: DbBatchWriteResponse = { items: {} };\n\n const flattenedBatches = Object.keys(data).flatMap((table) => {\n return (\n data[table]?.map((r) => {\n if (r.type === \"DELETE\") {\n return [table, { DeleteRequest: { Key: r.key } }] as [string, WriteRequest];\n } else {\n return [table, { PutRequest: { Item: r.item } }] as [string, WriteRequest];\n }\n }) ?? []\n );\n });\n\n let batchSize = 25;\n let retryCount = 0;\n\n while (flattenedBatches.length && retryCount < 5) {\n const batch = flattenedBatches.splice(0, batchSize || 1);\n\n const request: BatchWriteItemInput[\"RequestItems\"] = {};\n for (const [table, req] of batch) {\n if (!request[table]) {\n request[table] = [];\n }\n request[table].push(req);\n }\n\n const input = new Lib.BatchWriteCommand({ RequestItems: request });\n const output = await this.client.send(input);\n\n // handle unprocessed requests\n let unprocessedKeyCount = 0;\n for (const [table, requests] of Object.entries(output.UnprocessedItems ?? {})) {\n for (const request of requests) {\n flattenedBatches.push([table, request]);\n unprocessedKeyCount++;\n }\n }\n\n //move immediately to next batch if all requests were processed\n if (!unprocessedKeyCount) {\n retryCount = 0;\n continue;\n }\n\n // reduce batch size so we don't continue to overwrite,\n // but do it gradually by only splitting the difference\n batchSize -= Math.floor(unprocessedKeyCount / 2);\n\n retryCount++;\n }\n\n // anything left in flattened batches needs to be returned in unprocessed\n if (flattenedBatches.length) {\n result.unprocessed = {};\n for (const [table, request] of flattenedBatches) {\n if (!result.unprocessed[table]) {\n result.unprocessed[table] = [];\n }\n\n if (\"DeleteRequest\" in request && request.DeleteRequest?.Key) {\n result.unprocessed[table].push({\n type: \"DELETE\",\n key: request.DeleteRequest.Key,\n });\n } else if (\"PutRequest\" in request && request.PutRequest?.Item) {\n result.unprocessed[table].push({\n type: \"PUT\",\n item: request.PutRequest.Item,\n });\n }\n }\n }\n\n return result;\n }\n\n async trxGet<R extends DbTrxGetRequest[]>(...requests: R): Promise<DbTrxGetResult<R>> {\n const trxItems: TransactGetCommandInput[\"TransactItems\"] = requests.map((request) => {\n const exp = new ExpressionBuilder();\n return {\n Get: {\n Key: request.key,\n TableName: request.table,\n ProjectionExpression: exp.projection(request?.projection),\n ExpressionAttributeNames: exp.attributeNames,\n },\n };\n });\n\n const input = new Lib.TransactGetCommand({ TransactItems: trxItems });\n const output = await this.client.send(input);\n\n return (\n (output.Responses?.map((response, i) => {\n if (requests[i]?.condition && !sift(requests[i].condition)(response.Item)) {\n return undefined;\n }\n\n return response.Item;\n }) as DbTrxGetResult<R>) ?? []\n );\n }\n\n async trxGetOrThrow<R extends DbTrxGetRequest[]>(\n ...requests: R\n ): Promise<DbTrxGetOrThrowResult<R>> {\n const items = await this.trxGet(...requests);\n for (let i = 0; i < items.length; i++) {\n if (!items[i]) {\n throw new Error(`One or more items were not found in \"${requests[i]?.table}\" table.`);\n }\n }\n\n return items as DbTrxGetOrThrowResult<R>;\n }\n\n async trxWrite(...requests: DbTrxWriteRequest[]): Promise<void> {\n const trxItems: TransactWriteCommandInput[\"TransactItems\"] = requests.map((request) => {\n const exp = new ExpressionBuilder();\n\n if (request.type === \"CONDITION\" || request.type === \"DELETE\") {\n return {\n [request.type === \"CONDITION\" ? \"ConditionCheck\" : \"Delete\"]: {\n TableName: request.table,\n Key: request.key,\n ConditionExpression: exp.condition(request.condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n },\n };\n }\n\n if (request.type === \"PUT\") {\n return {\n Put: {\n TableName: request.table,\n Item: removeUndefined(request.item),\n ConditionExpression: exp.condition(request.condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n },\n };\n }\n\n return {\n Update: {\n Key: request.key,\n TableName: request.table,\n UpdateExpression: exp.update(request.update),\n ConditionExpression: exp.condition(request.condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n },\n };\n });\n\n const input = new Lib.TransactWriteCommand({ TransactItems: trxItems });\n await this.client.send(input);\n }\n\n /* Dynamodb Streams */\n\n /*\n\n\tasync enableStreamEvents(data?: DbEnableEventStreams): Promise<void> {\n\t\tconst tables = data?.tables ?? (await this.listTables());\n\n\t\tconst streamsClient = new DynamoDBStreams({\n\t\t\tendpoint: this.client.config.endpoint,\n\t\t\tcredentials: this.client.config.credentials,\n\t\t\tregion: this.client.config.region,\n\t\t});\n\n\t\tawait Promise.all(\n\t\t\ttables.map(async (table) => {\n\t\t\t\tconst tableDesc = await this.client.send(new DescribeTableCommand({ TableName: table }));\n\n\t\t\t\tconst latestStreamArn = tableDesc.Table?.LatestStreamArn;\n\n\t\t\t\tif (!latestStreamArn) {\n\t\t\t\t\tif (data?.tables) {\n\t\t\t\t\t\tthrow new Error(`Table \"${table}\" does not have streaming enabled.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst eventStreamer = new EventStreamer(streamsClient, latestStreamArn);\n\t\t\t\teventStreamer.startPolling();\n\t\t\t}),\n\t\t);\n\t}\n\n\tasync disableStreamEvents(): Promise<void> {}\n\n\tsubscribe(listener: DbStreamEventListener): void {\n\t\tthis.streamEventListeners.push(listener);\n\t}\n\n\tunsubscribe(listener: DbStreamEventListener): void {\n\t\tthis.streamEventListeners = this.streamEventListeners.filter((l) => l !== listener);\n\t}\n\n\tunsubscribeAll(): void {\n\t\tthis.streamEventListeners = [];\n\t}\n\t*/\n}\n\n// respondentRepo.onChange((respondent) => , { filter: (r1, r2) => r1.status !== r2.status } )\n/*\nconst time = new Date(record.dynamodb.ApproximateCreationDateTime).getTime();\nif (time >= startTime) {\n\tfor (const listener of this.streamEventListeners) {\n\t\tlistener({\n\t\t\ttable,\n\t\t\ttime,\n\t\t\tid: record.eventID,\n\t\t\ttype: record.eventName,\n\t\t\tkey: record.dynamodb.Keys,\n\t\t\toldItem: record.dynamodb.OldImage,\n\t\t\tnewItem: record.dynamodb.NewImage,\n\t\t});\n\t}\n}\n*/\n","import type { Static, TSchema } from \"typebox\";\nimport type { TableDef } from \"./types\";\n\ntype SchemaStatic<Schema extends TSchema> = unknown extends Static<Schema> ? any : Static<Schema>;\n\nexport class Table<\n Schema extends TSchema = TSchema,\n const Def extends TableDef<SchemaStatic<Schema>> = TableDef<SchemaStatic<Schema>>,\n> {\n readonly schema: Schema;\n readonly def: Def;\n\n constructor(schema: Schema, def: Def) {\n this.schema = schema;\n this.def = def;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/expression-builder.ts","../src/repo.ts","../src/db.ts","../src/table.ts"],"sourcesContent":["import type { Obj } from \"./types\";\n\nconst attrTypes = [\"S\", \"SS\", \"N\", \"NS\", \"B\", \"BS\", \"BOOL\", \"NULL\", \"L\", \"M\"] as const;\nconst comparatorOps: Obj<string> = {\n $eq: \"=\",\n $ne: \"<>\",\n $gt: \">\",\n $gte: \">=\",\n $lt: \"<\",\n $lte: \"<=\",\n};\n\n// TODO should { $eq: undefined } and { $ne: undefined } be converted into attribute_not_exists and attribute_exists ?\n\nexport const isOperation = (val: unknown): val is Obj => {\n if (!val || typeof val !== \"object\" || Array.isArray(val)) return false;\n return Object.keys(val).every((op) => op.startsWith(\"$\"));\n};\n\nexport class ExpressionBuilder {\n protected readonly attrNames = new Map<string, string>();\n protected readonly attrValues = new Map<unknown, string>();\n\n get attributeNames(): Obj<string> | undefined {\n return this.attrNames.size\n ? Object.fromEntries(\n [...this.attrNames.entries()].map(([name, placeholder]) => [placeholder, name]),\n )\n : undefined;\n }\n\n get attributeValues(): Obj | undefined {\n return this.attrValues.size\n ? Object.fromEntries(\n [...this.attrValues.entries()].map(([value, placeholder]) => [placeholder, value]),\n )\n : undefined;\n }\n\n reset(): void {\n this.attrNames.clear();\n this.attrValues.clear();\n }\n\n getPathSub(path: string): string {\n const segments = path.split(\".\");\n const placeholders: string[] = [];\n\n for (const segment of segments) {\n let placeholder = this.attrNames.get(segment);\n if (!placeholder) {\n placeholder = `#${this.attrNames.size}`;\n this.attrNames.set(segment, placeholder);\n }\n\n placeholders.push(placeholder);\n }\n\n return placeholders.join(\".\");\n }\n\n getValueSub(value: unknown): string {\n let placeholder = this.attrValues.get(value);\n if (!placeholder) {\n placeholder = `:${this.attrValues.size}`;\n this.attrValues.set(value, placeholder);\n }\n\n return placeholder;\n }\n\n getValueOrPathSub(pathOrValue: unknown): string {\n if (isOperation(pathOrValue)) {\n if (pathOrValue.$path) return this.getPathSub(pathOrValue.$path);\n throw new Error(\"Expected $path or operand.\");\n }\n\n return this.getValueSub(pathOrValue);\n }\n\n projection<T extends string[] | undefined>(paths: T): T extends undefined ? undefined : string {\n return paths?.map((path) => this.getPathSub(path)).join(\", \") as never;\n }\n\n condition<T extends Obj | undefined>(expression: T): T extends undefined ? undefined : string {\n if (!expression) return undefined as never;\n\n const expressions: string[] = [];\n for (const [key, val] of Object.entries(expression)) {\n if (key === \"$and\") {\n if (!Array.isArray(val)) throw new Error(\"$and expects an array operand.\");\n expressions.push(`(${val.map((v) => this.condition(v)).join(\" AND \")})`);\n } else if (key === \"$or\" && Array.isArray(val)) {\n if (!Array.isArray(val)) throw new Error(\"$or expects an array operand.\");\n expressions.push(`(${val.map((v) => this.condition(v)).join(\" OR \")})`);\n } else if (key === \"$not\") {\n if (!val || typeof val !== \"object\") throw new Error(\"$not expects an object operand.\");\n expressions.push(`NOT ${this.condition(val)}`);\n } else if (!key.startsWith(\"$\")) {\n expressions.push(this.resolveCondition(key, val));\n } else {\n throw new Error(\n `Unexpected operator \"${key}\". Expected attribute path or compound operator.`,\n );\n }\n }\n\n return expressions.join(\" AND \") as never;\n }\n\n update<T extends Obj | undefined>(expression: T): T extends undefined ? undefined : string {\n if (expression === undefined) return undefined as never;\n\n const setOperations: string[] = [];\n const removeOperations: string[] = [];\n const setAddOperations: string[] = [];\n const setDelOperations: string[] = [];\n\n for (const [path, valOrOperation] of Object.entries(expression)) {\n const placeholder = this.getPathSub(path);\n\n if (valOrOperation === undefined) {\n removeOperations.push(placeholder);\n } else if (isOperation(valOrOperation)) {\n if (valOrOperation.$remove === true) {\n removeOperations.push(placeholder);\n } else if (valOrOperation.$setAdd !== undefined || valOrOperation.$setDel !== undefined) {\n const operations = valOrOperation.$setAdd ? setAddOperations : setDelOperations;\n const operand = valOrOperation.$setAdd ?? valOrOperation.$setDel;\n operations.push(\n `${placeholder} ${this.getValueSub(operand instanceof Set ? operand : new Set([operand].flat()))}`,\n );\n } else {\n setOperations.push(`${placeholder} = ${this.resolveSetOperand(path, valOrOperation)}`);\n }\n } else {\n setOperations.push(`${placeholder} = ${this.getValueSub(valOrOperation)}`);\n }\n }\n\n let updateExpression = \"\";\n if (setOperations.length) {\n updateExpression += `SET ${setOperations.join(\", \")} `;\n }\n\n if (removeOperations.length) {\n updateExpression += `REMOVE ${removeOperations.join(\", \")} `;\n }\n\n if (setAddOperations.length) {\n updateExpression += `ADD ${setAddOperations.join(\", \")} `;\n }\n\n if (setDelOperations.length) {\n updateExpression += `DELETE ${setDelOperations.join(\", \")} `;\n }\n\n return updateExpression as never;\n }\n\n protected resolveCondition(path: string, exp: unknown): string {\n if (!exp || typeof exp !== \"object\" || !Object.keys(exp).at(0)?.startsWith(\"$\")) {\n return this.resolveCondition(path, { $eq: exp });\n }\n\n const placeholder = this.getPathSub(path);\n const [operator, operand] = Object.entries(exp).at(0) ?? [\"\"];\n\n if (comparatorOps[operator]) {\n if (isOperation(operand) && operand.$path) {\n return `${placeholder} ${comparatorOps[operator]} ${this.getPathSub(operand.$path)}`;\n }\n\n if (![\"string\", \"boolean\", \"number\"].includes(typeof operand)) {\n throw new Error(`${operator} expects a primitive/scalar operand.`);\n }\n return `${placeholder} ${comparatorOps[operator]} ${this.getValueSub(operand)}`;\n }\n\n switch (operator) {\n case \"$in\":\n if (!Array.isArray(operand)) {\n throw new Error(\"$in operator expects an array operand.\");\n }\n return `${placeholder} IN (${operand.map((op) => this.getValueSub(op)).join(\", \")})`;\n\n case \"$nin\":\n if (!Array.isArray(operand)) {\n throw new Error(\"$nin operator expects an array operand.\");\n }\n return `${placeholder} NOT IN (${operand.map((op) => this.getValueSub(op)).join(\", \")})`;\n\n case \"$prefix\":\n if (typeof operand !== \"string\") {\n throw new Error(\"$prefix operator expects a string operand.\");\n }\n return `begins_with(${placeholder}, ${this.getValueSub(operand)})`;\n\n case \"$includes\":\n return `contains(${placeholder}, ${this.getValueSub(operand)})`;\n\n case \"$between\":\n if (!Array.isArray(operand) || operand.length !== 2) {\n throw new Error(\"$between operator expects an array operand of exactly two values.\");\n }\n return `${placeholder} BETWEEN ${this.getValueSub(operand[0])} AND ${this.getValueSub(operand[1])}`;\n\n case \"$exists\":\n if (typeof operand !== \"boolean\") {\n throw new Error(\"$exists operator expects a boolean operand.\");\n }\n return operand\n ? `attribute_exists(${placeholder})`\n : `attribute_not_exists(${placeholder})`;\n\n case \"$type\":\n if (!attrTypes.includes(operand as any)) {\n throw new Error(`$type operator expects operand to be one of ${attrTypes.join(\",\")}`);\n }\n return `attribute_type(${placeholder})`;\n\n case \"$size\": {\n const sizeExp = typeof operand === \"number\" ? { $eq: operand } : operand;\n if (\n !sizeExp ||\n typeof sizeExp !== \"object\" ||\n !Object.keys(sizeExp).at(0)?.startsWith(\"$\")\n ) {\n throw new Error(\"$size operator expects a number operand or a comparator object.\");\n }\n const [sizeOperator, sizeOperand] = Object.entries(sizeExp).at(0) ?? [\"\"];\n\n if (!comparatorOps[sizeOperator]) {\n throw new Error(\"$size operator expects a number operand or a comparator object.\");\n }\n\n if (![\"string\", \"boolean\", \"number\"].includes(typeof sizeOperand)) {\n throw new Error(`${operator} expects a primitive/scalar operand.`);\n }\n\n return `size(${placeholder}) ${comparatorOps[sizeOperator]} ${this.getValueSub(sizeOperand)}`;\n }\n\n default:\n throw new Error(`Invalid operator \"${operator}\"`);\n }\n }\n\n protected resolveSetOperand(path: string, operand: unknown): string {\n if (isOperation(operand)) {\n if (operand.$ifNotExists) {\n const params = Array.isArray(operand.$ifNotExists)\n ? operand.$ifNotExists\n : [path, operand.$ifNotExists];\n return `if_not_exists(${this.getPathSub(params[0])}, ${this.resolveSetOperand(path, params[1])})`;\n }\n\n if (operand.$set) {\n return this.resolveSetOperand(path, operand.$set);\n }\n\n if (operand.$plus !== undefined || operand.$minus !== undefined) {\n const mathOperator = operand.$plus ? \"+\" : \"-\";\n const mathOperand = operand.$plus ?? operand.$minus;\n const params = Array.isArray(mathOperand) ? mathOperand : [{ $path: path }, mathOperand];\n return `${params.map((param) => this.resolveSetOperand(path, param)).join(` ${mathOperator} `)}`;\n }\n\n if (operand.$append !== undefined || operand.$prepend !== undefined) {\n const listOperand = operand.$append ?? operand.$prepend;\n const resolvedListOperand = isOperation(listOperand) ? listOperand : [listOperand].flat();\n const params = operand.$append\n ? [{ $path: path }, resolvedListOperand]\n : [resolvedListOperand, { $path: path }];\n return `list_append(${params.map((param) => this.resolveSetOperand(path, param)).join(\", \")})`;\n }\n }\n\n return this.getValueOrPathSub(operand);\n }\n}\n","import type { Db } from \"./db\";\nimport type { Table } from \"./table\";\nimport type {\n Condition,\n DbTrxGetRequest,\n DbTrxWriteRequest,\n ExtractTableDef,\n ExtractTableSchema,\n TableGsiNames,\n Obj,\n RepoBatchGetOptions,\n RepoBatchGetOrThrowResult,\n RepoBatchGetResult,\n RepoBatchWrite,\n RepoBatchWriteResult,\n RepoCreateOptions,\n RepoCreateItem,\n RepoCreateResult,\n RepoDeleteOptions,\n RepoDeleteOrThrowResult,\n RepoDeleteResult,\n RepoExistsOptions,\n RepoGetOptions,\n RepoGetOrThrowResult,\n RepoGetResult,\n RepoKey,\n RepoPutOptions,\n RepoPutItem,\n RepoPutResult,\n RepoQueryOptions,\n RepoQueryGsiOptions,\n RepoQueryGsiPagedResult,\n RepoQueryGsiResult,\n RepoQueryPagedResult,\n RepoQueryResult,\n RepoScanOptions,\n RepoScanGsiOptions,\n RepoScanGsiPagedResult,\n RepoScanGsiResult,\n RepoScanPagedResult,\n RepoScanResult,\n RepoTrxGetOptions,\n RepoTrxGetOrThrowResult,\n RepoTrxGetResult,\n RepoTrxWriteRequest,\n RepoUpdateOptions,\n RepoUpdateData,\n RepoUpdateResult,\n RepoQueryGsiQuery,\n RepoQueryQuery,\n} from \"./types\";\n\n// TODO: query/queryGsi needs strongly typed \"key\" argument\n// allows =,>,>=,<,<=,begins_with, between on sort key\n// util -> extractExclusiveStartKey(item)\n\nexport abstract class AbstractRepo<T extends Table> {\n // these phantom properties are used to pre-compute types derived from T\n // which allows easy lookups using the \"this\" AbstractRepo type\n declare readonly $schema: ExtractTableSchema<T>;\n declare readonly $def: ExtractTableDef<T>;\n\n abstract readonly table: T;\n readonly db: Db;\n constructor(db: Db) {\n this.db = db;\n }\n\n get tableName(): string {\n return `${this.db.config?.tableNamePrefix ?? \"\"}${this.table.def.name}`;\n }\n\n get defaultPutData(): Partial<ExtractTableSchema<T>> {\n return {};\n }\n\n get defaultUpdateData(): Partial<ExtractTableSchema<T>> {\n return {};\n }\n\n transformItem(item: ExtractTableSchema<T>): ExtractTableSchema<T> {\n return item;\n }\n\n // TODO: should this throw if pk is missing?\n // should return type by narrower?\n extractKey(item: RepoKey<this>): RepoKey<this> {\n const { partitionKey, sortKey } = this.table.def;\n if (sortKey) {\n return {\n [partitionKey]: item[partitionKey as keyof RepoKey<this>],\n [sortKey]: item[sortKey as keyof RepoKey<this>],\n } as RepoKey<this>;\n }\n\n return { [partitionKey]: item[partitionKey as keyof RepoKey<this>] } as RepoKey<this>;\n }\n\n async get<O extends RepoGetOptions<this>>(\n key: RepoKey<this>,\n options?: O,\n ): Promise<RepoGetResult<this, O>> {\n const item = await this.db.get({\n table: this.tableName,\n key: this.extractKey(key),\n ...options,\n });\n return item && this.applyTransformIfNeeded(item, options);\n }\n\n async getOrThrow<O extends RepoGetOptions<this>>(\n key: RepoKey<this>,\n options?: O,\n ): Promise<RepoGetOrThrowResult<this, O>> {\n const item = await this.db.getOrThrow({\n table: this.tableName,\n key: this.extractKey(key),\n ...options,\n });\n return this.applyTransformIfNeeded(item, options);\n }\n\n async put(item: RepoPutItem<this>, options?: RepoPutOptions<this>): Promise<RepoPutResult<this>> {\n const itemWithDefaults = { ...this.defaultPutData, ...item };\n const result = await this.db.put({ table: this.tableName, item: itemWithDefaults, ...options });\n return this.applyTransformIfNeeded(result);\n }\n\n async update(\n key: RepoKey<this>,\n update: RepoUpdateData,\n options?: RepoUpdateOptions<this>,\n ): Promise<RepoUpdateResult<this>> {\n const updateWithDefaults = { ...this.defaultUpdateData, ...update };\n const result = await this.db.update({\n table: this.tableName,\n key: this.extractKey(key),\n update: updateWithDefaults,\n ...options,\n });\n return this.applyTransformIfNeeded(result);\n }\n\n async create(\n item: RepoPutItem<this>,\n options?: RepoCreateOptions<this>,\n ): Promise<RepoCreateResult<this>> {\n const { condition: otherCondition, ...otherOptions } = options ?? {};\n\n const condition = { $and: [{ [this.table.def.partitionKey]: { $exists: false } }] } as any;\n\n if (otherCondition) {\n condition.$and.push(otherCondition);\n }\n\n return this.put(item, { condition, ...otherOptions });\n }\n\n async delete(\n key: RepoKey<this>,\n options?: RepoDeleteOptions<this>,\n ): Promise<RepoDeleteResult<this>> {\n const item = await this.db.delete({\n table: this.tableName,\n key: this.extractKey(key),\n ...options,\n });\n return item && this.applyTransformIfNeeded(item);\n }\n\n async deleteOrThrow(\n key: RepoKey<this>,\n options?: Omit<RepoDeleteOptions<this>, \"return\">,\n ): Promise<RepoDeleteOrThrowResult<this>> {\n const item = await this.db.deleteOrThrow({\n table: this.tableName,\n key: this.extractKey(key),\n ...options,\n });\n return this.applyTransformIfNeeded(item);\n }\n\n async query<O extends RepoQueryOptions<this>>(\n query: RepoQueryQuery<this>,\n options?: O,\n ): Promise<RepoQueryResult<this, O>> {\n const items = await this.db.query({ table: this.tableName, query, ...options });\n return this.applyTransformsIfNeeded(items, options);\n }\n\n async *queryPaged<O extends RepoQueryOptions<this>>(\n query: RepoQueryQuery<this>,\n options?: O,\n ): RepoQueryPagedResult<this, O> {\n for await (const page of this.db.queryPaged({ table: this.tableName, query, ...options })) {\n yield this.applyTransformsIfNeeded(page, options);\n }\n }\n\n async queryGsi<G extends TableGsiNames<T>, O extends RepoQueryGsiOptions<this, T, G>>(\n gsi: G,\n query: RepoQueryGsiQuery<T, G>,\n options?: O,\n ): Promise<RepoQueryGsiResult<this, O, G>> {\n const items = await this.db.query({ table: this.tableName, index: gsi, query, ...options });\n return this.applyTransformsIfNeeded(items, { ...options, gsi });\n }\n\n async *queryGsiPaged<G extends TableGsiNames<T>, O extends RepoQueryGsiOptions<this, T, G>>(\n gsi: G,\n query: RepoQueryGsiQuery<T, G>,\n options?: O,\n ): RepoQueryGsiPagedResult<this, O, G> {\n for await (const page of this.db.queryPaged({\n table: this.tableName,\n index: gsi,\n query,\n ...options,\n })) {\n yield this.applyTransformsIfNeeded(page, { ...options, gsi });\n }\n }\n\n async scan<O extends RepoScanOptions<this>>(options?: O): Promise<RepoScanResult<this, O>> {\n const items = await this.db.scan({ table: this.tableName, ...options });\n return this.applyTransformsIfNeeded(items, options);\n }\n\n async *scanPaged<O extends RepoScanOptions<this>>(options?: O): RepoScanPagedResult<this, O> {\n for await (const page of this.db.scanPaged({ table: this.tableName, ...options })) {\n yield this.applyTransformsIfNeeded(page, options);\n }\n }\n\n async scanGsi<G extends TableGsiNames<T>, O extends RepoScanGsiOptions<this, T, G>>(\n gsi: G,\n options?: O,\n ): Promise<RepoScanGsiResult<this, O, G>> {\n const items = await this.db.scan({ table: this.tableName, index: gsi, ...options });\n return this.applyTransformsIfNeeded(items, { ...options, gsi });\n }\n\n async *scanGsiPaged<G extends TableGsiNames<T>, O extends RepoScanGsiOptions<this, T, G>>(\n gsi: G,\n options?: O,\n ): RepoScanGsiPagedResult<this, O, G> {\n for await (const page of this.db.scanPaged({\n table: this.tableName,\n index: gsi,\n ...options,\n })) {\n yield this.applyTransformsIfNeeded(page, { ...options, gsi });\n }\n }\n\n async exists(options?: RepoExistsOptions<this>): Promise<boolean> {\n return this.db.exists({\n table: this.tableName,\n projection: [this.table.def.partitionKey],\n ...options,\n });\n }\n\n async existsGsi(gsi: TableGsiNames<T>, options?: RepoExistsOptions<this>): Promise<boolean> {\n return this.db.exists({\n table: this.tableName,\n index: gsi,\n projection: [this.table.def.partitionKey],\n ...options,\n });\n }\n\n async batchGet<O extends RepoBatchGetOptions<this>>(\n keys: RepoKey<this>[],\n options?: O,\n ): Promise<RepoBatchGetResult<this, O>> {\n const { items, unprocessed } = await this.db.batchGet({\n // TODO: fix this as any assertion\n [this.tableName]: { keys: keys.map((key) => this.extractKey(key)), ...(options as any) },\n });\n const tableItems = items[this.tableName];\n return {\n items: tableItems && this.applyTransformsIfNeeded(tableItems, options),\n unprocessed: unprocessed?.[this.tableName]?.keys,\n } as RepoBatchGetResult<this, O>;\n }\n\n async batchGetOrThrow<O extends RepoBatchGetOptions<this>>(\n keys: RepoKey<this>[],\n options?: O,\n ): Promise<RepoBatchGetOrThrowResult<this, O>> {\n const result = await this.db.batchGetOrThrow({\n // TODO: fix this as any assertion\n [this.tableName]: { keys: keys.map((key) => this.extractKey(key)), ...(options as any) },\n });\n return this.applyTransformsIfNeeded(result[this.tableName] ?? [], options);\n }\n\n async batchWrite(requests: RepoBatchWrite<this>): Promise<RepoBatchWriteResult<this>> {\n const { items, unprocessed } = await this.db.batchWrite({\n [this.tableName]: requests.map((request) => {\n if (request.type === \"DELETE\") {\n return { type: \"DELETE\", key: this.extractKey(request.key) };\n } else {\n const itemWithDefaults = { ...this.defaultPutData, ...request.item };\n return { type: \"PUT\", item: itemWithDefaults };\n }\n }),\n });\n\n return {\n items: items[this.tableName],\n unprocessed: unprocessed?.[this.tableName],\n } as RepoBatchWriteResult<this>;\n }\n\n async trxGet<O extends RepoTrxGetOptions<this>>(\n keys: RepoKey<this>[],\n options?: O,\n ): Promise<RepoTrxGetResult<this, O>> {\n const items = await this.db.trxGet(\n ...keys.map((key) => ({\n table: this.tableName,\n key: this.extractKey(key),\n // TODO: fix this as any assertion\n ...(options as any),\n })),\n );\n return items.map((item: any) => item && this.applyTransformIfNeeded(item, options)) as any;\n }\n\n async trxGetOrThrow<O extends RepoTrxGetOptions<this>>(\n keys: RepoKey<this>[],\n options?: O,\n ): Promise<RepoTrxGetOrThrowResult<this, O>> {\n const items = await this.db.trxGetOrThrow(\n ...keys.map((key) => ({\n table: this.tableName,\n key: this.extractKey(key),\n // TODO: fix this as any assertion\n ...(options as any),\n })),\n );\n return this.applyTransformsIfNeeded(items, options);\n }\n\n async trxWrite(...requests: RepoTrxWriteRequest<this>[]): Promise<void> {\n await this.db.trxWrite(\n ...requests.map((request) => {\n switch (request.type) {\n case \"CONDITION\": {\n const { key, condition, ...options } = request;\n return this.trxConditionRequest(key, condition, options);\n }\n\n case \"DELETE\": {\n const { key, ...options } = request;\n return this.trxDeleteRequest(key, options);\n }\n\n case \"PUT\": {\n const { item, ...options } = request;\n return this.trxPutRequest(item, options);\n }\n\n case \"UPDATE\": {\n const { key, update, ...options } = request;\n return this.trxUpdateRequest(key, update, options);\n }\n\n default:\n throw new Error(\"Unexpected request type.\");\n }\n }),\n );\n }\n\n async trxDelete(\n keys: RepoKey<this>[],\n options?: Omit<RepoDeleteOptions<this>, \"return\">,\n ): Promise<void> {\n return this.db.trxWrite(...keys.map((key) => this.trxDeleteRequest(key, options)));\n }\n\n // todo: return items\n async trxPut(\n items: RepoPutItem<this>[],\n options?: Omit<RepoPutOptions<this>, \"return\">,\n ): Promise<void> {\n return this.db.trxWrite(...items.map((item) => this.trxPutRequest(item, options)));\n }\n\n async trxUpdate(\n keys: RepoKey<this>[],\n update: RepoUpdateData,\n options?: Omit<RepoUpdateOptions<this>, \"return\">,\n ): Promise<void> {\n return this.db.trxWrite(...keys.map((key) => this.trxUpdateRequest(key, update, options)));\n }\n\n // todo: return items\n async trxCreate(items: RepoCreateItem<this>[], options?: RepoCreateOptions<this>): Promise<void> {\n return this.db.trxWrite(...items.map((item) => this.trxCreateRequest(item, options)));\n }\n\n trxGetRequest<O extends RepoGetOptions<this>>(\n key: RepoKey<this>,\n options?: O,\n ): DbTrxGetRequest<RepoGetOrThrowResult<this, O>> {\n // TODO: fix this as any assertion\n return { table: this.tableName, key: this.extractKey(key), ...(options as any) };\n }\n\n trxDeleteRequest(\n key: RepoKey<this>,\n options?: Omit<RepoDeleteOptions<this>, \"return\">,\n ): DbTrxWriteRequest {\n return { table: this.tableName, type: \"DELETE\", key: this.extractKey(key), ...options };\n }\n\n trxConditionRequest(\n key: RepoKey<this>,\n condition: Condition<ExtractTableSchema<T>>,\n options?: Omit<RepoDeleteOptions<this>, \"return\" | \"condition\">,\n ): DbTrxWriteRequest {\n return {\n table: this.tableName,\n type: \"CONDITION\",\n key: this.extractKey(key),\n condition,\n ...options,\n };\n }\n\n trxPutRequest(\n item: RepoPutItem<this>,\n options?: Omit<RepoPutOptions<this>, \"return\">,\n ): DbTrxWriteRequest {\n const itemWithDefaults = { ...this.defaultPutData, ...item };\n return { table: this.tableName, type: \"PUT\", item: itemWithDefaults, ...options };\n }\n\n trxUpdateRequest(\n key: RepoKey<this>,\n update: RepoUpdateData,\n options?: Omit<RepoUpdateOptions<this>, \"return\">,\n ): DbTrxWriteRequest {\n const updateWithDefaults = { ...this.defaultUpdateData, ...update };\n return {\n table: this.tableName,\n type: \"UPDATE\",\n key: this.extractKey(key),\n update: updateWithDefaults,\n ...options,\n };\n }\n\n trxCreateRequest(\n item: RepoCreateItem<this>,\n options?: RepoCreateOptions<this>,\n ): DbTrxWriteRequest {\n const { condition: otherCondition, ...otherOptions } = options ?? {};\n\n const condition = { $and: [{ [this.table.def.partitionKey]: { $exists: false } }] } as any;\n\n if (otherCondition) {\n condition.$and.push(otherCondition);\n }\n\n const itemWithDefaults = { ...this.defaultPutData, ...item };\n\n return {\n table: this.tableName,\n type: \"PUT\",\n item: itemWithDefaults,\n condition,\n ...otherOptions,\n };\n }\n\n private applyTransformsIfNeeded(\n items: Obj[],\n options?: { projection?: any[]; gsi?: string },\n ): any[] {\n // transforms aren't applied when applying a projection\n if (options?.projection?.length) return items;\n if (options?.gsi) {\n // projections inherited to GSIs also prevent transformation\n const gsiProj = this.table.def.gsis?.[options.gsi]?.projection;\n if (gsiProj === \"KEYS_ONLY\" || Array.isArray(gsiProj)) return items;\n }\n\n return items.map((item) => this.transformItem(item as ExtractTableSchema<T>));\n }\n\n private applyTransformIfNeeded(item: Obj, options?: { projection?: any[]; gsi?: string }): any {\n const [transformedItem] = this.applyTransformsIfNeeded([item], options);\n return transformedItem;\n }\n}\n\nexport class Repo<T extends Table<any, any>> extends AbstractRepo<T> {\n readonly table: T;\n\n constructor(db: Db, table: T) {\n super(db);\n this.table = table;\n }\n}\n","import {\n type BatchGetItemInput,\n type BatchWriteItemInput,\n CreateTableCommand,\n DeleteTableCommand,\n DynamoDB,\n DynamoDBClient,\n type DynamoDBClientConfig,\n ListTablesCommand,\n type WriteRequest,\n} from \"@aws-sdk/client-dynamodb\";\n//import { DynamoDBStreams } from '@aws-sdk/client-dynamodb-streams';\nimport type { TransactGetCommandInput, TransactWriteCommandInput } from \"@aws-sdk/lib-dynamodb\";\nimport * as Lib from \"@aws-sdk/lib-dynamodb\";\nimport { ExpressionBuilder } from \"./expression-builder\";\nimport { Repo } from \"./repo\";\nimport type { Table } from \"./table\";\nimport type {\n DbBatchGet,\n DbBatchGetResponse,\n DbBatchWrite,\n DbBatchWriteResponse,\n DbConfig,\n DbDelete,\n DbExists,\n DbGet,\n DbListTables,\n DbPut,\n DbQuery,\n DbScan,\n DbTrxGetOrThrowResult,\n DbTrxGetRequest,\n DbTrxGetResult,\n DbTrxWriteRequest,\n DbUpdate,\n Obj,\n} from \"./types\";\nimport { extractTableDesc, removeUndefined } from \"./util\";\n\n// TODO\n// - caching support?\n// - consider special \"limit\" handling for paged scans, maybe have \"scanLimit\" too\n// - consider \"sort\" shorthand for methods that return unpaginated collections\n// i.e. sort: { by: 'createdAt', dir: 'ASC' } or sort: (a,b) => a.createdAt - b.createdAt\n// - consider support for batchUpdates leveraging BatchExecute and PartiQL\n// - consider batchPut (batchPutOrThrow) and batchDelete that operate on a single table\n// - getGsi? throws if > 1 result, allows for assert, and filtering\n// - bug $in doesn't handle empty arrays, I imagine other operators are affected\n// - consider beforeCreate, beforePut, beforeUpdate, beforeDelete, after, etc.\n// - type out repo update data\n\nexport class Db {\n readonly client: Lib.DynamoDBDocumentClient;\n readonly config: DbConfig | undefined;\n\n //protected streamEventListeners: DbStreamEventListener[] = [];\n\n constructor(\n clientOrConfig: DynamoDBClient | DynamoDB | DynamoDBClientConfig,\n dbConfig?: DbConfig,\n ) {\n if (clientOrConfig instanceof DynamoDBClient || clientOrConfig instanceof DynamoDB) {\n this.client = Lib.DynamoDBDocumentClient.from(new DynamoDBClient(clientOrConfig));\n } else {\n const { endpoint, ...clientConfig } = clientOrConfig;\n // client doesn't interpret an empty string endpoint as falsy so normalize things\n // here so consumers don't have to worry about that quirk\n this.client = Lib.DynamoDBDocumentClient.from(\n new DynamoDBClient({\n endpoint: endpoint || undefined,\n ...clientConfig,\n }),\n );\n }\n\n this.config = dbConfig;\n }\n\n createRepo<T extends Table>(table: T): Repo<T> {\n return new Repo(this, table);\n }\n\n async createTable(table: Table): Promise<void> {\n await this.client.send(new CreateTableCommand(extractTableDesc(table)));\n }\n\n async deleteTable(tableName: string): Promise<void> {\n await this.client.send(new DeleteTableCommand({ TableName: tableName }));\n }\n\n async listTables(data?: DbListTables): Promise<string[]> {\n const tables: string[] = [];\n let lastEvaluatedTableName: string | undefined;\n do {\n const output = await this.client.send(\n new ListTablesCommand({\n Limit: data?.limit,\n ExclusiveStartTableName: lastEvaluatedTableName,\n }),\n );\n\n tables.push(...(output.TableNames ?? []));\n lastEvaluatedTableName = output.LastEvaluatedTableName;\n } while (lastEvaluatedTableName);\n return tables;\n }\n\n async get<R extends Obj = Obj>(data: DbGet<R>): Promise<R | undefined> {\n const exp = new ExpressionBuilder();\n\n const input = new Lib.GetCommand({\n TableName: data.table,\n Key: data.key,\n ConsistentRead: data.consistent,\n ProjectionExpression: exp.projection(data.projection),\n ExpressionAttributeNames: exp.attributeNames,\n });\n\n const output = await this.client.send(input);\n\n if (output.Item && data.filter && !data.filter(output.Item as R)) {\n return undefined;\n }\n\n return output.Item as R;\n }\n\n async getOrThrow<R extends Obj = Obj>(data: DbGet<R>): Promise<R> {\n const item = await this.get(data);\n if (!item) {\n throw new Error(`Item not found in \"${data.table}\" table.`);\n }\n return item as R;\n }\n\n async put<R extends Obj = Obj>(data: DbPut<R>): Promise<R> {\n const exp = new ExpressionBuilder();\n\n const item = removeUndefined(data.item as R);\n\n const input = new Lib.PutCommand({\n TableName: data.table,\n Item: item,\n ReturnValues: data.returnOld ? \"ALL_OLD\" : \"NONE\",\n ReturnValuesOnConditionCheckFailure: \"ALL_OLD\",\n ConditionExpression: exp.condition(data.condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n\n return (data.returnOld ? output.Attributes : item) as R;\n }\n\n async update<R extends Obj = Obj>(data: DbUpdate): Promise<R> {\n const exp = new ExpressionBuilder();\n\n const condition = {\n $and: Object.keys(data.key).map((field) => ({\n [field]: { $exists: true },\n })),\n };\n\n if (data.condition) {\n condition.$and.push(data.condition);\n }\n\n const input = new Lib.UpdateCommand({\n TableName: data.table,\n Key: data.key,\n ReturnValues: \"ALL_NEW\",\n ReturnValuesOnConditionCheckFailure: \"ALL_OLD\",\n UpdateExpression: exp.update(data.update),\n ConditionExpression: exp.condition(condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n\n return output.Attributes as R;\n }\n\n async delete<R extends Obj = Obj>(data: DbDelete): Promise<R | undefined> {\n const exp = new ExpressionBuilder();\n\n const input = new Lib.DeleteCommand({\n TableName: data.table,\n Key: data.key,\n ReturnValues: \"ALL_OLD\",\n ConditionExpression: exp.condition(data.condition),\n ReturnValuesOnConditionCheckFailure: \"ALL_OLD\",\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n\n return output.Attributes as R | undefined;\n }\n\n async deleteOrThrow<R extends Obj = Obj>(data: DbDelete): Promise<R> {\n const item = await this.delete<R>(data);\n if (!item) {\n throw new Error(`Item not found in \"${data.table}\" table.`);\n }\n return item;\n }\n\n async *queryPaged<R extends Obj = Obj>(data: DbQuery): AsyncGenerator<R[]> {\n const exp = new ExpressionBuilder();\n\n let lastEvaluatedKey = data.startKey;\n do {\n const input = new Lib.QueryCommand({\n TableName: data.table,\n IndexName: data.index,\n ExclusiveStartKey: lastEvaluatedKey,\n Limit: data.limit,\n ScanIndexForward: data.sort !== \"DESC\",\n ConsistentRead: data.consistent,\n KeyConditionExpression: exp.condition(data.query),\n ProjectionExpression: exp.projection(data.projection),\n FilterExpression: exp.condition(data.filter),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n\n if (output.Items?.length) {\n yield output.Items as R[];\n }\n lastEvaluatedKey = output.LastEvaluatedKey;\n } while (lastEvaluatedKey);\n }\n\n async query<R extends Obj = Obj>(data: DbQuery): Promise<R[]> {\n const items: Obj[] = [];\n\n for await (const page of this.queryPaged(data)) {\n items.push(...page);\n }\n\n return items as R[];\n }\n\n async *scanPaged<R extends Obj = Obj>(data: DbScan): AsyncGenerator<R[]> {\n const exp = new ExpressionBuilder();\n\n const totalSegments = data.parallel ?? 1;\n const segments = [...Array(totalSegments).keys()];\n\n // undefined: initial value when a start key isn't specified\n // null: scanning a particular segment is finished\n const lastEvaluatedKeys: (Obj | undefined | null)[] = segments.map(() => data.startKey);\n do {\n const results = await Promise.all(\n segments.map(async (segment) => {\n if (lastEvaluatedKeys[segment] === null) return [];\n\n const input = new Lib.ScanCommand({\n ExclusiveStartKey: lastEvaluatedKeys[segment],\n Segment: segment,\n TotalSegments: totalSegments,\n TableName: data.table,\n IndexName: data.index,\n Limit: data.limit,\n ConsistentRead: data.consistent,\n ProjectionExpression: exp.projection(data.projection),\n FilterExpression: exp.condition(data.filter),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n });\n\n const output = await this.client.send(input);\n lastEvaluatedKeys[segment] = output.LastEvaluatedKey ?? null;\n return output.Items ?? [];\n }),\n );\n\n const items = results.flat();\n\n if (items.length) {\n yield items as R[];\n }\n } while (lastEvaluatedKeys.some((key) => key !== null));\n }\n\n async scan<R extends Obj = Obj>(data: DbScan): Promise<R[]> {\n const items: R[] = [];\n\n for await (const page of this.scanPaged(data)) {\n items.push(...(page as R[]));\n }\n\n return items;\n }\n\n async exists(data: DbExists): Promise<boolean> {\n const { query, ...otherOptions } = data;\n\n // we can't rely on the limit when a filter is being applied, since the filter is\n // applied after the scan/query page, so we only apply a limit of 1 when there is no filter.\n // otherwise, we page through the results and return true as soon as we see a single item\n const sharedOptions = {\n ...otherOptions,\n limit: data.filter ? undefined : 1,\n };\n\n const pagedItems = query\n ? this.queryPaged({ query, ...sharedOptions })\n : this.scanPaged(sharedOptions);\n\n for await (const items of pagedItems) {\n if (items.length) return true;\n }\n\n return false;\n }\n\n // TODO: test wildly different item sizes to make\n // sure retry algorithm works properly\n async batchGet(data: DbBatchGet): Promise<DbBatchGetResponse> {\n const result: DbBatchGetResponse = { items: {} };\n\n const tableData = Object.fromEntries(\n Object.entries(data).map(([table, request]) => {\n const exp = new ExpressionBuilder();\n\n result.items[table] = [];\n\n return [\n table,\n {\n request: {\n ConsistentRead: request?.consistent,\n ProjectionExpression: exp.projection(request?.projection),\n ExpressionAttributeNames: exp.attributeNames,\n },\n keyNames: Object.keys(request.keys.at(0) ?? {}),\n itemIndexMap: new Map<string, number>(),\n filter: request.filter,\n },\n ];\n }),\n );\n\n const flattenedBatches = Object.entries(data).flatMap(([table, request]) => {\n return request.keys.map((key, i) => {\n const itemIndexKey =\n tableData[table]?.keyNames.map((keyName) => key[keyName]).join(\"|\") ?? \"\";\n tableData[table]?.itemIndexMap.set(itemIndexKey, i);\n return [table, key] as const;\n });\n });\n\n let batchSize = 100;\n let retryCount = 0;\n\n while (flattenedBatches.length && retryCount < 5) {\n const batch = flattenedBatches.splice(0, batchSize || 1);\n\n const request: BatchGetItemInput[\"RequestItems\"] = {};\n for (const [table, key] of batch) {\n if (!request[table]) {\n request[table] = { ...tableData[table]?.request, Keys: [] };\n }\n\n request[table].Keys?.push(key);\n }\n\n const input = new Lib.BatchGetCommand({ RequestItems: request });\n const output = await this.client.send(input);\n\n for (const [table, items] of Object.entries(output.Responses ?? {})) {\n //just to appease typescript\n if (!result.items[table]) continue;\n\n const filteredItems = tableData[table]?.filter\n ? items.filter(tableData[table].filter)\n : items;\n\n result.items[table].push(...filteredItems);\n }\n\n // handle unprocessed requests\n let unprocessedKeyCount = 0;\n for (const [table, request] of Object.entries(output.UnprocessedKeys ?? {})) {\n const unprocessed = (request.Keys ?? []).map((key) => [table, key] as const);\n flattenedBatches.push(...unprocessed);\n unprocessedKeyCount += unprocessed.length;\n }\n\n //move immediately to next batch if all requests were processed\n if (!unprocessedKeyCount) {\n retryCount = 0;\n continue;\n }\n\n // reduce batch size so we don't continue to overfetch,\n // but do it gradually by only splitting the difference\n batchSize -= Math.floor(unprocessedKeyCount / 2);\n\n retryCount++;\n }\n\n // anything left in flattened batches needs to be returned in unprocessed\n if (flattenedBatches.length) {\n result.unprocessed = {};\n for (const [table, key] of flattenedBatches) {\n if (!result.unprocessed[table]) {\n result.unprocessed[table] = {\n ...tableData[table]?.request,\n keys: [],\n };\n }\n result.unprocessed[table].keys.push(key);\n }\n }\n\n // finally, sort any returned items by their original index to preserve order\n for (const [table, items] of Object.entries(result.items)) {\n const itemIndexMap = tableData[table]?.itemIndexMap;\n const keyNames = tableData[table]?.keyNames;\n\n if (!itemIndexMap || !keyNames) continue;\n\n items.sort((item1, item2) => {\n const item1IndexKey = keyNames.map((keyName) => item1[keyName]).join(\"|\");\n const item2IndexKey = keyNames.map((keyName) => item2[keyName]).join(\"|\");\n\n return (itemIndexMap.get(item1IndexKey) ?? 0) - (itemIndexMap.get(item2IndexKey) ?? 0);\n });\n }\n\n return result;\n }\n\n async batchGetOrThrow(data: DbBatchGet): Promise<DbBatchGetResponse[\"items\"]> {\n const { items, unprocessed } = await this.batchGet(data);\n\n for (const table of Object.keys(data)) {\n if (unprocessed?.[table]) {\n throw new Error(`One or more batch get requests were not processed in \"${table}\" table.`);\n }\n\n if (items[table]?.length !== data[table]?.keys?.length) {\n throw new Error(`One or more items were not found in \"${table}\" table.`);\n }\n }\n\n return items;\n }\n\n // TODO: test wildly different item sizes to make\n // sure retry algorithm works properly\n async batchWrite(data: DbBatchWrite): Promise<DbBatchWriteResponse> {\n const result: DbBatchWriteResponse = { items: {} };\n\n const flattenedBatches = Object.keys(data).flatMap((table) => {\n return (\n data[table]?.map((r) => {\n if (r.type === \"DELETE\") {\n return [table, { DeleteRequest: { Key: r.key } }] as [string, WriteRequest];\n } else {\n return [table, { PutRequest: { Item: r.item } }] as [string, WriteRequest];\n }\n }) ?? []\n );\n });\n\n let batchSize = 25;\n let retryCount = 0;\n\n while (flattenedBatches.length && retryCount < 5) {\n const batch = flattenedBatches.splice(0, batchSize || 1);\n\n const request: BatchWriteItemInput[\"RequestItems\"] = {};\n for (const [table, req] of batch) {\n if (!request[table]) {\n request[table] = [];\n }\n request[table].push(req);\n }\n\n const input = new Lib.BatchWriteCommand({ RequestItems: request });\n const output = await this.client.send(input);\n\n // handle unprocessed requests\n let unprocessedKeyCount = 0;\n for (const [table, requests] of Object.entries(output.UnprocessedItems ?? {})) {\n for (const request of requests) {\n flattenedBatches.push([table, request]);\n unprocessedKeyCount++;\n }\n }\n\n //move immediately to next batch if all requests were processed\n if (!unprocessedKeyCount) {\n retryCount = 0;\n continue;\n }\n\n // reduce batch size so we don't continue to overwrite,\n // but do it gradually by only splitting the difference\n batchSize -= Math.floor(unprocessedKeyCount / 2);\n\n retryCount++;\n }\n\n // anything left in flattened batches needs to be returned in unprocessed\n if (flattenedBatches.length) {\n result.unprocessed = {};\n for (const [table, request] of flattenedBatches) {\n if (!result.unprocessed[table]) {\n result.unprocessed[table] = [];\n }\n\n if (\"DeleteRequest\" in request && request.DeleteRequest?.Key) {\n result.unprocessed[table].push({\n type: \"DELETE\",\n key: request.DeleteRequest.Key,\n });\n } else if (\"PutRequest\" in request && request.PutRequest?.Item) {\n result.unprocessed[table].push({\n type: \"PUT\",\n item: request.PutRequest.Item,\n });\n }\n }\n }\n\n return result;\n }\n\n async trxGet<R extends DbTrxGetRequest[]>(...requests: R): Promise<DbTrxGetResult<R>> {\n const trxItems: TransactGetCommandInput[\"TransactItems\"] = requests.map((request) => {\n const exp = new ExpressionBuilder();\n return {\n Get: {\n Key: request.key,\n TableName: request.table,\n ProjectionExpression: exp.projection(request?.projection),\n ExpressionAttributeNames: exp.attributeNames,\n },\n };\n });\n\n const input = new Lib.TransactGetCommand({ TransactItems: trxItems });\n const output = await this.client.send(input);\n\n return (\n (output.Responses?.map((response, i) => {\n if (!response.Item) return;\n\n if (!requests[i]?.filter) return response.Item;\n\n return requests[i].filter(response.Item) ? response.Item : undefined;\n }) as DbTrxGetResult<R>) ?? []\n );\n }\n\n async trxGetOrThrow<R extends DbTrxGetRequest[]>(\n ...requests: R\n ): Promise<DbTrxGetOrThrowResult<R>> {\n const items = await this.trxGet(...requests);\n for (let i = 0; i < items.length; i++) {\n if (!items[i]) {\n throw new Error(`One or more items were not found in \"${requests[i]?.table}\" table.`);\n }\n }\n\n return items as DbTrxGetOrThrowResult<R>;\n }\n\n async trxWrite(...requests: DbTrxWriteRequest[]): Promise<void> {\n const trxItems: TransactWriteCommandInput[\"TransactItems\"] = requests.map((request) => {\n const exp = new ExpressionBuilder();\n\n if (request.type === \"CONDITION\" || request.type === \"DELETE\") {\n return {\n [request.type === \"CONDITION\" ? \"ConditionCheck\" : \"Delete\"]: {\n TableName: request.table,\n Key: request.key,\n ConditionExpression: exp.condition(request.condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n },\n };\n }\n\n if (request.type === \"PUT\") {\n return {\n Put: {\n TableName: request.table,\n Item: removeUndefined(request.item),\n ConditionExpression: exp.condition(request.condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n },\n };\n }\n\n return {\n Update: {\n Key: request.key,\n TableName: request.table,\n UpdateExpression: exp.update(request.update),\n ConditionExpression: exp.condition(request.condition),\n ExpressionAttributeNames: exp.attributeNames,\n ExpressionAttributeValues: exp.attributeValues,\n },\n };\n });\n\n const input = new Lib.TransactWriteCommand({ TransactItems: trxItems });\n await this.client.send(input);\n }\n\n /* Dynamodb Streams */\n\n /*\n\n\tasync enableStreamEvents(data?: DbEnableEventStreams): Promise<void> {\n\t\tconst tables = data?.tables ?? (await this.listTables());\n\n\t\tconst streamsClient = new DynamoDBStreams({\n\t\t\tendpoint: this.client.config.endpoint,\n\t\t\tcredentials: this.client.config.credentials,\n\t\t\tregion: this.client.config.region,\n\t\t});\n\n\t\tawait Promise.all(\n\t\t\ttables.map(async (table) => {\n\t\t\t\tconst tableDesc = await this.client.send(new DescribeTableCommand({ TableName: table }));\n\n\t\t\t\tconst latestStreamArn = tableDesc.Table?.LatestStreamArn;\n\n\t\t\t\tif (!latestStreamArn) {\n\t\t\t\t\tif (data?.tables) {\n\t\t\t\t\t\tthrow new Error(`Table \"${table}\" does not have streaming enabled.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst eventStreamer = new EventStreamer(streamsClient, latestStreamArn);\n\t\t\t\teventStreamer.startPolling();\n\t\t\t}),\n\t\t);\n\t}\n\n\tasync disableStreamEvents(): Promise<void> {}\n\n\tsubscribe(listener: DbStreamEventListener): void {\n\t\tthis.streamEventListeners.push(listener);\n\t}\n\n\tunsubscribe(listener: DbStreamEventListener): void {\n\t\tthis.streamEventListeners = this.streamEventListeners.filter((l) => l !== listener);\n\t}\n\n\tunsubscribeAll(): void {\n\t\tthis.streamEventListeners = [];\n\t}\n\t*/\n}\n\n// respondentRepo.onChange((respondent) => , { filter: (r1, r2) => r1.status !== r2.status } )\n/*\nconst time = new Date(record.dynamodb.ApproximateCreationDateTime).getTime();\nif (time >= startTime) {\n\tfor (const listener of this.streamEventListeners) {\n\t\tlistener({\n\t\t\ttable,\n\t\t\ttime,\n\t\t\tid: record.eventID,\n\t\t\ttype: record.eventName,\n\t\t\tkey: record.dynamodb.Keys,\n\t\t\toldItem: record.dynamodb.OldImage,\n\t\t\tnewItem: record.dynamodb.NewImage,\n\t\t});\n\t}\n}\n*/\n","import type { Static, TSchema } from \"typebox\";\nimport type { TableDef } from \"./types\";\n\ntype SchemaStatic<Schema extends TSchema> = unknown extends Static<Schema> ? any : Static<Schema>;\n\nexport class Table<\n Schema extends TSchema = TSchema,\n const Def extends TableDef<SchemaStatic<Schema>> = TableDef<SchemaStatic<Schema>>,\n> {\n readonly schema: Schema;\n readonly def: Def;\n\n constructor(schema: Schema, def: Def) {\n this.schema = schema;\n this.def = def;\n }\n}\n"],"mappings":"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"}
|
package/dist/streams.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
require("./util-
|
|
2
|
+
require("./util-CduXXDLh.cjs");
|
|
3
3
|
let _aws_sdk_client_dynamodb_streams = require("@aws-sdk/client-dynamodb-streams");
|
|
4
4
|
//#region src/streams.ts
|
|
5
5
|
var EventStreamer = class {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Static, TSchema } from "typebox";
|
|
2
1
|
import { DynamoDB, DynamoDBClient, DynamoDBClientConfig } from "@aws-sdk/client-dynamodb";
|
|
3
2
|
import * as Lib from "@aws-sdk/lib-dynamodb";
|
|
3
|
+
import { Static, TSchema } from "typebox";
|
|
4
4
|
|
|
5
5
|
//#region src/db.d.ts
|
|
6
6
|
declare class Db {
|
|
@@ -11,16 +11,16 @@ declare class Db {
|
|
|
11
11
|
createTable(table: Table): Promise<void>;
|
|
12
12
|
deleteTable(tableName: string): Promise<void>;
|
|
13
13
|
listTables(data?: DbListTables): Promise<string[]>;
|
|
14
|
-
get<R = Obj>(data: DbGet): Promise<R | undefined>;
|
|
15
|
-
getOrThrow<R = Obj>(data: DbGet): Promise<R>;
|
|
16
|
-
put<R = Obj>(data: DbPut): Promise<R>;
|
|
17
|
-
update<R = Obj>(data: DbUpdate): Promise<R>;
|
|
18
|
-
delete<R = Obj>(data: DbDelete): Promise<R | undefined>;
|
|
19
|
-
deleteOrThrow<R = Obj>(data: DbDelete): Promise<R>;
|
|
20
|
-
queryPaged<R = Obj>(data: DbQuery): AsyncGenerator<R[]>;
|
|
21
|
-
query<R = Obj>(data: DbQuery): Promise<R[]>;
|
|
22
|
-
scanPaged<R = Obj>(data: DbScan): AsyncGenerator<R[]>;
|
|
23
|
-
scan<R = Obj>(data: DbScan): Promise<R[]>;
|
|
14
|
+
get<R extends Obj = Obj>(data: DbGet<R>): Promise<R | undefined>;
|
|
15
|
+
getOrThrow<R extends Obj = Obj>(data: DbGet<R>): Promise<R>;
|
|
16
|
+
put<R extends Obj = Obj>(data: DbPut<R>): Promise<R>;
|
|
17
|
+
update<R extends Obj = Obj>(data: DbUpdate): Promise<R>;
|
|
18
|
+
delete<R extends Obj = Obj>(data: DbDelete): Promise<R | undefined>;
|
|
19
|
+
deleteOrThrow<R extends Obj = Obj>(data: DbDelete): Promise<R>;
|
|
20
|
+
queryPaged<R extends Obj = Obj>(data: DbQuery): AsyncGenerator<R[]>;
|
|
21
|
+
query<R extends Obj = Obj>(data: DbQuery): Promise<R[]>;
|
|
22
|
+
scanPaged<R extends Obj = Obj>(data: DbScan): AsyncGenerator<R[]>;
|
|
23
|
+
scan<R extends Obj = Obj>(data: DbScan): Promise<R[]>;
|
|
24
24
|
exists(data: DbExists): Promise<boolean>;
|
|
25
25
|
batchGet(data: DbBatchGet): Promise<DbBatchGetResponse>;
|
|
26
26
|
batchGetOrThrow(data: DbBatchGet): Promise<DbBatchGetResponse["items"]>;
|
|
@@ -91,16 +91,16 @@ interface DbConfig {
|
|
|
91
91
|
interface DbListTables {
|
|
92
92
|
limit?: number;
|
|
93
93
|
}
|
|
94
|
-
interface DbGet {
|
|
94
|
+
interface DbGet<R = Obj> {
|
|
95
95
|
table: string;
|
|
96
96
|
key: Obj;
|
|
97
97
|
consistent?: boolean;
|
|
98
98
|
projection?: string[];
|
|
99
|
-
|
|
99
|
+
filter?: (item: R) => boolean;
|
|
100
100
|
}
|
|
101
|
-
interface DbPut {
|
|
101
|
+
interface DbPut<R = Obj> {
|
|
102
102
|
table: string;
|
|
103
|
-
item:
|
|
103
|
+
item: R;
|
|
104
104
|
returnOld?: boolean;
|
|
105
105
|
condition?: Obj;
|
|
106
106
|
}
|
|
@@ -110,17 +110,10 @@ interface DbUpdate {
|
|
|
110
110
|
update: Obj;
|
|
111
111
|
condition?: Obj;
|
|
112
112
|
}
|
|
113
|
-
interface DbCreate {
|
|
113
|
+
interface DbCreate<R = Obj> {
|
|
114
114
|
table: string;
|
|
115
115
|
partitionKeyName: string;
|
|
116
|
-
item:
|
|
117
|
-
condition?: Obj;
|
|
118
|
-
}
|
|
119
|
-
interface DbUpsert {
|
|
120
|
-
table: string;
|
|
121
|
-
key: Obj;
|
|
122
|
-
update: Obj;
|
|
123
|
-
item: Obj;
|
|
116
|
+
item: R;
|
|
124
117
|
condition?: Obj;
|
|
125
118
|
}
|
|
126
119
|
interface DbDelete {
|
|
@@ -161,7 +154,7 @@ interface DbBatchGetRequest {
|
|
|
161
154
|
keys: Obj[];
|
|
162
155
|
consistent?: boolean;
|
|
163
156
|
projection?: string[];
|
|
164
|
-
|
|
157
|
+
filter?: (item: Obj) => boolean;
|
|
165
158
|
}
|
|
166
159
|
type DbBatchGet = Obj<DbBatchGetRequest>;
|
|
167
160
|
interface DbBatchGetResponse {
|
|
@@ -185,7 +178,7 @@ interface DbTrxGetRequest<T = Obj> {
|
|
|
185
178
|
table: string;
|
|
186
179
|
key: Obj;
|
|
187
180
|
projection?: string[];
|
|
188
|
-
|
|
181
|
+
filter?: (item: Obj) => boolean;
|
|
189
182
|
}
|
|
190
183
|
type DbTrxGetResult<R extends DbTrxGetRequest[]> = { [K in keyof R]: R[K] extends DbTrxGetRequest<infer T> ? T | undefined : Obj | undefined };
|
|
191
184
|
type DbTrxGetOrThrowResult<R extends DbTrxGetRequest[]> = { [K in keyof R]: R[K] extends DbTrxGetRequest<infer T> ? (T extends Obj ? T : Obj) : Obj };
|
|
@@ -334,7 +327,7 @@ type ApplyGsiProjection<R extends AbstractRepo<any>, O, G extends string> = O ex
|
|
|
334
327
|
interface RepoGetOptions<R extends AbstractRepo<any>> {
|
|
335
328
|
consistent?: boolean;
|
|
336
329
|
projection?: Projection<R>;
|
|
337
|
-
|
|
330
|
+
filter?: (item: R["$schema"]) => boolean;
|
|
338
331
|
}
|
|
339
332
|
type RepoGetResult<R extends AbstractRepo<any>, O extends RepoGetOptions<R>> = undefined | ApplyProjection<R, O>;
|
|
340
333
|
type RepoGetOrThrowResult<R extends AbstractRepo<any>, O extends RepoGetOptions<R>> = ApplyProjection<R, O>;
|
|
@@ -411,7 +404,7 @@ interface RepoExistsOptions<R extends AbstractRepo<any>> {
|
|
|
411
404
|
}
|
|
412
405
|
interface RepoTrxGetOptions<R extends AbstractRepo<any>> {
|
|
413
406
|
projection?: Projection<R>;
|
|
414
|
-
|
|
407
|
+
filter?: (item: R["$schema"]) => boolean;
|
|
415
408
|
}
|
|
416
409
|
type RepoTrxGetResult<R extends AbstractRepo<any>, O extends RepoTrxGetOptions<R>> = (ApplyProjection<R, O> | undefined)[];
|
|
417
410
|
type RepoTrxGetOrThrowResult<R extends AbstractRepo<any>, O extends RepoTrxGetOptions<R>> = ApplyProjection<R, O>[];
|
|
@@ -444,7 +437,7 @@ type RepoTrxWriteRequest<R extends AbstractRepo<any>> = RepoTrxDeleteRequest<R>
|
|
|
444
437
|
interface RepoBatchGetOptions<R extends AbstractRepo<any>> {
|
|
445
438
|
consistent?: boolean;
|
|
446
439
|
projection?: Projection<R>;
|
|
447
|
-
|
|
440
|
+
filter?: (item: R["$schema"]) => boolean;
|
|
448
441
|
}
|
|
449
442
|
type RepoBatchGetResult<R extends AbstractRepo<any>, O extends RepoBatchGetOptions<R>> = {
|
|
450
443
|
items: ApplyProjection<R, O>[];
|
|
@@ -516,5 +509,5 @@ declare class Table<Schema extends TSchema = TSchema, const Def extends TableDef
|
|
|
516
509
|
constructor(schema: Schema, def: Def);
|
|
517
510
|
}
|
|
518
511
|
//#endregion
|
|
519
|
-
export {
|
|
520
|
-
//# sourceMappingURL=table-
|
|
512
|
+
export { RepoBatchGetResult as $, ValidGsiKeys as $t, DbTrxGetResult as A, RepoScanGsiResult as At, Func as B, RepoTrxPutRequest as Bt, DbScan as C, RepoQueryGsiResult as Ct, DbTrxDeleteRequest as D, RepoQueryResult as Dt, DbTrxConditionRequest as E, RepoQueryQuery as Et, DistPartialSome as F, RepoTrxDeleteRequest as Ft, Obj as G, RepoUpdateOptions as Gt, GsiKey as H, RepoTrxWriteRequest as Ht, ExtractKey as I, RepoTrxGetOptions as It, Projection as J, TableDef as Jt, PartialSome as K, RepoUpdateResult as Kt, ExtractKeys as L, RepoTrxGetOrThrowResult as Lt, DbTrxUpdateRequest as M, RepoScanPagedResult as Mt, DbTrxWriteRequest as N, RepoScanResult as Nt, DbTrxGetOrThrowResult as O, RepoScanGsiOptions as Ot, DbUpdate as P, RepoTrxConditionRequest as Pt, RepoBatchGetOrThrowResult as Q, TableKey as Qt, ExtractTableDef as R, RepoTrxGetRequestResult as Rt, DbQuery as S, RepoQueryGsiQuery as St, DbStreamEventListener as T, RepoQueryPagedResult as Tt, GsiNames as U, RepoUpdateData as Ut, Gsi as V, RepoTrxUpdateRequest as Vt, GsiProjectionType as W, RepoUpdateItem as Wt, RepoBatchDeleteResponse as X, TableGsi as Xt, RepoBatchDeleteRequest as Y, TableDesc as Yt, RepoBatchGetOptions as Z, TableGsiNames as Zt, DbEnableEventStreams as _, RepoPutItem as _t, Condition as a, RepoCreateOptions as at, DbListTables as b, RepoQueryGsiOptions as bt, DbBatchGetRequest as c, RepoDeleteOrThrowResult as ct, DbBatchWrite as d, RepoGetOptions as dt, ValidPrimaryKeys as en, RepoBatchPutRequest as et, DbBatchWriteResponse as f, RepoGetOrThrowResult as ft, DbDisableEventStreams as g, RepoOutput as gt, DbDelete as h, RepoKey as ht, ApplyProjection as i, Db as in, RepoCreateItem as it, DbTrxPutRequest as j, RepoScanOptions as jt, DbTrxGetRequest as k, RepoScanGsiPagedResult as kt, DbBatchGetResponse as l, RepoDeleteResult as lt, DbCreate as m, RepoGsiStartKey as mt, AllKeys as n, AbstractRepo as nn, RepoBatchWrite as nt, DbBatchDeleteRequest as o, RepoCreateResult as ot, DbConfig as p, RepoGetResult as pt, PickTypeOf as q, ResolvedAttrType as qt, ApplyGsiProjection as r, Repo as rn, RepoBatchWriteResult as rt, DbBatchGet as s, RepoDeleteOptions as st, Table as t, ValidTtlKeys as tn, RepoBatchPutResult as tt, DbBatchPutRequest as u, RepoExistsOptions as ut, DbExists as v, RepoPutOptions as vt, DbStreamEvent as w, RepoQueryOptions as wt, DbPut as x, RepoQueryGsiPagedResult as xt, DbGet as y, RepoPutResult as yt, ExtractTableSchema as z, RepoTrxGetResult as zt };
|
|
513
|
+
//# sourceMappingURL=table-DHIwU2MI.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-DHIwU2MI.d.mts","names":[],"sources":["../src/db.ts","../src/repo.ts","../src/types.ts","../src/table.ts"],"mappings":"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"}
|