@devappsnpm/vue-kit 1.0.7 → 1.0.8
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.
- package/dist/config/createVueKit.d.ts.map +1 -1
- package/dist/config/useHttpClient.d.ts +18 -0
- package/dist/config/useHttpClient.d.ts.map +1 -0
- package/dist/index.cjs +19 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/stubs/module/crud/modal/stores/store.ts.stub +1 -2
- package/stubs/module/crud/page/stores/store.ts.stub +1 -2
- package/stubs/module/resource/store.ts.stub +1 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createVueKit.d.ts","sourceRoot":"","sources":["../../src/config/createVueKit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"createVueKit.d.ts","sourceRoot":"","sources":["../../src/config/createVueKit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAazD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HttpClient } from "../core/http/HttpClient";
|
|
2
|
+
/**
|
|
3
|
+
* Stores the global HttpClient instance.
|
|
4
|
+
* Called internally by `createVueKit` — do not call manually.
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export declare function _setHttpClientInstance(http: HttpClient): void;
|
|
8
|
+
/**
|
|
9
|
+
* Returns the globally configured HttpClient instance.
|
|
10
|
+
* Requires that `createVueKit()` has been called in main.ts before use.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // In your store:
|
|
14
|
+
* import { useHttpClient } from '@devappsnpm/vue-kit'
|
|
15
|
+
* export const useCompanyStore = defineCrudStore('company', () => new CompanyService(useHttpClient()))
|
|
16
|
+
*/
|
|
17
|
+
export declare function useHttpClient(): HttpClient;
|
|
18
|
+
//# sourceMappingURL=useHttpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHttpClient.d.ts","sourceRoot":"","sources":["../../src/config/useHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAI1D;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAQ1C"}
|
package/dist/index.cjs
CHANGED
|
@@ -39,7 +39,8 @@ __export(src_exports, {
|
|
|
39
39
|
Pagination: () => Pagination,
|
|
40
40
|
SessionStorageTokenStorage: () => SessionStorageTokenStorage,
|
|
41
41
|
createVueKit: () => createVueKit,
|
|
42
|
-
defineCrudStore: () => defineCrudStore
|
|
42
|
+
defineCrudStore: () => defineCrudStore,
|
|
43
|
+
useHttpClient: () => useHttpClient
|
|
43
44
|
});
|
|
44
45
|
module.exports = __toCommonJS(src_exports);
|
|
45
46
|
|
|
@@ -224,6 +225,20 @@ var HttpClient = class {
|
|
|
224
225
|
}
|
|
225
226
|
};
|
|
226
227
|
|
|
228
|
+
// src/config/useHttpClient.ts
|
|
229
|
+
var _instance = null;
|
|
230
|
+
function _setHttpClientInstance(http) {
|
|
231
|
+
_instance = http;
|
|
232
|
+
}
|
|
233
|
+
function useHttpClient() {
|
|
234
|
+
if (!_instance) {
|
|
235
|
+
throw new Error(
|
|
236
|
+
"[vue-kit] useHttpClient() called before createVueKit(). Make sure to call app.use(createVueKit({ ... })) in your main.ts."
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
return _instance;
|
|
240
|
+
}
|
|
241
|
+
|
|
227
242
|
// src/config/createVueKit.ts
|
|
228
243
|
function createVueKit(config) {
|
|
229
244
|
const httpConfig = { baseURL: config.api.baseURL };
|
|
@@ -231,6 +246,7 @@ function createVueKit(config) {
|
|
|
231
246
|
if (config.api.auth !== void 0) httpConfig.auth = config.api.auth;
|
|
232
247
|
if (config.api.handlers !== void 0) httpConfig.handlers = config.api.handlers;
|
|
233
248
|
const http = new HttpClient(httpConfig);
|
|
249
|
+
_setHttpClientInstance(http);
|
|
234
250
|
return { http, config };
|
|
235
251
|
}
|
|
236
252
|
|
|
@@ -551,6 +567,7 @@ var Form = class {
|
|
|
551
567
|
Pagination,
|
|
552
568
|
SessionStorageTokenStorage,
|
|
553
569
|
createVueKit,
|
|
554
|
-
defineCrudStore
|
|
570
|
+
defineCrudStore,
|
|
571
|
+
useHttpClient
|
|
555
572
|
});
|
|
556
573
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/http/HttpClient.ts","../src/core/http/auth/JwtAuthDriver.ts","../src/core/http/auth/CookieAuthDriver.ts","../src/core/http/auth/LocalStorageTokenStorage.ts","../src/core/http/auth/SessionStorageTokenStorage.ts","../src/core/http/HttpError.ts","../src/core/http/interceptors/response.interceptor.ts","../src/config/createVueKit.ts","../src/core/services/BaseService.ts","../src/core/services/CrudService.ts","../src/core/stores/CrudStore.ts","../src/core/pagination/Pagination.ts","../src/core/forms/Form.ts"],"sourcesContent":["export { createVueKit } from \"./config/createVueKit\";\nexport type { VueKit } from \"./config/createVueKit\";\nexport type { VueKitConfig } from \"./config/VueKitConfig\";\n\nexport { HttpClient } from \"./core/http/HttpClient\";\nexport type { HttpClientConfig } from \"./core/http/HttpClientConfig\";\nexport { HttpError } from \"./core/http/HttpError\";\n\nexport { LocalStorageTokenStorage } from \"./core/http/auth/LocalStorageTokenStorage\";\nexport { SessionStorageTokenStorage } from \"./core/http/auth/SessionStorageTokenStorage\";\nexport type { TokenStorage } from \"./core/http/auth/TokenStorage\";\n\nexport { BaseService } from \"./core/services/BaseService\";\nexport { CrudService } from \"./core/services/CrudService\";\n\nexport { defineCrudStore } from \"./core/stores/CrudStore\";\nexport type { CrudState } from \"./core/stores/BaseStore\";\n\nexport { Form } from \"./core/forms/Form\";\nexport { Pagination } from \"./core/pagination/Pagination\";\n\nexport type {\n ApiResource,\n ApiCollection,\n ApiPaginatedCollection,\n ApiParams,\n ApiErrorResponse,\n} from \"./contracts/api\";\n\nexport type {\n PaginationMeta,\n PaginationLinks,\n PaginationParams,\n} from \"./contracts/pagination\";\n\nexport type {\n AuthConfig,\n AuthDriver,\n TokenStorageConfig,\n CsrfConfig,\n} from \"./contracts/auth\";\n\nexport type { HttpHandlers } from \"./contracts/http\";\n","import axios, { type AxiosInstance } from \"axios\";\n\nimport type { HttpClientConfig } from \"./HttpClientConfig\";\n\nimport { JwtAuthDriver } from \"./auth/JwtAuthDriver\";\n\nimport { CookieAuthDriver } from \"./auth/CookieAuthDriver\";\n\nimport type { AuthDriver } from \"./auth/AuthDriver\";\n\nimport type { TokenStorage } from \"./auth/TokenStorage\";\n\nimport type { TokenStorageConfig } from \"../../contracts/auth\";\n\nimport { LocalStorageTokenStorage } from \"./auth/LocalStorageTokenStorage\";\n\nimport { SessionStorageTokenStorage } from \"./auth/SessionStorageTokenStorage\";\n\nimport { registerResponseInterceptor } from \"./interceptors/response.interceptor\";\n\nexport class HttpClient {\n private readonly client: AxiosInstance;\n\n private readonly authDriver: AuthDriver | undefined;\n\n constructor(config: HttpClientConfig) {\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout ?? 30000,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n\n this.authDriver = this.createAuthDriver(config);\n\n this.authDriver?.configure(this.client);\n\n registerResponseInterceptor(this.client, config.handlers);\n }\n\n private createAuthDriver(config: HttpClientConfig): AuthDriver | undefined {\n const auth = config.auth;\n\n if (!auth || auth.driver === \"none\") {\n return undefined;\n }\n\n if (auth.driver === \"cookie\") {\n return new CookieAuthDriver(auth.csrf);\n }\n\n if (auth.driver === \"jwt\") {\n return new JwtAuthDriver(this.resolveTokenStorage(auth.tokenStorage));\n }\n\n return undefined;\n }\n\n private resolveTokenStorage(\n tokenStorage: TokenStorageConfig | TokenStorage | undefined,\n ): TokenStorage {\n if (tokenStorage && \"get\" in tokenStorage && \"set\" in tokenStorage) {\n return tokenStorage;\n }\n\n const key = tokenStorage?.key ?? \"auth_token\";\n\n if (tokenStorage?.type === \"sessionStorage\") {\n return new SessionStorageTokenStorage(key);\n }\n\n return new LocalStorageTokenStorage(key);\n }\n\n /** Clears whatever authentication state the configured driver holds (token, csrf, etc). */\n clearAuth(): void {\n this.authDriver?.clear();\n }\n\n instance(): AxiosInstance {\n return this.client;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuthDriver } from \"./AuthDriver\";\nimport type { TokenStorage } from \"./TokenStorage\";\n\nexport class JwtAuthDriver implements AuthDriver {\n constructor(private readonly storage: TokenStorage) {}\n\n configure(client: AxiosInstance): void {\n client.interceptors.request.use((config) => {\n const token = this.storage.get();\n\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n\n return config;\n });\n }\n\n clear(): void {\n this.storage.remove();\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuthDriver } from \"./AuthDriver\";\nimport type { CsrfConfig } from \"../../../contracts/auth\";\n\nconst MUTATING_METHODS = new Set([\"post\", \"put\", \"patch\", \"delete\"]);\n\nexport class CookieAuthDriver implements AuthDriver {\n private csrfInitialization: Promise<void> | null = null;\n\n constructor(private readonly csrf?: CsrfConfig) {}\n\n configure(client: AxiosInstance): void {\n client.defaults.withCredentials = true;\n client.defaults.withXSRFToken = true;\n client.defaults.headers.common[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\n if (this.csrf?.enabled) {\n client.interceptors.request.use(async (config) => {\n const method = config.method?.toLowerCase();\n\n if (method && MUTATING_METHODS.has(method)) {\n await this.ensureCsrfCookie(client);\n }\n\n return config;\n });\n }\n }\n\n clear(): void {\n this.csrfInitialization = null;\n }\n\n private ensureCsrfCookie(client: AxiosInstance): Promise<void> {\n if (!this.csrfInitialization) {\n const endpoint = this.csrf?.endpoint ?? \"/sanctum/csrf-cookie\";\n this.csrfInitialization = client.get(endpoint).then(() => undefined);\n }\n\n return this.csrfInitialization;\n }\n}\n","import type { TokenStorage } from \"./TokenStorage\";\n\nexport class LocalStorageTokenStorage implements TokenStorage {\n constructor(private readonly key: string) {}\n\n get(): string | null {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage.getItem(this.key);\n }\n\n set(token: string): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(this.key, token);\n }\n\n remove(): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.removeItem(this.key);\n }\n}\n","import type { TokenStorage } from \"./TokenStorage\";\n\nexport class SessionStorageTokenStorage implements TokenStorage {\n constructor(private readonly key: string) {}\n\n get(): string | null {\n if (typeof sessionStorage === \"undefined\") return null;\n return sessionStorage.getItem(this.key);\n }\n\n set(token: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.setItem(this.key, token);\n }\n\n remove(): void {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.removeItem(this.key);\n }\n}\n","import type { AxiosError } from \"axios\";\nimport type { ApiErrorResponse } from \"../../contracts/api\";\n\nexport class HttpError extends Error {\n readonly status: number | null;\n readonly errors: Record<string, string[]> | undefined;\n readonly response: unknown;\n\n constructor(\n message: string,\n status: number | null,\n errors?: Record<string, string[]>,\n response?: unknown,\n ) {\n super(message);\n this.name = \"HttpError\";\n this.status = status;\n this.errors = errors;\n this.response = response;\n }\n\n static fromAxiosError(error: AxiosError<ApiErrorResponse>): HttpError {\n const status = error.response?.status ?? null;\n const data = error.response?.data;\n\n const message =\n (typeof data === \"object\" && data && \"message\" in data\n ? data.message\n : undefined) ?? error.message ?? \"Unexpected HTTP error.\";\n\n const errors =\n typeof data === \"object\" && data && \"errors\" in data\n ? data.errors\n : undefined;\n\n return new HttpError(message, status, errors, error.response);\n }\n}\n","import type { AxiosError, AxiosInstance } from \"axios\";\nimport type { HttpHandlers } from \"../../../contracts/http\";\nimport type { ApiErrorResponse } from \"../../../contracts/api\";\nimport { HttpError } from \"../HttpError\";\n\nexport function registerResponseInterceptor(\n client: AxiosInstance,\n handlers?: HttpHandlers,\n): void {\n client.interceptors.response.use(\n (response) => response,\n (error: AxiosError<ApiErrorResponse>) => {\n const httpError = HttpError.fromAxiosError(error);\n\n if (httpError.status === 401) {\n handlers?.onUnauthorized?.();\n }\n\n return Promise.reject(httpError);\n },\n );\n}\n","import { HttpClient } from \"../core/http/HttpClient\";\nimport type { HttpClientConfig } from \"../core/http/HttpClientConfig\";\nimport type { VueKitConfig } from \"./VueKitConfig\";\n\nexport interface VueKit {\n http: HttpClient;\n config: VueKitConfig;\n}\n\nexport function createVueKit(config: VueKitConfig): VueKit {\n const httpConfig: HttpClientConfig = { baseURL: config.api.baseURL };\n\n if (config.api.timeout !== undefined) httpConfig.timeout = config.api.timeout;\n if (config.api.auth !== undefined) httpConfig.auth = config.api.auth;\n if (config.api.handlers !== undefined) httpConfig.handlers = config.api.handlers;\n\n const http = new HttpClient(httpConfig);\n\n return { http, config };\n}\n","import type { AxiosResponse } from \"axios\";\nimport type { HttpClient } from \"../http/HttpClient\";\nimport type { ApiParams } from \"../../contracts/api\";\n\n/**\n * Base class for all application services.\n * Services that extend BaseService never import Axios directly.\n */\nexport class BaseService {\n constructor(protected readonly http: HttpClient) {}\n\n protected get<T>(\n url: string,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().get<T>(url, { params });\n }\n\n protected post<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().post<T>(url, data, { params });\n }\n\n protected put<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().put<T>(url, data, { params });\n }\n\n protected patch<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().patch<T>(url, data, { params });\n }\n\n protected delete<T>(\n url: string,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().delete<T>(url, { params });\n }\n}\n","import type { HttpClient } from \"../http/HttpClient\";\nimport type {\n ApiResource,\n ApiPaginatedCollection,\n ApiParams,\n} from \"../../contracts/api\";\nimport type { PaginationParams } from \"../../contracts/pagination\";\nimport { BaseService } from \"./BaseService\";\n\n/**\n * Generic CRUD service for resources exposed by a Laravel REST API.\n *\n * @example\n * class CustomerService extends CrudService<Customer> {\n * constructor(http: HttpClient) {\n * super(http, '/customers')\n * }\n * }\n */\nexport class CrudService<T> extends BaseService {\n constructor(\n http: HttpClient,\n protected readonly resourcePath: string,\n ) {\n super(http);\n }\n\n /** GET /resource — paginated list */\n async index(\n params?: PaginationParams & ApiParams,\n ): Promise<ApiPaginatedCollection<T>> {\n const response = await this.get<ApiPaginatedCollection<T>>(\n this.resourcePath,\n params,\n );\n return response.data;\n }\n\n /** GET /resource/:id */\n async show(id: string | number, params?: ApiParams): Promise<ApiResource<T>> {\n const response = await this.get<ApiResource<T>>(\n `${this.resourcePath}/${id}`,\n params,\n );\n return response.data;\n }\n\n /** POST /resource */\n async store(data: unknown): Promise<ApiResource<T>> {\n const response = await this.post<ApiResource<T>>(this.resourcePath, data);\n return response.data;\n }\n\n /** PUT /resource/:id */\n async update(id: string | number, data: unknown): Promise<ApiResource<T>> {\n const response = await this.put<ApiResource<T>>(\n `${this.resourcePath}/${id}`,\n data,\n );\n return response.data;\n }\n\n /** DELETE /resource/:id */\n async destroy(id: string | number): Promise<void> {\n await this.delete(`${this.resourcePath}/${id}`);\n }\n}\n","import { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\nimport type { CrudService } from \"../services/CrudService\";\nimport type { ApiParams } from \"../../contracts/api\";\nimport type { PaginationParams } from \"../../contracts/pagination\";\nimport { Pagination } from \"../pagination/Pagination\";\nimport { HttpError } from \"../http/HttpError\";\n\n/**\n * Factory that creates a fully-typed Pinia Composition-API store for CRUD operations.\n *\n * @example\n * export const useCustomerStore = defineCrudStore('customer', () => customerService)\n */\nexport function defineCrudStore<T extends { uuid: string }>(\n id: string,\n serviceFactory: () => CrudService<T>,\n) {\n return defineStore(id, () => {\n const service = serviceFactory();\n\n const items = ref<T[]>([]) as import(\"vue\").Ref<T[]>;\n const item = ref<T | null>(null) as import(\"vue\").Ref<T | null>;\n const loading = ref(false);\n const saving = ref(false);\n const deleting = ref(false);\n const error = ref<string | null>(null);\n const pagination = ref<Pagination | null>(null);\n\n function setError(err: unknown): void {\n if (err instanceof HttpError) {\n error.value = err.message;\n } else if (err instanceof Error) {\n error.value = err.message;\n } else {\n error.value = \"An unexpected error occurred.\";\n }\n }\n\n async function fetchAll(\n params?: PaginationParams & ApiParams,\n ): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const result = await service.index(params);\n items.value = result.data;\n pagination.value = new Pagination(result.meta, result.links);\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n loading.value = false;\n }\n }\n\n async function fetchOne(id: string | number): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const result = await service.show(id);\n item.value = result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n loading.value = false;\n }\n }\n\n async function create(data: unknown): Promise<T> {\n saving.value = true;\n error.value = null;\n\n try {\n const result = await service.store(data);\n return result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n saving.value = false;\n }\n }\n\n async function update(id: string | number, data: unknown): Promise<T> {\n saving.value = true;\n error.value = null;\n\n try {\n const result = await service.update(id, data);\n return result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n saving.value = false;\n }\n }\n\n async function remove(id: string | number): Promise<void> {\n deleting.value = true;\n error.value = null;\n\n try {\n await service.destroy(id);\n items.value = items.value.filter((i) => i.uuid !== id);\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n deleting.value = false;\n }\n }\n\n function $reset(): void {\n items.value = [];\n item.value = null;\n loading.value = false;\n saving.value = false;\n deleting.value = false;\n error.value = null;\n pagination.value = null;\n }\n\n return {\n items,\n item,\n loading,\n saving,\n deleting,\n error,\n pagination,\n fetchAll,\n fetchOne,\n create,\n update,\n remove,\n $reset,\n };\n });\n}\n","import type { PaginationMeta, PaginationLinks } from \"../../contracts/pagination\";\n\n/**\n * Immutable value-object that wraps Laravel pagination meta + links\n * and exposes derived helpers.\n */\nexport class Pagination {\n readonly meta: PaginationMeta;\n readonly links: PaginationLinks;\n\n constructor(meta: PaginationMeta, links: PaginationLinks) {\n this.meta = meta;\n this.links = links;\n }\n\n get currentPage(): number {\n return this.meta.current_page;\n }\n\n get lastPage(): number {\n return this.meta.last_page;\n }\n\n get perPage(): number {\n return this.meta.per_page;\n }\n\n get total(): number {\n return this.meta.total;\n }\n\n get from(): number | null {\n return this.meta.from;\n }\n\n get to(): number | null {\n return this.meta.to;\n }\n\n get isFirstPage(): boolean {\n return this.meta.current_page === 1;\n }\n\n get isLastPage(): boolean {\n return this.meta.current_page === this.meta.last_page;\n }\n\n get hasPrevPage(): boolean {\n return this.links.prev !== null;\n }\n\n get hasNextPage(): boolean {\n return this.links.next !== null;\n }\n\n /** Total number of pages. */\n get pageCount(): number {\n return this.meta.last_page;\n }\n\n /** Array of page numbers for rendering a paginator UI. */\n pages(): number[] {\n return Array.from({ length: this.meta.last_page }, (_, i) => i + 1);\n }\n\n /** Build the next page params or null if on last page. */\n nextPageParams(): { page: number } | null {\n if (this.isLastPage) return null;\n return { page: this.meta.current_page + 1 };\n }\n\n /** Build the prev page params or null if on first page. */\n prevPageParams(): { page: number } | null {\n if (this.isFirstPage) return null;\n return { page: this.meta.current_page - 1 };\n }\n}\n","import { HttpError } from \"../http/HttpError\";\n\ntype FormErrors<T extends object> = Partial<Record<keyof T, string>>;\n\ntype SubmitCallback<T extends object> = (data: T) => Promise<unknown>;\n\n/**\n * Generic form abstraction with error handling compatible with Laravel 422 responses.\n *\n * @example\n * const form = new Form({ name: '', email: '' })\n * await form.submit(() => service.store(form.data))\n * if (form.errors.name) { ... }\n */\nexport class Form<T extends object> {\n data: T;\n errors: FormErrors<T> = {};\n processing = false;\n success = false;\n\n private readonly _initial: T;\n\n constructor(initialData: T) {\n this._initial = { ...initialData };\n this.data = { ...initialData };\n }\n\n async submit(callback: SubmitCallback<T>): Promise<void> {\n this.processing = true;\n this.success = false;\n this.clearErrors();\n\n try {\n await callback(this.data);\n this.success = true;\n } catch (error) {\n if (error instanceof HttpError && error.status === 422 && error.errors) {\n this.setErrors(error.errors as Record<keyof T, string[]>);\n } else {\n throw error;\n }\n } finally {\n this.processing = false;\n }\n }\n\n reset(): void {\n this.data = { ...this._initial };\n this.clearErrors();\n this.success = false;\n this.processing = false;\n }\n\n resetField(field: keyof T): void {\n (this.data as Record<keyof T, unknown>)[field] = (\n this._initial as Record<keyof T, unknown>\n )[field];\n this.clearError(field);\n }\n\n clearErrors(): void {\n this.errors = {};\n }\n\n clearError(field: keyof T): void {\n const updated = { ...this.errors };\n delete updated[field];\n this.errors = updated;\n }\n\n /**\n * Accepts Laravel-style error bags: `{ field: ['msg1', 'msg2'] }`.\n * Only the first message per field is stored.\n */\n setErrors(errors: Record<string, string[]>): void {\n const mapped: FormErrors<T> = {};\n\n for (const [field, messages] of Object.entries(errors)) {\n const key = field as keyof T;\n const first = messages[0];\n if (first !== undefined) {\n mapped[key] = first;\n }\n }\n\n this.errors = mapped;\n }\n\n /** True when the form has any validation error. */\n get hasErrors(): boolean {\n return Object.keys(this.errors).length > 0;\n }\n}\n"],"mappings":"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","names":["axios","id"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/http/HttpClient.ts","../src/core/http/auth/JwtAuthDriver.ts","../src/core/http/auth/CookieAuthDriver.ts","../src/core/http/auth/LocalStorageTokenStorage.ts","../src/core/http/auth/SessionStorageTokenStorage.ts","../src/core/http/HttpError.ts","../src/core/http/interceptors/response.interceptor.ts","../src/config/useHttpClient.ts","../src/config/createVueKit.ts","../src/core/services/BaseService.ts","../src/core/services/CrudService.ts","../src/core/stores/CrudStore.ts","../src/core/pagination/Pagination.ts","../src/core/forms/Form.ts"],"sourcesContent":["export { createVueKit } from \"./config/createVueKit\";\nexport type { VueKit } from \"./config/createVueKit\";\nexport type { VueKitConfig } from \"./config/VueKitConfig\";\nexport { useHttpClient } from \"./config/useHttpClient\";\n\n\nexport { HttpClient } from \"./core/http/HttpClient\";\nexport type { HttpClientConfig } from \"./core/http/HttpClientConfig\";\nexport { HttpError } from \"./core/http/HttpError\";\n\nexport { LocalStorageTokenStorage } from \"./core/http/auth/LocalStorageTokenStorage\";\nexport { SessionStorageTokenStorage } from \"./core/http/auth/SessionStorageTokenStorage\";\nexport type { TokenStorage } from \"./core/http/auth/TokenStorage\";\n\nexport { BaseService } from \"./core/services/BaseService\";\nexport { CrudService } from \"./core/services/CrudService\";\n\nexport { defineCrudStore } from \"./core/stores/CrudStore\";\nexport type { CrudState } from \"./core/stores/BaseStore\";\n\nexport { Form } from \"./core/forms/Form\";\nexport { Pagination } from \"./core/pagination/Pagination\";\n\nexport type {\n ApiResource,\n ApiCollection,\n ApiPaginatedCollection,\n ApiParams,\n ApiErrorResponse,\n} from \"./contracts/api\";\n\nexport type {\n PaginationMeta,\n PaginationLinks,\n PaginationParams,\n} from \"./contracts/pagination\";\n\nexport type {\n AuthConfig,\n AuthDriver,\n TokenStorageConfig,\n CsrfConfig,\n} from \"./contracts/auth\";\n\nexport type { HttpHandlers } from \"./contracts/http\";\n","import axios, { type AxiosInstance } from \"axios\";\n\nimport type { HttpClientConfig } from \"./HttpClientConfig\";\n\nimport { JwtAuthDriver } from \"./auth/JwtAuthDriver\";\n\nimport { CookieAuthDriver } from \"./auth/CookieAuthDriver\";\n\nimport type { AuthDriver } from \"./auth/AuthDriver\";\n\nimport type { TokenStorage } from \"./auth/TokenStorage\";\n\nimport type { TokenStorageConfig } from \"../../contracts/auth\";\n\nimport { LocalStorageTokenStorage } from \"./auth/LocalStorageTokenStorage\";\n\nimport { SessionStorageTokenStorage } from \"./auth/SessionStorageTokenStorage\";\n\nimport { registerResponseInterceptor } from \"./interceptors/response.interceptor\";\n\nexport class HttpClient {\n private readonly client: AxiosInstance;\n\n private readonly authDriver: AuthDriver | undefined;\n\n constructor(config: HttpClientConfig) {\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout ?? 30000,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n\n this.authDriver = this.createAuthDriver(config);\n\n this.authDriver?.configure(this.client);\n\n registerResponseInterceptor(this.client, config.handlers);\n }\n\n private createAuthDriver(config: HttpClientConfig): AuthDriver | undefined {\n const auth = config.auth;\n\n if (!auth || auth.driver === \"none\") {\n return undefined;\n }\n\n if (auth.driver === \"cookie\") {\n return new CookieAuthDriver(auth.csrf);\n }\n\n if (auth.driver === \"jwt\") {\n return new JwtAuthDriver(this.resolveTokenStorage(auth.tokenStorage));\n }\n\n return undefined;\n }\n\n private resolveTokenStorage(\n tokenStorage: TokenStorageConfig | TokenStorage | undefined,\n ): TokenStorage {\n if (tokenStorage && \"get\" in tokenStorage && \"set\" in tokenStorage) {\n return tokenStorage;\n }\n\n const key = tokenStorage?.key ?? \"auth_token\";\n\n if (tokenStorage?.type === \"sessionStorage\") {\n return new SessionStorageTokenStorage(key);\n }\n\n return new LocalStorageTokenStorage(key);\n }\n\n /** Clears whatever authentication state the configured driver holds (token, csrf, etc). */\n clearAuth(): void {\n this.authDriver?.clear();\n }\n\n instance(): AxiosInstance {\n return this.client;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuthDriver } from \"./AuthDriver\";\nimport type { TokenStorage } from \"./TokenStorage\";\n\nexport class JwtAuthDriver implements AuthDriver {\n constructor(private readonly storage: TokenStorage) {}\n\n configure(client: AxiosInstance): void {\n client.interceptors.request.use((config) => {\n const token = this.storage.get();\n\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n\n return config;\n });\n }\n\n clear(): void {\n this.storage.remove();\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuthDriver } from \"./AuthDriver\";\nimport type { CsrfConfig } from \"../../../contracts/auth\";\n\nconst MUTATING_METHODS = new Set([\"post\", \"put\", \"patch\", \"delete\"]);\n\nexport class CookieAuthDriver implements AuthDriver {\n private csrfInitialization: Promise<void> | null = null;\n\n constructor(private readonly csrf?: CsrfConfig) {}\n\n configure(client: AxiosInstance): void {\n client.defaults.withCredentials = true;\n client.defaults.withXSRFToken = true;\n client.defaults.headers.common[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\n if (this.csrf?.enabled) {\n client.interceptors.request.use(async (config) => {\n const method = config.method?.toLowerCase();\n\n if (method && MUTATING_METHODS.has(method)) {\n await this.ensureCsrfCookie(client);\n }\n\n return config;\n });\n }\n }\n\n clear(): void {\n this.csrfInitialization = null;\n }\n\n private ensureCsrfCookie(client: AxiosInstance): Promise<void> {\n if (!this.csrfInitialization) {\n const endpoint = this.csrf?.endpoint ?? \"/sanctum/csrf-cookie\";\n this.csrfInitialization = client.get(endpoint).then(() => undefined);\n }\n\n return this.csrfInitialization;\n }\n}\n","import type { TokenStorage } from \"./TokenStorage\";\n\nexport class LocalStorageTokenStorage implements TokenStorage {\n constructor(private readonly key: string) {}\n\n get(): string | null {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage.getItem(this.key);\n }\n\n set(token: string): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(this.key, token);\n }\n\n remove(): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.removeItem(this.key);\n }\n}\n","import type { TokenStorage } from \"./TokenStorage\";\n\nexport class SessionStorageTokenStorage implements TokenStorage {\n constructor(private readonly key: string) {}\n\n get(): string | null {\n if (typeof sessionStorage === \"undefined\") return null;\n return sessionStorage.getItem(this.key);\n }\n\n set(token: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.setItem(this.key, token);\n }\n\n remove(): void {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.removeItem(this.key);\n }\n}\n","import type { AxiosError } from \"axios\";\nimport type { ApiErrorResponse } from \"../../contracts/api\";\n\nexport class HttpError extends Error {\n readonly status: number | null;\n readonly errors: Record<string, string[]> | undefined;\n readonly response: unknown;\n\n constructor(\n message: string,\n status: number | null,\n errors?: Record<string, string[]>,\n response?: unknown,\n ) {\n super(message);\n this.name = \"HttpError\";\n this.status = status;\n this.errors = errors;\n this.response = response;\n }\n\n static fromAxiosError(error: AxiosError<ApiErrorResponse>): HttpError {\n const status = error.response?.status ?? null;\n const data = error.response?.data;\n\n const message =\n (typeof data === \"object\" && data && \"message\" in data\n ? data.message\n : undefined) ?? error.message ?? \"Unexpected HTTP error.\";\n\n const errors =\n typeof data === \"object\" && data && \"errors\" in data\n ? data.errors\n : undefined;\n\n return new HttpError(message, status, errors, error.response);\n }\n}\n","import type { AxiosError, AxiosInstance } from \"axios\";\nimport type { HttpHandlers } from \"../../../contracts/http\";\nimport type { ApiErrorResponse } from \"../../../contracts/api\";\nimport { HttpError } from \"../HttpError\";\n\nexport function registerResponseInterceptor(\n client: AxiosInstance,\n handlers?: HttpHandlers,\n): void {\n client.interceptors.response.use(\n (response) => response,\n (error: AxiosError<ApiErrorResponse>) => {\n const httpError = HttpError.fromAxiosError(error);\n\n if (httpError.status === 401) {\n handlers?.onUnauthorized?.();\n }\n\n return Promise.reject(httpError);\n },\n );\n}\n","import type { HttpClient } from \"../core/http/HttpClient\";\n\nlet _instance: HttpClient | null = null;\n\n/**\n * Stores the global HttpClient instance.\n * Called internally by `createVueKit` — do not call manually.\n * @internal\n */\nexport function _setHttpClientInstance(http: HttpClient): void {\n _instance = http;\n}\n\n/**\n * Returns the globally configured HttpClient instance.\n * Requires that `createVueKit()` has been called in main.ts before use.\n *\n * @example\n * // In your store:\n * import { useHttpClient } from '@devappsnpm/vue-kit'\n * export const useCompanyStore = defineCrudStore('company', () => new CompanyService(useHttpClient()))\n */\nexport function useHttpClient(): HttpClient {\n if (!_instance) {\n throw new Error(\n \"[vue-kit] useHttpClient() called before createVueKit(). \" +\n \"Make sure to call app.use(createVueKit({ ... })) in your main.ts.\"\n );\n }\n return _instance;\n}\n","import { HttpClient } from \"../core/http/HttpClient\";\nimport type { HttpClientConfig } from \"../core/http/HttpClientConfig\";\nimport type { VueKitConfig } from \"./VueKitConfig\";\nimport { _setHttpClientInstance } from \"./useHttpClient\";\n\nexport interface VueKit {\n http: HttpClient;\n config: VueKitConfig;\n}\n\nexport function createVueKit(config: VueKitConfig): VueKit {\n const httpConfig: HttpClientConfig = { baseURL: config.api.baseURL };\n\n if (config.api.timeout !== undefined) httpConfig.timeout = config.api.timeout;\n if (config.api.auth !== undefined) httpConfig.auth = config.api.auth;\n if (config.api.handlers !== undefined) httpConfig.handlers = config.api.handlers;\n\n const http = new HttpClient(httpConfig);\n\n // Store globally so useHttpClient() works in stores/services\n _setHttpClientInstance(http);\n\n return { http, config };\n}\n","import type { AxiosResponse } from \"axios\";\nimport type { HttpClient } from \"../http/HttpClient\";\nimport type { ApiParams } from \"../../contracts/api\";\n\n/**\n * Base class for all application services.\n * Services that extend BaseService never import Axios directly.\n */\nexport class BaseService {\n constructor(protected readonly http: HttpClient) {}\n\n protected get<T>(\n url: string,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().get<T>(url, { params });\n }\n\n protected post<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().post<T>(url, data, { params });\n }\n\n protected put<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().put<T>(url, data, { params });\n }\n\n protected patch<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().patch<T>(url, data, { params });\n }\n\n protected delete<T>(\n url: string,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().delete<T>(url, { params });\n }\n}\n","import type { HttpClient } from \"../http/HttpClient\";\nimport type {\n ApiResource,\n ApiPaginatedCollection,\n ApiParams,\n} from \"../../contracts/api\";\nimport type { PaginationParams } from \"../../contracts/pagination\";\nimport { BaseService } from \"./BaseService\";\n\n/**\n * Generic CRUD service for resources exposed by a Laravel REST API.\n *\n * @example\n * class CustomerService extends CrudService<Customer> {\n * constructor(http: HttpClient) {\n * super(http, '/customers')\n * }\n * }\n */\nexport class CrudService<T> extends BaseService {\n constructor(\n http: HttpClient,\n protected readonly resourcePath: string,\n ) {\n super(http);\n }\n\n /** GET /resource — paginated list */\n async index(\n params?: PaginationParams & ApiParams,\n ): Promise<ApiPaginatedCollection<T>> {\n const response = await this.get<ApiPaginatedCollection<T>>(\n this.resourcePath,\n params,\n );\n return response.data;\n }\n\n /** GET /resource/:id */\n async show(id: string | number, params?: ApiParams): Promise<ApiResource<T>> {\n const response = await this.get<ApiResource<T>>(\n `${this.resourcePath}/${id}`,\n params,\n );\n return response.data;\n }\n\n /** POST /resource */\n async store(data: unknown): Promise<ApiResource<T>> {\n const response = await this.post<ApiResource<T>>(this.resourcePath, data);\n return response.data;\n }\n\n /** PUT /resource/:id */\n async update(id: string | number, data: unknown): Promise<ApiResource<T>> {\n const response = await this.put<ApiResource<T>>(\n `${this.resourcePath}/${id}`,\n data,\n );\n return response.data;\n }\n\n /** DELETE /resource/:id */\n async destroy(id: string | number): Promise<void> {\n await this.delete(`${this.resourcePath}/${id}`);\n }\n}\n","import { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\nimport type { CrudService } from \"../services/CrudService\";\nimport type { ApiParams } from \"../../contracts/api\";\nimport type { PaginationParams } from \"../../contracts/pagination\";\nimport { Pagination } from \"../pagination/Pagination\";\nimport { HttpError } from \"../http/HttpError\";\n\n/**\n * Factory that creates a fully-typed Pinia Composition-API store for CRUD operations.\n *\n * @example\n * export const useCustomerStore = defineCrudStore('customer', () => customerService)\n */\nexport function defineCrudStore<T extends { uuid: string }>(\n id: string,\n serviceFactory: () => CrudService<T>,\n) {\n return defineStore(id, () => {\n const service = serviceFactory();\n\n const items = ref<T[]>([]) as import(\"vue\").Ref<T[]>;\n const item = ref<T | null>(null) as import(\"vue\").Ref<T | null>;\n const loading = ref(false);\n const saving = ref(false);\n const deleting = ref(false);\n const error = ref<string | null>(null);\n const pagination = ref<Pagination | null>(null);\n\n function setError(err: unknown): void {\n if (err instanceof HttpError) {\n error.value = err.message;\n } else if (err instanceof Error) {\n error.value = err.message;\n } else {\n error.value = \"An unexpected error occurred.\";\n }\n }\n\n async function fetchAll(\n params?: PaginationParams & ApiParams,\n ): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const result = await service.index(params);\n items.value = result.data;\n pagination.value = new Pagination(result.meta, result.links);\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n loading.value = false;\n }\n }\n\n async function fetchOne(id: string | number): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const result = await service.show(id);\n item.value = result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n loading.value = false;\n }\n }\n\n async function create(data: unknown): Promise<T> {\n saving.value = true;\n error.value = null;\n\n try {\n const result = await service.store(data);\n return result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n saving.value = false;\n }\n }\n\n async function update(id: string | number, data: unknown): Promise<T> {\n saving.value = true;\n error.value = null;\n\n try {\n const result = await service.update(id, data);\n return result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n saving.value = false;\n }\n }\n\n async function remove(id: string | number): Promise<void> {\n deleting.value = true;\n error.value = null;\n\n try {\n await service.destroy(id);\n items.value = items.value.filter((i) => i.uuid !== id);\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n deleting.value = false;\n }\n }\n\n function $reset(): void {\n items.value = [];\n item.value = null;\n loading.value = false;\n saving.value = false;\n deleting.value = false;\n error.value = null;\n pagination.value = null;\n }\n\n return {\n items,\n item,\n loading,\n saving,\n deleting,\n error,\n pagination,\n fetchAll,\n fetchOne,\n create,\n update,\n remove,\n $reset,\n };\n });\n}\n","import type { PaginationMeta, PaginationLinks } from \"../../contracts/pagination\";\n\n/**\n * Immutable value-object that wraps Laravel pagination meta + links\n * and exposes derived helpers.\n */\nexport class Pagination {\n readonly meta: PaginationMeta;\n readonly links: PaginationLinks;\n\n constructor(meta: PaginationMeta, links: PaginationLinks) {\n this.meta = meta;\n this.links = links;\n }\n\n get currentPage(): number {\n return this.meta.current_page;\n }\n\n get lastPage(): number {\n return this.meta.last_page;\n }\n\n get perPage(): number {\n return this.meta.per_page;\n }\n\n get total(): number {\n return this.meta.total;\n }\n\n get from(): number | null {\n return this.meta.from;\n }\n\n get to(): number | null {\n return this.meta.to;\n }\n\n get isFirstPage(): boolean {\n return this.meta.current_page === 1;\n }\n\n get isLastPage(): boolean {\n return this.meta.current_page === this.meta.last_page;\n }\n\n get hasPrevPage(): boolean {\n return this.links.prev !== null;\n }\n\n get hasNextPage(): boolean {\n return this.links.next !== null;\n }\n\n /** Total number of pages. */\n get pageCount(): number {\n return this.meta.last_page;\n }\n\n /** Array of page numbers for rendering a paginator UI. */\n pages(): number[] {\n return Array.from({ length: this.meta.last_page }, (_, i) => i + 1);\n }\n\n /** Build the next page params or null if on last page. */\n nextPageParams(): { page: number } | null {\n if (this.isLastPage) return null;\n return { page: this.meta.current_page + 1 };\n }\n\n /** Build the prev page params or null if on first page. */\n prevPageParams(): { page: number } | null {\n if (this.isFirstPage) return null;\n return { page: this.meta.current_page - 1 };\n }\n}\n","import { HttpError } from \"../http/HttpError\";\n\ntype FormErrors<T extends object> = Partial<Record<keyof T, string>>;\n\ntype SubmitCallback<T extends object> = (data: T) => Promise<unknown>;\n\n/**\n * Generic form abstraction with error handling compatible with Laravel 422 responses.\n *\n * @example\n * const form = new Form({ name: '', email: '' })\n * await form.submit(() => service.store(form.data))\n * if (form.errors.name) { ... }\n */\nexport class Form<T extends object> {\n data: T;\n errors: FormErrors<T> = {};\n processing = false;\n success = false;\n\n private readonly _initial: T;\n\n constructor(initialData: T) {\n this._initial = { ...initialData };\n this.data = { ...initialData };\n }\n\n async submit(callback: SubmitCallback<T>): Promise<void> {\n this.processing = true;\n this.success = false;\n this.clearErrors();\n\n try {\n await callback(this.data);\n this.success = true;\n } catch (error) {\n if (error instanceof HttpError && error.status === 422 && error.errors) {\n this.setErrors(error.errors as Record<keyof T, string[]>);\n } else {\n throw error;\n }\n } finally {\n this.processing = false;\n }\n }\n\n reset(): void {\n this.data = { ...this._initial };\n this.clearErrors();\n this.success = false;\n this.processing = false;\n }\n\n resetField(field: keyof T): void {\n (this.data as Record<keyof T, unknown>)[field] = (\n this._initial as Record<keyof T, unknown>\n )[field];\n this.clearError(field);\n }\n\n clearErrors(): void {\n this.errors = {};\n }\n\n clearError(field: keyof T): void {\n const updated = { ...this.errors };\n delete updated[field];\n this.errors = updated;\n }\n\n /**\n * Accepts Laravel-style error bags: `{ field: ['msg1', 'msg2'] }`.\n * Only the first message per field is stored.\n */\n setErrors(errors: Record<string, string[]>): void {\n const mapped: FormErrors<T> = {};\n\n for (const [field, messages] of Object.entries(errors)) {\n const key = field as keyof T;\n const first = messages[0];\n if (first !== undefined) {\n mapped[key] = first;\n }\n }\n\n this.errors = mapped;\n }\n\n /** True when the form has any validation error. */\n get hasErrors(): boolean {\n return Object.keys(this.errors).length > 0;\n }\n}\n"],"mappings":"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","names":["axios","id"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { createVueKit } from "./config/createVueKit";
|
|
2
2
|
export type { VueKit } from "./config/createVueKit";
|
|
3
3
|
export type { VueKitConfig } from "./config/VueKitConfig";
|
|
4
|
+
export { useHttpClient } from "./config/useHttpClient";
|
|
4
5
|
export { HttpClient } from "./core/http/HttpClient";
|
|
5
6
|
export type { HttpClientConfig } from "./core/http/HttpClientConfig";
|
|
6
7
|
export { HttpError } from "./core/http/HttpError";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,YAAY,EACV,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,SAAS,EACT,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -179,6 +179,20 @@ var HttpClient = class {
|
|
|
179
179
|
}
|
|
180
180
|
};
|
|
181
181
|
|
|
182
|
+
// src/config/useHttpClient.ts
|
|
183
|
+
var _instance = null;
|
|
184
|
+
function _setHttpClientInstance(http) {
|
|
185
|
+
_instance = http;
|
|
186
|
+
}
|
|
187
|
+
function useHttpClient() {
|
|
188
|
+
if (!_instance) {
|
|
189
|
+
throw new Error(
|
|
190
|
+
"[vue-kit] useHttpClient() called before createVueKit(). Make sure to call app.use(createVueKit({ ... })) in your main.ts."
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
return _instance;
|
|
194
|
+
}
|
|
195
|
+
|
|
182
196
|
// src/config/createVueKit.ts
|
|
183
197
|
function createVueKit(config) {
|
|
184
198
|
const httpConfig = { baseURL: config.api.baseURL };
|
|
@@ -186,6 +200,7 @@ function createVueKit(config) {
|
|
|
186
200
|
if (config.api.auth !== void 0) httpConfig.auth = config.api.auth;
|
|
187
201
|
if (config.api.handlers !== void 0) httpConfig.handlers = config.api.handlers;
|
|
188
202
|
const http = new HttpClient(httpConfig);
|
|
203
|
+
_setHttpClientInstance(http);
|
|
189
204
|
return { http, config };
|
|
190
205
|
}
|
|
191
206
|
|
|
@@ -505,6 +520,7 @@ export {
|
|
|
505
520
|
Pagination,
|
|
506
521
|
SessionStorageTokenStorage,
|
|
507
522
|
createVueKit,
|
|
508
|
-
defineCrudStore
|
|
523
|
+
defineCrudStore,
|
|
524
|
+
useHttpClient
|
|
509
525
|
};
|
|
510
526
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/http/HttpClient.ts","../src/core/http/auth/JwtAuthDriver.ts","../src/core/http/auth/CookieAuthDriver.ts","../src/core/http/auth/LocalStorageTokenStorage.ts","../src/core/http/auth/SessionStorageTokenStorage.ts","../src/core/http/HttpError.ts","../src/core/http/interceptors/response.interceptor.ts","../src/config/createVueKit.ts","../src/core/services/BaseService.ts","../src/core/services/CrudService.ts","../src/core/stores/CrudStore.ts","../src/core/pagination/Pagination.ts","../src/core/forms/Form.ts"],"sourcesContent":["import axios, { type AxiosInstance } from \"axios\";\n\nimport type { HttpClientConfig } from \"./HttpClientConfig\";\n\nimport { JwtAuthDriver } from \"./auth/JwtAuthDriver\";\n\nimport { CookieAuthDriver } from \"./auth/CookieAuthDriver\";\n\nimport type { AuthDriver } from \"./auth/AuthDriver\";\n\nimport type { TokenStorage } from \"./auth/TokenStorage\";\n\nimport type { TokenStorageConfig } from \"../../contracts/auth\";\n\nimport { LocalStorageTokenStorage } from \"./auth/LocalStorageTokenStorage\";\n\nimport { SessionStorageTokenStorage } from \"./auth/SessionStorageTokenStorage\";\n\nimport { registerResponseInterceptor } from \"./interceptors/response.interceptor\";\n\nexport class HttpClient {\n private readonly client: AxiosInstance;\n\n private readonly authDriver: AuthDriver | undefined;\n\n constructor(config: HttpClientConfig) {\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout ?? 30000,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n\n this.authDriver = this.createAuthDriver(config);\n\n this.authDriver?.configure(this.client);\n\n registerResponseInterceptor(this.client, config.handlers);\n }\n\n private createAuthDriver(config: HttpClientConfig): AuthDriver | undefined {\n const auth = config.auth;\n\n if (!auth || auth.driver === \"none\") {\n return undefined;\n }\n\n if (auth.driver === \"cookie\") {\n return new CookieAuthDriver(auth.csrf);\n }\n\n if (auth.driver === \"jwt\") {\n return new JwtAuthDriver(this.resolveTokenStorage(auth.tokenStorage));\n }\n\n return undefined;\n }\n\n private resolveTokenStorage(\n tokenStorage: TokenStorageConfig | TokenStorage | undefined,\n ): TokenStorage {\n if (tokenStorage && \"get\" in tokenStorage && \"set\" in tokenStorage) {\n return tokenStorage;\n }\n\n const key = tokenStorage?.key ?? \"auth_token\";\n\n if (tokenStorage?.type === \"sessionStorage\") {\n return new SessionStorageTokenStorage(key);\n }\n\n return new LocalStorageTokenStorage(key);\n }\n\n /** Clears whatever authentication state the configured driver holds (token, csrf, etc). */\n clearAuth(): void {\n this.authDriver?.clear();\n }\n\n instance(): AxiosInstance {\n return this.client;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuthDriver } from \"./AuthDriver\";\nimport type { TokenStorage } from \"./TokenStorage\";\n\nexport class JwtAuthDriver implements AuthDriver {\n constructor(private readonly storage: TokenStorage) {}\n\n configure(client: AxiosInstance): void {\n client.interceptors.request.use((config) => {\n const token = this.storage.get();\n\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n\n return config;\n });\n }\n\n clear(): void {\n this.storage.remove();\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuthDriver } from \"./AuthDriver\";\nimport type { CsrfConfig } from \"../../../contracts/auth\";\n\nconst MUTATING_METHODS = new Set([\"post\", \"put\", \"patch\", \"delete\"]);\n\nexport class CookieAuthDriver implements AuthDriver {\n private csrfInitialization: Promise<void> | null = null;\n\n constructor(private readonly csrf?: CsrfConfig) {}\n\n configure(client: AxiosInstance): void {\n client.defaults.withCredentials = true;\n client.defaults.withXSRFToken = true;\n client.defaults.headers.common[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\n if (this.csrf?.enabled) {\n client.interceptors.request.use(async (config) => {\n const method = config.method?.toLowerCase();\n\n if (method && MUTATING_METHODS.has(method)) {\n await this.ensureCsrfCookie(client);\n }\n\n return config;\n });\n }\n }\n\n clear(): void {\n this.csrfInitialization = null;\n }\n\n private ensureCsrfCookie(client: AxiosInstance): Promise<void> {\n if (!this.csrfInitialization) {\n const endpoint = this.csrf?.endpoint ?? \"/sanctum/csrf-cookie\";\n this.csrfInitialization = client.get(endpoint).then(() => undefined);\n }\n\n return this.csrfInitialization;\n }\n}\n","import type { TokenStorage } from \"./TokenStorage\";\n\nexport class LocalStorageTokenStorage implements TokenStorage {\n constructor(private readonly key: string) {}\n\n get(): string | null {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage.getItem(this.key);\n }\n\n set(token: string): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(this.key, token);\n }\n\n remove(): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.removeItem(this.key);\n }\n}\n","import type { TokenStorage } from \"./TokenStorage\";\n\nexport class SessionStorageTokenStorage implements TokenStorage {\n constructor(private readonly key: string) {}\n\n get(): string | null {\n if (typeof sessionStorage === \"undefined\") return null;\n return sessionStorage.getItem(this.key);\n }\n\n set(token: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.setItem(this.key, token);\n }\n\n remove(): void {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.removeItem(this.key);\n }\n}\n","import type { AxiosError } from \"axios\";\nimport type { ApiErrorResponse } from \"../../contracts/api\";\n\nexport class HttpError extends Error {\n readonly status: number | null;\n readonly errors: Record<string, string[]> | undefined;\n readonly response: unknown;\n\n constructor(\n message: string,\n status: number | null,\n errors?: Record<string, string[]>,\n response?: unknown,\n ) {\n super(message);\n this.name = \"HttpError\";\n this.status = status;\n this.errors = errors;\n this.response = response;\n }\n\n static fromAxiosError(error: AxiosError<ApiErrorResponse>): HttpError {\n const status = error.response?.status ?? null;\n const data = error.response?.data;\n\n const message =\n (typeof data === \"object\" && data && \"message\" in data\n ? data.message\n : undefined) ?? error.message ?? \"Unexpected HTTP error.\";\n\n const errors =\n typeof data === \"object\" && data && \"errors\" in data\n ? data.errors\n : undefined;\n\n return new HttpError(message, status, errors, error.response);\n }\n}\n","import type { AxiosError, AxiosInstance } from \"axios\";\nimport type { HttpHandlers } from \"../../../contracts/http\";\nimport type { ApiErrorResponse } from \"../../../contracts/api\";\nimport { HttpError } from \"../HttpError\";\n\nexport function registerResponseInterceptor(\n client: AxiosInstance,\n handlers?: HttpHandlers,\n): void {\n client.interceptors.response.use(\n (response) => response,\n (error: AxiosError<ApiErrorResponse>) => {\n const httpError = HttpError.fromAxiosError(error);\n\n if (httpError.status === 401) {\n handlers?.onUnauthorized?.();\n }\n\n return Promise.reject(httpError);\n },\n );\n}\n","import { HttpClient } from \"../core/http/HttpClient\";\nimport type { HttpClientConfig } from \"../core/http/HttpClientConfig\";\nimport type { VueKitConfig } from \"./VueKitConfig\";\n\nexport interface VueKit {\n http: HttpClient;\n config: VueKitConfig;\n}\n\nexport function createVueKit(config: VueKitConfig): VueKit {\n const httpConfig: HttpClientConfig = { baseURL: config.api.baseURL };\n\n if (config.api.timeout !== undefined) httpConfig.timeout = config.api.timeout;\n if (config.api.auth !== undefined) httpConfig.auth = config.api.auth;\n if (config.api.handlers !== undefined) httpConfig.handlers = config.api.handlers;\n\n const http = new HttpClient(httpConfig);\n\n return { http, config };\n}\n","import type { AxiosResponse } from \"axios\";\nimport type { HttpClient } from \"../http/HttpClient\";\nimport type { ApiParams } from \"../../contracts/api\";\n\n/**\n * Base class for all application services.\n * Services that extend BaseService never import Axios directly.\n */\nexport class BaseService {\n constructor(protected readonly http: HttpClient) {}\n\n protected get<T>(\n url: string,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().get<T>(url, { params });\n }\n\n protected post<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().post<T>(url, data, { params });\n }\n\n protected put<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().put<T>(url, data, { params });\n }\n\n protected patch<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().patch<T>(url, data, { params });\n }\n\n protected delete<T>(\n url: string,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().delete<T>(url, { params });\n }\n}\n","import type { HttpClient } from \"../http/HttpClient\";\nimport type {\n ApiResource,\n ApiPaginatedCollection,\n ApiParams,\n} from \"../../contracts/api\";\nimport type { PaginationParams } from \"../../contracts/pagination\";\nimport { BaseService } from \"./BaseService\";\n\n/**\n * Generic CRUD service for resources exposed by a Laravel REST API.\n *\n * @example\n * class CustomerService extends CrudService<Customer> {\n * constructor(http: HttpClient) {\n * super(http, '/customers')\n * }\n * }\n */\nexport class CrudService<T> extends BaseService {\n constructor(\n http: HttpClient,\n protected readonly resourcePath: string,\n ) {\n super(http);\n }\n\n /** GET /resource — paginated list */\n async index(\n params?: PaginationParams & ApiParams,\n ): Promise<ApiPaginatedCollection<T>> {\n const response = await this.get<ApiPaginatedCollection<T>>(\n this.resourcePath,\n params,\n );\n return response.data;\n }\n\n /** GET /resource/:id */\n async show(id: string | number, params?: ApiParams): Promise<ApiResource<T>> {\n const response = await this.get<ApiResource<T>>(\n `${this.resourcePath}/${id}`,\n params,\n );\n return response.data;\n }\n\n /** POST /resource */\n async store(data: unknown): Promise<ApiResource<T>> {\n const response = await this.post<ApiResource<T>>(this.resourcePath, data);\n return response.data;\n }\n\n /** PUT /resource/:id */\n async update(id: string | number, data: unknown): Promise<ApiResource<T>> {\n const response = await this.put<ApiResource<T>>(\n `${this.resourcePath}/${id}`,\n data,\n );\n return response.data;\n }\n\n /** DELETE /resource/:id */\n async destroy(id: string | number): Promise<void> {\n await this.delete(`${this.resourcePath}/${id}`);\n }\n}\n","import { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\nimport type { CrudService } from \"../services/CrudService\";\nimport type { ApiParams } from \"../../contracts/api\";\nimport type { PaginationParams } from \"../../contracts/pagination\";\nimport { Pagination } from \"../pagination/Pagination\";\nimport { HttpError } from \"../http/HttpError\";\n\n/**\n * Factory that creates a fully-typed Pinia Composition-API store for CRUD operations.\n *\n * @example\n * export const useCustomerStore = defineCrudStore('customer', () => customerService)\n */\nexport function defineCrudStore<T extends { uuid: string }>(\n id: string,\n serviceFactory: () => CrudService<T>,\n) {\n return defineStore(id, () => {\n const service = serviceFactory();\n\n const items = ref<T[]>([]) as import(\"vue\").Ref<T[]>;\n const item = ref<T | null>(null) as import(\"vue\").Ref<T | null>;\n const loading = ref(false);\n const saving = ref(false);\n const deleting = ref(false);\n const error = ref<string | null>(null);\n const pagination = ref<Pagination | null>(null);\n\n function setError(err: unknown): void {\n if (err instanceof HttpError) {\n error.value = err.message;\n } else if (err instanceof Error) {\n error.value = err.message;\n } else {\n error.value = \"An unexpected error occurred.\";\n }\n }\n\n async function fetchAll(\n params?: PaginationParams & ApiParams,\n ): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const result = await service.index(params);\n items.value = result.data;\n pagination.value = new Pagination(result.meta, result.links);\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n loading.value = false;\n }\n }\n\n async function fetchOne(id: string | number): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const result = await service.show(id);\n item.value = result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n loading.value = false;\n }\n }\n\n async function create(data: unknown): Promise<T> {\n saving.value = true;\n error.value = null;\n\n try {\n const result = await service.store(data);\n return result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n saving.value = false;\n }\n }\n\n async function update(id: string | number, data: unknown): Promise<T> {\n saving.value = true;\n error.value = null;\n\n try {\n const result = await service.update(id, data);\n return result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n saving.value = false;\n }\n }\n\n async function remove(id: string | number): Promise<void> {\n deleting.value = true;\n error.value = null;\n\n try {\n await service.destroy(id);\n items.value = items.value.filter((i) => i.uuid !== id);\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n deleting.value = false;\n }\n }\n\n function $reset(): void {\n items.value = [];\n item.value = null;\n loading.value = false;\n saving.value = false;\n deleting.value = false;\n error.value = null;\n pagination.value = null;\n }\n\n return {\n items,\n item,\n loading,\n saving,\n deleting,\n error,\n pagination,\n fetchAll,\n fetchOne,\n create,\n update,\n remove,\n $reset,\n };\n });\n}\n","import type { PaginationMeta, PaginationLinks } from \"../../contracts/pagination\";\n\n/**\n * Immutable value-object that wraps Laravel pagination meta + links\n * and exposes derived helpers.\n */\nexport class Pagination {\n readonly meta: PaginationMeta;\n readonly links: PaginationLinks;\n\n constructor(meta: PaginationMeta, links: PaginationLinks) {\n this.meta = meta;\n this.links = links;\n }\n\n get currentPage(): number {\n return this.meta.current_page;\n }\n\n get lastPage(): number {\n return this.meta.last_page;\n }\n\n get perPage(): number {\n return this.meta.per_page;\n }\n\n get total(): number {\n return this.meta.total;\n }\n\n get from(): number | null {\n return this.meta.from;\n }\n\n get to(): number | null {\n return this.meta.to;\n }\n\n get isFirstPage(): boolean {\n return this.meta.current_page === 1;\n }\n\n get isLastPage(): boolean {\n return this.meta.current_page === this.meta.last_page;\n }\n\n get hasPrevPage(): boolean {\n return this.links.prev !== null;\n }\n\n get hasNextPage(): boolean {\n return this.links.next !== null;\n }\n\n /** Total number of pages. */\n get pageCount(): number {\n return this.meta.last_page;\n }\n\n /** Array of page numbers for rendering a paginator UI. */\n pages(): number[] {\n return Array.from({ length: this.meta.last_page }, (_, i) => i + 1);\n }\n\n /** Build the next page params or null if on last page. */\n nextPageParams(): { page: number } | null {\n if (this.isLastPage) return null;\n return { page: this.meta.current_page + 1 };\n }\n\n /** Build the prev page params or null if on first page. */\n prevPageParams(): { page: number } | null {\n if (this.isFirstPage) return null;\n return { page: this.meta.current_page - 1 };\n }\n}\n","import { HttpError } from \"../http/HttpError\";\n\ntype FormErrors<T extends object> = Partial<Record<keyof T, string>>;\n\ntype SubmitCallback<T extends object> = (data: T) => Promise<unknown>;\n\n/**\n * Generic form abstraction with error handling compatible with Laravel 422 responses.\n *\n * @example\n * const form = new Form({ name: '', email: '' })\n * await form.submit(() => service.store(form.data))\n * if (form.errors.name) { ... }\n */\nexport class Form<T extends object> {\n data: T;\n errors: FormErrors<T> = {};\n processing = false;\n success = false;\n\n private readonly _initial: T;\n\n constructor(initialData: T) {\n this._initial = { ...initialData };\n this.data = { ...initialData };\n }\n\n async submit(callback: SubmitCallback<T>): Promise<void> {\n this.processing = true;\n this.success = false;\n this.clearErrors();\n\n try {\n await callback(this.data);\n this.success = true;\n } catch (error) {\n if (error instanceof HttpError && error.status === 422 && error.errors) {\n this.setErrors(error.errors as Record<keyof T, string[]>);\n } else {\n throw error;\n }\n } finally {\n this.processing = false;\n }\n }\n\n reset(): void {\n this.data = { ...this._initial };\n this.clearErrors();\n this.success = false;\n this.processing = false;\n }\n\n resetField(field: keyof T): void {\n (this.data as Record<keyof T, unknown>)[field] = (\n this._initial as Record<keyof T, unknown>\n )[field];\n this.clearError(field);\n }\n\n clearErrors(): void {\n this.errors = {};\n }\n\n clearError(field: keyof T): void {\n const updated = { ...this.errors };\n delete updated[field];\n this.errors = updated;\n }\n\n /**\n * Accepts Laravel-style error bags: `{ field: ['msg1', 'msg2'] }`.\n * Only the first message per field is stored.\n */\n setErrors(errors: Record<string, string[]>): void {\n const mapped: FormErrors<T> = {};\n\n for (const [field, messages] of Object.entries(errors)) {\n const key = field as keyof T;\n const first = messages[0];\n if (first !== undefined) {\n mapped[key] = first;\n }\n }\n\n this.errors = mapped;\n }\n\n /** True when the form has any validation error. */\n get hasErrors(): boolean {\n return Object.keys(this.errors).length > 0;\n }\n}\n"],"mappings":"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","names":["id"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/http/HttpClient.ts","../src/core/http/auth/JwtAuthDriver.ts","../src/core/http/auth/CookieAuthDriver.ts","../src/core/http/auth/LocalStorageTokenStorage.ts","../src/core/http/auth/SessionStorageTokenStorage.ts","../src/core/http/HttpError.ts","../src/core/http/interceptors/response.interceptor.ts","../src/config/useHttpClient.ts","../src/config/createVueKit.ts","../src/core/services/BaseService.ts","../src/core/services/CrudService.ts","../src/core/stores/CrudStore.ts","../src/core/pagination/Pagination.ts","../src/core/forms/Form.ts"],"sourcesContent":["import axios, { type AxiosInstance } from \"axios\";\n\nimport type { HttpClientConfig } from \"./HttpClientConfig\";\n\nimport { JwtAuthDriver } from \"./auth/JwtAuthDriver\";\n\nimport { CookieAuthDriver } from \"./auth/CookieAuthDriver\";\n\nimport type { AuthDriver } from \"./auth/AuthDriver\";\n\nimport type { TokenStorage } from \"./auth/TokenStorage\";\n\nimport type { TokenStorageConfig } from \"../../contracts/auth\";\n\nimport { LocalStorageTokenStorage } from \"./auth/LocalStorageTokenStorage\";\n\nimport { SessionStorageTokenStorage } from \"./auth/SessionStorageTokenStorage\";\n\nimport { registerResponseInterceptor } from \"./interceptors/response.interceptor\";\n\nexport class HttpClient {\n private readonly client: AxiosInstance;\n\n private readonly authDriver: AuthDriver | undefined;\n\n constructor(config: HttpClientConfig) {\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout ?? 30000,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n\n this.authDriver = this.createAuthDriver(config);\n\n this.authDriver?.configure(this.client);\n\n registerResponseInterceptor(this.client, config.handlers);\n }\n\n private createAuthDriver(config: HttpClientConfig): AuthDriver | undefined {\n const auth = config.auth;\n\n if (!auth || auth.driver === \"none\") {\n return undefined;\n }\n\n if (auth.driver === \"cookie\") {\n return new CookieAuthDriver(auth.csrf);\n }\n\n if (auth.driver === \"jwt\") {\n return new JwtAuthDriver(this.resolveTokenStorage(auth.tokenStorage));\n }\n\n return undefined;\n }\n\n private resolveTokenStorage(\n tokenStorage: TokenStorageConfig | TokenStorage | undefined,\n ): TokenStorage {\n if (tokenStorage && \"get\" in tokenStorage && \"set\" in tokenStorage) {\n return tokenStorage;\n }\n\n const key = tokenStorage?.key ?? \"auth_token\";\n\n if (tokenStorage?.type === \"sessionStorage\") {\n return new SessionStorageTokenStorage(key);\n }\n\n return new LocalStorageTokenStorage(key);\n }\n\n /** Clears whatever authentication state the configured driver holds (token, csrf, etc). */\n clearAuth(): void {\n this.authDriver?.clear();\n }\n\n instance(): AxiosInstance {\n return this.client;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuthDriver } from \"./AuthDriver\";\nimport type { TokenStorage } from \"./TokenStorage\";\n\nexport class JwtAuthDriver implements AuthDriver {\n constructor(private readonly storage: TokenStorage) {}\n\n configure(client: AxiosInstance): void {\n client.interceptors.request.use((config) => {\n const token = this.storage.get();\n\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n\n return config;\n });\n }\n\n clear(): void {\n this.storage.remove();\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuthDriver } from \"./AuthDriver\";\nimport type { CsrfConfig } from \"../../../contracts/auth\";\n\nconst MUTATING_METHODS = new Set([\"post\", \"put\", \"patch\", \"delete\"]);\n\nexport class CookieAuthDriver implements AuthDriver {\n private csrfInitialization: Promise<void> | null = null;\n\n constructor(private readonly csrf?: CsrfConfig) {}\n\n configure(client: AxiosInstance): void {\n client.defaults.withCredentials = true;\n client.defaults.withXSRFToken = true;\n client.defaults.headers.common[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\n if (this.csrf?.enabled) {\n client.interceptors.request.use(async (config) => {\n const method = config.method?.toLowerCase();\n\n if (method && MUTATING_METHODS.has(method)) {\n await this.ensureCsrfCookie(client);\n }\n\n return config;\n });\n }\n }\n\n clear(): void {\n this.csrfInitialization = null;\n }\n\n private ensureCsrfCookie(client: AxiosInstance): Promise<void> {\n if (!this.csrfInitialization) {\n const endpoint = this.csrf?.endpoint ?? \"/sanctum/csrf-cookie\";\n this.csrfInitialization = client.get(endpoint).then(() => undefined);\n }\n\n return this.csrfInitialization;\n }\n}\n","import type { TokenStorage } from \"./TokenStorage\";\n\nexport class LocalStorageTokenStorage implements TokenStorage {\n constructor(private readonly key: string) {}\n\n get(): string | null {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage.getItem(this.key);\n }\n\n set(token: string): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(this.key, token);\n }\n\n remove(): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.removeItem(this.key);\n }\n}\n","import type { TokenStorage } from \"./TokenStorage\";\n\nexport class SessionStorageTokenStorage implements TokenStorage {\n constructor(private readonly key: string) {}\n\n get(): string | null {\n if (typeof sessionStorage === \"undefined\") return null;\n return sessionStorage.getItem(this.key);\n }\n\n set(token: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.setItem(this.key, token);\n }\n\n remove(): void {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.removeItem(this.key);\n }\n}\n","import type { AxiosError } from \"axios\";\nimport type { ApiErrorResponse } from \"../../contracts/api\";\n\nexport class HttpError extends Error {\n readonly status: number | null;\n readonly errors: Record<string, string[]> | undefined;\n readonly response: unknown;\n\n constructor(\n message: string,\n status: number | null,\n errors?: Record<string, string[]>,\n response?: unknown,\n ) {\n super(message);\n this.name = \"HttpError\";\n this.status = status;\n this.errors = errors;\n this.response = response;\n }\n\n static fromAxiosError(error: AxiosError<ApiErrorResponse>): HttpError {\n const status = error.response?.status ?? null;\n const data = error.response?.data;\n\n const message =\n (typeof data === \"object\" && data && \"message\" in data\n ? data.message\n : undefined) ?? error.message ?? \"Unexpected HTTP error.\";\n\n const errors =\n typeof data === \"object\" && data && \"errors\" in data\n ? data.errors\n : undefined;\n\n return new HttpError(message, status, errors, error.response);\n }\n}\n","import type { AxiosError, AxiosInstance } from \"axios\";\nimport type { HttpHandlers } from \"../../../contracts/http\";\nimport type { ApiErrorResponse } from \"../../../contracts/api\";\nimport { HttpError } from \"../HttpError\";\n\nexport function registerResponseInterceptor(\n client: AxiosInstance,\n handlers?: HttpHandlers,\n): void {\n client.interceptors.response.use(\n (response) => response,\n (error: AxiosError<ApiErrorResponse>) => {\n const httpError = HttpError.fromAxiosError(error);\n\n if (httpError.status === 401) {\n handlers?.onUnauthorized?.();\n }\n\n return Promise.reject(httpError);\n },\n );\n}\n","import type { HttpClient } from \"../core/http/HttpClient\";\n\nlet _instance: HttpClient | null = null;\n\n/**\n * Stores the global HttpClient instance.\n * Called internally by `createVueKit` — do not call manually.\n * @internal\n */\nexport function _setHttpClientInstance(http: HttpClient): void {\n _instance = http;\n}\n\n/**\n * Returns the globally configured HttpClient instance.\n * Requires that `createVueKit()` has been called in main.ts before use.\n *\n * @example\n * // In your store:\n * import { useHttpClient } from '@devappsnpm/vue-kit'\n * export const useCompanyStore = defineCrudStore('company', () => new CompanyService(useHttpClient()))\n */\nexport function useHttpClient(): HttpClient {\n if (!_instance) {\n throw new Error(\n \"[vue-kit] useHttpClient() called before createVueKit(). \" +\n \"Make sure to call app.use(createVueKit({ ... })) in your main.ts.\"\n );\n }\n return _instance;\n}\n","import { HttpClient } from \"../core/http/HttpClient\";\nimport type { HttpClientConfig } from \"../core/http/HttpClientConfig\";\nimport type { VueKitConfig } from \"./VueKitConfig\";\nimport { _setHttpClientInstance } from \"./useHttpClient\";\n\nexport interface VueKit {\n http: HttpClient;\n config: VueKitConfig;\n}\n\nexport function createVueKit(config: VueKitConfig): VueKit {\n const httpConfig: HttpClientConfig = { baseURL: config.api.baseURL };\n\n if (config.api.timeout !== undefined) httpConfig.timeout = config.api.timeout;\n if (config.api.auth !== undefined) httpConfig.auth = config.api.auth;\n if (config.api.handlers !== undefined) httpConfig.handlers = config.api.handlers;\n\n const http = new HttpClient(httpConfig);\n\n // Store globally so useHttpClient() works in stores/services\n _setHttpClientInstance(http);\n\n return { http, config };\n}\n","import type { AxiosResponse } from \"axios\";\nimport type { HttpClient } from \"../http/HttpClient\";\nimport type { ApiParams } from \"../../contracts/api\";\n\n/**\n * Base class for all application services.\n * Services that extend BaseService never import Axios directly.\n */\nexport class BaseService {\n constructor(protected readonly http: HttpClient) {}\n\n protected get<T>(\n url: string,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().get<T>(url, { params });\n }\n\n protected post<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().post<T>(url, data, { params });\n }\n\n protected put<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().put<T>(url, data, { params });\n }\n\n protected patch<T>(\n url: string,\n data?: unknown,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().patch<T>(url, data, { params });\n }\n\n protected delete<T>(\n url: string,\n params?: ApiParams,\n ): Promise<AxiosResponse<T>> {\n return this.http.instance().delete<T>(url, { params });\n }\n}\n","import type { HttpClient } from \"../http/HttpClient\";\nimport type {\n ApiResource,\n ApiPaginatedCollection,\n ApiParams,\n} from \"../../contracts/api\";\nimport type { PaginationParams } from \"../../contracts/pagination\";\nimport { BaseService } from \"./BaseService\";\n\n/**\n * Generic CRUD service for resources exposed by a Laravel REST API.\n *\n * @example\n * class CustomerService extends CrudService<Customer> {\n * constructor(http: HttpClient) {\n * super(http, '/customers')\n * }\n * }\n */\nexport class CrudService<T> extends BaseService {\n constructor(\n http: HttpClient,\n protected readonly resourcePath: string,\n ) {\n super(http);\n }\n\n /** GET /resource — paginated list */\n async index(\n params?: PaginationParams & ApiParams,\n ): Promise<ApiPaginatedCollection<T>> {\n const response = await this.get<ApiPaginatedCollection<T>>(\n this.resourcePath,\n params,\n );\n return response.data;\n }\n\n /** GET /resource/:id */\n async show(id: string | number, params?: ApiParams): Promise<ApiResource<T>> {\n const response = await this.get<ApiResource<T>>(\n `${this.resourcePath}/${id}`,\n params,\n );\n return response.data;\n }\n\n /** POST /resource */\n async store(data: unknown): Promise<ApiResource<T>> {\n const response = await this.post<ApiResource<T>>(this.resourcePath, data);\n return response.data;\n }\n\n /** PUT /resource/:id */\n async update(id: string | number, data: unknown): Promise<ApiResource<T>> {\n const response = await this.put<ApiResource<T>>(\n `${this.resourcePath}/${id}`,\n data,\n );\n return response.data;\n }\n\n /** DELETE /resource/:id */\n async destroy(id: string | number): Promise<void> {\n await this.delete(`${this.resourcePath}/${id}`);\n }\n}\n","import { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\nimport type { CrudService } from \"../services/CrudService\";\nimport type { ApiParams } from \"../../contracts/api\";\nimport type { PaginationParams } from \"../../contracts/pagination\";\nimport { Pagination } from \"../pagination/Pagination\";\nimport { HttpError } from \"../http/HttpError\";\n\n/**\n * Factory that creates a fully-typed Pinia Composition-API store for CRUD operations.\n *\n * @example\n * export const useCustomerStore = defineCrudStore('customer', () => customerService)\n */\nexport function defineCrudStore<T extends { uuid: string }>(\n id: string,\n serviceFactory: () => CrudService<T>,\n) {\n return defineStore(id, () => {\n const service = serviceFactory();\n\n const items = ref<T[]>([]) as import(\"vue\").Ref<T[]>;\n const item = ref<T | null>(null) as import(\"vue\").Ref<T | null>;\n const loading = ref(false);\n const saving = ref(false);\n const deleting = ref(false);\n const error = ref<string | null>(null);\n const pagination = ref<Pagination | null>(null);\n\n function setError(err: unknown): void {\n if (err instanceof HttpError) {\n error.value = err.message;\n } else if (err instanceof Error) {\n error.value = err.message;\n } else {\n error.value = \"An unexpected error occurred.\";\n }\n }\n\n async function fetchAll(\n params?: PaginationParams & ApiParams,\n ): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const result = await service.index(params);\n items.value = result.data;\n pagination.value = new Pagination(result.meta, result.links);\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n loading.value = false;\n }\n }\n\n async function fetchOne(id: string | number): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const result = await service.show(id);\n item.value = result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n loading.value = false;\n }\n }\n\n async function create(data: unknown): Promise<T> {\n saving.value = true;\n error.value = null;\n\n try {\n const result = await service.store(data);\n return result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n saving.value = false;\n }\n }\n\n async function update(id: string | number, data: unknown): Promise<T> {\n saving.value = true;\n error.value = null;\n\n try {\n const result = await service.update(id, data);\n return result.data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n saving.value = false;\n }\n }\n\n async function remove(id: string | number): Promise<void> {\n deleting.value = true;\n error.value = null;\n\n try {\n await service.destroy(id);\n items.value = items.value.filter((i) => i.uuid !== id);\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n deleting.value = false;\n }\n }\n\n function $reset(): void {\n items.value = [];\n item.value = null;\n loading.value = false;\n saving.value = false;\n deleting.value = false;\n error.value = null;\n pagination.value = null;\n }\n\n return {\n items,\n item,\n loading,\n saving,\n deleting,\n error,\n pagination,\n fetchAll,\n fetchOne,\n create,\n update,\n remove,\n $reset,\n };\n });\n}\n","import type { PaginationMeta, PaginationLinks } from \"../../contracts/pagination\";\n\n/**\n * Immutable value-object that wraps Laravel pagination meta + links\n * and exposes derived helpers.\n */\nexport class Pagination {\n readonly meta: PaginationMeta;\n readonly links: PaginationLinks;\n\n constructor(meta: PaginationMeta, links: PaginationLinks) {\n this.meta = meta;\n this.links = links;\n }\n\n get currentPage(): number {\n return this.meta.current_page;\n }\n\n get lastPage(): number {\n return this.meta.last_page;\n }\n\n get perPage(): number {\n return this.meta.per_page;\n }\n\n get total(): number {\n return this.meta.total;\n }\n\n get from(): number | null {\n return this.meta.from;\n }\n\n get to(): number | null {\n return this.meta.to;\n }\n\n get isFirstPage(): boolean {\n return this.meta.current_page === 1;\n }\n\n get isLastPage(): boolean {\n return this.meta.current_page === this.meta.last_page;\n }\n\n get hasPrevPage(): boolean {\n return this.links.prev !== null;\n }\n\n get hasNextPage(): boolean {\n return this.links.next !== null;\n }\n\n /** Total number of pages. */\n get pageCount(): number {\n return this.meta.last_page;\n }\n\n /** Array of page numbers for rendering a paginator UI. */\n pages(): number[] {\n return Array.from({ length: this.meta.last_page }, (_, i) => i + 1);\n }\n\n /** Build the next page params or null if on last page. */\n nextPageParams(): { page: number } | null {\n if (this.isLastPage) return null;\n return { page: this.meta.current_page + 1 };\n }\n\n /** Build the prev page params or null if on first page. */\n prevPageParams(): { page: number } | null {\n if (this.isFirstPage) return null;\n return { page: this.meta.current_page - 1 };\n }\n}\n","import { HttpError } from \"../http/HttpError\";\n\ntype FormErrors<T extends object> = Partial<Record<keyof T, string>>;\n\ntype SubmitCallback<T extends object> = (data: T) => Promise<unknown>;\n\n/**\n * Generic form abstraction with error handling compatible with Laravel 422 responses.\n *\n * @example\n * const form = new Form({ name: '', email: '' })\n * await form.submit(() => service.store(form.data))\n * if (form.errors.name) { ... }\n */\nexport class Form<T extends object> {\n data: T;\n errors: FormErrors<T> = {};\n processing = false;\n success = false;\n\n private readonly _initial: T;\n\n constructor(initialData: T) {\n this._initial = { ...initialData };\n this.data = { ...initialData };\n }\n\n async submit(callback: SubmitCallback<T>): Promise<void> {\n this.processing = true;\n this.success = false;\n this.clearErrors();\n\n try {\n await callback(this.data);\n this.success = true;\n } catch (error) {\n if (error instanceof HttpError && error.status === 422 && error.errors) {\n this.setErrors(error.errors as Record<keyof T, string[]>);\n } else {\n throw error;\n }\n } finally {\n this.processing = false;\n }\n }\n\n reset(): void {\n this.data = { ...this._initial };\n this.clearErrors();\n this.success = false;\n this.processing = false;\n }\n\n resetField(field: keyof T): void {\n (this.data as Record<keyof T, unknown>)[field] = (\n this._initial as Record<keyof T, unknown>\n )[field];\n this.clearError(field);\n }\n\n clearErrors(): void {\n this.errors = {};\n }\n\n clearError(field: keyof T): void {\n const updated = { ...this.errors };\n delete updated[field];\n this.errors = updated;\n }\n\n /**\n * Accepts Laravel-style error bags: `{ field: ['msg1', 'msg2'] }`.\n * Only the first message per field is stored.\n */\n setErrors(errors: Record<string, string[]>): void {\n const mapped: FormErrors<T> = {};\n\n for (const [field, messages] of Object.entries(errors)) {\n const key = field as keyof T;\n const first = messages[0];\n if (first !== undefined) {\n mapped[key] = first;\n }\n }\n\n this.errors = mapped;\n }\n\n /** True when the form has any validation error. */\n get hasErrors(): boolean {\n return Object.keys(this.errors).length > 0;\n }\n}\n"],"mappings":"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","names":["id"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { defineCrudStore } from '@devappsnpm/vue-kit'
|
|
1
|
+
import { defineCrudStore, useHttpClient } from '@devappsnpm/vue-kit'
|
|
2
2
|
import { {{ ModuleName }}Service } from '../services/{{ moduleSlug }}.service'
|
|
3
3
|
import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
|
|
4
|
-
import { useHttpClient } from '@/composables/useHttpClient' // adjust to your project
|
|
5
4
|
|
|
6
5
|
export const use{{ ModuleName }}Store = defineCrudStore<{{ ModuleName }}>(
|
|
7
6
|
'{{ moduleName }}',
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { defineCrudStore } from '@devappsnpm/vue-kit'
|
|
1
|
+
import { defineCrudStore, useHttpClient } from '@devappsnpm/vue-kit'
|
|
2
2
|
import { {{ ModuleName }}Service } from '../services/{{ moduleSlug }}.service'
|
|
3
3
|
import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
|
|
4
|
-
import { useHttpClient } from '@/composables/useHttpClient' // adjust to your project
|
|
5
4
|
|
|
6
5
|
export const use{{ ModuleName }}Store = defineCrudStore<{{ ModuleName }}>(
|
|
7
6
|
'{{ moduleName }}',
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { defineCrudStore } from '@devappsnpm/vue-kit'
|
|
1
|
+
import { defineCrudStore, useHttpClient } from '@devappsnpm/vue-kit'
|
|
2
2
|
import { {{ ModuleName }}Service } from '../services/{{ moduleSlug }}.service'
|
|
3
3
|
import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
|
|
4
|
-
import { useHttpClient } from '@/composables/useHttpClient' // adjust to your project
|
|
5
4
|
|
|
6
5
|
export const use{{ ModuleName }}Store = defineCrudStore<{{ ModuleName }}>(
|
|
7
6
|
'{{ moduleName }}',
|