{"version":3,"file":"dill-pixel-storage-adapter-supabase.mjs","sources":["../src/version.ts","../src/SupabaseAdapter.ts"],"sourcesContent":["export const version = '6.2.3';\nexport const supabaseVersion = '2.50.2';\nexport const supabasePostgresVersion = '1.19.4';","import type { SupabaseClient } from '@supabase/supabase-js';\nimport { createClient } from '@supabase/supabase-js';\nimport { GenericSchema } from '@supabase/supabase-js/dist/module/lib/types';\nimport { IApplication, IStorageAdapter, Logger, StorageAdapter } from 'dill-pixel';\nimport { supabasePostgresVersion, supabaseVersion, version } from './version';\n\ntype SaveMethod = 'insert' | 'update' | 'upsert';\n\ntype DeleteData = {\n  [key: string]: any;\n};\n\ninterface ISupabaseAdapterOptions {\n  supabaseUrl?: string;\n  anonKey?: string;\n  debug?: boolean;\n}\n\nexport interface ISupabaseAdapter<Database extends GenericSchema = any>\n  extends IStorageAdapter<ISupabaseAdapterOptions, Database> {\n  client: SupabaseClient<Database>;\n\n  initialize(options: Partial<ISupabaseAdapterOptions>, _app: IApplication): void;\n\n  save(tableId: string, data: any, method?: SaveMethod): Promise<any>;\n\n  load<T = any>(tableId: string, selectors?: string[]): Promise<T>;\n\n  delete(tableId: string, data: DeleteData): Promise<any>;\n}\n\n/**\n * A class representing a storage adapter that uses Supabase.\n */\nexport class SupabaseAdapter<Database extends GenericSchema = any>\n  extends StorageAdapter<ISupabaseAdapterOptions, Database>\n  implements ISupabaseAdapter<Database>\n{\n  private _options: ISupabaseAdapterOptions;\n  private _supabase: SupabaseClient<Database>;\n\n  /**\n   * Returns the Supabase client.\n   * @returns {SupabaseClient<Database>} The Supabase client.\n   */\n  get client(): SupabaseClient<Database> {\n    return this._supabase as SupabaseClient<Database>;\n  }\n\n  private hello() {\n    const hello = `%c Dill Pixel Supabase Adapter v${version} | %cSupabase v${supabaseVersion} | %cSupabase Postgres v${supabasePostgresVersion}`;\n    console.log(\n      hello,\n      'background: rgba(31, 41, 55, 1);color: #74b64c',\n      'background: rgba(31, 41, 55, 1);color: #e91e63',\n      'background: rgba(31, 41, 55, 1);color: #e91e63',\n      'background: rgba(31, 41, 55, 1);color: #74b64c',\n      'background: rgba(31, 41, 55, 1);color: #74b64c',\n    );\n\n    if (this._options.debug) {\n      Logger.log(this._options);\n    }\n  }\n\n  /**\n   * Initializes the adapter.\n   * @param {IApplication} _app The application that the adapter belongs to.\n   * @param {ISupabaseAdapterOptions} options The options to initialize the adapter with.\n   * @returns {void}\n   */\n  public initialize(options: Partial<ISupabaseAdapterOptions> = {}, _app: IApplication): void {\n    Logger.log('SupabaseAdapter initialized');\n    const defaultConfig: ISupabaseAdapterOptions = {\n      supabaseUrl: _app.env.VITE_SUPABASE_URL || _app.env.SUPABASE_URL,\n      anonKey: _app.env.VITE_SUPABASE_ANON_KEY || _app.env.SUPABASE_ANON_KEY,\n    };\n    this._options = { ...defaultConfig, ...options };\n\n    this.hello();\n\n    if (!this._options.supabaseUrl) {\n      throw new Error('Supabase URL is not set');\n    }\n    if (!this._options.anonKey) {\n      throw new Error('Supabase anon key is not set');\n    }\n\n    this._supabase = createClient<Database>(this._options.supabaseUrl, this._options.anonKey);\n  }\n\n  /**\n   * Saves data to a specified table in the Supabase database.\n   * @param {string} tableId The table to save the data to.\n   * @param {any} data The data to save.\n   * @param {SaveMethod} method The method to use for saving the data.\n   * @returns {Promise<any>} The saved data.\n   *\n   * @example\n   * await this.app.supabase.save('scores', { username: 'relish', score: 50 })\n   */\n  async save(tableId: string, data: any, method: SaveMethod = 'upsert'): Promise<any> {\n    if (!Array.isArray(data)) {\n      data = [data];\n    }\n    const table = this.client.from(tableId);\n    switch (method) {\n      case 'insert':\n        return await table.insert(data).select();\n      case 'update':\n        return await table.update(data).select();\n      case 'upsert':\n        return await table.upsert(data).select();\n    }\n  }\n\n  /**\n   * Loads data from a specified table in the Supabase database.\n   * @param {string} tableId The table from which to load the data.\n   * @param {string[]} selectors The columns to select. Default is '*'.\n   * @returns {PostgrestFilterBuilder<any, any, any>} PostgrestFilterBuilder // TODO\n   *\n   * @example\n   * await this.app.supabase.load('scores', ['score', 'username']).order('score', { ascending: false }).limit(5)\n   */\n  async load<TExpectedLoadResult = any>(tableId: string, selectors?: string[]): Promise<TExpectedLoadResult> {\n    const query = this.client.from(tableId).select(selectors?.join(','));\n    const { data, error } = await query;\n    if (error) throw error;\n    return data as TExpectedLoadResult;\n  }\n\n  /**\n   * Deletes data from a specified table in the Supabase database.\n   * @param {string} tableId The table from which to load the data.\n   * @param {DeleteData} data The data to delete.\n   * @returns {Promise<any>} The deleted data.\n   *\n   * @example\n   * await this.app.supabase.delete('scores', { username: 'relish', score: 50 })\n   */\n\n  async delete(tableId: string, data: DeleteData): Promise<any> {\n    const column = Object.keys(data)[0];\n    const value = data[column];\n    return await this.client.from(tableId).delete().eq(column, value).select();\n  }\n}\n"],"names":["version","supabaseVersion","supabasePostgresVersion","SupabaseAdapter","StorageAdapter","hello","Logger","options","_app","defaultConfig","createClient","tableId","data","method","table","selectors","query","error","column","value"],"mappings":";;AAAO,MAAMA,IAAU,SACVC,IAAkB,UAClBC,IAA0B;ACgChC,MAAMC,UACHC,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAQE,IAAI,SAAmC;AACrC,WAAO,KAAK;AAAA,EAAA;AAAA,EAGN,QAAQ;AACd,UAAMC,IAAQ,mCAAmCL,CAAO,kBAAkBC,CAAe,2BAA2BC,CAAuB;AAC3I,YAAQ;AAAA,MACNG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,GAGE,KAAK,SAAS,SAChBC,EAAO,IAAI,KAAK,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASK,WAAWC,IAA4C,CAAA,GAAIC,GAA0B;AAC1F,IAAAF,EAAO,IAAI,6BAA6B;AACxC,UAAMG,IAAyC;AAAA,MAC7C,aAAaD,EAAK,IAAI,qBAAqBA,EAAK,IAAI;AAAA,MACpD,SAASA,EAAK,IAAI,0BAA0BA,EAAK,IAAI;AAAA,IAAA;AAMvD,QAJA,KAAK,WAAW,EAAE,GAAGC,GAAe,GAAGF,EAAA,GAEvC,KAAK,MAAA,GAED,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,yBAAyB;AAE3C,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,8BAA8B;AAGhD,SAAK,YAAYG,EAAuB,KAAK,SAAS,aAAa,KAAK,SAAS,OAAO;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa1F,MAAM,KAAKC,GAAiBC,GAAWC,IAAqB,UAAwB;AAClF,IAAK,MAAM,QAAQD,CAAI,MACrBA,IAAO,CAACA,CAAI;AAEd,UAAME,IAAQ,KAAK,OAAO,KAAKH,CAAO;AACtC,YAAQE,GAAA;AAAA,MACN,KAAK;AACH,eAAO,MAAMC,EAAM,OAAOF,CAAI,EAAE,OAAA;AAAA,MAClC,KAAK;AACH,eAAO,MAAME,EAAM,OAAOF,CAAI,EAAE,OAAA;AAAA,MAClC,KAAK;AACH,eAAO,MAAME,EAAM,OAAOF,CAAI,EAAE,OAAA;AAAA,IAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYF,MAAM,KAAgCD,GAAiBI,GAAoD;AACzG,UAAMC,IAAQ,KAAK,OAAO,KAAKL,CAAO,EAAE,OAAOI,KAAA,gBAAAA,EAAW,KAAK,IAAI,GAC7D,EAAE,MAAAH,GAAM,OAAAK,EAAA,IAAU,MAAMD;AAC9B,QAAIC,EAAO,OAAMA;AACjB,WAAOL;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaT,MAAM,OAAOD,GAAiBC,GAAgC;AAC5D,UAAMM,IAAS,OAAO,KAAKN,CAAI,EAAE,CAAC,GAC5BO,IAAQP,EAAKM,CAAM;AACzB,WAAO,MAAM,KAAK,OAAO,KAAKP,CAAO,EAAE,OAAA,EAAS,GAAGO,GAAQC,CAAK,EAAE,OAAA;AAAA,EAAO;AAE7E;"}