1{"version":3,"file":"SQLite.js","sourceRoot":"","sources":["../src/SQLite.ts"],"names":[],"mappings":"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","sourcesContent":["import './polyfillNextTick';\n\nimport customOpenDatabase from '@expo/websql/custom';\nimport { requireNativeModule, EventEmitter } from 'expo-modules-core';\nimport { Platform } from 'react-native';\n\nimport type {\n  Query,\n  ResultSet,\n  ResultSetError,\n  SQLiteCallback,\n  SQLTransactionAsyncCallback,\n  SQLTransactionAsync,\n  SQLTransactionCallback,\n  SQLTransactionErrorCallback,\n} from './SQLite.types';\n\nconst ExpoSQLite = requireNativeModule('ExpoSQLite');\nconst emitter = new EventEmitter(ExpoSQLite);\n\nfunction zipObject(keys: string[], values: any[]) {\n  const result = {};\n  for (let i = 0; i < keys.length; i++) {\n    result[keys[i]] = values[i];\n  }\n  return result;\n}\n\n/** The database returned by `openDatabase()` */\nexport class SQLiteDatabase {\n  _name: string;\n  _closed: boolean = false;\n\n  constructor(name: string) {\n    this._name = name;\n  }\n\n  /**\n   * Executes the SQL statement and returns a callback resolving with the result.\n   */\n  exec(queries: Query[], readOnly: boolean, callback: SQLiteCallback): void {\n    if (this._closed) {\n      throw new Error(`The SQLite database is closed`);\n    }\n\n    ExpoSQLite.exec(this._name, queries.map(_serializeQuery), readOnly).then(\n      (nativeResultSets) => {\n        callback(null, nativeResultSets.map(_deserializeResultSet));\n      },\n      (error) => {\n        // TODO: make the native API consistently reject with an error, not a string or other type\n        callback(error instanceof Error ? error : new Error(error));\n      }\n    );\n  }\n\n  /**\n   * Executes the SQL statement and returns a Promise resolving with the result.\n   */\n  async execAsync(queries: Query[], readOnly: boolean): Promise<(ResultSetError | ResultSet)[]> {\n    if (this._closed) {\n      throw new Error(`The SQLite database is closed`);\n    }\n\n    const nativeResultSets = await ExpoSQLite.exec(\n      this._name,\n      queries.map(_serializeQuery),\n      readOnly\n    );\n    return nativeResultSets.map(_deserializeResultSet);\n  }\n\n  /**\n   * @deprecated Use `closeAsync()` instead.\n   */\n  close = this.closeAsync;\n\n  /**\n   * Close the database.\n   */\n  closeAsync(): Promise<void> {\n    this._closed = true;\n    return ExpoSQLite.close(this._name);\n  }\n\n  /**\n   * Synchronously closes the database.\n   */\n  closeSync(): void {\n    this._closed = true;\n    return ExpoSQLite.closeSync(this._name);\n  }\n\n  /**\n   * Delete the database file.\n   * > The database has to be closed prior to deletion.\n   */\n  deleteAsync(): Promise<void> {\n    if (!this._closed) {\n      throw new Error(\n        `Unable to delete '${this._name}' database that is currently open. Close it prior to deletion.`\n      );\n    }\n\n    return ExpoSQLite.deleteAsync(this._name);\n  }\n\n  onDatabaseChange(cb: (result: { tableName: string; rowId: number }) => void) {\n    return emitter.addListener('onDatabaseChange', cb);\n  }\n\n  /**\n   * Creates a new transaction with Promise support.\n   * @param asyncCallback A `SQLTransactionAsyncCallback` function that can perform SQL statements in a transaction.\n   * @param readOnly true if all the SQL statements in the callback are read only.\n   */\n  async transactionAsync(\n    asyncCallback: SQLTransactionAsyncCallback,\n    readOnly: boolean = false\n  ): Promise<void> {\n    await this.execAsync([{ sql: 'BEGIN;', args: [] }], false);\n    try {\n      const transaction = new ExpoSQLTransactionAsync(this, readOnly);\n      await asyncCallback(transaction);\n      await this.execAsync([{ sql: 'END;', args: [] }], false);\n    } catch (e: unknown) {\n      await this.execAsync([{ sql: 'ROLLBACK;', args: [] }], false);\n      throw e;\n    }\n  }\n\n  // @ts-expect-error: properties that are added from websql\n  version: string;\n\n  /**\n   * Execute a database transaction.\n   * @param callback A function representing the transaction to perform. Takes a Transaction\n   * (see below) as its only parameter, on which it can add SQL statements to execute.\n   * @param errorCallback Called if an error occurred processing this transaction. Takes a single\n   * parameter describing the error.\n   * @param successCallback Called when the transaction has completed executing on the database.\n   */\n  // @ts-expect-error: properties that are added from websql\n  transaction(\n    callback: SQLTransactionCallback,\n    errorCallback?: SQLTransactionErrorCallback,\n    successCallback?: () => void\n  ): void;\n\n  // @ts-expect-error: properties that are added from websql\n  readTransaction(\n    callback: SQLTransactionCallback,\n    errorCallback?: SQLTransactionErrorCallback,\n    successCallback?: () => void\n  ): void;\n}\n\nfunction _serializeQuery(query: Query): Query | [string, any[]] {\n  return Platform.OS === 'android'\n    ? {\n        sql: query.sql,\n        args: query.args.map(_escapeBlob),\n      }\n    : [query.sql, query.args];\n}\n\nfunction _deserializeResultSet(nativeResult): ResultSet | ResultSetError {\n  const [errorMessage, insertId, rowsAffected, columns, rows] = nativeResult;\n  // TODO: send more structured error information from the native module so we can better construct\n  // a SQLException object\n  if (errorMessage !== null) {\n    return { error: new Error(errorMessage) } as ResultSetError;\n  }\n\n  return {\n    insertId,\n    rowsAffected,\n    rows: rows.map((row) => zipObject(columns, row)),\n  };\n}\n\nfunction _escapeBlob<T>(data: T): T {\n  if (typeof data === 'string') {\n    /* eslint-disable no-control-regex */\n    return data\n      .replace(/\\u0002/g, '\\u0002\\u0002')\n      .replace(/\\u0001/g, '\\u0001\\u0002')\n      .replace(/\\u0000/g, '\\u0001\\u0001') as any;\n    /* eslint-enable no-control-regex */\n  } else {\n    return data;\n  }\n}\n\nconst _openExpoSQLiteDatabase = customOpenDatabase(SQLiteDatabase);\n\n// @needsAudit @docsMissing\n/**\n * Open a database, creating it if it doesn't exist, and return a `Database` object. On disk,\n * the database will be created under the app's [documents directory](./filesystem), i.e.\n * `${FileSystem.documentDirectory}/SQLite/${name}`.\n * > The `version`, `description` and `size` arguments are ignored, but are accepted by the function\n * for compatibility with the WebSQL specification.\n * @param name Name of the database file to open.\n * @param version\n * @param description\n * @param size\n * @param callback\n * @return\n */\nexport function openDatabase(\n  name: string,\n  version: string = '1.0',\n  description: string = name,\n  size: number = 1,\n  callback?: (db: SQLiteDatabase) => void\n): SQLiteDatabase {\n  if (name === undefined) {\n    throw new TypeError(`The database name must not be undefined`);\n  }\n  const db = _openExpoSQLiteDatabase(name, version, description, size, callback);\n  db.exec = db._db.exec.bind(db._db);\n  db.execAsync = db._db.execAsync.bind(db._db);\n  db.closeAsync = db._db.closeAsync.bind(db._db);\n  db.closeSync = db._db.closeSync.bind(db._db);\n  db.onDatabaseChange = db._db.onDatabaseChange.bind(db._db);\n  db.deleteAsync = db._db.deleteAsync.bind(db._db);\n  db.transactionAsync = db._db.transactionAsync.bind(db._db);\n  return db;\n}\n\n/**\n * Internal data structure for the async transaction API.\n * @internal\n */\nexport class ExpoSQLTransactionAsync implements SQLTransactionAsync {\n  constructor(private readonly db: SQLiteDatabase, private readonly readOnly: boolean) {}\n\n  async executeSqlAsync(\n    sqlStatement: string,\n    args?: (number | string)[]\n  ): Promise<ResultSetError | ResultSet> {\n    const resultSets = await this.db.execAsync(\n      [{ sql: sqlStatement, args: args ?? [] }],\n      this.readOnly\n    );\n    return resultSets[0];\n  }\n}\n"]}