{"version":3,"sources":["../src/index.ts","../src/utils/utils.ts"],"sourcesContent":["import {\n  AttributeValue,\n  DynamoDB,\n  DynamoDBClientConfig,\n} from '@aws-sdk/client-dynamodb';\nimport {\n  BatchWriteCommandInput,\n  BatchGetCommandInput,\n  DeleteCommandInput,\n  DynamoDBDocument,\n  GetCommandInput,\n  PutCommandInput,\n  QueryCommandInput,\n  ScanCommandInput,\n  UpdateCommandInput,\n} from '@aws-sdk/lib-dynamodb';\nimport {\n  NativeAttributeValue,\n  marshall,\n  marshallOptions,\n  unmarshall,\n  unmarshallOptions,\n} from '@aws-sdk/util-dynamodb';\nimport {\n  sleep,\n  buildConditionExpression,\n  decorrelatedJitterBackoff,\n  ConditionExpressionArgs,\n  ConditionExpressionQueryArgs,\n} from './utils/utils';\n\n// Re export useful util types\nexport { type ConditionExpressionArgs, type ConditionExpressionQueryArgs };\nexport type DynamoClientConfig = DynamoDBClientConfig & { region: string };\n\n/**\n * Provided to get around conflicting versions of DynamoDBDocument from @aws-sdk/lib-dynamodb\n */\nexport type DynamoDbDocumentClient = DynamoDBDocument;\n\nconst IS_OFFLINE = process.env.IS_OFFLINE;\nconst FORCE_ONLINE = process.env.FORCE_ONLINE;\n\n/**\n * Creates a DynamoDBDocument connection.\n *\n * Must specify a region.\n *\n * Uses a local connection if IS_OFFLINE is set to \"true\" and FORCE_ONLINE is not set to \"true\".\n */\nexport function getDynamodbConnection(\n  config: DynamoClientConfig,\n): DynamoDbDocumentClient {\n  let newConnection: DynamoDbDocumentClient;\n  if (IS_OFFLINE === 'true' && FORCE_ONLINE !== 'true') {\n    newConnection = DynamoDBDocument.from(\n      new DynamoDB({\n        region: 'localhost',\n        endpoint: 'http://localhost:8000',\n      }),\n    );\n  } else {\n    newConnection = DynamoDBDocument.from(new DynamoDB(config));\n  }\n  return newConnection;\n}\n\nexport interface PutItemParams<T extends Record<string, NativeAttributeValue>> {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  item: T;\n  /**\n   * Array of conditions to apply to the create.\n   * Conditions are combined with AND.\n   */\n  conditions?: ConditionExpressionArgs[];\n}\n\n/**\n * Create a new item.\n */\nexport const putItem = async <T extends Record<string, NativeAttributeValue>>(\n  params: PutItemParams<T>,\n): Promise<T> => {\n  const dynamoDb = params.dynamoDb;\n\n  const putItemInput: PutCommandInput = {\n    TableName: params.table,\n    Item: params.item,\n    ReturnValuesOnConditionCheckFailure: 'ALL_OLD',\n  };\n\n  const conditionalData = buildConditionExpression(params.conditions);\n  if (conditionalData?.attributeNames) {\n    putItemInput.ExpressionAttributeNames = conditionalData.attributeNames;\n  }\n\n  if (conditionalData?.attributeValues) {\n    putItemInput.ExpressionAttributeValues = conditionalData.attributeValues;\n  }\n\n  if (conditionalData?.conditionExpression) {\n    putItemInput.ConditionExpression = conditionalData.conditionExpression;\n  }\n\n  await dynamoDb.put(putItemInput);\n  return params.item;\n};\n\ninterface UpdateItem {\n  name: string;\n  attributeName: string;\n  attributeValue: NativeAttributeValue;\n  ref: string;\n}\n\nexport interface UpdateItemParams<\n  T extends Record<string, NativeAttributeValue>,\n> {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  key: Record<string, NativeAttributeValue>;\n  /**\n   * Record of fields to update.\n   * Attributes from the \"key\" will be automatically removed from fields to prevent \"This attribute is part of the key\" errors.\n   */\n  fields?: Partial<Record<keyof T, NativeAttributeValue>>;\n  /**\n   * Array of attributes to remove from the item.\n   */\n  removeFields?: Extract<keyof T, string>[];\n  /**\n   * Array of conditions to apply to the update.\n   * Conditions are combined with AND.\n   */\n  conditions?: ConditionExpressionArgs[];\n}\n\n/**\n * Update attributes on an item.\n *\n * Specify \"fields\" for the attributes to update.\n *\n * Specify \"removeFields\" for the attributes to remove from the item.\n *\n * Either \"fields\", \"removeFields\" or both must be specified.\n */\nexport const updateItem = async <\n  T extends Record<string, NativeAttributeValue>,\n>(\n  params: UpdateItemParams<T>,\n): Promise<T> => {\n  const updateItems: UpdateItem[] = [];\n\n  let count = 0;\n\n  const keyNames = Object.keys(params.key);\n  for (const element in params.fields) {\n    const attributeValue = params.fields[element];\n    if (attributeValue !== undefined && !keyNames.includes(element)) {\n      updateItems.push({\n        name: element,\n        attributeName: `#attr${count}`,\n        attributeValue,\n        ref: `:attr${count}`,\n      });\n      count++;\n    }\n  }\n\n  const removeAttributeItems: { name: keyof T; attributeName: string }[] = [];\n  for (const field of params.removeFields || []) {\n    if (field !== undefined && !keyNames.includes(field)) {\n      removeAttributeItems.push({\n        name: field,\n        attributeName: `#attr${count}`,\n      });\n      count++;\n    }\n  }\n\n  if (!updateItems.length && !removeAttributeItems.length) {\n    throw new Error('No fields or removeFields provided to updateItem');\n  }\n\n  let updateExpression = '';\n  if (updateItems.length) {\n    updateExpression =\n      'SET ' + updateItems.map((i) => `${i.attributeName}=${i.ref}`).join(', ');\n  }\n\n  if (removeAttributeItems.length) {\n    updateExpression +=\n      (updateExpression.length > 1 ? ' REMOVE ' : 'REMOVE') +\n      removeAttributeItems.map((i) => i.attributeName).join(', ');\n  }\n\n  const expressionAttributeValues = updateItems.reduce(\n    (p, c: UpdateItem) => {\n      p[`${c.ref}`] = c.attributeValue;\n      return p;\n    },\n    {} as Record<string, NativeAttributeValue>,\n  );\n\n  const expressionAttributeNames = [\n    ...updateItems,\n    ...removeAttributeItems,\n  ].reduce(\n    (p, c) => {\n      p[`${c.attributeName}`] = c.name;\n      return p;\n    },\n    {} as Record<string, NativeAttributeValue>,\n  );\n\n  const updateItemInput: UpdateCommandInput = {\n    TableName: params.table || '',\n    Key: params.key,\n    UpdateExpression: updateExpression,\n    ReturnValues: 'ALL_NEW',\n    ExpressionAttributeNames: expressionAttributeNames,\n    ExpressionAttributeValues: expressionAttributeValues,\n    ReturnValuesOnConditionCheckFailure: 'ALL_OLD',\n  };\n\n  const conditionalData = buildConditionExpression(params.conditions);\n  if (conditionalData?.attributeNames) {\n    updateItemInput.ExpressionAttributeNames = {\n      ...updateItemInput.ExpressionAttributeNames,\n      ...conditionalData.attributeNames,\n    };\n  }\n\n  if (conditionalData?.attributeValues) {\n    updateItemInput.ExpressionAttributeValues = {\n      ...updateItemInput.ExpressionAttributeValues,\n      ...conditionalData.attributeValues,\n    };\n  }\n\n  if (conditionalData?.conditionExpression) {\n    updateItemInput.ConditionExpression = conditionalData.conditionExpression;\n  }\n\n  const result = await params.dynamoDb.update(updateItemInput);\n  return result.Attributes as T;\n};\n\nexport interface DeleteItemParams {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  key: Record<string, NativeAttributeValue>;\n  /**\n   * Array of conditions to apply to the delete.\n   * Conditions are combined with AND.\n   */\n  conditions?: ConditionExpressionArgs[];\n}\n\nexport const deleteItem = async (\n  params: DeleteItemParams,\n): Promise<boolean> => {\n  const deleteInput: DeleteCommandInput = {\n    TableName: `${params.table}`,\n    Key: params.key,\n    ReturnValuesOnConditionCheckFailure: 'ALL_OLD',\n  };\n\n  const conditionalData = buildConditionExpression(params.conditions);\n  if (conditionalData?.attributeNames) {\n    deleteInput.ExpressionAttributeNames = conditionalData.attributeNames;\n  }\n\n  if (conditionalData?.attributeValues) {\n    deleteInput.ExpressionAttributeValues = conditionalData.attributeValues;\n  }\n\n  if (conditionalData?.conditionExpression) {\n    deleteInput.ConditionExpression = conditionalData.conditionExpression;\n  }\n\n  await params.dynamoDb.delete(deleteInput);\n  return true;\n};\n\nexport interface GetItemParams<K> {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  key: Record<string, NativeAttributeValue>;\n  consistentRead?: boolean;\n  /**\n   * Specific attributes to be returned on the item.\n   *\n   * When using this provide the K type including each of these attributes.\n   */\n  projectionExpression?: K[];\n}\n\n/**\n * Get a single item.\n */\nexport function getItem<T extends Record<string, NativeAttributeValue>>(\n  params: GetItemParams<keyof T>,\n): Promise<T>;\n\n/**\n * Get a single item.\n *\n * Specify K when using a projectionExpression\n */\nexport function getItem<\n  T extends Record<string, NativeAttributeValue>,\n  K extends keyof T,\n>(params: GetItemParams<K>): Promise<Pick<T, K>>;\n\n/**\n * Get a single item.\n *\n * Specify K type when using a projectionExpression\n */\nexport async function getItem<\n  T extends Record<string, NativeAttributeValue>,\n  K extends keyof T,\n>(params: GetItemParams<K>): Promise<T> {\n  const getItemInput: GetCommandInput = {\n    TableName: params.table || '',\n    Key: params.key,\n  };\n\n  if (params.consistentRead) {\n    getItemInput.ConsistentRead = params.consistentRead;\n  }\n\n  const result = await params.dynamoDb.get(getItemInput);\n  return result.Item as T;\n}\n\nexport interface GetAllItemsParams<K> {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  /**\n   * Limit the number of items returned.\n   * This will continue fetching items until the limit is reached or there are no more items.\n   */\n  limit?: number;\n  consistentRead?: boolean;\n  /**\n   * Array of conditions to apply to the scan.\n   * Conditions are combined with AND.\n   */\n  filterConditions?: ConditionExpressionArgs[];\n  /**\n   * Specific attributes to be returned on each item.\n   *\n   * When using this provide the K type including each of these attributes.\n   */\n  projectionExpression?: K[];\n  exclusiveStartKey?: Record<string, NativeAttributeValue>;\n}\n\n// Overload for when K is not provided, using keyof T as the default for K\n// Allows for a return type of T[] when K is not provided.\n\n/**\n * Scan items from a table.\n */\nexport function getAllItems<T extends Record<string, NativeAttributeValue>>(\n  params: GetAllItemsParams<keyof T>,\n): Promise<T[]>;\n\n/**\n * Scan items from a table.\n */\nexport function getAllItems<\n  T extends Record<string, NativeAttributeValue>,\n  K extends keyof T,\n>(params: GetAllItemsParams<K>): Promise<Pick<T, K>[]>;\n\n/**\n * Scan items from a table.\n */\nexport async function getAllItems<\n  T extends Record<string, NativeAttributeValue>,\n>(params: GetAllItemsParams<keyof T>): Promise<T[]> {\n  const scanInput: ScanCommandInput = {\n    TableName: params.table || '',\n  };\n\n  if (params.consistentRead) {\n    scanInput.ConsistentRead = params.consistentRead;\n  }\n\n  if (params.limit) {\n    scanInput.Limit = params.limit;\n  }\n\n  if (params.projectionExpression) {\n    scanInput.ProjectionExpression = params.projectionExpression.join(',');\n  }\n\n  if (params.exclusiveStartKey) {\n    scanInput.ExclusiveStartKey = params.exclusiveStartKey;\n  }\n\n  const conditionalData = buildConditionExpression(params.filterConditions);\n  if (conditionalData?.attributeNames) {\n    scanInput.ExpressionAttributeNames = conditionalData.attributeNames;\n  }\n\n  if (conditionalData?.attributeValues) {\n    scanInput.ExpressionAttributeValues = conditionalData.attributeValues;\n  }\n\n  if (conditionalData?.conditionExpression) {\n    scanInput.FilterExpression = conditionalData.conditionExpression;\n  }\n\n  const allRecords: T[] = [];\n  let lastKey: Record<string, NativeAttributeValue> | undefined = undefined;\n  do {\n    const result = await params.dynamoDb.scan(scanInput);\n    const resultRecords = result.Items as T[];\n    allRecords.push(...resultRecords);\n    lastKey = result.LastEvaluatedKey;\n    scanInput.ExclusiveStartKey = lastKey;\n  } while (lastKey && (params.limit ? allRecords.length < params.limit : true));\n\n  return allRecords;\n}\n\nexport interface BatchGetItemsParams {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  /**\n   * Keys of items to get.\n   * Automatically handles chunking the keys by 100.\n   */\n  keys: Record<string, NativeAttributeValue>[];\n}\n\n/**\n * Batch get items from a table.\n * Automatically handles chunking the keys by 100.\n * Items are returned in an arbitrary order.\n */\nexport const batchGetItems = async <\n  T extends Record<string, NativeAttributeValue>,\n>(\n  params: BatchGetItemsParams,\n): Promise<T[]> => {\n  if (!params.keys.length) {\n    return [];\n  }\n\n  const unique = new Map<string, Record<string, NativeAttributeValue>>();\n\n  for (const item of params.keys) {\n    const key = JSON.stringify(item);\n    if (!unique.has(key)) {\n      unique.set(key, item);\n    }\n  }\n\n  const uniqueIds = Array.from(unique.values());\n\n  const totalBatches = Math.ceil(uniqueIds.length / 100);\n  const keyBatches: Record<string, any>[][] = [];\n  for (let index = 0; index < totalBatches; index++) {\n    const start = index * 100;\n    const end = start + 100 > uniqueIds.length ? uniqueIds.length : start + 100;\n    const batch = uniqueIds.slice(start, end);\n    keyBatches.push(batch);\n  }\n\n  const initialPromises = keyBatches.map((keyBatch) => {\n    const batchGetInput: BatchGetCommandInput = {\n      RequestItems: {\n        [params.table]: {\n          Keys: keyBatch,\n        },\n      },\n    };\n    return params.dynamoDb.batchGet(batchGetInput);\n  });\n\n  const initialResults = await Promise.all(initialPromises);\n  let allRecords: T[] = [];\n  for (const result of initialResults) {\n    const records = result.Responses?.[params.table] as T[];\n    allRecords = allRecords.concat(records);\n\n    let unprocessedKeys = result.UnprocessedKeys?.[params.table]?.Keys;\n    while (unprocessedKeys && unprocessedKeys.length) {\n      const batchGetInput: BatchGetCommandInput = {\n        RequestItems: {\n          [params.table]: {\n            Keys: unprocessedKeys,\n          },\n        },\n      };\n      const retryResult = await params.dynamoDb.batchGet(batchGetInput);\n      const retryRecords = retryResult.Responses?.[params.table] as T[];\n      allRecords = allRecords.concat(retryRecords);\n      unprocessedKeys = retryResult.UnprocessedKeys?.[params.table]?.Keys;\n    }\n  }\n\n  return allRecords;\n};\n\nexport interface QueryItemsParams<K> {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  keyName: string;\n  keyValue: NativeAttributeValue;\n  /**\n   * Which GSI or LSI to query.\n   */\n  indexName?: string;\n  /**\n   * Specify as false to query in reverse order.\n   */\n  scanIndexForward?: boolean;\n  /**\n   * Consistent reads for queries can only be done with no index specified or an LSI.\n   */\n  consistentRead?: boolean;\n  /**\n   * Limit the number of items returned.\n   * This will continue fetching items until the limit is reached or there are no more items.\n   */\n  limit?: number;\n  /**\n   * Condition to be applied to the sort key.\n   */\n  rangeCondition?: ConditionExpressionQueryArgs;\n  /**\n   * Specific attributes to be returned on each item.\n   *\n   * When using this provide the K type including each of these attributes.\n   */\n  projectionExpression?: K[];\n  exclusiveStartKey?: Record<string, NativeAttributeValue>;\n}\n\n/**\n * Query items from a table.\n */\nexport function queryItems<T extends Record<string, NativeAttributeValue>>(\n  params: QueryItemsParams<keyof T>,\n): Promise<T[]>;\n\n/**\n * Query items from a table.\n */\nexport function queryItems<\n  T extends Record<string, NativeAttributeValue>,\n  K extends keyof T,\n>(params: QueryItemsParams<K>): Promise<Pick<T, K>[]>;\n\n/**\n * Query items from a table.\n */\nexport async function queryItems<\n  T extends Record<string, NativeAttributeValue>,\n>(params: QueryItemsParams<keyof T>): Promise<T[]> {\n  const queryInput: QueryCommandInput = {\n    TableName: params.table,\n    KeyConditionExpression: `#a = :b`,\n    ExpressionAttributeNames: {\n      '#a': params.keyName,\n    },\n    ExpressionAttributeValues: {\n      ':b': params.keyValue,\n    },\n  };\n\n  if (params?.indexName) {\n    queryInput.IndexName = params?.indexName;\n  }\n\n  if (params?.exclusiveStartKey) {\n    queryInput.ExclusiveStartKey = params?.exclusiveStartKey;\n  }\n\n  if (params.consistentRead) {\n    queryInput.ConsistentRead = params.consistentRead;\n  }\n\n  if (params?.scanIndexForward === false) {\n    queryInput.ScanIndexForward = false;\n  }\n\n  if (params?.limit) {\n    queryInput.Limit = params.limit;\n  }\n\n  if (params.projectionExpression) {\n    queryInput.ProjectionExpression = params.projectionExpression.join(',');\n  }\n\n  const rangeData = buildConditionExpression(\n    params.rangeCondition ? [params.rangeCondition] : undefined,\n  );\n  if (rangeData?.attributeNames) {\n    queryInput.ExpressionAttributeNames = {\n      ...queryInput.ExpressionAttributeNames,\n      ...rangeData.attributeNames,\n    };\n  }\n\n  if (rangeData?.attributeValues) {\n    queryInput.ExpressionAttributeValues = {\n      ...queryInput.ExpressionAttributeValues,\n      ...rangeData.attributeValues,\n    };\n  }\n\n  if (rangeData?.conditionExpression) {\n    queryInput.KeyConditionExpression = `${queryInput.KeyConditionExpression} AND ${rangeData?.conditionExpression}`;\n  }\n\n  const allRecords: T[] = [];\n  let lastKey: Record<string, NativeAttributeValue> | undefined = undefined;\n  do {\n    const result = await params.dynamoDb.query(queryInput);\n    const resultRecords = result.Items as T[];\n    allRecords.push(...resultRecords);\n    lastKey = result.LastEvaluatedKey;\n    queryInput.ExclusiveStartKey = lastKey;\n  } while (lastKey && (params.limit ? allRecords.length < params.limit : true));\n\n  return allRecords;\n}\n\nexport interface QueryRangeParams<K>\n  extends Omit<QueryItemsParams<K>, 'rangeCondition'> {\n  rangeKeyName: string;\n  rangeKeyValue: NativeAttributeValue;\n  /**\n   * Specify as true to use a begins_with condition on the sort key.\n   * Specify as falsy to use an equals condition on the sort key.\n   */\n  fuzzy?: boolean;\n}\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with an equals or begins_with condition.\n */\nexport function queryItemsRange<T extends Record<string, NativeAttributeValue>>(\n  params: QueryRangeParams<keyof T>,\n): Promise<T[]>;\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with an equals or begins_with condition.\n */\nexport function queryItemsRange<\n  T extends Record<string, NativeAttributeValue>,\n  K extends keyof T,\n>(params: QueryRangeParams<K>): Promise<Pick<T, K>[]>;\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with an equals or begins_with condition.\n */\nexport async function queryItemsRange<\n  T extends Record<string, NativeAttributeValue>,\n>(params: QueryRangeParams<keyof T>): Promise<T[]> {\n  const result = await queryItems<T>({\n    ...params,\n    rangeCondition: {\n      operator: params.fuzzy ? 'BeginsWith' : 'Equal',\n      field: params.rangeKeyName,\n      value: params.rangeKeyValue,\n    },\n  });\n\n  return result;\n}\n\nexport interface QueryItemsRangeBetweenParams<K>\n  extends Omit<QueryItemsParams<K>, 'rangeCondition'> {\n  rangeKeyName: string;\n  rangeKeyValueMin: NativeAttributeValue;\n  rangeKeyValueMax: NativeAttributeValue;\n}\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with a 'between' condition\n */\nexport function queryItemsRangeBetween<\n  T extends Record<string, NativeAttributeValue>,\n>(params: QueryItemsRangeBetweenParams<keyof T>): Promise<T[]>;\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with a 'between' condition\n */\nexport function queryItemsRangeBetween<\n  T extends Record<string, NativeAttributeValue>,\n  K extends keyof T,\n>(params: QueryItemsRangeBetweenParams<K>): Promise<Pick<T, K>[]>;\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with a 'between' condition\n */\nexport async function queryItemsRangeBetween<\n  T extends Record<string, NativeAttributeValue>,\n>(params: QueryItemsRangeBetweenParams<keyof T>): Promise<T[]> {\n  const result = await queryItems<T>({\n    ...params,\n    rangeCondition: {\n      operator: 'Between',\n      field: params.rangeKeyName,\n      value: params.rangeKeyValueMin,\n      betweenSecondValue: params.rangeKeyValueMax,\n    },\n  });\n\n  return result;\n}\n\nexport interface BatchPutItems<T extends Record<string, NativeAttributeValue>> {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  /**\n   * Items to create.\n   * Automatically handles chunking the items by 25.\n   */\n  items: T[];\n}\n\n/**\n * Batch create items into a table.\n * Automatically handles chunking the items by 25.\n */\nexport const batchPutItems = async <\n  T extends Record<string, NativeAttributeValue>,\n>(\n  params: BatchPutItems<T>,\n): Promise<T[]> => {\n  const totalBatches = Math.ceil(params.items.length / 25);\n  const itemBatches: Record<string, any>[][] = [];\n  for (let index = 0; index < totalBatches; index++) {\n    const start = index * 25;\n    const end =\n      start + 25 > params.items.length ? params.items.length : start + 25;\n    const batch = params.items.slice(start, end);\n    itemBatches.push(batch);\n  }\n\n  const initialPromises = itemBatches.map((itemsBatch) => {\n    const batchWriteInput: BatchWriteCommandInput = {\n      RequestItems: {\n        [params.table]: itemsBatch.map((item) => ({\n          PutRequest: {\n            Item: item,\n          },\n        })),\n      },\n    };\n    return params.dynamoDb.batchWrite(batchWriteInput);\n  });\n\n  const initialResults = await Promise.all(initialPromises);\n\n  let previousDelay = 0;\n  for (const result of initialResults) {\n    let unprocessedItems = result.UnprocessedItems;\n    while (Object.keys(unprocessedItems || {}).length > 0) {\n      const batchWriteInput: BatchWriteCommandInput = {\n        RequestItems: unprocessedItems,\n      };\n\n      // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.BatchOperations\n      const delay = decorrelatedJitterBackoff(previousDelay);\n      await sleep(delay);\n\n      const retryResult = await params.dynamoDb.batchWrite(batchWriteInput);\n      unprocessedItems = retryResult.UnprocessedItems;\n    }\n  }\n\n  return params.items;\n};\n\nexport interface BatchDeleteItemsParams {\n  dynamoDb: DynamoDbDocumentClient;\n  table: string;\n  /**\n   * Items to delete.\n   * Automatically handles chunking the items by 25.\n   */\n  keys: Record<string, NativeAttributeValue>[];\n}\n\n/**\n * Batch delete items from a table.\n * Automatically handles chunking the keys by 25.\n */\nexport const batchDeleteItems = async (\n  params: BatchDeleteItemsParams,\n): Promise<boolean> => {\n  const totalBatches = Math.ceil(params.keys.length / 25);\n  const keyBatches: Record<string, any>[][] = [];\n  for (let index = 0; index < totalBatches; index++) {\n    const start = index * 25;\n    const end =\n      start + 25 > params.keys.length ? params.keys.length : start + 25;\n    const batch = params.keys.slice(start, end);\n    keyBatches.push(batch);\n  }\n\n  const initialPromises = keyBatches.map((keysBatch) => {\n    const batchWriteInput: BatchWriteCommandInput = {\n      RequestItems: {\n        [params.table]: keysBatch.map((item) => ({\n          DeleteRequest: {\n            Key: item,\n          },\n        })),\n      },\n    };\n    return params.dynamoDb.batchWrite(batchWriteInput);\n  });\n\n  const initialResults = await Promise.all(initialPromises);\n\n  let previousDelay = 0;\n  for (const result of initialResults) {\n    let unprocessedItems = result.UnprocessedItems;\n    while (Object.keys(unprocessedItems || {}).length > 0) {\n      const batchWriteInput: BatchWriteCommandInput = {\n        RequestItems: unprocessedItems,\n      };\n\n      // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.BatchOperations\n      const delay = decorrelatedJitterBackoff(previousDelay);\n      await sleep(delay);\n\n      const retryResult = await params.dynamoDb.batchWrite(batchWriteInput);\n      unprocessedItems = retryResult.UnprocessedItems;\n    }\n  }\n\n  return true;\n};\n\n/**\n * Unmarshalling is used to convert a DynamoDB record into a JavaScript object.\n */\nexport const unmarshallItem = <T extends Record<string, NativeAttributeValue>>(\n  item: Record<string, AttributeValue>,\n  options?: unmarshallOptions,\n): T => {\n  const unmarshallItem = unmarshall(item, options);\n  return unmarshallItem as T;\n};\n\n/**\n * Marshalling is used to convert a JavaScript object into a DynamoDB record.\n */\nexport const marshallItem = <T extends Record<string, NativeAttributeValue>>(\n  item: T,\n  options?: marshallOptions,\n): Record<string, AttributeValue> => {\n  const unmarshallItem = marshall(item, options);\n  return unmarshallItem;\n};\n","import { NativeAttributeValue } from '@aws-sdk/util-dynamodb';\n\nexport type OperatorQueryType =\n  | 'BeginsWith'\n  | 'LessThan'\n  | 'GreaterThan'\n  | 'LessThanEqual'\n  | 'GreaterThanEqual'\n  | 'Equal'\n  | 'NotEqual'\n  | 'Between';\n\n/**\n * These additional operators are valid for condition expressions but not query expressions.\n */\nexport type OperatorType =\n  | OperatorQueryType\n  | 'AttributeExists'\n  | 'AttributeNotExists';\n\nexport interface ConditionExpressionArgs {\n  operator: OperatorType;\n  field: string;\n  value?: NativeAttributeValue;\n  /** Used only for Between comparison */\n  betweenSecondValue?: NativeAttributeValue;\n}\n\nexport interface ConditionExpressionQueryArgs {\n  operator: OperatorQueryType;\n  field: string;\n  value?: NativeAttributeValue;\n  /** Used only for Between comparison */\n  betweenSecondValue?: NativeAttributeValue;\n}\n\nexport const sleep = (ms: number) =>\n  new Promise((resolve) => setTimeout(resolve, ms));\n\n// https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/\nexport const decorrelatedJitterBackoff = (previousDelay: number) => {\n  const maxDelayMiliseconds = 4000;\n  const baseMiliseconds = 50;\n\n  const nextDelay = Math.min(\n    maxDelayMiliseconds,\n    Math.random() * previousDelay * 3 + baseMiliseconds,\n  );\n  return nextDelay;\n};\n\nconst buildCondition = (args: ConditionExpressionArgs): string => {\n  const { operator, value, betweenSecondValue, field } = args;\n  let conditionExpression = '';\n\n  switch (operator) {\n    case 'BeginsWith':\n      conditionExpression = `begins_with(${field}, ${value})`;\n      break;\n    case 'Equal':\n      conditionExpression = `${field} = ${value}`;\n      break;\n    case 'NotEqual':\n      conditionExpression = `${field} <> ${value}`;\n      break;\n    case 'GreaterThan':\n      conditionExpression = `${field} > ${value}`;\n      break;\n    case 'GreaterThanEqual':\n      conditionExpression = `${field} >= ${value}`;\n      break;\n    case 'LessThan':\n      conditionExpression = `${field} < ${value}`;\n      break;\n    case 'LessThanEqual':\n      conditionExpression = `${field} <= ${value}`;\n      break;\n    case 'Between':\n      conditionExpression = `${field} BETWEEN ${value} AND ${betweenSecondValue}`;\n      break;\n    case 'AttributeExists':\n      conditionExpression = `attribute_exists(${field})`;\n      break;\n    case 'AttributeNotExists':\n      conditionExpression = `attribute_not_exists(${field})`;\n      break;\n    default:\n      throw new Error('Unknown Query Condition type');\n  }\n  return conditionExpression;\n};\n\ninterface ConditionExpressData {\n  conditionExpression: string;\n  attributeNames: Record<string, string> | null;\n  attributeValues: Record<string, NativeAttributeValue> | null;\n}\n\nexport const buildConditionExpression = (\n  conditions?: ConditionExpressionArgs[],\n): ConditionExpressData | null => {\n  if (!conditions?.length) {\n    return null;\n  }\n\n  let count = 0;\n  const attributeNames: Record<string, string> = {};\n  const attributeValues: Record<string, NativeAttributeValue> = {};\n  let conditionExpression = '';\n\n  conditions.forEach((values: ConditionExpressionArgs) => {\n    if (conditionExpression?.length) {\n      conditionExpression += ' AND ';\n    }\n    conditionExpression += buildCondition({\n      field: `#field${count}`,\n      value: `:val${count}`,\n      operator: values.operator,\n      betweenSecondValue: `:val${count + 1}`,\n    });\n    attributeNames[`#field${count}`] = values.field;\n\n    if (values.value !== undefined) {\n      attributeValues[`:val${count}`] = values.value;\n    }\n\n    if (values.betweenSecondValue !== undefined) {\n      attributeValues[`:val${count + 1}`] = values.betweenSecondValue;\n    }\n    count += 2;\n  });\n\n  if (!conditionExpression?.length) {\n    return null;\n  }\n\n  return {\n    conditionExpression,\n    attributeNames: Object.keys(attributeNames).length ? attributeNames : null,\n    attributeValues: Object.keys(attributeValues).length\n      ? attributeValues\n      : null,\n  };\n};\n"],"mappings":"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","names":["unmarshallItem"]}