ng-qubee 2.0.3 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +8 -0
  2. package/fesm2022/ng-qubee.mjs +257 -66
  3. package/fesm2022/ng-qubee.mjs.map +1 -1
  4. package/lib/errors/invalid-limit.error.d.ts +3 -0
  5. package/lib/errors/invalid-model-name.error.d.ts +3 -0
  6. package/lib/errors/invalid-page-number.error.d.ts +3 -0
  7. package/lib/services/nest.service.d.ts +113 -12
  8. package/package.json +27 -5
  9. package/public-api.d.ts +5 -0
  10. package/esm2022/lib/enums/sort.enum.mjs +0 -6
  11. package/esm2022/lib/errors/key-not-found.error.mjs +0 -6
  12. package/esm2022/lib/errors/unselectable-model.error.mjs +0 -6
  13. package/esm2022/lib/interfaces/config.interface.mjs +0 -2
  14. package/esm2022/lib/interfaces/fields.interface.mjs +0 -2
  15. package/esm2022/lib/interfaces/filters.interface.mjs +0 -2
  16. package/esm2022/lib/interfaces/normalized.interface.mjs +0 -2
  17. package/esm2022/lib/interfaces/paginated-object.interface.mjs +0 -2
  18. package/esm2022/lib/interfaces/pagination-config.interface.mjs +0 -2
  19. package/esm2022/lib/interfaces/query-builder-config.interface.mjs +0 -2
  20. package/esm2022/lib/interfaces/query-builder-state.interface.mjs +0 -2
  21. package/esm2022/lib/interfaces/sort.interface.mjs +0 -2
  22. package/esm2022/lib/models/paginated-collection.mjs +0 -47
  23. package/esm2022/lib/models/query-builder-options.mjs +0 -12
  24. package/esm2022/lib/models/response-options.mjs +0 -17
  25. package/esm2022/lib/ng-qubee.module.mjs +0 -42
  26. package/esm2022/lib/provide-ngqubee.mjs +0 -39
  27. package/esm2022/lib/services/nest.service.mjs +0 -173
  28. package/esm2022/lib/services/ng-qubee.service.mjs +0 -319
  29. package/esm2022/lib/services/pagination.service.mjs +0 -23
  30. package/esm2022/ng-qubee.mjs +0 -5
  31. package/esm2022/public-api.mjs +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"ng-qubee.mjs","sources":["../../../projects/ng-qubee/src/lib/errors/key-not-found.error.ts","../../../projects/ng-qubee/src/lib/models/paginated-collection.ts","../../../projects/ng-qubee/src/lib/enums/sort.enum.ts","../../../projects/ng-qubee/src/lib/errors/unselectable-model.error.ts","../../../projects/ng-qubee/src/lib/models/query-builder-options.ts","../../../projects/ng-qubee/src/lib/services/nest.service.ts","../../../projects/ng-qubee/src/lib/services/ng-qubee.service.ts","../../../projects/ng-qubee/src/lib/models/response-options.ts","../../../projects/ng-qubee/src/lib/services/pagination.service.ts","../../../projects/ng-qubee/src/lib/ng-qubee.module.ts","../../../projects/ng-qubee/src/lib/provide-ngqubee.ts","../../../projects/ng-qubee/src/public-api.ts","../../../projects/ng-qubee/src/ng-qubee.ts"],"sourcesContent":["export class KeyNotFoundError extends Error {\n constructor(key: string) {\n super(`Cannot find the key ${key} inside the collection item: does it really exists?`);\n }\n}","import { KeyNotFoundError } from \"../errors/key-not-found.error\";\nimport { INormalized } from \"../interfaces/normalized.interface\";\nimport { IPaginatedObject } from \"../interfaces/paginated-object.interface\";\n\nexport class PaginatedCollection<T extends IPaginatedObject> {\n constructor(\n public data: T[],\n public readonly page: number,\n public readonly from?: number,\n public readonly to?: number,\n public readonly total?: number,\n public readonly perPage?: number,\n public readonly prevPageUrl?: string,\n public readonly nextPageUrl?: string,\n public readonly lastPage?: number,\n public readonly firstPageUrl?: string,\n public readonly lastPageUrl?: string\n ) {\n //\n }\n\n /**\n * Normalize the collection to a paginated list of ids for state-managed applications.\n * \n * This method returns a single key object, where the key is the page number and the associated value is\n * an array of ids. Each id is fetched by the collection items, looking up for the \"id\" key. If an id is supplied\n * to this method, it will be used instead of the default \"id\" key.\n * \n * Please note that in case the key doesn't exist in the collection's item, a KeyNotFoundError is thrown\n * \n * @param k A key to use instead of the default \"id\": this will be searched inside each element of the collection\n * @returns []\n * @throws KeyNotFoundItem\n */\n public normalize(id?: string): INormalized {\n return {\n [this.page]: this.data.reduce((ids: number[], value: T) => {\n if (id && id in value) {\n ids.push(value[id]);\n } else if (value.hasOwnProperty('id')) {\n ids.push(value['id']);\n } else {\n throw new KeyNotFoundError(id || 'id');\n }\n\n return ids;\n }, [])\n }\n }\n}","export enum SortEnum {\n ASC = 'asc',\n DESC = 'desc'\n}","export class UnselectableModelError extends Error {\n constructor(model: string) {\n super(`Unselectable Model: the selected model (${model}) is not present neither in the \"model\" property, nor in the includes object.`);\n }\n}","import { IQueryBuilderConfig } from '../interfaces/query-builder-config.interface';\n\nexport class QueryBuilderOptions {\n public readonly appends: string;\n public readonly fields: string;\n public readonly filters: string;\n public readonly includes: string;\n public readonly limit: string;\n public readonly page: string;\n public readonly sort: string;\n\n constructor(options: IQueryBuilderConfig) {\n this.appends = options.appends || 'append';\n this.fields = options.fields || 'fields';\n this.filters = options.filters || 'filter';\n this.includes = options.includes || 'include';\n this.limit = options.limit || 'limit';\n this.page = options.page || 'page';\n this.sort = options.sort || 'sort';\n }\n}","import { Injectable, Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { IQueryBuilderState } from '../interfaces/query-builder-state.interface';\nimport { IFields } from '../interfaces/fields.interface';\nimport { IFilters } from '../interfaces/filters.interface';\nimport { ISort } from '../interfaces/sort.interface';\n\nconst INITIAL_STATE: IQueryBuilderState = {\n baseUrl: '',\n fields: {},\n filters: {},\n includes: [],\n limit: 15,\n model: '',\n page: 1,\n sorts: []\n};\n\n@Injectable()\nexport class NestService {\n\n /**\n * Private writable signal that holds the Query Builder state\n * \n * @type {IQueryBuilderState}\n */\n private _nest: WritableSignal<IQueryBuilderState> = signal(this._clone(INITIAL_STATE));\n\n /**\n * A computed signal that makes readonly the writable signal _nest\n * \n * @type {Signal<IQueryBuilderState>}\n */\n public nest: Signal<IQueryBuilderState> = computed(() => this._clone(this._nest()));\n\n constructor() {\n // Nothing to see here 👮🏻‍♀️\n }\n\n set baseUrl(baseUrl: string) {\n this._nest.update(nest => ({\n ...nest,\n baseUrl\n }));\n }\n\n set limit(limit: number) {\n this._nest.update(nest => ({\n ...nest,\n limit\n }));\n }\n\n set model(model: string) {\n this._nest.update(nest => ({\n ...nest,\n model\n }));\n }\n\n set page(page: number) {\n this._nest.update(nest => ({\n ...nest,\n page\n }));\n }\n\n private _clone<T>(obj: T): T {\n return JSON.parse( JSON.stringify(obj) );\n }\n\n /**\n * Add selectable fields for the given model to the request\n * \n * @param {IFields} fields \n * @return {void}\n * @todo Avoid duplicated fields\n */\n public addFields(fields: IFields): void {\n this._nest.update(nest => ({\n ...nest,\n fields: { ...nest.fields, ...fields }\n }));\n }\n\n /**\n * Add filters to the request\n * \n * @param {IFilters} filters\n * @todo Avoid duplicated filters\n */\n public addFilters(filters: IFilters): void {\n this._nest.update(nest => ({\n ...nest,\n filters: { ...nest.filters, ...filters }\n }));\n }\n\n /**\n * Add resources to include with the request\n * \n * @param {string[]} includes models to include to the request\n * @return {void}\n * @todo Avoid duplicated includes\n */\n public addIncludes(includes: string[]): void {\n this._nest.update(nest => ({\n ...nest,\n includes: [...nest.includes, ...includes]\n }))\n }\n\n /**\n * Add a field that should be used for sorting data\n * \n * @param {ISort} sort\n * @return {void}\n */\n public addSort(sort: ISort): void {\n this._nest.update(nest => ({\n ...nest,\n sorts: [...nest.sorts, sort]\n }));\n }\n\n /**\n * Remove fields for the given model\n * \n * @param {IFields} fields \n */\n public deleteFields(fields: IFields): void {\n const f = Object.assign({}, this.nest().fields);\n\n Object.keys(fields).forEach(k => {\n if (!(k in f)) {\n return;\n }\n\n f[k] = this._nest().fields[k].filter(v => !fields[k].includes(v));\n });\n\n this._nest.update(nest => ({\n ...nest,\n fields: f\n }));\n }\n\n /**\n * \n * @param filters \n * @todo Create a clone of the filter obj before assigning to f\n */\n public deleteFilters(...filters: string[]): void {\n const f = Object.assign({}, this._nest().filters);\n \n filters.forEach(k => delete f[k]);\n\n this._nest.update(nest => ({\n ...nest,\n filters: f\n }));\n }\n\n /**\n * \n * @param includes \n */\n public deleteIncludes(...includes: string[]): void {\n this._nest.update(nest => ({\n ...nest,\n includes: nest.includes.filter(v => !includes.includes(v))\n }));\n }\n\n /**\n * \n * @param sorts \n */\n public deleteSorts(...sorts: string[]): void {\n const s = [...this._nest().sorts];\n \n sorts.forEach(field => {\n const p = this.nest().sorts.findIndex(sort => sort.field === field);\n\n if (p > -1) {\n s.splice(p, 1);\n }\n });\n \n this._nest.update(nest => ({\n ...nest,\n sorts: s\n }));\n }\n\n public reset(): void {\n this._nest.update(_ => this._clone(INITIAL_STATE));\n }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport * as qs from 'qs';\nimport { BehaviorSubject, Observable, filter } from 'rxjs';\n\n// Enums\nimport { SortEnum } from '../enums/sort.enum';\n\n// Errors\nimport { UnselectableModelError } from '../errors/unselectable-model.error';\n\n// Interfaces\nimport { IFields } from '../interfaces/fields.interface';\nimport { IQueryBuilderConfig } from '../interfaces/query-builder-config.interface';\nimport { IQueryBuilderState } from '../interfaces/query-builder-state.interface';\n\n// Models\nimport { QueryBuilderOptions } from '../models/query-builder-options';\n\n// Services\nimport { NestService } from './nest.service';\n\n@Injectable()\nexport class NgQubeeService {\n\n private _options: QueryBuilderOptions;\n\n /**\n * This property serves as an accumulator for holding the composed string with each query param\n */\n private _uri = '';\n\n private _uri$: BehaviorSubject<string> = new BehaviorSubject('');\n\n public uri$: Observable<string> = this._uri$.asObservable().pipe(\n filter(uri => !!uri)\n );\n\n constructor(private _nestService: NestService, @Inject('QUERY_PARAMS_CONFIG') @Optional() options: IQueryBuilderConfig = {}) {\n this._options = new QueryBuilderOptions(options);\n }\n\n private _parseFields(s: IQueryBuilderState): string {\n if (!Object.keys(s.fields).length) {\n return this._uri;\n }\n\n if (!s.model) {\n throw new Error('While selecting fields, the -> model <- is required');\n }\n\n if (!(s.model in s.fields)) {\n throw new Error(`Key ${s.model} is missing in the fields object`);\n }\n\n const f = {};\n\n for (const k in s.fields) {\n if (s.fields.hasOwnProperty(k)) {\n // Check if the key is the model or is declared in \"includes\".\n // If not, it means that has not been selected anywhere and that will cause an error on the API\n if (k !== s.model && !s.includes.includes(k)) {\n throw new UnselectableModelError(k);\n }\n\n Object.assign(f, { [`${this._options.fields}[${k}]`]: s.fields[k].join(',') });\n }\n }\n\n const param = `${this._prepend(s.model)}${qs.stringify(f, { encode: false })}`;\n this._uri += param;\n\n return param;\n }\n\n private _parseFilters(s: IQueryBuilderState): string {\n const keys = Object.keys(s.filters);\n\n if (!keys.length) {\n return this._uri;\n }\n\n const f = {\n [`${this._options.filters}`]: keys.reduce((acc, key) => {\n return Object.assign(acc, { [key]: s.filters[key].join(',') });\n }, {})\n };\n const param = `${this._prepend(s.model)}${qs.stringify(f, { encode: false })}`;\n\n this._uri += param;\n\n return param;\n }\n\n private _parseIncludes(s: IQueryBuilderState): string {\n if (!s.includes.length) {\n return this._uri;\n }\n\n const param = `${this._prepend(s.model)}${this._options.includes}=${s.includes}`;\n this._uri += param;\n\n return param;\n }\n\n private _parseLimit(s: IQueryBuilderState): string {\n const param = `${this._prepend(s.model)}${this._options.limit}=${s.limit}`;\n this._uri += param;\n\n return param;\n }\n\n private _parsePage(s: IQueryBuilderState): string {\n const param = `${this._prepend(s.model)}${this._options.page}=${s.page}`;\n this._uri += param;\n\n return param;\n }\n\n private _parseSort(s: IQueryBuilderState): string {\n let param: string = '';\n\n if (!s.sorts.length) {\n return param;\n }\n\n param = `${this._prepend(s.model)}${this._options.sort}=`;\n\n s.sorts.forEach((sort, idx) => {\n param += `${sort.order === SortEnum.DESC ? '-' : ''}${sort.field}`;\n\n if (idx < s.sorts.length - 1) {\n param += ','\n }\n });\n\n this._uri += param;\n\n return param;\n }\n\n private _parse(s: IQueryBuilderState): string {\n if (!s.model) {\n throw new Error('Set the model property BEFORE adding filters or calling the url() / get() methods');\n }\n\n // Cleanup the previously generated URI\n this._uri = '';\n\n this._parseIncludes(s);\n this._parseFields(s);\n this._parseFilters(s);\n this._parseLimit(s);\n this._parsePage(s);\n this._parseSort(s);\n\n return this._uri;\n }\n\n private _prepend(model: string): string {\n return this._uri ? '&' : `/${model}?`;\n }\n\n // private _removeArgIfEmpty(arg: string): string {\n // const params = new URL(this._uri).searchParams;\n \n // if (!params.get(arg)) {\n // params.delete(arg);\n // }\n \n\n // }\n\n /**\n * Add fields to the select statement for the given model\n * \n * @param model Model that holds the fields\n * @param fields Fields to select\n * @returns {this}\n */\n public addFields(model: string, fields: string[]): this {\n if (!fields.length) {\n return this;\n }\n\n this._nestService.addFields({ [model]: fields });\n\n return this;\n }\n\n /**\n * Add a filter with the given value(s)\n * I.e. filter[field]=1 or filter[field]=1,2,3\n * \n * @param {string} field Name of the field to filter\n * @param {string[]} value The needle(s)\n * @returns {this}\n */\n public addFilter(field: string, ...values: (string | number | boolean)[]): this {\n if (!values.length) {\n return this;\n }\n\n this._nestService.addFilters({\n [field]: values\n });\n\n return this;\n }\n\n /**\n * Add related entities to include in the request\n * \n * @param {string[]} models \n * @returns \n */\n public addIncludes(...models: string[]): this {\n if (!models.length) {\n return this;\n }\n\n this._nestService.addIncludes(models);\n\n return this;\n }\n\n /**\n * Add a field with a sort criteria\n * \n * @param field Field to use for sorting\n * @param {SortEnum} order A value from the SortEnum enumeration\n * @returns {this}\n */\n public addSort(field: string, order: SortEnum): this {\n this._nestService.addSort({\n field,\n order\n });\n\n return this;\n }\n\n /**\n * Delete selected fields for the given models in the current query builder state\n * \n * ```\n * ngQubeeService.deleteFields({\n * users: ['email', 'password'],\n * address: ['zipcode']\n * });\n * ```\n * \n * @param {IFields} fields \n * @returns \n */\n public deleteFields(fields: IFields): this {\n this._nestService.deleteFields(fields);\n return this;\n }\n\n /**\n * Delete selected fields for the given model in the current query builder state\n * \n * ```\n * ngQubeeService.deleteFieldsByModel('users', 'email', 'password']);\n * ```\n * \n * @param model Model that holds the fields\n * @param {string[]} fields Fields to delete from the state\n * @returns {this}\n */\n public deleteFieldsByModel(model: string, ...fields: string[]): this {\n if (!fields.length) {\n return this;\n }\n\n this._nestService.deleteFields({\n [model]: fields\n });\n\n return this;\n }\n\n /**\n * Remove given filters from the query builder state\n * \n * @param {string[]} filters Filters to remove\n * @returns {this}\n */\n public deleteFilters(...filters: string[]): this {\n if (!filters.length) {\n return this;\n }\n\n this._nestService.deleteFilters(...filters);\n\n return this;\n }\n\n /**\n * Remove selected related models from the query builder state\n * \n * @param {string[]} includes Models to remove\n * @returns \n */\n public deleteIncludes(...includes: string[]): this {\n if (!includes.length) {\n return this;\n }\n\n this._nestService.deleteIncludes(...includes);\n\n return this;\n }\n\n /**\n * Remove sorts rules from the query builder state\n * \n * @param sorts Fields used for sorting to remove\n * @returns {this}\n */\n public deleteSorts(...sorts: string[]): this {\n this._nestService.deleteSorts(...sorts);\n return this;\n }\n\n /**\n * Generate an URI accordingly to the given data\n *\n * @returns {Observable<string>} An observable that emits the generated uri\n */\n public generateUri(): Observable<string> {\n this._uri$.next(this._parse(this._nestService.nest()));\n return this.uri$;\n }\n\n /**\n * Clear the current state and reset the Query Builder to a fresh, clean condition\n * \n * @returns {this}\n */\n public reset(): this {\n this._nestService.reset();\n return this;\n }\n\n /**\n * Set the base url to use for composing the address\n * \n * @param {string} baseUrl \n * @returns {this}\n */\n public setBaseUrl(baseUrl: string): this {\n this._nestService.baseUrl = baseUrl;\n return this;\n }\n\n /**\n * Set the items per page number\n * \n * @param limit \n * @returns {this}\n */\n public setLimit(limit: number): this {\n this._nestService.limit = limit;\n return this;\n }\n\n /**\n * Set the model to use for running the query against\n * - I.e. the model \"users\" will return /users\n * \n * @param {string} model Model name\n * @returns {this}\n */\n public setModel(model: string): this {\n this._nestService.model = model;\n return this;\n }\n\n /**\n * Set the page that the backend will use to paginate the result set\n * \n * @param page Page param\n * @returns {this}\n */\n public setPage(page: number): this {\n this._nestService.page = page;\n return this;\n }\n}\n","import { IPaginationConfig } from '../interfaces/pagination-config.interface';\nimport { IQueryBuilderConfig } from '../interfaces/query-builder-config.interface';\n\nexport class ResponseOptions {\n public readonly currentPage: string;\n public readonly data: string;\n public readonly firstPageUrl: string;\n public readonly from: string;\n public readonly lastPage: string;\n public readonly lastPageUrl: string;\n public readonly nextPageUrl: string;\n public readonly path: string;\n public readonly perPage: string;\n public readonly prevPageUrl: string;\n public readonly to: string;\n public readonly total: string;\n\n constructor(options: IPaginationConfig) {\n this.currentPage = options.currentPage || 'current_page';\n this.data = options.data || 'data';\n this.firstPageUrl = options.firstPageUrl || 'first_page_url';\n this.from = options.from || 'from';\n this.lastPage = options.lastPage || 'last_page';\n this.lastPageUrl = options.lastPageUrl || 'last_page_url';\n this.nextPageUrl = options.nextPageUrl || 'next_page_url';\n this.path = options.path || 'path';\n this.perPage = options.perPage || 'per_page';\n this.prevPageUrl = options.prevPageUrl || 'prev_page_url';\n this.to = options.to || 'to';\n this.total = options.total || 'total';\n }\n}","import { Inject, Injectable, Optional } from \"@angular/core\";\nimport { IPaginationConfig } from \"../interfaces/pagination-config.interface\";\nimport { PaginatedCollection } from \"../models/paginated-collection\";\nimport { ResponseOptions } from \"../models/response-options\";\nimport { IPaginatedObject } from \"../interfaces/paginated-object.interface\";\n\n@Injectable()\nexport class PaginationService {\n private _options: ResponseOptions;\n \n constructor(@Inject('RESPONSE_OPTIONS') @Optional() options: IPaginationConfig = {}) {\n this._options = new ResponseOptions(options);\n }\n\n public paginate<T extends IPaginatedObject>(response: {[key: string]: any}): PaginatedCollection<T> {\n return new PaginatedCollection(\n response[this._options.data],\n response[this._options.currentPage],\n response[this._options.from],\n response[this._options.to],\n response[this._options.total],\n response[this._options.perPage],\n response[this._options.prevPageUrl],\n response[this._options.nextPageUrl],\n response[this._options.lastPage],\n response[this._options.firstPageUrl],\n response[this._options.lastPageUrl]\n );\n }\n}","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { NgQubeeService } from './services/ng-qubee.service';\nimport { IConfig } from './interfaces/config.interface';\nimport { PaginationService } from './services/pagination.service';\nimport { NestService } from './services/nest.service';\n\n// @dynamic\n@NgModule({\n providers: [{\n deps: [NestService],\n provide: NgQubeeService,\n useFactory: (nestService: NestService) => new NgQubeeService(nestService, {})\n }]\n})\nexport class NgQubeeModule {\n public static forRoot(config: IConfig = {}): ModuleWithProviders<NgQubeeModule> {\n return {\n ngModule: NgQubeeModule,\n providers: [\n NestService,\n {\n deps: [NestService],\n provide: NgQubeeService,\n useFactory: (nestService: NestService) =>\n new NgQubeeService(nestService, Object.assign({}, config.request))\n }, {\n provide: PaginationService,\n useFactory: () =>\n new PaginationService(Object.assign({}, config.response))\n }\n ]\n };\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\nimport { IConfig } from \"./interfaces/config.interface\";\nimport { NgQubeeService } from \"./services/ng-qubee.service\";\nimport { PaginationService } from \"./services/pagination.service\";\nimport { NestService } from \"./services/nest.service\";\n\n/**\n * Sets up providers necessary to enable `NgQubee` functionality for the application.\n *\n * @usageNotes\n *\n * Basic example of how you can add NgQubee to your application:\n * ```\n * const config = {};\n * \n * bootstrapApplication(AppComponent, {\n * providers: [provideNgQubee(config)]\n * });\n * ```\n *\n * @publicApi\n * @param config Configuration object compliant to the IConfig interface\n * @returns A set of providers to setup NgQubee\n */\nexport function provideNgQubee(config: IConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NestService,\n useClass: NestService\n },\n {\n deps: [NestService],\n provide: NgQubeeService,\n useFactory: (nestService: NestService) => new NgQubeeService(nestService, Object.assign({}, config.request))\n }, {\n provide: PaginationService,\n useFactory: () => new PaginationService(Object.assign({}, config.response))\n }\n ]);\n}","/*\n * Public API Surface of angular-query-builder\n */\n\nexport * from './lib/models/paginated-collection';\nexport * from './lib/ng-qubee.module';\nexport * from './lib/provide-ngqubee';\nexport * from './lib/services/ng-qubee.service';\nexport * from './lib/services/pagination.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-qubee.mjs","sources":["../../../projects/ng-qubee/src/lib/errors/key-not-found.error.ts","../../../projects/ng-qubee/src/lib/models/paginated-collection.ts","../../../projects/ng-qubee/src/lib/enums/sort.enum.ts","../../../projects/ng-qubee/src/lib/errors/unselectable-model.error.ts","../../../projects/ng-qubee/src/lib/models/query-builder-options.ts","../../../projects/ng-qubee/src/lib/errors/invalid-model-name.error.ts","../../../projects/ng-qubee/src/lib/errors/invalid-page-number.error.ts","../../../projects/ng-qubee/src/lib/errors/invalid-limit.error.ts","../../../projects/ng-qubee/src/lib/services/nest.service.ts","../../../projects/ng-qubee/src/lib/services/ng-qubee.service.ts","../../../projects/ng-qubee/src/lib/models/response-options.ts","../../../projects/ng-qubee/src/lib/services/pagination.service.ts","../../../projects/ng-qubee/src/lib/ng-qubee.module.ts","../../../projects/ng-qubee/src/lib/provide-ngqubee.ts","../../../projects/ng-qubee/src/public-api.ts","../../../projects/ng-qubee/src/ng-qubee.ts"],"sourcesContent":["export class KeyNotFoundError extends Error {\n constructor(key: string) {\n super(`Cannot find the key ${key} inside the collection item: does it really exists?`);\n }\n}","import { KeyNotFoundError } from \"../errors/key-not-found.error\";\nimport { INormalized } from \"../interfaces/normalized.interface\";\nimport { IPaginatedObject } from \"../interfaces/paginated-object.interface\";\n\nexport class PaginatedCollection<T extends IPaginatedObject> {\n constructor(\n public data: T[],\n public readonly page: number,\n public readonly from?: number,\n public readonly to?: number,\n public readonly total?: number,\n public readonly perPage?: number,\n public readonly prevPageUrl?: string,\n public readonly nextPageUrl?: string,\n public readonly lastPage?: number,\n public readonly firstPageUrl?: string,\n public readonly lastPageUrl?: string\n ) {\n //\n }\n\n /**\n * Normalize the collection to a paginated list of ids for state-managed applications.\n * \n * This method returns a single key object, where the key is the page number and the associated value is\n * an array of ids. Each id is fetched by the collection items, looking up for the \"id\" key. If an id is supplied\n * to this method, it will be used instead of the default \"id\" key.\n * \n * Please note that in case the key doesn't exist in the collection's item, a KeyNotFoundError is thrown\n * \n * @param k A key to use instead of the default \"id\": this will be searched inside each element of the collection\n * @returns []\n * @throws KeyNotFoundItem\n */\n public normalize(id?: string): INormalized {\n return {\n [this.page]: this.data.reduce((ids: number[], value: T) => {\n if (id && id in value) {\n ids.push(value[id]);\n } else if (value.hasOwnProperty('id')) {\n ids.push(value['id']);\n } else {\n throw new KeyNotFoundError(id || 'id');\n }\n\n return ids;\n }, [])\n }\n }\n}","export enum SortEnum {\n ASC = 'asc',\n DESC = 'desc'\n}","export class UnselectableModelError extends Error {\n constructor(model: string) {\n super(`Unselectable Model: the selected model (${model}) is not present neither in the \"model\" property, nor in the includes object.`);\n }\n}","import { IQueryBuilderConfig } from '../interfaces/query-builder-config.interface';\n\nexport class QueryBuilderOptions {\n public readonly appends: string;\n public readonly fields: string;\n public readonly filters: string;\n public readonly includes: string;\n public readonly limit: string;\n public readonly page: string;\n public readonly sort: string;\n\n constructor(options: IQueryBuilderConfig) {\n this.appends = options.appends || 'append';\n this.fields = options.fields || 'fields';\n this.filters = options.filters || 'filter';\n this.includes = options.includes || 'include';\n this.limit = options.limit || 'limit';\n this.page = options.page || 'page';\n this.sort = options.sort || 'sort';\n }\n}","export class InvalidModelNameError extends Error {\n constructor(model: string | null | undefined) {\n super(\n `Invalid model name: Model name must be a non-empty string. Received: ${JSON.stringify(model)}`\n );\n this.name = 'InvalidModelNameError';\n }\n}\n","export class InvalidPageNumberError extends Error {\n constructor(page: number) {\n super(\n `Invalid page number: Page must be a positive integer greater than 0. Received: ${page}`\n );\n this.name = 'InvalidPageNumberError';\n }\n}\n","export class InvalidLimitError extends Error {\n constructor(limit: number) {\n super(\n `Invalid limit value: Limit must be a positive integer greater than 0. Received: ${limit}`\n );\n this.name = 'InvalidLimitError';\n }\n}\n","import { Injectable, Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { IQueryBuilderState } from '../interfaces/query-builder-state.interface';\nimport { IFields } from '../interfaces/fields.interface';\nimport { IFilters } from '../interfaces/filters.interface';\nimport { ISort } from '../interfaces/sort.interface';\nimport { InvalidModelNameError } from '../errors/invalid-model-name.error';\nimport { InvalidPageNumberError } from '../errors/invalid-page-number.error';\nimport { InvalidLimitError } from '../errors/invalid-limit.error';\n\nconst INITIAL_STATE: IQueryBuilderState = {\n baseUrl: '',\n fields: {},\n filters: {},\n includes: [],\n limit: 15,\n model: '',\n page: 1,\n sorts: []\n};\n\n@Injectable()\nexport class NestService {\n\n /**\n * Private writable signal that holds the Query Builder state\n * \n * @type {IQueryBuilderState}\n */\n private _nest: WritableSignal<IQueryBuilderState> = signal(this._clone(INITIAL_STATE));\n\n /**\n * A computed signal that makes readonly the writable signal _nest\n * \n * @type {Signal<IQueryBuilderState>}\n */\n public nest: Signal<IQueryBuilderState> = computed(() => this._clone(this._nest()));\n\n constructor() {\n // Nothing to see here 👮🏻‍♀️\n }\n\n /**\n * Set the base URL for the API\n *\n * @param {string} baseUrl - The base URL to prepend to generated URIs\n * @example\n * service.baseUrl = 'https://api.example.com';\n */\n set baseUrl(baseUrl: string) {\n this._nest.update(nest => ({\n ...nest,\n baseUrl\n }));\n }\n\n /**\n * Set the limit for paginated results\n * Must be a positive integer greater than 0\n *\n * @param {number} limit - The number of items per page\n * @throws {InvalidLimitError} If limit is not a positive integer\n * @example\n * service.limit = 25;\n */\n set limit(limit: number) {\n this._validateLimit(limit);\n this._nest.update(nest => ({\n ...nest,\n limit\n }));\n }\n\n /**\n * Set the model name for the query\n * Must be a non-empty string\n *\n * @param {string} model - The model/resource name (e.g., 'users', 'posts')\n * @throws {InvalidModelNameError} If model is not a non-empty string\n * @example\n * service.model = 'users';\n */\n set model(model: string) {\n this._validateModelName(model);\n this._nest.update(nest => ({\n ...nest,\n model\n }));\n }\n\n /**\n * Set the page number for pagination\n * Must be a positive integer greater than 0\n *\n * @param {number} page - The page number to fetch\n * @throws {InvalidPageNumberError} If page is not a positive integer\n * @example\n * service.page = 2;\n */\n set page(page: number) {\n this._validatePageNumber(page);\n this._nest.update(nest => ({\n ...nest,\n page\n }));\n }\n\n private _clone<T>(obj: T): T {\n return JSON.parse( JSON.stringify(obj) );\n }\n\n /**\n * Validates that the model name is a non-empty string\n *\n * @param {string} model - The model name to validate\n * @throws {InvalidModelNameError} If model is not a non-empty string\n * @private\n */\n private _validateModelName(model: string): void {\n if (!model || typeof model !== 'string' || model.trim().length === 0) {\n throw new InvalidModelNameError(model);\n }\n }\n\n /**\n * Validates that the page number is a positive integer\n *\n * @param {number} page - The page number to validate\n * @throws {InvalidPageNumberError} If page is not a positive integer\n * @private\n */\n private _validatePageNumber(page: number): void {\n if (!Number.isInteger(page) || page < 1) {\n throw new InvalidPageNumberError(page);\n }\n }\n\n /**\n * Validates that the limit is a positive integer\n *\n * @param {number} limit - The limit value to validate\n * @throws {InvalidLimitError} If limit is not a positive integer\n * @private\n */\n private _validateLimit(limit: number): void {\n if (!Number.isInteger(limit) || limit < 1) {\n throw new InvalidLimitError(limit);\n }\n }\n\n /**\n * Add selectable fields for the given model to the request\n * Automatically prevents duplicate fields for each model\n *\n * @param {IFields} fields - Object mapping model names to arrays of field names\n * @return {void}\n * @example\n * service.addFields({ users: ['id', 'email', 'username'] });\n * service.addFields({ posts: ['title', 'content'] });\n */\n public addFields(fields: IFields): void {\n this._nest.update(nest => {\n const mergedFields = { ...nest.fields };\n\n Object.keys(fields).forEach(model => {\n const existingFields = mergedFields[model] || [];\n const newFields = fields[model];\n\n // Use Set to prevent duplicates\n const uniqueFields = Array.from(new Set([...existingFields, ...newFields]));\n mergedFields[model] = uniqueFields;\n });\n\n return {\n ...nest,\n fields: mergedFields\n };\n });\n }\n\n /**\n * Add filters to the request\n * Automatically prevents duplicate filter values for each filter key\n *\n * @param {IFilters} filters - Object mapping filter keys to arrays of values\n * @return {void}\n * @example\n * service.addFilters({ id: [1, 2, 3] });\n * service.addFilters({ status: ['active', 'pending'] });\n */\n public addFilters(filters: IFilters): void {\n this._nest.update(nest => {\n const mergedFilters = { ...nest.filters };\n\n Object.keys(filters).forEach(key => {\n const existingValues = mergedFilters[key] || [];\n const newValues = filters[key];\n\n // Use Set to prevent duplicates\n const uniqueValues = Array.from(new Set([...existingValues, ...newValues]));\n mergedFilters[key] = uniqueValues;\n });\n\n return {\n ...nest,\n filters: mergedFilters\n };\n });\n }\n\n /**\n * Add resources to include with the request\n * Automatically prevents duplicate includes\n *\n * @param {string[]} includes - Array of model names to include in the response\n * @return {void}\n * @example\n * service.addIncludes(['profile', 'posts']);\n * service.addIncludes(['comments']);\n */\n public addIncludes(includes: string[]): void {\n this._nest.update(nest => {\n // Use Set to prevent duplicates\n const uniqueIncludes = Array.from(new Set([...nest.includes, ...includes]));\n\n return {\n ...nest,\n includes: uniqueIncludes\n };\n });\n }\n\n /**\n * Add a field that should be used for sorting data\n *\n * @param {ISort} sort - Sort configuration with field name and order (ASC/DESC)\n * @return {void}\n * @example\n * import { SortEnum } from 'ng-qubee';\n * service.addSort({ field: 'created_at', order: SortEnum.DESC });\n * service.addSort({ field: 'name', order: SortEnum.ASC });\n */\n public addSort(sort: ISort): void {\n this._nest.update(nest => ({\n ...nest,\n sorts: [...nest.sorts, sort]\n }));\n }\n\n /**\n * Remove fields for the given model\n * Uses deep cloning to prevent mutations to the original state\n *\n * @param {IFields} fields - Object mapping model names to arrays of field names to remove\n * @return {void}\n * @example\n * service.deleteFields({ users: ['email'] });\n * service.deleteFields({ posts: ['content', 'body'] });\n */\n public deleteFields(fields: IFields): void {\n // Deep clone the fields object to prevent mutations\n const f = this._clone(this._nest().fields);\n\n Object.keys(fields).forEach(k => {\n if (!(k in f)) {\n return;\n }\n\n f[k] = f[k].filter(v => !fields[k].includes(v));\n });\n\n this._nest.update(nest => ({\n ...nest,\n fields: f\n }));\n }\n\n /**\n * Remove filters from the request\n * Uses deep cloning to prevent mutations to the original state\n *\n * @param {...string[]} filters - Filter keys to remove\n * @return {void}\n * @example\n * service.deleteFilters('id');\n * service.deleteFilters('status', 'type');\n */\n public deleteFilters(...filters: string[]): void {\n // Deep clone the filters object to prevent mutations\n const f = this._clone(this._nest().filters);\n\n filters.forEach(k => delete f[k]);\n\n this._nest.update(nest => ({\n ...nest,\n filters: f\n }));\n }\n\n /**\n * Remove includes from the request\n *\n * @param {...string[]} includes - Include names to remove\n * @return {void}\n * @example\n * service.deleteIncludes('profile');\n * service.deleteIncludes('posts', 'comments');\n */\n public deleteIncludes(...includes: string[]): void {\n this._nest.update(nest => ({\n ...nest,\n includes: nest.includes.filter(v => !includes.includes(v))\n }));\n }\n\n /**\n * Remove sorts from the request by field name\n *\n * @param {...string[]} sorts - Field names of sorts to remove\n * @return {void}\n * @example\n * service.deleteSorts('created_at');\n * service.deleteSorts('name', 'created_at');\n */\n public deleteSorts(...sorts: string[]): void {\n const s = [...this._nest().sorts];\n \n sorts.forEach(field => {\n const p = this.nest().sorts.findIndex(sort => sort.field === field);\n\n if (p > -1) {\n s.splice(p, 1);\n }\n });\n \n this._nest.update(nest => ({\n ...nest,\n sorts: s\n }));\n }\n\n /**\n * Reset the query builder state to initial values\n * Clears all fields, filters, includes, sorts, and resets pagination\n *\n * @return {void}\n * @example\n * service.reset();\n * // State is now: { baseUrl: '', fields: {}, filters: {}, includes: [], limit: 15, model: '', page: 1, sorts: [] }\n */\n public reset(): void {\n this._nest.update(_ => this._clone(INITIAL_STATE));\n }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport * as qs from 'qs';\nimport { BehaviorSubject, Observable, filter } from 'rxjs';\n\n// Enums\nimport { SortEnum } from '../enums/sort.enum';\n\n// Errors\nimport { UnselectableModelError } from '../errors/unselectable-model.error';\n\n// Interfaces\nimport { IFields } from '../interfaces/fields.interface';\nimport { IQueryBuilderConfig } from '../interfaces/query-builder-config.interface';\nimport { IQueryBuilderState } from '../interfaces/query-builder-state.interface';\n\n// Models\nimport { QueryBuilderOptions } from '../models/query-builder-options';\n\n// Services\nimport { NestService } from './nest.service';\n\n@Injectable()\nexport class NgQubeeService {\n\n private _options: QueryBuilderOptions;\n\n /**\n * This property serves as an accumulator for holding the composed string with each query param\n */\n private _uri = '';\n\n private _uri$: BehaviorSubject<string> = new BehaviorSubject('');\n\n public uri$: Observable<string> = this._uri$.asObservable().pipe(\n filter(uri => !!uri)\n );\n\n constructor(private _nestService: NestService, @Inject('QUERY_PARAMS_CONFIG') @Optional() options: IQueryBuilderConfig = {}) {\n this._options = new QueryBuilderOptions(options);\n }\n\n private _parseFields(s: IQueryBuilderState): string {\n if (!Object.keys(s.fields).length) {\n return this._uri;\n }\n\n if (!s.model) {\n throw new Error('While selecting fields, the -> model <- is required');\n }\n\n if (!(s.model in s.fields)) {\n throw new Error(`Key ${s.model} is missing in the fields object`);\n }\n\n const f = {};\n\n for (const k in s.fields) {\n if (s.fields.hasOwnProperty(k)) {\n // Check if the key is the model or is declared in \"includes\".\n // If not, it means that has not been selected anywhere and that will cause an error on the API\n if (k !== s.model && !s.includes.includes(k)) {\n throw new UnselectableModelError(k);\n }\n\n Object.assign(f, { [`${this._options.fields}[${k}]`]: s.fields[k].join(',') });\n }\n }\n\n const param = `${this._prepend(s.model)}${qs.stringify(f, { encode: false })}`;\n this._uri += param;\n\n return param;\n }\n\n private _parseFilters(s: IQueryBuilderState): string {\n const keys = Object.keys(s.filters);\n\n if (!keys.length) {\n return this._uri;\n }\n\n const f = {\n [`${this._options.filters}`]: keys.reduce((acc, key) => {\n return Object.assign(acc, { [key]: s.filters[key].join(',') });\n }, {})\n };\n const param = `${this._prepend(s.model)}${qs.stringify(f, { encode: false })}`;\n\n this._uri += param;\n\n return param;\n }\n\n private _parseIncludes(s: IQueryBuilderState): string {\n if (!s.includes.length) {\n return this._uri;\n }\n\n const param = `${this._prepend(s.model)}${this._options.includes}=${s.includes}`;\n this._uri += param;\n\n return param;\n }\n\n private _parseLimit(s: IQueryBuilderState): string {\n const param = `${this._prepend(s.model)}${this._options.limit}=${s.limit}`;\n this._uri += param;\n\n return param;\n }\n\n private _parsePage(s: IQueryBuilderState): string {\n const param = `${this._prepend(s.model)}${this._options.page}=${s.page}`;\n this._uri += param;\n\n return param;\n }\n\n private _parseSort(s: IQueryBuilderState): string {\n let param: string = '';\n\n if (!s.sorts.length) {\n return param;\n }\n\n param = `${this._prepend(s.model)}${this._options.sort}=`;\n\n s.sorts.forEach((sort, idx) => {\n param += `${sort.order === SortEnum.DESC ? '-' : ''}${sort.field}`;\n\n if (idx < s.sorts.length - 1) {\n param += ','\n }\n });\n\n this._uri += param;\n\n return param;\n }\n\n private _parse(s: IQueryBuilderState): string {\n if (!s.model) {\n throw new Error('Set the model property BEFORE adding filters or calling the url() / get() methods');\n }\n\n // Cleanup the previously generated URI\n this._uri = '';\n\n this._parseIncludes(s);\n this._parseFields(s);\n this._parseFilters(s);\n this._parseLimit(s);\n this._parsePage(s);\n this._parseSort(s);\n\n return this._uri;\n }\n\n private _prepend(model: string): string {\n return this._uri ? '&' : `/${model}?`;\n }\n\n /**\n * Add fields to the select statement for the given model\n *\n * @param model Model that holds the fields\n * @param fields Fields to select\n * @returns {this}\n */\n public addFields(model: string, fields: string[]): this {\n if (!fields.length) {\n return this;\n }\n\n this._nestService.addFields({ [model]: fields });\n\n return this;\n }\n\n /**\n * Add a filter with the given value(s)\n * I.e. filter[field]=1 or filter[field]=1,2,3\n * \n * @param {string} field Name of the field to filter\n * @param {string[]} value The needle(s)\n * @returns {this}\n */\n public addFilter(field: string, ...values: (string | number | boolean)[]): this {\n if (!values.length) {\n return this;\n }\n\n this._nestService.addFilters({\n [field]: values\n });\n\n return this;\n }\n\n /**\n * Add related entities to include in the request\n * \n * @param {string[]} models \n * @returns \n */\n public addIncludes(...models: string[]): this {\n if (!models.length) {\n return this;\n }\n\n this._nestService.addIncludes(models);\n\n return this;\n }\n\n /**\n * Add a field with a sort criteria\n * \n * @param field Field to use for sorting\n * @param {SortEnum} order A value from the SortEnum enumeration\n * @returns {this}\n */\n public addSort(field: string, order: SortEnum): this {\n this._nestService.addSort({\n field,\n order\n });\n\n return this;\n }\n\n /**\n * Delete selected fields for the given models in the current query builder state\n * \n * ```\n * ngQubeeService.deleteFields({\n * users: ['email', 'password'],\n * address: ['zipcode']\n * });\n * ```\n * \n * @param {IFields} fields \n * @returns \n */\n public deleteFields(fields: IFields): this {\n this._nestService.deleteFields(fields);\n return this;\n }\n\n /**\n * Delete selected fields for the given model in the current query builder state\n * \n * ```\n * ngQubeeService.deleteFieldsByModel('users', 'email', 'password']);\n * ```\n * \n * @param model Model that holds the fields\n * @param {string[]} fields Fields to delete from the state\n * @returns {this}\n */\n public deleteFieldsByModel(model: string, ...fields: string[]): this {\n if (!fields.length) {\n return this;\n }\n\n this._nestService.deleteFields({\n [model]: fields\n });\n\n return this;\n }\n\n /**\n * Remove given filters from the query builder state\n * \n * @param {string[]} filters Filters to remove\n * @returns {this}\n */\n public deleteFilters(...filters: string[]): this {\n if (!filters.length) {\n return this;\n }\n\n this._nestService.deleteFilters(...filters);\n\n return this;\n }\n\n /**\n * Remove selected related models from the query builder state\n * \n * @param {string[]} includes Models to remove\n * @returns \n */\n public deleteIncludes(...includes: string[]): this {\n if (!includes.length) {\n return this;\n }\n\n this._nestService.deleteIncludes(...includes);\n\n return this;\n }\n\n /**\n * Remove sorts rules from the query builder state\n * \n * @param sorts Fields used for sorting to remove\n * @returns {this}\n */\n public deleteSorts(...sorts: string[]): this {\n this._nestService.deleteSorts(...sorts);\n return this;\n }\n\n /**\n * Generate an URI accordingly to the given data\n *\n * @returns {Observable<string>} An observable that emits the generated uri\n */\n public generateUri(): Observable<string> {\n this._uri$.next(this._parse(this._nestService.nest()));\n return this.uri$;\n }\n\n /**\n * Clear the current state and reset the Query Builder to a fresh, clean condition\n * \n * @returns {this}\n */\n public reset(): this {\n this._nestService.reset();\n return this;\n }\n\n /**\n * Set the base url to use for composing the address\n * \n * @param {string} baseUrl \n * @returns {this}\n */\n public setBaseUrl(baseUrl: string): this {\n this._nestService.baseUrl = baseUrl;\n return this;\n }\n\n /**\n * Set the items per page number\n * \n * @param limit \n * @returns {this}\n */\n public setLimit(limit: number): this {\n this._nestService.limit = limit;\n return this;\n }\n\n /**\n * Set the model to use for running the query against\n * - I.e. the model \"users\" will return /users\n * \n * @param {string} model Model name\n * @returns {this}\n */\n public setModel(model: string): this {\n this._nestService.model = model;\n return this;\n }\n\n /**\n * Set the page that the backend will use to paginate the result set\n * \n * @param page Page param\n * @returns {this}\n */\n public setPage(page: number): this {\n this._nestService.page = page;\n return this;\n }\n}\n","import { IPaginationConfig } from '../interfaces/pagination-config.interface';\n\nexport class ResponseOptions {\n public readonly currentPage: string;\n public readonly data: string;\n public readonly firstPageUrl: string;\n public readonly from: string;\n public readonly lastPage: string;\n public readonly lastPageUrl: string;\n public readonly nextPageUrl: string;\n public readonly path: string;\n public readonly perPage: string;\n public readonly prevPageUrl: string;\n public readonly to: string;\n public readonly total: string;\n\n constructor(options: IPaginationConfig) {\n this.currentPage = options.currentPage || 'current_page';\n this.data = options.data || 'data';\n this.firstPageUrl = options.firstPageUrl || 'first_page_url';\n this.from = options.from || 'from';\n this.lastPage = options.lastPage || 'last_page';\n this.lastPageUrl = options.lastPageUrl || 'last_page_url';\n this.nextPageUrl = options.nextPageUrl || 'next_page_url';\n this.path = options.path || 'path';\n this.perPage = options.perPage || 'per_page';\n this.prevPageUrl = options.prevPageUrl || 'prev_page_url';\n this.to = options.to || 'to';\n this.total = options.total || 'total';\n }\n}","import { Inject, Injectable, Optional } from \"@angular/core\";\nimport { IPaginationConfig } from \"../interfaces/pagination-config.interface\";\nimport { PaginatedCollection } from \"../models/paginated-collection\";\nimport { ResponseOptions } from \"../models/response-options\";\nimport { IPaginatedObject } from \"../interfaces/paginated-object.interface\";\n\n@Injectable()\nexport class PaginationService {\n private _options: ResponseOptions;\n \n constructor(@Inject('RESPONSE_OPTIONS') @Optional() options: IPaginationConfig = {}) {\n this._options = new ResponseOptions(options);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public paginate<T extends IPaginatedObject>(response: {[key: string]: any}): PaginatedCollection<T> {\n return new PaginatedCollection(\n response[this._options.data],\n response[this._options.currentPage],\n response[this._options.from],\n response[this._options.to],\n response[this._options.total],\n response[this._options.perPage],\n response[this._options.prevPageUrl],\n response[this._options.nextPageUrl],\n response[this._options.lastPage],\n response[this._options.firstPageUrl],\n response[this._options.lastPageUrl]\n );\n }\n}","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { NgQubeeService } from './services/ng-qubee.service';\nimport { IConfig } from './interfaces/config.interface';\nimport { PaginationService } from './services/pagination.service';\nimport { NestService } from './services/nest.service';\n\n// @dynamic\n@NgModule({\n providers: [{\n deps: [NestService],\n provide: NgQubeeService,\n useFactory: (nestService: NestService) => new NgQubeeService(nestService, {})\n }]\n})\nexport class NgQubeeModule {\n public static forRoot(config: IConfig = {}): ModuleWithProviders<NgQubeeModule> {\n return {\n ngModule: NgQubeeModule,\n providers: [\n NestService,\n {\n deps: [NestService],\n provide: NgQubeeService,\n useFactory: (nestService: NestService) =>\n new NgQubeeService(nestService, Object.assign({}, config.request))\n }, {\n provide: PaginationService,\n useFactory: () =>\n new PaginationService(Object.assign({}, config.response))\n }\n ]\n };\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\nimport { IConfig } from \"./interfaces/config.interface\";\nimport { NgQubeeService } from \"./services/ng-qubee.service\";\nimport { PaginationService } from \"./services/pagination.service\";\nimport { NestService } from \"./services/nest.service\";\n\n/**\n * Sets up providers necessary to enable `NgQubee` functionality for the application.\n *\n * @usageNotes\n *\n * Basic example of how you can add NgQubee to your application:\n * ```\n * const config = {};\n * \n * bootstrapApplication(AppComponent, {\n * providers: [provideNgQubee(config)]\n * });\n * ```\n *\n * @publicApi\n * @param config Configuration object compliant to the IConfig interface\n * @returns A set of providers to setup NgQubee\n */\nexport function provideNgQubee(config: IConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NestService,\n useClass: NestService\n },\n {\n deps: [NestService],\n provide: NgQubeeService,\n useFactory: (nestService: NestService) => new NgQubeeService(nestService, Object.assign({}, config.request))\n }, {\n provide: PaginationService,\n useFactory: () => new PaginationService(Object.assign({}, config.response))\n }\n ]);\n}","/*\n * Public API Surface of angular-query-builder\n */\n\nexport * from './lib/models/paginated-collection';\nexport * from './lib/ng-qubee.module';\nexport * from './lib/provide-ngqubee';\nexport * from './lib/services/ng-qubee.service';\nexport * from './lib/services/pagination.service';\n\n// Error classes\nexport * from './lib/errors/invalid-model-name.error';\nexport * from './lib/errors/invalid-page-number.error';\nexport * from './lib/errors/invalid-limit.error';\nexport * from './lib/errors/key-not-found.error';\nexport * from './lib/errors/unselectable-model.error';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare class InvalidLimitError extends Error {
2
+ constructor(limit: number);
3
+ }
@@ -0,0 +1,3 @@
1
+ export declare class InvalidModelNameError extends Error {
2
+ constructor(model: string | null | undefined);
3
+ }
@@ -0,0 +1,3 @@
1
+ export declare class InvalidPageNumberError extends Error {
2
+ constructor(page: number);
3
+ }
@@ -18,63 +18,164 @@ export declare class NestService {
18
18
  */
19
19
  nest: Signal<IQueryBuilderState>;
20
20
  constructor();
21
+ /**
22
+ * Set the base URL for the API
23
+ *
24
+ * @param {string} baseUrl - The base URL to prepend to generated URIs
25
+ * @example
26
+ * service.baseUrl = 'https://api.example.com';
27
+ */
21
28
  set baseUrl(baseUrl: string);
29
+ /**
30
+ * Set the limit for paginated results
31
+ * Must be a positive integer greater than 0
32
+ *
33
+ * @param {number} limit - The number of items per page
34
+ * @throws {InvalidLimitError} If limit is not a positive integer
35
+ * @example
36
+ * service.limit = 25;
37
+ */
22
38
  set limit(limit: number);
39
+ /**
40
+ * Set the model name for the query
41
+ * Must be a non-empty string
42
+ *
43
+ * @param {string} model - The model/resource name (e.g., 'users', 'posts')
44
+ * @throws {InvalidModelNameError} If model is not a non-empty string
45
+ * @example
46
+ * service.model = 'users';
47
+ */
23
48
  set model(model: string);
49
+ /**
50
+ * Set the page number for pagination
51
+ * Must be a positive integer greater than 0
52
+ *
53
+ * @param {number} page - The page number to fetch
54
+ * @throws {InvalidPageNumberError} If page is not a positive integer
55
+ * @example
56
+ * service.page = 2;
57
+ */
24
58
  set page(page: number);
25
59
  private _clone;
60
+ /**
61
+ * Validates that the model name is a non-empty string
62
+ *
63
+ * @param {string} model - The model name to validate
64
+ * @throws {InvalidModelNameError} If model is not a non-empty string
65
+ * @private
66
+ */
67
+ private _validateModelName;
68
+ /**
69
+ * Validates that the page number is a positive integer
70
+ *
71
+ * @param {number} page - The page number to validate
72
+ * @throws {InvalidPageNumberError} If page is not a positive integer
73
+ * @private
74
+ */
75
+ private _validatePageNumber;
76
+ /**
77
+ * Validates that the limit is a positive integer
78
+ *
79
+ * @param {number} limit - The limit value to validate
80
+ * @throws {InvalidLimitError} If limit is not a positive integer
81
+ * @private
82
+ */
83
+ private _validateLimit;
26
84
  /**
27
85
  * Add selectable fields for the given model to the request
86
+ * Automatically prevents duplicate fields for each model
28
87
  *
29
- * @param {IFields} fields
88
+ * @param {IFields} fields - Object mapping model names to arrays of field names
30
89
  * @return {void}
31
- * @todo Avoid duplicated fields
90
+ * @example
91
+ * service.addFields({ users: ['id', 'email', 'username'] });
92
+ * service.addFields({ posts: ['title', 'content'] });
32
93
  */
33
94
  addFields(fields: IFields): void;
34
95
  /**
35
96
  * Add filters to the request
97
+ * Automatically prevents duplicate filter values for each filter key
36
98
  *
37
- * @param {IFilters} filters
38
- * @todo Avoid duplicated filters
99
+ * @param {IFilters} filters - Object mapping filter keys to arrays of values
100
+ * @return {void}
101
+ * @example
102
+ * service.addFilters({ id: [1, 2, 3] });
103
+ * service.addFilters({ status: ['active', 'pending'] });
39
104
  */
40
105
  addFilters(filters: IFilters): void;
41
106
  /**
42
107
  * Add resources to include with the request
108
+ * Automatically prevents duplicate includes
43
109
  *
44
- * @param {string[]} includes models to include to the request
110
+ * @param {string[]} includes - Array of model names to include in the response
45
111
  * @return {void}
46
- * @todo Avoid duplicated includes
112
+ * @example
113
+ * service.addIncludes(['profile', 'posts']);
114
+ * service.addIncludes(['comments']);
47
115
  */
48
116
  addIncludes(includes: string[]): void;
49
117
  /**
50
118
  * Add a field that should be used for sorting data
51
119
  *
52
- * @param {ISort} sort
120
+ * @param {ISort} sort - Sort configuration with field name and order (ASC/DESC)
53
121
  * @return {void}
122
+ * @example
123
+ * import { SortEnum } from 'ng-qubee';
124
+ * service.addSort({ field: 'created_at', order: SortEnum.DESC });
125
+ * service.addSort({ field: 'name', order: SortEnum.ASC });
54
126
  */
55
127
  addSort(sort: ISort): void;
56
128
  /**
57
129
  * Remove fields for the given model
130
+ * Uses deep cloning to prevent mutations to the original state
58
131
  *
59
- * @param {IFields} fields
132
+ * @param {IFields} fields - Object mapping model names to arrays of field names to remove
133
+ * @return {void}
134
+ * @example
135
+ * service.deleteFields({ users: ['email'] });
136
+ * service.deleteFields({ posts: ['content', 'body'] });
60
137
  */
61
138
  deleteFields(fields: IFields): void;
62
139
  /**
140
+ * Remove filters from the request
141
+ * Uses deep cloning to prevent mutations to the original state
63
142
  *
64
- * @param filters
65
- * @todo Create a clone of the filter obj before assigning to f
143
+ * @param {...string[]} filters - Filter keys to remove
144
+ * @return {void}
145
+ * @example
146
+ * service.deleteFilters('id');
147
+ * service.deleteFilters('status', 'type');
66
148
  */
67
149
  deleteFilters(...filters: string[]): void;
68
150
  /**
151
+ * Remove includes from the request
69
152
  *
70
- * @param includes
153
+ * @param {...string[]} includes - Include names to remove
154
+ * @return {void}
155
+ * @example
156
+ * service.deleteIncludes('profile');
157
+ * service.deleteIncludes('posts', 'comments');
71
158
  */
72
159
  deleteIncludes(...includes: string[]): void;
73
160
  /**
161
+ * Remove sorts from the request by field name
74
162
  *
75
- * @param sorts
163
+ * @param {...string[]} sorts - Field names of sorts to remove
164
+ * @return {void}
165
+ * @example
166
+ * service.deleteSorts('created_at');
167
+ * service.deleteSorts('name', 'created_at');
76
168
  */
77
169
  deleteSorts(...sorts: string[]): void;
170
+ /**
171
+ * Reset the query builder state to initial values
172
+ * Clears all fields, filters, includes, sorts, and resets pagination
173
+ *
174
+ * @return {void}
175
+ * @example
176
+ * service.reset();
177
+ * // State is now: { baseUrl: '', fields: {}, filters: {}, includes: [], limit: 15, model: '', page: 1, sorts: [] }
178
+ */
78
179
  reset(): void;
79
180
  static ɵfac: i0.ɵɵFactoryDeclaration<NestService, never>;
80
181
  static ɵprov: i0.ɵɵInjectableDeclaration<NestService>;
package/package.json CHANGED
@@ -5,14 +5,38 @@
5
5
  "email": "info@andreatantimonaco.me",
6
6
  "url": "https://andreatantimonaco.me"
7
7
  },
8
- "version": "2.0.3",
8
+ "version": "2.0.5",
9
9
  "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/AndreaAlhena/ng-qubee.git"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/AndreaAlhena/ng-qubee/issues"
16
+ },
17
+ "homepage": "https://github.com/AndreaAlhena/ng-qubee#readme",
18
+ "keywords": [
19
+ "angular",
20
+ "query-builder",
21
+ "api",
22
+ "pagination",
23
+ "rxjs",
24
+ "filter",
25
+ "query",
26
+ "builder",
27
+ "typescript",
28
+ "signals"
29
+ ],
10
30
  "allowedNonPeerDependencies": [
11
31
  "qs"
12
32
  ],
13
33
  "dependencies": {
14
- "qs": "^6.11.2",
15
- "tslib": "^2.3.0"
34
+ "qs": "^6.14.0",
35
+ "tslib": "^2.8.1"
36
+ },
37
+ "peerDependencies": {
38
+ "@angular/core": ">=16.0.0 <22.0.0",
39
+ "rxjs": "^6.5.0 || ^7.0.0"
16
40
  },
17
41
  "sideEffects": false,
18
42
  "module": "fesm2022/ng-qubee.mjs",
@@ -23,8 +47,6 @@
23
47
  },
24
48
  ".": {
25
49
  "types": "./index.d.ts",
26
- "esm2022": "./esm2022/ng-qubee.mjs",
27
- "esm": "./esm2022/ng-qubee.mjs",
28
50
  "default": "./fesm2022/ng-qubee.mjs"
29
51
  }
30
52
  }
package/public-api.d.ts CHANGED
@@ -3,3 +3,8 @@ export * from './lib/ng-qubee.module';
3
3
  export * from './lib/provide-ngqubee';
4
4
  export * from './lib/services/ng-qubee.service';
5
5
  export * from './lib/services/pagination.service';
6
+ export * from './lib/errors/invalid-model-name.error';
7
+ export * from './lib/errors/invalid-page-number.error';
8
+ export * from './lib/errors/invalid-limit.error';
9
+ export * from './lib/errors/key-not-found.error';
10
+ export * from './lib/errors/unselectable-model.error';
@@ -1,6 +0,0 @@
1
- export var SortEnum;
2
- (function (SortEnum) {
3
- SortEnum["ASC"] = "asc";
4
- SortEnum["DESC"] = "desc";
5
- })(SortEnum || (SortEnum = {}));
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9lbnVtcy9zb3J0LmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNoQix1QkFBVyxDQUFBO0lBQ1gseUJBQWEsQ0FBQTtBQUNqQixDQUFDLEVBSFcsUUFBUSxLQUFSLFFBQVEsUUFHbkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBTb3J0RW51bSB7XG4gICAgQVNDID0gJ2FzYycsXG4gICAgREVTQyA9ICdkZXNjJ1xufSJdfQ==
@@ -1,6 +0,0 @@
1
- export class KeyNotFoundError extends Error {
2
- constructor(key) {
3
- super(`Cannot find the key ${key} inside the collection item: does it really exists?`);
4
- }
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LW5vdC1mb3VuZC5lcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXF1YmVlL3NyYy9saWIvZXJyb3JzL2tleS1ub3QtZm91bmQuZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGdCQUFpQixTQUFRLEtBQUs7SUFDdkMsWUFBWSxHQUFXO1FBQ25CLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxxREFBcUQsQ0FBQyxDQUFDO0lBQzNGLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBLZXlOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGBDYW5ub3QgZmluZCB0aGUga2V5ICR7a2V5fSBpbnNpZGUgdGhlIGNvbGxlY3Rpb24gaXRlbTogZG9lcyBpdCByZWFsbHkgZXhpc3RzP2ApO1xuICAgIH1cbn0iXX0=
@@ -1,6 +0,0 @@
1
- export class UnselectableModelError extends Error {
2
- constructor(model) {
3
- super(`Unselectable Model: the selected model (${model}) is not present neither in the "model" property, nor in the includes object.`);
4
- }
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zZWxlY3RhYmxlLW1vZGVsLmVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9lcnJvcnMvdW5zZWxlY3RhYmxlLW1vZGVsLmVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0lBQzdDLFlBQVksS0FBYTtRQUNyQixLQUFLLENBQUMsMkNBQTJDLEtBQUssK0VBQStFLENBQUMsQ0FBQztJQUMzSSxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgVW5zZWxlY3RhYmxlTW9kZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGBVbnNlbGVjdGFibGUgTW9kZWw6IHRoZSBzZWxlY3RlZCBtb2RlbCAoJHttb2RlbH0pIGlzIG5vdCBwcmVzZW50IG5laXRoZXIgaW4gdGhlIFwibW9kZWxcIiBwcm9wZXJ0eSwgbm9yIGluIHRoZSBpbmNsdWRlcyBvYmplY3QuYCk7XG4gICAgfVxufSJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXF1YmVlL3NyYy9saWIvaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUGFnaW5hdGlvbkNvbmZpZyB9IGZyb20gXCIuL3BhZ2luYXRpb24tY29uZmlnLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgSVF1ZXJ5QnVpbGRlckNvbmZpZyB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXItY29uZmlnLmludGVyZmFjZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb25maWcge1xuICAgIHJlcXVlc3Q/OiBJUXVlcnlCdWlsZGVyQ29uZmlnLFxuICAgIHJlc3BvbnNlPzogSVBhZ2luYXRpb25Db25maWdcbn0iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXF1YmVlL3NyYy9saWIvaW50ZXJmYWNlcy9maWVsZHMuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIElGaWVsZHMge1xuICAgIFttb2RlbDogc3RyaW5nXTogc3RyaW5nW107XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvZmlsdGVycy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSUZpbHRlcnMge1xuICAgIFtrOiBzdHJpbmddOiAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbilbXTtcbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplZC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvbm9ybWFsaXplZC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSU5vcm1hbGl6ZWQge1xuICAgIFtrOiBudW1iZXIgfCBzdHJpbmddOiBudW1iZXJbXSB8IHN0cmluZ1tdXG59Il19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGVkLW9iamVjdC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvcGFnaW5hdGVkLW9iamVjdC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSVBhZ2luYXRlZE9iamVjdCB7XG4gICAgW2s6IHN0cmluZ106IGFueTtcbn0iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi1jb25maWcuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9pbnRlcmZhY2VzL3BhZ2luYXRpb24tY29uZmlnLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJUGFnaW5hdGlvbkNvbmZpZyB7XG4gICAgY3VycmVudFBhZ2U/OiBzdHJpbmc7XG4gICAgZGF0YT86IHN0cmluZztcbiAgICBmaXJzdFBhZ2VVcmw/OiBzdHJpbmc7XG4gICAgZnJvbT86IHN0cmluZztcbiAgICBsYXN0UGFnZT86IHN0cmluZztcbiAgICBsYXN0UGFnZVVybD86IHN0cmluZztcbiAgICBuZXh0UGFnZVVybD86IHN0cmluZztcbiAgICBwYXRoPzogc3RyaW5nO1xuICAgIHBlclBhZ2U/OiBzdHJpbmc7XG4gICAgcHJldlBhZ2VVcmw/OiBzdHJpbmc7XG4gICAgdG8/OiBzdHJpbmc7XG4gICAgdG90YWw/OiBzdHJpbmc7XG59Il19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci1jb25maWcuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9pbnRlcmZhY2VzL3F1ZXJ5LWJ1aWxkZXItY29uZmlnLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJUXVlcnlCdWlsZGVyQ29uZmlnIHtcbiAgICBhcHBlbmRzPzogc3RyaW5nO1xuICAgIGZpZWxkcz86IHN0cmluZztcbiAgICBmaWx0ZXJzPzogc3RyaW5nO1xuICAgIGluY2x1ZGVzPzogc3RyaW5nO1xuICAgIGxpbWl0Pzogc3RyaW5nO1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgc29ydD86IHN0cmluZztcbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci1zdGF0ZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvcXVlcnktYnVpbGRlci1zdGF0ZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElGaWVsZHMgfSBmcm9tIFwiLi9maWVsZHMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJRmlsdGVycyB9IGZyb20gXCIuL2ZpbHRlcnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJU29ydCB9IGZyb20gXCIuL3NvcnQuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVF1ZXJ5QnVpbGRlclN0YXRlIHtcbiAgICBiYXNlVXJsOiBzdHJpbmc7XG4gICAgZmllbGRzOiBJRmllbGRzO1xuICAgIGZpbHRlcnM6IElGaWx0ZXJzO1xuICAgIGluY2x1ZGVzOiBzdHJpbmdbXTtcbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgcGFnZTogbnVtYmVyLFxuICAgIHNvcnRzOiBJU29ydFtdO1xufSJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvc29ydC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvcnRFbnVtIH0gZnJvbSBcIi4uL2VudW1zL3NvcnQuZW51bVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTb3J0IHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG9yZGVyOiBTb3J0RW51bVxufSJdfQ==
@@ -1,47 +0,0 @@
1
- import { KeyNotFoundError } from "../errors/key-not-found.error";
2
- export class PaginatedCollection {
3
- constructor(data, page, from, to, total, perPage, prevPageUrl, nextPageUrl, lastPage, firstPageUrl, lastPageUrl) {
4
- this.data = data;
5
- this.page = page;
6
- this.from = from;
7
- this.to = to;
8
- this.total = total;
9
- this.perPage = perPage;
10
- this.prevPageUrl = prevPageUrl;
11
- this.nextPageUrl = nextPageUrl;
12
- this.lastPage = lastPage;
13
- this.firstPageUrl = firstPageUrl;
14
- this.lastPageUrl = lastPageUrl;
15
- //
16
- }
17
- /**
18
- * Normalize the collection to a paginated list of ids for state-managed applications.
19
- *
20
- * This method returns a single key object, where the key is the page number and the associated value is
21
- * an array of ids. Each id is fetched by the collection items, looking up for the "id" key. If an id is supplied
22
- * to this method, it will be used instead of the default "id" key.
23
- *
24
- * Please note that in case the key doesn't exist in the collection's item, a KeyNotFoundError is thrown
25
- *
26
- * @param k A key to use instead of the default "id": this will be searched inside each element of the collection
27
- * @returns []
28
- * @throws KeyNotFoundItem
29
- */
30
- normalize(id) {
31
- return {
32
- [this.page]: this.data.reduce((ids, value) => {
33
- if (id && id in value) {
34
- ids.push(value[id]);
35
- }
36
- else if (value.hasOwnProperty('id')) {
37
- ids.push(value['id']);
38
- }
39
- else {
40
- throw new KeyNotFoundError(id || 'id');
41
- }
42
- return ids;
43
- }, [])
44
- };
45
- }
46
- }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGVkLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL21vZGVscy9wYWdpbmF0ZWQtY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUlqRSxNQUFNLE9BQU8sbUJBQW1CO0lBQzVCLFlBQ1csSUFBUyxFQUNBLElBQVksRUFDWixJQUFhLEVBQ2IsRUFBVyxFQUNYLEtBQWMsRUFDZCxPQUFnQixFQUNoQixXQUFvQixFQUNwQixXQUFvQixFQUNwQixRQUFpQixFQUNqQixZQUFxQixFQUNyQixXQUFvQjtRQVY3QixTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ0EsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFNBQUksR0FBSixJQUFJLENBQVM7UUFDYixPQUFFLEdBQUYsRUFBRSxDQUFTO1FBQ1gsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUNkLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFDcEIsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixpQkFBWSxHQUFaLFlBQVksQ0FBUztRQUNyQixnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUVwQyxFQUFFO0lBQ04sQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFNBQVMsQ0FBQyxFQUFXO1FBQ3hCLE9BQU87WUFDSCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQWEsRUFBRSxLQUFRLEVBQUUsRUFBRTtnQkFDdEQsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEtBQUssRUFBRTtvQkFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDdkI7cUJBQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUN6QjtxQkFBTTtvQkFDSCxNQUFNLElBQUksZ0JBQWdCLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO2lCQUMxQztnQkFFRCxPQUFPLEdBQUcsQ0FBQztZQUNmLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDVCxDQUFBO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMva2V5LW5vdC1mb3VuZC5lcnJvclwiO1xuaW1wb3J0IHsgSU5vcm1hbGl6ZWQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9ub3JtYWxpemVkLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgSVBhZ2luYXRlZE9iamVjdCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL3BhZ2luYXRlZC1vYmplY3QuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBQYWdpbmF0ZWRDb2xsZWN0aW9uPFQgZXh0ZW5kcyBJUGFnaW5hdGVkT2JqZWN0PiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkYXRhOiBUW10sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwYWdlOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBmcm9tPzogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdG8/OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0b3RhbD86IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlclBhZ2U/OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwcmV2UGFnZVVybD86IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5leHRQYWdlVXJsPzogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdFBhZ2U/OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBmaXJzdFBhZ2VVcmw/OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBsYXN0UGFnZVVybD86IHN0cmluZ1xuICAgICkge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZSB0aGUgY29sbGVjdGlvbiB0byBhIHBhZ2luYXRlZCBsaXN0IG9mIGlkcyBmb3Igc3RhdGUtbWFuYWdlZCBhcHBsaWNhdGlvbnMuXG4gICAgICogXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHNpbmdsZSBrZXkgb2JqZWN0LCB3aGVyZSB0aGUga2V5IGlzIHRoZSBwYWdlIG51bWJlciBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWUgaXNcbiAgICAgKiBhbiBhcnJheSBvZiBpZHMuIEVhY2ggaWQgaXMgZmV0Y2hlZCBieSB0aGUgY29sbGVjdGlvbiBpdGVtcywgbG9va2luZyB1cCBmb3IgdGhlIFwiaWRcIiBrZXkuIElmIGFuIGlkIGlzIHN1cHBsaWVkXG4gICAgICogdG8gdGhpcyBtZXRob2QsIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IFwiaWRcIiBrZXkuXG4gICAgICogXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCBpbiBjYXNlIHRoZSBrZXkgZG9lc24ndCBleGlzdCBpbiB0aGUgY29sbGVjdGlvbidzIGl0ZW0sIGEgS2V5Tm90Rm91bmRFcnJvciBpcyB0aHJvd25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gayBBIGtleSB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBcImlkXCI6IHRoaXMgd2lsbCBiZSBzZWFyY2hlZCBpbnNpZGUgZWFjaCBlbGVtZW50IG9mIHRoZSBjb2xsZWN0aW9uXG4gICAgICogQHJldHVybnMgW11cbiAgICAgKiBAdGhyb3dzIEtleU5vdEZvdW5kSXRlbVxuICAgICAqL1xuICAgIHB1YmxpYyBub3JtYWxpemUoaWQ/OiBzdHJpbmcpOiBJTm9ybWFsaXplZCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbdGhpcy5wYWdlXTogdGhpcy5kYXRhLnJlZHVjZSgoaWRzOiBudW1iZXJbXSwgdmFsdWU6IFQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaWQgJiYgaWQgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2godmFsdWVbaWRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKHZhbHVlWydpZCddKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgS2V5Tm90Rm91bmRFcnJvcihpZCB8fCAnaWQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaWRzO1xuICAgICAgICAgICAgfSwgW10pXG4gICAgICAgIH1cbiAgICB9XG59Il19
@@ -1,12 +0,0 @@
1
- export class QueryBuilderOptions {
2
- constructor(options) {
3
- this.appends = options.appends || 'append';
4
- this.fields = options.fields || 'fields';
5
- this.filters = options.filters || 'filter';
6
- this.includes = options.includes || 'include';
7
- this.limit = options.limit || 'limit';
8
- this.page = options.page || 'page';
9
- this.sort = options.sort || 'sort';
10
- }
11
- }
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9tb2RlbHMvcXVlcnktYnVpbGRlci1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxtQkFBbUI7SUFTNUIsWUFBWSxPQUE0QjtRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDO0lBQ3ZDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElRdWVyeUJ1aWxkZXJDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3F1ZXJ5LWJ1aWxkZXItY29uZmlnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUJ1aWxkZXJPcHRpb25zIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwZW5kczogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZHM6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyczogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBpbmNsdWRlczogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBsaW1pdDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHNvcnQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElRdWVyeUJ1aWxkZXJDb25maWcpIHtcbiAgICAgICAgdGhpcy5hcHBlbmRzID0gb3B0aW9ucy5hcHBlbmRzIHx8ICdhcHBlbmQnO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IG9wdGlvbnMuZmllbGRzIHx8ICdmaWVsZHMnO1xuICAgICAgICB0aGlzLmZpbHRlcnMgPSBvcHRpb25zLmZpbHRlcnMgfHwgJ2ZpbHRlcic7XG4gICAgICAgIHRoaXMuaW5jbHVkZXMgPSBvcHRpb25zLmluY2x1ZGVzIHx8ICdpbmNsdWRlJztcbiAgICAgICAgdGhpcy5saW1pdCA9IG9wdGlvbnMubGltaXQgfHwgJ2xpbWl0JztcbiAgICAgICAgdGhpcy5wYWdlID0gb3B0aW9ucy5wYWdlIHx8ICdwYWdlJztcbiAgICAgICAgdGhpcy5zb3J0ID0gb3B0aW9ucy5zb3J0IHx8ICdzb3J0JztcbiAgICB9XG59Il19