{"version":3,"sources":["../src/async.helpers.ts","../src/all.records.ts","../src/async.batch.ts","../src/delete.records.ts","../src/logging.helper.ts","../src/normalize-sheet-config.ts","../src/slugify.ts","../src/simple.records.ts"],"names":["asyncLimitSeries","limit","fn","response","i","res","api","FlatfileClient","DEFAULT_PAGE_SIZE","getRecordsRaw","sheetId","options","queryParams","key","value","v","baseUrl","token","getCredentials","url","httpResponse","fetch","e","getSheetLength","counts","processRecords","callback","pageSize","totalRecords","totalPageCount","results","pageNumber","records","record","result","createRecords","updateRecords","updateAllRecords","tick","recordCount","pageCount","index","start","end","createAllRecords","CrossEnvConfig","asyncBatch","arr","event","chunkSize","parallel","debug","chunks","chunkify","processChunk","chunkIndex","threadId","currentIndex","processChunks","promises","_","deleteRecords","config","sheet","error","log","packageName","msg","type","status","logInfo","logWarn","logError","normalizeKey","specialReplacements","char","replacement","runsRegex","singleRegex","truncate","maxLength","normalizeSheetConfig","sheetConfig","output","usedKeys","conflicts","normalizedFields","field","originalKey","normalizedKey","truncatedKey","finalKey","counter","hadConflict","message","slugify","str","PAGE_SIZE","Simplified","_Simplified","recordPages","obj","r"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["export async function asyncLimitSeries<T>(\n  limit: number,\n  fn: (i: number) => Promise<T>\n): Promise<T[]> {\n  let response = []\n\n  for (let i = 0; i < limit; i++) {\n    const res = await fn(i)\n    response.push(res)\n  }\n\n  return response\n}\n","import { type Flatfile, FlatfileClient } from '@flatfile/api'\nimport { CrossEnvConfig } from '@flatfile/cross-env-config'\nimport fetch from 'cross-fetch'\nimport { asyncLimitSeries } from './async.helpers'\n\nconst api = new FlatfileClient()\n\nconst DEFAULT_PAGE_SIZE = 5_000\n\nexport async function getRecordsRaw(\n  sheetId: string,\n  options: Flatfile.records.GetRecordsRequest = {}\n): Promise<Array<Flatfile.Record_>> {\n  const queryParams = new URLSearchParams()\n  queryParams.set('pageNumber', String(options.pageNumber ?? 1))\n  queryParams.set('pageSize', String(options.pageSize ?? DEFAULT_PAGE_SIZE))\n\n  Object.entries(options).forEach(([key, value]) => {\n    if (value !== undefined) {\n      if (Array.isArray(value)) {\n        value.map((v) => queryParams.append(key, String(v)))\n      } else {\n        queryParams.set(key, String(value))\n      }\n    }\n  })\n\n  const { baseUrl, token } = getCredentials()\n\n  const url = `${baseUrl}/v1/sheets/${sheetId}/records?${queryParams}`\n  const httpResponse = await fetch(url, {\n    method: 'GET',\n    headers: {\n      Authorization: `Bearer ${token}`,\n      'Content-Type': 'application/json',\n    },\n  })\n\n  if (!httpResponse.ok) {\n    throw new Error(`Reading ${options.pageNumber ?? 1} of ${sheetId} failed.`)\n  }\n\n  try {\n    const res = await httpResponse.json()\n    return res.data?.records ?? []\n  } catch (e) {\n    console.log(e)\n    return []\n  }\n}\n\nexport async function getSheetLength(sheetId: string): Promise<number> {\n  const {\n    data: { counts },\n  } = await api.sheets.getRecordCounts(sheetId)\n  return counts.total\n}\n\nexport async function processRecords<R>(\n  sheetId: string,\n  callback: (\n    records: Flatfile.RecordsWithLinks,\n    pageNumber?: number,\n    totalPageCount?: number\n  ) => R | void | Promise<R | void>,\n  options: Omit<Flatfile.records.GetRecordsRequest, 'pageNumber'> = {}\n): Promise<R[] | void> {\n  const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE\n  const totalRecords = await getSheetLength(sheetId)\n  const totalPageCount = Math.ceil(totalRecords / pageSize) || 1\n  const results: R[] = []\n\n  for (let pageNumber = 1; pageNumber <= totalPageCount; pageNumber++) {\n    try {\n      const records = (await getRecordsRaw(sheetId, {\n        ...options,\n        pageSize,\n        pageNumber,\n      })) as Flatfile.Record_[]\n\n      // Delete updatedAt\n      records.forEach((record) =>\n        Object.values(record.values).forEach(\n          (value: Record<string, Flatfile.CellValue>) => delete value.updatedAt\n        )\n      )\n\n      const result = await callback(records, pageNumber, totalPageCount)\n      if (result !== undefined && result !== null) {\n        results.push(result as R)\n      }\n    } catch (e) {\n      // log error and continue processing\n      console.error(e)\n    }\n  }\n\n  return results.length ? results : undefined\n}\n\n/**\n * Creates records in a sheet. Bypasses API SDK in order to suppress hooks\n */\nexport async function createRecords(\n  sheetId: string,\n  records: Flatfile.RecordData[]\n): Promise<string> {\n  const { baseUrl, token } = getCredentials()\n\n  const httpResponse = await fetch(`${baseUrl}/v1/sheets/${sheetId}/records`, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${token}`,\n      'Content-Type': 'application/json',\n      'x-force-hooks': 'true',\n    },\n    body: JSON.stringify(records),\n  })\n\n  if (!httpResponse.ok) {\n    console.log(await httpResponse?.text())\n    throw new Error(`Creating records failed.`)\n  }\n  const res = await httpResponse.json()\n  return res.data.commitId\n}\n\n/**\n * Updates records in a sheet. Bypasses API SDK in order to suppress hooks\n */\nexport async function updateRecords(\n  sheetId: string,\n  records: any\n): Promise<string> {\n  const { baseUrl, token } = getCredentials()\n\n  const httpResponse = await fetch(`${baseUrl}/v1/sheets/${sheetId}/records`, {\n    method: 'PUT',\n    headers: {\n      Authorization: `Bearer ${token}`,\n      'Content-Type': 'application/json',\n      'x-force-hooks': 'true',\n    },\n    body: JSON.stringify(records),\n  })\n\n  if (httpResponse.status === 304) {\n    return 'not-modified'\n  }\n\n  if (!httpResponse.ok) {\n    console.log(await httpResponse?.text())\n    throw new Error(`Updating records failed.`)\n  }\n\n  const res = await httpResponse.json()\n  return res.data.commitId\n}\n\n/**\n * Updates records in a sheet. Bypasses API SDK in order to suppress hooks\n */\nexport async function updateAllRecords(\n  sheetId: string,\n  records: Flatfile.Record_[],\n  tick?: TickHelper\n): Promise<void> {\n  const recordCount = records.length\n  const pageCount = Math.ceil(recordCount / DEFAULT_PAGE_SIZE)\n  await asyncLimitSeries(pageCount, async (index: number) => {\n    const start = index * DEFAULT_PAGE_SIZE\n    const end =\n      start + DEFAULT_PAGE_SIZE <= records.length\n        ? start + DEFAULT_PAGE_SIZE\n        : records.length\n    await tick?.((index + 1) / pageCount, index + 1, pageCount).catch(\n      console.log\n    )\n    return updateRecords(sheetId, records.slice(index * DEFAULT_PAGE_SIZE, end))\n  })\n}\n\n/**\n * Creates many records in a sheet. Bypasses API SDK in order to suppress hooks\n */\nexport async function createAllRecords(\n  sheetId: string,\n  records: Flatfile.RecordData[],\n  tick?: TickHelper,\n  options?: {\n    pageSize?: number\n  }\n): Promise<void> {\n  const recordCount = records.length\n  const pageSize = options?.pageSize ?? DEFAULT_PAGE_SIZE\n  const pageCount = Math.ceil(recordCount / pageSize)\n  await asyncLimitSeries(pageCount, async (index: number) => {\n    const start = index * pageSize\n    const end =\n      start + pageSize <= records.length ? start + pageSize : records.length\n    await tick?.((index + 1) / pageCount, index + 1, pageCount).catch(\n      console.log\n    )\n    return createRecords(sheetId, records.slice(index * pageSize, end))\n  })\n}\n\nexport type TickHelper = (\n  progress: number,\n  part: number,\n  totalParts: number\n) => Promise<void>\n\nfunction getCredentials() {\n  const baseUrl =\n    CrossEnvConfig.get('AGENT_INTERNAL_URL') ||\n    CrossEnvConfig.get('FLATFILE_API_URL') ||\n    'https://platform.flatfile.com/api'\n  const token =\n    CrossEnvConfig.get('FLATFILE_BEARER_TOKEN') ||\n    CrossEnvConfig.get('FLATFILE_API_KEY')\n\n  return { baseUrl, token }\n}\n","import type { FlatfileEvent } from '@flatfile/listener'\n\nexport async function asyncBatch<T, R>(\n  arr: T[],\n  callback: (chunk: T[], event?: FlatfileEvent) => Promise<R>,\n  options: { chunkSize?: number; parallel?: number; debug?: boolean } = {},\n  event?: FlatfileEvent\n): Promise<R[]> {\n  const { chunkSize = 10_000, parallel = 1, debug = false } = options\n  const chunks = chunkify<T>(arr, chunkSize)\n\n  if (debug) {\n    console.log(`${chunks.length} chunks to be processed`)\n  }\n\n  const results: Map<number, R> = new Map()\n\n  async function processChunk(\n    chunkIndex: number,\n    threadId: number\n  ): Promise<void> {\n    if (debug) {\n      console.log(`Thread ${threadId} processing chunk ${chunkIndex}`)\n    }\n\n    const result = await callback(chunks[chunkIndex], event)\n    results.set(chunkIndex, result)\n  }\n\n  let currentIndex = 0\n  async function processChunks(threadId: number): Promise<void> {\n    while (currentIndex < chunks.length) {\n      const chunkIndex = currentIndex++\n      await processChunk(chunkIndex, threadId)\n    }\n  }\n\n  const promises: Promise<void>[] = Array.from({ length: parallel }, (_, i) =>\n    processChunks(i)\n  )\n\n  await Promise.all(promises)\n\n  if (debug) {\n    console.log('All chunks processed')\n  }\n\n  return Array.from(results.values())\n}\n\nexport function chunkify<T>(arr: T[], chunkSize: number): T[][] {\n  if (chunkSize <= 0) {\n    return []\n  }\n\n  return Array.from({ length: Math.ceil(arr.length / chunkSize) }, (_, i) =>\n    arr.slice(i * chunkSize, i * chunkSize + chunkSize)\n  )\n}\n","import type { Flatfile } from '@flatfile/api'\nimport { FlatfileClient } from '@flatfile/api'\n\nconst api = new FlatfileClient()\n\nexport async function deleteRecords(\n  sheetId: string,\n  config: Omit<Flatfile.DeleteRecordsJobConfig, 'sheet'>\n): Promise<void> {\n  try {\n    const { data: sheet } = await api.sheets.get(sheetId)\n    await api.jobs.create({\n      type: 'workbook',\n      operation: 'delete-records',\n      trigger: 'immediate',\n      source: sheet.workbookId,\n      config: {\n        ...config,\n        sheet: sheetId,\n      },\n    })\n  } catch (error) {\n    console.error('Error deleting records:', error)\n    throw new Error('Error deleting records')\n  }\n}\n","type LogType = 'log' | 'warn' | 'error'\n\nexport const log = (\n  packageName: string,\n  msg: string,\n  type: LogType = 'log'\n): void => {\n  const status = {\n    log: 'INFO',\n    warn: 'WARN',\n    error: 'FATAL',\n  }\n  console[type](`[${packageName}]:[${status[type]}] ${msg}`)\n}\n\nexport const logInfo = (packageName: string, msg: string): void => {\n  log(packageName, msg)\n}\n\nexport const logWarn = (packageName: string, msg: string): void => {\n  log(packageName, msg, 'warn')\n}\n\nexport const logError = (packageName: string, msg: string): void => {\n  log(packageName, msg, 'error')\n}\n","import type { Flatfile } from '@flatfile/api'\n\nexport interface NormalizeSheetConfigOptions {\n  output?: 'validate' | 'transform'\n}\n\nexport interface KeyConflict {\n  originalKey: string\n  normalizedKey: string\n  finalKey: string\n  message: string\n}\n\nexport interface ValidationResult {\n  conflicts: KeyConflict[]\n  hasConflicts: boolean\n}\n\nconst MAX_SHEET_FIELD_KEY_LENGTH = 225\n\n/**\n * Converts a string (in various formats) to snake_case.\n * - Consecutive uppercase letters remain a single chunk (e.g. \"XYZ\" => \"xyz\")\n * - But if there's a lowercase letter followed by uppercase letters (\"ValueXYZ\"),\n *   we insert a space before the uppercase chunk => \"Value XYZ\"\n * - Hyphens, underscores, spaces become single spaces.\n * - % -> \"percent\"; $ -> \"dollar\"\n * - Fully uppercase words stay as one chunk (\"FIRSTNAME\" => \"firstname\").\n * - Also, if the entire string is numeric, return it as a number.\n */\nexport function normalizeKey(key: string | number): string {\n  if (key === null || key === undefined) {\n    return ''\n  }\n  // 1) Convert to string\n  key = String(key)\n\n  // 2) If it's an empty string, return ''\n  if (key.trim() === '') {\n    return ''\n  }\n\n  // 3) We have some special characters to handle\n  const specialReplacements: Record<string, string> = {\n    '%': 'percent',\n    $: 'dollar',\n  }\n\n  // 4) For each special char, collapse consecutive runs and then replace\n  let result = key\n  for (const [char, replacement] of Object.entries(specialReplacements)) {\n    // (A) Collapse runs of consecutive `char` into a single instance\n    //     e.g. \"%%%%\" => \"%\"\n    const runsRegex = new RegExp(`\\\\${char}+`, 'g')\n    result = result.replace(runsRegex, char)\n\n    // (B) Replace the single `char` with the textual placeholder\n    //     Wrap it with spaces => \" percent \"\n    const singleRegex = new RegExp(`\\\\${char}`, 'g')\n    result = result.replace(singleRegex, ` ${replacement} `)\n  }\n\n  // 5) Convert hyphens, underscores, multiple spaces => single space\n  result = result.replace(/[\\s_-]+/g, ' ')\n\n  // 6) Remove or unify any other non-alphanumeric punctuation\n  //    e.g. \"!!!!\" => ' '\n  //    But preserve non-English characters\n  //    Updated regex to support all languages and scripts instead of only English\n  //    e.g.\n  //    1. Chinese: \"你好\" -> \"你好\"\n  //    2. Japanese: \"こんにちは\" -> \"こんにちは\"\n  //    3. Kanji: \"漢字\" -> \"漢字\"\n  //    4. Hindi: \"नमस्ते\" -> \"नमस्ते\"\n  result = result.replace(/[^\\p{L}\\p{N}\\p{M}\\p{Pd}\\p{Pc}]+/gu, ' ')\n\n  // 7) Split uppercase sequences from subsequent capital+lower\n  //    e.g. \"HTTPStatus\" => \"HTTP Status\"\n  result = result.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n\n  // 8) Split a lower/number followed by run of uppercase letters\n  //    e.g. \"someValueXYZ\" => \"some Value XYZ\"\n  result = result.replace(/([a-z0-9])([A-Z]+)/g, '$1 $2')\n\n  // 9) Convert to lowercase\n  result = result.toLowerCase()\n\n  // 10) Trim, then replace any remaining spaces with underscores => snake_case\n  result = result.trim().replace(/\\s+/g, '_')\n\n  // 11) If the result is a number, convert it to a number then back to a string (converts 000 to 0 for example)\n  if (!isNaN(Number(result))) {\n    result = Number(result).toString()\n  }\n\n  return result\n}\n\nexport function truncate(\n  key: string,\n  maxLength: number = MAX_SHEET_FIELD_KEY_LENGTH\n): string {\n  // Validate key is a string\n  if (typeof key !== 'string') {\n    throw new TypeError('The \"key\" parameter must be a string.')\n  }\n\n  // Validate maxLength is a positive integer\n  if (!Number.isInteger(maxLength) || maxLength <= 0) {\n    throw new RangeError(\n      'The \"maxLength\" parameter must be a positive integer.'\n    )\n  }\n\n  // Truncate if necessary\n  return key.length > maxLength ? key.substring(0, maxLength) : key\n}\n\n/**\n * Normalizes the field keys in a Flatfile SheetConfig using snake_case convention.\n * Creates a new SheetConfig with normalized field keys while preserving all other properties.\n * If normalized keys create duplicates, adds _1, _2, etc. to make them unique.\n *\n * @param sheetConfig - The Flatfile SheetConfig to normalize\n * @param options - Configuration options for the normalization\n * @param options.output - 'validate' returns conflict info, 'transform' (default) returns normalized SheetConfig\n * @returns Either a normalized SheetConfig (transform mode) or validation results (validate mode)\n */\n\nexport function normalizeSheetConfig(\n  sheetConfig: Flatfile.SheetConfig,\n  options: NormalizeSheetConfigOptions & { output: 'validate' }\n): ValidationResult\nexport function normalizeSheetConfig(\n  sheetConfig: Flatfile.SheetConfig,\n  options?: NormalizeSheetConfigOptions & { output?: 'transform' }\n): Flatfile.SheetConfig\n\nexport function normalizeSheetConfig(\n  sheetConfig: Flatfile.SheetConfig,\n  options: NormalizeSheetConfigOptions = {}\n): Flatfile.SheetConfig | ValidationResult {\n  const { output = 'transform' } = options\n  const usedKeys = new Set<string>()\n  const conflicts: KeyConflict[] = []\n  const normalizedFields = sheetConfig.fields.map((field) => {\n    const originalKey = field.key\n    const normalizedKey = String(normalizeKey(field.key))\n    // truncate the key to 225 characters to give room for uniqueness suffixes\n    // Database indexed keys are limited to 255 characters\n    const truncatedKey = truncate(normalizedKey, MAX_SHEET_FIELD_KEY_LENGTH)\n    let finalKey = truncatedKey\n    let counter = 1\n\n    // Track if this key had conflicts\n    const hadConflict = usedKeys.has(finalKey)\n\n    // If the normalized key is already used, append _1, _2, etc.\n    while (usedKeys.has(finalKey)) {\n      finalKey = `${truncatedKey}_${counter}`\n      counter++\n    }\n\n    usedKeys.add(finalKey)\n\n    // Record conflicts for validation mode\n    if (hadConflict || originalKey !== normalizedKey) {\n      let message = ''\n      if (originalKey !== normalizedKey && hadConflict) {\n        message = `Key \"${originalKey}\" was normalized to \"${normalizedKey}\" but conflicted with existing key, renamed to \"${finalKey}\"`\n      } else if (hadConflict) {\n        message = `Key \"${originalKey}\" conflicted with existing key, renamed to \"${finalKey}\"`\n      } else if (originalKey !== normalizedKey) {\n        message = `Key \"${originalKey}\" was normalized to \"${normalizedKey}\"`\n      }\n\n      if (message) {\n        conflicts.push({\n          originalKey,\n          normalizedKey,\n          finalKey,\n          message,\n        })\n      }\n    }\n\n    return {\n      ...field,\n      key: finalKey,\n    }\n  })\n\n  if (output === 'validate') {\n    return {\n      conflicts,\n      hasConflicts: conflicts.length > 0,\n    }\n  }\n\n  return {\n    ...sheetConfig,\n    fields: normalizedFields,\n  }\n}\n","export const slugify = (str: string) =>\n  str\n    .trim()\n    .replace(/[^\\w\\s-]/g, '')\n    .replace(/[\\s_-]+/g, '-')\n    .replace(/^-+|-+$/g, '')\n","import { Flatfile } from '@flatfile/api'\nimport {\n  createAllRecords,\n  getRecordsRaw,\n  getSheetLength,\n  TickHelper,\n  updateAllRecords,\n} from './all.records'\nimport { asyncLimitSeries } from './async.helpers'\n\nconst PAGE_SIZE = 2000\n\nexport class Simplified {\n  /**\n   * Return all records for a sheet\n   *\n   * @param sheetId\n   * @param options\n   * @param tick\n   */\n  static async getAllRecords(\n    sheetId: string,\n    options: Flatfile.records.GetRecordsRequest = {},\n    tick?: TickHelper\n  ): Promise<SimpleRecord[]> {\n    const recordCount = await getSheetLength(sheetId)\n    const pageSize = options.pageSize || PAGE_SIZE\n    const pageCount = Math.ceil(recordCount / pageSize)\n\n    const recordPages = await asyncLimitSeries(pageCount, async (i: number) => {\n      await tick?.((i + 1) / pageCount, i + 1, pageCount).catch(console.log)\n      const res = await getRecordsRaw(sheetId, {\n        ...options,\n        pageNumber: i + 1,\n        pageSize,\n      })\n      return res.map(Simplified.toSimpleRecord)\n    })\n    return recordPages.flat(1)\n  }\n\n  /**\n   * Return all records for a sheet by iterating until there are empty pages.\n   * This is most useful in scenarios where pages are generally small but you want\n   * to safely handle edge cases. It avoids another count request.\n   *\n   * @param sheetId\n   * @param options\n   */\n  static async getAllRecordsSeries(\n    sheetId: string,\n    options: Flatfile.records.GetRecordsRequest = {}\n  ): Promise<SimpleRecord[]> {\n    const pageSize = options.pageSize || PAGE_SIZE\n\n    const recordPages: SimpleRecord[][] = []\n    let pageNumber = 1\n    while (true) {\n      const res = await getRecordsRaw(sheetId, {\n        ...options,\n        pageSize,\n        pageNumber,\n      })\n\n      recordPages.push(res.map(Simplified.toSimpleRecord))\n      pageNumber += 1\n      if (res.length < pageSize) {\n        break\n      }\n    }\n\n    return recordPages.flat(1)\n  }\n\n  static async findRecordsLimit(\n    sheetId: string,\n    options: Flatfile.records.GetRecordsRequest,\n    limit = 100\n  ) {\n    const records = await getRecordsRaw(sheetId, {\n      ...options,\n      pageSize: limit,\n      pageNumber: 1,\n    })\n    if (Array.isArray(records)) {\n      return records.map(Simplified.toSimpleRecord)\n    }\n    return []\n  }\n\n  /**\n   * { foo: bar } => { foo : {value: bar}}\n   * @param obj\n   */\n  static toRecordValues(obj: SimpleRecord): Flatfile.RecordData {\n    return Object.fromEntries(\n      Object.entries(obj)\n        .filter(([key]) => key !== '_id' && key !== '_metadata')\n        .map(([key, value]) => [key, { value: value as Primitive }])\n    )\n  }\n\n  static toStandardRecord(obj: SimpleRecord) {\n    return {\n      id: obj._id as string,\n      metadata: obj._metadata as any,\n      values: Simplified.toRecordValues(obj),\n    }\n  }\n\n  /**\n   *\n   * @param r\n   */\n  static toSimpleRecord(r: Flatfile.Record_): SimpleRecord {\n    const obj = Object.fromEntries(\n      Object.entries(r.values).map(\n        ([key, value]) => [key, value.value] as [string, any]\n      )\n    )\n    obj._id = r.id\n    obj._metadata = r.metadata\n    return obj as SimpleRecord\n  }\n\n  static updateAllRecords(\n    sheetId: string,\n    records: SimpleRecord[],\n    tick?: TickHelper\n  ): Promise<void> {\n    return updateAllRecords(\n      sheetId,\n      records.map(Simplified.toStandardRecord),\n      tick\n    )\n  }\n\n  static async createAllRecords(\n    sheetId: string,\n    records: SimpleValues[],\n    tick?: TickHelper\n  ): Promise<void> {\n    await createAllRecords(\n      sheetId,\n      records.map(Simplified.toRecordValues),\n      tick\n    )\n  }\n}\n\nexport type Primitive = string | number | null | boolean\n\nexport type SimpleRecord = {\n  _id: string\n  _metadata?: Record<string, any>\n} & SimpleValues\nexport type SimpleValues = { [key: string]: Primitive }\n"]}