UNPKG

@kovalson/prevue

Version:

A Vue 3 package based on Pinia that helps to manage resource models.

1 lines 46.8 kB
{"version":3,"sources":["../src/Model.ts","../src/utils/convertObjectKeys.ts","../src/defineConfig.ts","../src/defineApi.ts","../src/utils/defineApiUrl.ts","../src/utils/getInferredUri.ts","../src/utils/defineUri.ts","../src/ApiResponse.ts","../src/utils/createInstance.ts","../src/utils/deepMerge.ts","../src/defineRepository.ts","../src/definePagination.ts","../src/defineController.ts"],"sourcesContent":["import { camelCase } from 'lodash';\nimport { convertObjectKeys } from './utils/convertObjectKeys';\nimport { apiConfig } from './defineConfig';\n\ntype TFlagExcludedType<Base, Type> = {\n [Key in keyof Base]: Base[Key] extends Type\n ? never\n : Key;\n};\n\ntype TAllowedNames<Base, Type> = TFlagExcludedType<Base, Type>[keyof Base];\n\ntype TOmitType<Base, Type> = Pick<Base, TAllowedNames<Base, Type>>;\n\nexport type TModelConstructorType<T> = TOmitType<T, (...args: any[]) => any>;\n\nexport abstract class Model {\n public static primaryKey = 'id';\n\n protected $convertCase = false;\n\n protected $relations: Record<string, new () => Model> = {\n //\n };\n\n public $update(props: Partial<TModelConstructorType<typeof this>>): this {\n const newModel = new (this.constructor as any)();\n const relatedModels: Record<string, Model | Model[]> = {};\n if (this.$convertCase || apiConfig.convertCase) {\n props = convertObjectKeys(props, camelCase);\n }\n Object\n .keys(props)\n .forEach((key: string) => {\n if (!(key in this) && !(key in this.$relations)) {\n delete props[key as keyof typeof props];\n }\n });\n Object.keys(props)\n .filter((key: string) => key in this.$relations)\n .forEach((key: string) => {\n const propsKey = key as keyof typeof props;\n const propsModelData = props[propsKey] as any;\n const RelatedModelClass = this.$relations[key];\n if (Array.isArray(propsModelData)) {\n relatedModels[key] = [];\n propsModelData.forEach((propsModel: any) => {\n const _relatedModel = new RelatedModelClass();\n const relatedModel = _relatedModel.$update(propsModel);\n (relatedModels[key] as Model[]).push(relatedModel);\n });\n } else if (typeof propsModelData === 'object') {\n const _relatedModel = new RelatedModelClass();\n relatedModels[key] = _relatedModel.$update(propsModelData);\n }\n });\n Object.keys(relatedModels).forEach((key: string) => {\n if (key in props) {\n delete props[key as keyof typeof props];\n }\n });\n Object.assign(newModel, {\n ...this,\n ...props,\n });\n Object.assign(newModel, relatedModels);\n return newModel;\n }\n}\n","type TConvertFunction = (key: string) => string;\n\nexport function convertObjectKeys<TObject extends Record<string, unknown>>(\n object: TObject,\n convertFunction: TConvertFunction,\n): TObject {\n return Object.fromEntries(\n Object\n .entries(object)\n .map((entry: [string, unknown]) => [\n convertFunction(entry[0]),\n entry[1],\n ]),\n ) as TObject;\n}\n","import { IPaginationSetup, TApiOptions } from './defineApi';\n\ntype THeaders =\n | HeadersInit\n | (() => HeadersInit)\n ;\n\ninterface IConfigOptions {\n apiUrl?: string;\n headers?: THeaders;\n convertCase?: boolean;\n pagination?: IPaginationSetup;\n requestOptions?: TApiOptions;\n}\n\nfunction clearConfig(): void {\n apiConfig = {};\n}\n\nfunction defineConfig(options: IConfigOptions) {\n if (Object.isFrozen(apiConfig)) {\n throw new Error('You can configure Prevue only once.');\n }\n\n apiConfig.apiUrl = options.apiUrl;\n apiConfig.headers = options.headers;\n apiConfig.convertCase = options.convertCase;\n apiConfig.pagination = options.pagination;\n apiConfig.requestOptions = options.requestOptions;\n\n apiConfig = Object.freeze(apiConfig);\n}\n\nlet apiConfig: IConfigOptions = {};\n\nexport {\n apiConfig,\n defineConfig,\n};\n\nexport const configExportsForTesting = {\n clearConfig,\n};\n","import { $fetch, type FetchOptions } from 'ofetch';\nimport type { Model } from './Model';\nimport { defineApiUrl } from './utils/defineApiUrl';\nimport { defineUri } from './utils/defineUri';\nimport type { TOverride } from './utils/types';\nimport { ApiResponse, IPagination, PaginatedResponse, SimpleResponse } from './ApiResponse';\nimport { apiConfig } from './defineConfig';\nimport { createInstance } from './utils/createInstance';\nimport { deepMerge } from './utils/deepMerge';\n\nexport type TApiOptions = FetchOptions<'json'>;\n\ntype TMethod = (...args: any[]) => void;\n\ntype TMethods = Record<string, TMethod>;\n\ntype TSetupEndpoints<E> = TMethods extends E ? {} : E;\n\ntype TIdentifier =\n | string\n | number\n ;\n\nexport interface IBaseModelApi<M> {\n fetchAll(options?: TApiOptions): Promise<ApiResponse<M[]>>\n fetchOne(id: TIdentifier, options?: TApiOptions): Promise<ApiResponse<M>>;\n fetchMany(ids: TIdentifier[], options?: TApiOptions): Promise<ApiResponse<M[]>>;\n createOne<Request extends Partial<M>>(data: Request, options?: TApiOptions): Promise<ApiResponse<M>>;\n updateOne(id: TIdentifier, data: Partial<M>, options?: TApiOptions): Promise<ApiResponse<M>>;\n updateMany(ids: TIdentifier[], data: Partial<M>, options?: TApiOptions): Promise<ApiResponse<M[]>>;\n deleteOne(id: TIdentifier, options?: TApiOptions): Promise<ApiResponse<null>>;\n deleteMany(ids: TIdentifier[], options?: TApiOptions): Promise<ApiResponse<null>>;\n}\n\ninterface ISetupContext<M> extends IBaseModelApi<M> {\n request<T>(url: string, options?: TApiOptions): Promise<ApiResponse<T>>;\n rawRequest<T = TResponse>(url: string, options?: TApiOptions): Promise<T>;\n}\n\ntype TEndpointsContext<M, E> =\n & E\n & ThisType<ISetupContext<M> & E>\n ;\n\ntype TResponse = any;\n\ntype TPaginationMapper = (response: TResponse) => IPagination;\n\ntype TPaginationKeys = {\n [K in keyof IPagination]: string;\n};\n\nexport interface IPaginationSetup extends Partial<TPaginationKeys> {\n dataWrapper?: string;\n paginationWrapper?: string;\n mapper?: TPaginationMapper;\n}\n\nexport interface ISetup<M, E> {\n apiUrl?: (() => string) | string;\n uri?: (() => string) | string;\n trimSlashes?: boolean;\n endpoints?: TEndpointsContext<M, E>;\n pagination?: IPaginationSetup;\n options?: TApiOptions;\n}\n\nexport type TApi<M, E> =\n & E\n & IBaseModelApi<M>\n & TOverride<IBaseModelApi<M>, TSetupEndpoints<E>>\n;\n\nexport interface IApiDefinition<M, E> {\n (): TApi<M, E>;\n}\n\ninterface IProcessedPaginatedResponse<T> {\n data: T;\n pagination: IPagination;\n}\n\ninterface ISetupConfig {\n getUri(): string;\n getApiUrl(): string;\n buildFullUrl(...segments: string[]): string;\n getPaginationWrapperKey(): string;\n getPaginationDataKey(): string;\n processPaginatedResponse<T>(response: TResponse): IProcessedPaginatedResponse<T>;\n getApiOptions(): TApiOptions;\n}\n\nfunction getSetupConfig<M extends Model, E = {}>(ModelClass: new () => M, setup?: ISetup<M, E>): ISetupConfig {\n const getUri = defineUri(ModelClass, setup);\n const getApiUrl = defineApiUrl(setup);\n\n function buildFullUrl(...segments: string[]): string {\n const apiUrl = getApiUrl();\n const uri = getUri();\n const concatenated = [apiUrl, uri, ...segments].join('/');\n const trimmed = (setup?.trimSlashes ?? true)\n ? concatenated.replace(/([^:]\\/)\\/+/g, '$1')\n : concatenated;\n\n return trimmed\n .replace(/^\\/*/gi, '')\n .replace(/\\/*$/gi, '');\n }\n\n function processPaginatedResponse<T>(response: TResponse): IProcessedPaginatedResponse<T> {\n const paginationTemplate: IPaginationSetup | undefined = setup?.pagination ?? apiConfig.pagination;\n const dataWrapperKey = getPaginationDataKey();\n const data = response[dataWrapperKey].map((data: any) => createInstance(ModelClass, data));\n\n if (paginationTemplate) {\n if (paginationTemplate.mapper) {\n return {\n data,\n pagination: paginationTemplate.mapper(response),\n };\n }\n\n const pagination = paginationTemplate.paginationWrapper\n ? response[paginationTemplate.paginationWrapper]\n : response.pagination;\n\n return {\n data,\n pagination: {\n currentPage: pagination[paginationTemplate.currentPage ?? 'currentPage'],\n lastPage: pagination[paginationTemplate.lastPage ?? 'lastPage'],\n perPage: pagination[paginationTemplate.perPage ?? 'perPage'],\n total: pagination[paginationTemplate.total ?? 'total'],\n },\n };\n }\n\n return {\n data: response.data,\n pagination: response.pagination,\n };\n }\n\n function getPaginationDataKey(): string {\n return setup?.pagination?.dataWrapper ?? apiConfig.pagination?.dataWrapper ?? 'data';\n }\n\n function getPaginationWrapperKey(): string {\n return setup?.pagination?.paginationWrapper ?? apiConfig.pagination?.paginationWrapper ?? 'pagination';\n }\n\n function getApiOptions(): TApiOptions {\n return setup?.options ?? {};\n }\n\n return {\n getUri,\n getApiUrl,\n buildFullUrl,\n processPaginatedResponse,\n getPaginationDataKey,\n getPaginationWrapperKey,\n getApiOptions,\n };\n}\n\nfunction getConfigHeaders(): HeadersInit {\n if (apiConfig.headers) {\n return typeof apiConfig.headers === 'function'\n ? apiConfig.headers()\n : apiConfig.headers;\n }\n return {};\n}\n\nexport function buildOptions(...options: TApiOptions[]): TApiOptions {\n const mergedOptions: TApiOptions = {};\n deepMerge(mergedOptions, apiConfig?.requestOptions ?? {});\n deepMerge(mergedOptions, {\n headers: {\n 'Accept': 'application/json',\n ...getConfigHeaders(),\n },\n });\n options.forEach((options) => {\n deepMerge(mergedOptions, options);\n });\n return mergedOptions;\n}\n\nfunction getBaseEndpoints<M extends Model>(ModelClass: new () => M, setupConfig: ISetupConfig): ISetupContext<M> {\n function isPaginatedResponse(response: TResponse): boolean {\n const paginationDataKey = setupConfig.getPaginationDataKey();\n const paginationWrapperKey = setupConfig.getPaginationWrapperKey();\n\n return (\n typeof response === 'object' &&\n response !== null &&\n paginationWrapperKey in response &&\n paginationDataKey in response\n );\n }\n\n class ResponseError extends Error {\n public constructor(message: string) {\n super(setupConfig.buildFullUrl() + ': ' + message);\n }\n }\n\n class InvalidResponseError extends ResponseError {\n public constructor(response: Response) {\n super(`Invalid response. Expected pagination object or array, got \"${JSON.stringify(response)}\".`);\n }\n }\n\n return {\n async rawRequest<T = TResponse>(url: string, options: TApiOptions = {}): Promise<T> {\n return await $fetch<T>(setupConfig.buildFullUrl(url), buildOptions(setupConfig.getApiOptions(), options));\n },\n async request<T>(url: string, options?: TApiOptions): Promise<ApiResponse<T>> {\n const response = await this.rawRequest(url, options);\n if (isPaginatedResponse(response)) {\n const processedResponse = setupConfig.processPaginatedResponse<M[]>(response);\n return new PaginatedResponse(\n processedResponse.data.map((item: M) => createInstance(ModelClass, item)),\n processedResponse.pagination,\n ) as ApiResponse<T>;\n } else if (Array.isArray(response)) {\n return new SimpleResponse(response.map((item: M) => createInstance(ModelClass, item))) as ApiResponse<T>;\n }\n throw new InvalidResponseError(response);\n },\n async fetchAll(options?: TApiOptions): Promise<ApiResponse<M[]>> {\n return await this.request('', {\n method: 'GET',\n ...options,\n });\n },\n async fetchOne(id: TIdentifier, options?: TApiOptions): Promise<ApiResponse<M>> {\n return await this.request(id.toString(), {\n method: 'GET',\n ...options,\n });\n },\n async fetchMany(ids: TIdentifier[], options?: TApiOptions): Promise<ApiResponse<M[]>> {\n return await this.request('', {\n method: 'GET',\n ...options,\n body: {\n ids,\n },\n });\n },\n async createOne<Request extends Partial<M>>(data: Request, options?: TApiOptions): Promise<ApiResponse<M>> {\n return await this.request('', {\n method: 'POST',\n ...options,\n body: data,\n });\n },\n async updateOne(id: TIdentifier, data: Partial<M>, options?: TApiOptions): Promise<ApiResponse<M>> {\n return await this.request(id.toString(), {\n method: 'PATCH',\n ...options,\n body: data,\n });\n },\n async updateMany(ids: TIdentifier[], data: Partial<M>, options?: TApiOptions): Promise<ApiResponse<M[]>> {\n return await this.request('', {\n method: 'PATCH',\n ...options,\n body: {\n ids,\n data,\n },\n });\n },\n async deleteOne(id: TIdentifier, options?: TApiOptions): Promise<ApiResponse<null>> {\n return await this.request(id.toString(), {\n method: 'DELETE',\n ...options,\n });\n },\n async deleteMany(ids: TIdentifier[], options?: TApiOptions): Promise<ApiResponse<null>> {\n return await this.request('', {\n method: 'DELETE',\n ...options,\n body: {\n ids,\n },\n });\n },\n };\n}\n\nexport function defineApi<M extends Model, E = {}>(ModelClass: new () => M, setup?: ISetup<M, E>): IApiDefinition<M, E> {\n const setupConfig = getSetupConfig(ModelClass, setup);\n const baseEndpoints = getBaseEndpoints(ModelClass, setupConfig);\n const endpointsWithBaseContext = {} as E;\n\n let setupEndpoints = {} as E;\n if (setup && setup.endpoints) {\n setupEndpoints = setup.endpoints;\n }\n\n Object.keys(setupEndpoints as object).forEach((key: string) => {\n const setupKey = key as keyof typeof setupEndpoints;\n const method = setupEndpoints[setupKey] as TMethod;\n endpointsWithBaseContext[setupKey] = method.bind({\n ...baseEndpoints,\n ...setupEndpoints,\n }) as E[keyof E];\n });\n\n // We must return a named function, so it can be automatically detected in the controller\n return function useApi() {\n return {\n ...baseEndpoints,\n ...endpointsWithBaseContext,\n };\n };\n}\n\nexport const defineApiExportsForTesting = {\n getSetupConfig,\n};\n","import { apiConfig } from '../defineConfig';\n\ninterface ISetup {\n apiUrl?: (() => string) | string;\n}\n\nexport function defineApiUrl<S extends ISetup = ISetup>(setup?: S): () => string {\n if (setup && setup.apiUrl) {\n if (typeof setup.apiUrl === 'function') {\n return setup.apiUrl;\n } else {\n const apiUrl = setup.apiUrl;\n return () => apiUrl;\n }\n }\n\n return () => {\n return apiConfig.apiUrl ?? '';\n };\n}\n","import { kebabCase } from 'lodash';\nimport pluralize from 'pluralize';\n\nexport function getInferredUri(ModelClass: object): string {\n const modelName = (typeof ModelClass === 'function' && ModelClass.prototype !== undefined)\n ? ModelClass.name\n : ModelClass.constructor.name;\n const kebabCaseName = kebabCase(modelName);\n const segments = kebabCaseName.split('-');\n\n if (segments.length > 1) {\n const lastSegment = segments.pop() as string;\n const pluralized = pluralize(lastSegment);\n\n return segments\n .concat(pluralized)\n .join('-');\n }\n\n return pluralize(kebabCaseName);\n}\n","import { getInferredUri } from './getInferredUri';\nimport { Model } from '../Model';\n\ninterface ISetup {\n uri?: (() => string) | string;\n}\n\nexport function defineUri<M extends Model, S extends ISetup>(ModelClass: new (...args: any[]) => M, setup?: S): (() => string) {\n if (setup && setup.uri) {\n if (typeof setup.uri === 'function') {\n return setup.uri;\n } else {\n const uri = setup.uri;\n return () => uri;\n }\n }\n\n return () => getInferredUri(ModelClass);\n}","export interface IPagination {\n currentPage: number;\n lastPage: number;\n perPage: number;\n total: number;\n}\n\nexport abstract class ApiResponse<Data> {\n public _apiResponse = true;\n\n protected data?: Data | null;\n protected pagination?: IPagination;\n\n public abstract isPaginated(): boolean;\n\n public constructor(data?: Data | null, pagination?: IPagination) {\n this.data = data;\n this.pagination = pagination;\n }\n\n public getData(): Data | null | undefined {\n return this.data;\n }\n\n public getPagination(): IPagination | undefined {\n return this.pagination;\n }\n\n public hasData(): boolean {\n return typeof this.data !== 'undefined';\n }\n\n public isDataNull(): boolean {\n return this.data === null;\n }\n\n public hasPagination(): boolean {\n return typeof this.pagination !== 'undefined';\n }\n}\n\nexport class SimpleResponse<Data> extends ApiResponse<Data> {\n public isPaginated(): boolean {\n return false;\n }\n}\n\nexport class PaginatedResponse<Data> extends ApiResponse<Data> {\n public isPaginated(): boolean {\n return true;\n }\n}\n","import { Model, TModelConstructorType } from '../Model';\n\nexport function createInstance<T extends Model, D extends TModelConstructorType<T>>(\n ModelClass: new () => T,\n data?: Partial<D>,\n): T {\n const instance = new ModelClass();\n return typeof data !== 'undefined'\n ? instance.$update(data)\n : instance;\n}\n","export function deepMerge(target: object, source: object): void {\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n const targetKey = key as keyof typeof target;\n const sourceKey = key as keyof typeof source;\n if (\n target.hasOwnProperty(key) &&\n typeof target[targetKey] === 'object' &&\n typeof source[sourceKey] === 'object'\n ) {\n deepMerge(target[targetKey], source[sourceKey]);\n } else {\n target[targetKey] = source[sourceKey];\n }\n }\n }\n}\n","import { Model } from './Model';\nimport { computed, DeepReadonly, readonly, ref, type Ref, toRef } from 'vue';\nimport { defineStore } from 'pinia';\n\nexport interface ISetup<M extends Model, Methods> {\n local?: boolean;\n methods?: Methods & ThisType<IBaseMethods<M> & Methods>;\n}\n\nexport interface IRepositoryDefinition<M extends Model, Methods> {\n (): TRepository<M, Methods>;\n}\n\nexport type TRepository<M extends Model, Methods> =\n & IBaseMethods<M>\n & Methods\n ;\n\ninterface IBaseMethods<M extends Model> {\n items: Ref<Map<string, M>>;\n isEmpty(): boolean;\n isNotEmpty(): boolean;\n count(): number;\n clear(): void;\n set(items: M[]): void;\n add(items: M[] | M): void;\n all(): M[];\n find(id: string): M | null;\n first(): M | null;\n last(): M | null;\n update(item: M, data?: Partial<M>): void;\n update(item: string, data: Partial<M>): void;\n remove(items: (M | string)[] | M | string): void;\n toArray(): M[];\n getWatchable(): Readonly<Ref<ReadonlyMap<string, DeepReadonly<M>>>>;\n}\n\nfunction createCollection<M extends Model>(): IBaseMethods<M> {\n const items = ref(new Map<string, M>()) as Ref<Map<string, M>>;\n return getBaseMethods(items);\n}\n\nfunction createModelStore<M extends Model>(name: string) {\n return defineStore(name, () => {\n return {\n items: new Map<string, M>(),\n };\n });\n}\n\nfunction getBaseMethods<M extends Model>(items: Ref<Map<string, M>>): IBaseMethods<M> {\n const list = computed(() => Array.from(items.value.values()));\n\n return {\n items,\n isEmpty(): boolean {\n return this.count() === 0;\n },\n isNotEmpty(): boolean {\n return this.count() > 0;\n },\n count(): number {\n return items.value.size;\n },\n clear(): void {\n items.value.clear();\n },\n set(models: M[]): void {\n this.clear();\n models.forEach((model: M) => {\n items.value.set(getModelId(model), model);\n });\n },\n add(items: M[] | M) {\n if (Array.isArray(items)) {\n items.forEach((item: M) => this.add(item));\n } else {\n this.items.value.set(getModelId(items), items);\n }\n },\n find(id: string): M | null {\n return items.value.get(id) ?? null;\n },\n all(): M[] {\n return list.value;\n },\n first(): M | null {\n return list.value[0] ?? null;\n },\n last(): M | null {\n return list.value[list.value.length - 1] ?? null;\n },\n update(item: string | M, data?: Partial<M>): void {\n if (typeof data !== 'undefined') {\n const id: string = typeof item === 'object'\n ? getModelId(item)\n : item;\n const existingItem = this.find(id);\n if (existingItem) {\n items.value.set(id, existingItem.$update(data));\n }\n } else {\n const model = item as M;\n const id = getModelId(model);\n const existingItem = this.find(id);\n if (existingItem) {\n items.value.set(id, existingItem.$update(model));\n }\n }\n },\n remove(models: (M | string)[] | M | string): void {\n if (Array.isArray(models)) {\n models.forEach((model: M | string) => this.remove(model));\n } else {\n items.value.delete(\n typeof models === 'object'\n ? getModelId(models)\n : models,\n );\n }\n },\n toArray(): M[] {\n return list.value;\n },\n getWatchable(): Readonly<Ref<ReadonlyMap<string, DeepReadonly<M>>>> {\n return readonly(items);\n },\n };\n}\n\nfunction getModelId<M extends Model>(model: M): string {\n const property = (model.constructor as any).primaryKey;\n return model[property as keyof M] as string;\n}\n\nexport function defineRepository<M extends Model, Methods = {}>(ModelClass: new () => M, setup?: ISetup<M, Methods>): IRepositoryDefinition<M, Methods> {\n let setupMethods = {} as Methods;\n\n if (setup && setup.methods) {\n setupMethods = setup.methods as Methods;\n }\n\n if (setup && setup.local) {\n // We must return a named function, so it can be automatically detected in the controller\n return function useRepository() {\n const collection = createCollection<M>();\n\n return {\n ...collection,\n ...setupMethods,\n };\n };\n }\n\n const useModelStore = createModelStore<M>(ModelClass.name);\n\n // We must return a named function, so it can be automatically detected in the controller\n return function useRepository() {\n const store = useModelStore();\n const items = toRef(store.items) as Ref<Map<string, M>>;\n const baseMethods = getBaseMethods(items);\n\n return {\n ...baseMethods,\n ...setupMethods,\n };\n };\n}\n\nexport const defineRepositoryExportsForTesting = {\n getModelId,\n};\n","import { defineStore } from 'pinia';\nimport { ref } from 'vue';\nimport { IPagination } from './ApiResponse';\n\ninterface IPaginationSetup {\n local?: boolean;\n}\n\ninterface IPaginationDefinition {\n (): IPaginationInstance;\n}\n\nexport interface IPaginationInstance {\n get(): IPagination | null;\n set(pagination: IPagination): void;\n clear(): void;\n}\n\nfunction defineGlobalPagination(name: string): IPaginationDefinition {\n const useStore = defineStore(name + 'Pagination', () => {\n const pagination = ref<IPagination | null>(null);\n\n return {\n pagination,\n };\n });\n\n return function useGlobalPagination() {\n const store = useStore();\n\n function get(): IPagination | null {\n return store.pagination;\n }\n\n function set(pagination: IPagination | null): void {\n store.pagination = pagination;\n }\n\n function clear(): void {\n set(null);\n }\n\n return {\n get,\n set,\n clear,\n };\n }\n}\n\nfunction defineLocalPagination(): IPaginationDefinition {\n return () => {\n const _pagination = ref<IPagination | null>(null);\n\n function get(): IPagination | null {\n return _pagination.value;\n }\n\n function set(pagination: IPagination | null): void {\n _pagination.value = pagination;\n }\n\n function clear(): void {\n set(null);\n }\n\n return {\n get,\n set,\n clear,\n };\n };\n}\n\nexport function definePagination(name: string, setup?: IPaginationSetup): IPaginationDefinition {\n return setup?.local\n ? defineLocalPagination()\n : defineGlobalPagination(name);\n}\n","import { Model } from './Model';\nimport { defineApi, type IApiDefinition, type IBaseModelApi, type TApi, type ISetup as IApiSetup } from './defineApi';\nimport { TOverride } from './utils/types';\nimport { defineRepository, type IRepositoryDefinition, type TRepository, type ISetup as IRepositorySetup } from './defineRepository';\nimport { definePagination, IPaginationInstance } from './definePagination';\n\ntype TAsyncFunction = (...args: any[]) => Promise<any>;\n\ntype TActionsContext<M extends Model, ApiEndpoints, CustomRepositoryMethods, CustomActions> =\n & CustomActions\n & ThisType<CustomActions & ISetupContext<M, ApiEndpoints, CustomRepositoryMethods>>\n ;\n\ntype TController<M extends Model, ApiEndpoints, RepositoryMethods, CustomActions> =\n & IBaseController<M, ApiEndpoints, RepositoryMethods>\n & CustomActions\n & TOverride<IBaseModelApi<M>, CustomActions>\n & TOverride<ApiEndpoints, CustomActions>\n ;\n\ntype TReactionsTree<ApiEndpoints> = {\n [K in keyof ApiEndpoints]-?: TReactionFunction;\n};\n\ntype TReactionFunction = (response: any, ...args: any[]) => void;\n\ninterface IBaseController<M extends Model, ApiEndpoints, RepositoryMethods> {\n api: TApi<M, ApiEndpoints>;\n repository: TRepository<M, RepositoryMethods>;\n pagination: IPaginationInstance;\n}\n\ninterface ISetupContext<M extends Model, ApiEndpoints, CustomRepositoryMethods> {\n api: TApi<M, ApiEndpoints>;\n repository: TRepository<M, CustomRepositoryMethods>;\n}\n\ninterface ISetup<M extends Model, ApiEndpoints, RepositoryMethods, CustomActions, Reactions> {\n actions?: TActionsContext<M, ApiEndpoints, RepositoryMethods, CustomActions>;\n reactions?: Reactions;\n api?: IApiSetup<M, ApiEndpoints>;\n repository?: IRepositorySetup<M, RepositoryMethods>;\n}\n\ninterface IControllerDefinition<M extends Model, ApiEndpoints, RepositoryMethods, CustomActions> {\n (): TController<M, ApiEndpoints, RepositoryMethods, CustomActions>;\n}\n\nfunction _defineController<\n M extends Model,\n Reactions extends TReactionsTree<CustomApiEndpoints>,\n CustomApiEndpoints = {},\n CustomRepositoryMethods = {},\n CustomActions = {},\n>(\n ModelClass: new () => M,\n apiDefinition?: IApiDefinition<M, CustomApiEndpoints>,\n repositoryDefinition?: IRepositoryDefinition<M, CustomRepositoryMethods>,\n setup?: ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>,\n): IControllerDefinition<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions> {\n const _useApi = apiDefinition\n ? apiDefinition\n : defineApi<M, CustomApiEndpoints>(ModelClass, setup?.api);\n const _useRepository = repositoryDefinition\n ? repositoryDefinition\n : defineRepository<M, CustomRepositoryMethods>(ModelClass, setup?.repository);\n\n const api = _useApi();\n const baseActions = {} as typeof api;\n const setupActions = setup?.actions ?? {} as CustomActions;\n const setupReactions = setup?.reactions ?? {} as Reactions;\n const usePagination = definePagination(ModelClass.name);\n\n function getResponseData(response: any): any {\n return response._apiResponse\n ? response.getData()\n : response;\n }\n\n return function useController() {\n const repository = _useRepository();\n const pagination = usePagination();\n\n const responseHandlers = {\n fetchAll(response: any): void {\n repository.set(getResponseData(response));\n },\n fetchOne(response: any): void {\n repository.add(getResponseData(response));\n },\n fetchMany(response: any): void {\n repository.add(getResponseData(response));\n },\n createOne(response: any): void {\n repository.add(getResponseData(response));\n },\n updateOne(response: any): void {\n repository.update(getResponseData(response));\n },\n updateMany(models: any): void {\n models.forEach((model: any) => repository.update(model));\n },\n deleteOne(_: any, ...args: any[]): void {\n repository.remove(args[0]);\n },\n deleteMany(_: any, ...args: any[]): void {\n repository.remove(args);\n },\n } as Record<keyof typeof api, (response: any, ...args: any[]) => void>;\n\n Object.keys(api).forEach((key: string) => {\n const endpointKey = key as keyof typeof api;\n\n baseActions[endpointKey] = async function (...args: any[]): Promise<any> {\n const response = await (api[endpointKey] as TAsyncFunction)(...args);\n if (response._apiResponse && response.isPaginated()) {\n pagination.set(response.getPagination() ?? null);\n }\n if (endpointKey in responseHandlers) {\n responseHandlers[endpointKey](response, ...args);\n } else if (endpointKey in setupReactions) {\n (setupReactions[endpointKey as keyof Reactions] as TReactionFunction)(response, ...args);\n }\n return response;\n } as any;\n });\n\n return {\n api,\n repository,\n pagination,\n ...baseActions,\n ...setupActions,\n };\n };\n}\n\nfunction defineController<\n M extends Model,\n Reactions extends TReactionsTree<CustomApiEndpoints>,\n CustomApiEndpoints = {},\n CustomRepositoryMethods = {},\n CustomActions = {},\n>(\n ModelClass: new () => M,\n setup?: ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>,\n): IControllerDefinition<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions>;\nfunction defineController<\n M extends Model,\n Reactions extends TReactionsTree<CustomApiEndpoints>,\n CustomApiEndpoints = {},\n CustomRepositoryMethods = {},\n CustomActions = {},\n>(\n ModelClass: new () => M,\n apiDefinition: IApiDefinition<M, CustomApiEndpoints>,\n setup?: ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>,\n): IControllerDefinition<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions>;\nfunction defineController<\n M extends Model,\n Reactions extends TReactionsTree<CustomApiEndpoints>,\n CustomApiEndpoints = {},\n CustomRepositoryMethods = {},\n CustomActions = {},\n>(\n ModelClass: new () => M,\n repositoryDefinition: IRepositoryDefinition<M, CustomRepositoryMethods>,\n setup?: ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>,\n): IControllerDefinition<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions>;\nfunction defineController<\n M extends Model,\n Reactions extends TReactionsTree<CustomApiEndpoints>,\n CustomApiEndpoints = {},\n CustomRepositoryMethods = {},\n CustomActions = {},\n>(\n ModelClass: new () => M,\n apiDefinition: IApiDefinition<M, CustomApiEndpoints>,\n repositoryDefinition: IRepositoryDefinition<M, CustomRepositoryMethods>,\n setup?: ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>,\n): IControllerDefinition<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions>;\nfunction defineController<\n M extends Model,\n Reactions extends TReactionsTree<CustomApiEndpoints>,\n CustomApiEndpoints = {},\n CustomRepositoryMethods = {},\n CustomActions = {},\n>(\n ModelClass: new () => M,\n apiDefinition?: IApiDefinition<M, CustomApiEndpoints> | ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>,\n repositoryDefinition?: IRepositoryDefinition<M, CustomRepositoryMethods> | ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>,\n setup?: ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>,\n): IControllerDefinition<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions> {\n let _apiDefinition: IApiDefinition<M, CustomApiEndpoints> | undefined;\n let _repositoryDefinition: IRepositoryDefinition<M, CustomRepositoryMethods> | undefined;\n\n if (arguments.length === 4) {\n _apiDefinition = apiDefinition as IApiDefinition<M, CustomApiEndpoints>;\n _repositoryDefinition = repositoryDefinition as IRepositoryDefinition<M, CustomRepositoryMethods>;\n } else if (arguments.length === 3) {\n const functionName = arguments[1].name.toLowerCase();\n const composable = functionName.includes('api')\n ? 'api'\n : 'repository';\n _apiDefinition = composable === 'api'\n ? arguments[1]\n : undefined;\n _repositoryDefinition = composable === 'repository'\n ? arguments[1]\n : undefined;\n setup = arguments[2] as ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>;\n } else if (arguments.length === 2) {\n if (typeof arguments[1] === 'function') {\n const functionName = arguments[1].name.toLowerCase();\n const composable = functionName.includes('api')\n ? 'api'\n : 'repository';\n _apiDefinition = composable === 'api'\n ? arguments[1]\n : undefined;\n _repositoryDefinition = composable === 'repository'\n ? arguments[1]\n : undefined;\n } else {\n setup = arguments[1] as ISetup<M, CustomApiEndpoints, CustomRepositoryMethods, CustomActions, Reactions>;\n }\n }\n\n return _defineController(ModelClass, _apiDefinition, _repositoryDefinition, setup);\n}\n\nexport {\n defineController,\n};\n"],"mappings":"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","names":["data","options","items","defineStore","ref","_a"]}