{"version":3,"file":"BaseCrudApi.cjs","names":[],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import qs from 'qs'\nimport type { ApiClient } from './ApiClient'\nimport type { CrudApi, GetByIdQuery, ListQuery, Paginated } from './types'\nexport type {\n  WhereClause,\n  IncludeItem,\n  ListQuery,\n  GetByIdQuery,\n  Paginated,\n  HasGetMany,\n  HasGetById,\n  HasCreate,\n  HasUpdateById,\n  HasDeleteById,\n  CrudApi,\n} from './types'\n\nexport class BaseCrudApi<\n  TResponse,\n  TCreate,\n  TUpdate = TCreate,\n  TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n> implements CrudApi<TResponse, TCreate, TUpdate, TQuery> {\n  public readonly client: ApiClient\n  public readonly basePath: string\n\n  constructor(client: ApiClient, basePath: string) {\n    this.client = client\n    this.basePath = basePath.replace(/\\/$/, '')\n    this.getMany = this.getMany.bind(this)\n    this.getOne = this.getOne.bind(this)\n    this.getById = this.getById.bind(this)\n    this.create = this.create.bind(this)\n    this.updateById = this.updateById.bind(this)\n    this.deleteById = this.deleteById.bind(this)\n  }\n\n  getMany(\n    query: TQuery & { paginate: false },\n    headers?: Record<string, string>,\n  ): Promise<TResponse[]>\n  getMany(\n    query?: TQuery & { paginate?: true },\n    headers?: Record<string, string>,\n  ): Promise<Paginated<TResponse>>\n  getMany(\n    query?: TQuery,\n    headers?: Record<string, string>,\n  ): Promise<Paginated<TResponse> | TResponse[]> {\n    const queryString = query ? `?${qs.stringify(query)}` : ''\n    return this.client.get<Paginated<TResponse> | TResponse[]>(\n      `${this.basePath}${queryString}`,\n      headers,\n    )\n  }\n\n  /**\n   * Returns the first resource matching the query, or `null` when none match.\n   * Convenience over `getMany` with `limit: 1`.\n   * @permissions $resourceName.view\n   */\n  async getOne(query?: TQuery, headers?: Record<string, string>): Promise<TResponse | null> {\n    const results = await this.getMany(\n      { ...query, limit: 1, paginate: false } as TQuery & { paginate: false },\n      headers,\n    )\n    return results[0] ?? null\n  }\n\n  /**\n   * Returns a single resource by ID.\n   * @permissions $resourceName.view\n   */\n  getById(\n    id: string,\n    query?: GetByIdQuery<TResponse>,\n    headers?: Record<string, string>,\n  ): Promise<TResponse> {\n    const queryString = query ? `?${qs.stringify(query)}` : ''\n    return this.client.get<TResponse>(`${this.basePath}/${id}${queryString}`, headers)\n  }\n\n  /**\n   * Creates a new resource.\n   * @permissions $resourceName.create\n   */\n  create(body: TCreate, headers?: Record<string, string>): Promise<TResponse> {\n    return this.client.post<TResponse, TCreate>(this.basePath, body, headers)\n  }\n\n  /**\n   * Updates an existing resource by ID.\n   * @permissions $resourceName.update\n   */\n  updateById(id: string, body: TUpdate, headers?: Record<string, string>): Promise<TResponse> {\n    return this.client.put<TResponse, TUpdate>(`${this.basePath}/${id}`, body, headers)\n  }\n\n  /**\n   * Deletes a resource by ID.\n   * @permissions $resourceName.delete\n   */\n  deleteById(id: string, headers?: Record<string, string>): Promise<TResponse> {\n    return this.client.delete<TResponse>(`${this.basePath}/${id}`, headers)\n  }\n}\n"],"mappings":";;;;;;AAiBA,IAAa,cAAb,MAK0D;CACxD,AAAgB;CAChB,AAAgB;CAEhB,YAAY,QAAmB,UAAkB;AAC/C,OAAK,SAAS;AACd,OAAK,WAAW,SAAS,QAAQ,OAAO,GAAG;AAC3C,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;AAC5C,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;;CAW9C,QACE,OACA,SAC6C;EAC7C,MAAM,cAAc,QAAQ,IAAI,WAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,WAAW,eACnB,QACD;;;;;;;CAQH,MAAM,OAAO,OAAgB,SAA6D;AAKxF,UAJgB,MAAM,KAAK,QACzB;GAAE,GAAG;GAAO,OAAO;GAAG,UAAU;GAAO,EACvC,QACD,EACc,MAAM;;;;;;CAOvB,QACE,IACA,OACA,SACoB;EACpB,MAAM,cAAc,QAAQ,IAAI,WAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IAAe,GAAG,KAAK,SAAS,GAAG,KAAK,eAAe,QAAQ;;;;;;CAOpF,OAAO,MAAe,SAAsD;AAC1E,SAAO,KAAK,OAAO,KAAyB,KAAK,UAAU,MAAM,QAAQ;;;;;;CAO3E,WAAW,IAAY,MAAe,SAAsD;AAC1F,SAAO,KAAK,OAAO,IAAwB,GAAG,KAAK,SAAS,GAAG,MAAM,MAAM,QAAQ;;;;;;CAOrF,WAAW,IAAY,SAAsD;AAC3E,SAAO,KAAK,OAAO,OAAkB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}