diff --git a/apps/web/.env.development b/apps/web/.env.development new file mode 100644 index 00000000..956ae5f2 --- /dev/null +++ b/apps/web/.env.development @@ -0,0 +1 @@ +VITE_API_SERVER_URL=http://192.168.0.104:3002/api/v1 diff --git a/apps/web/index.html b/apps/web/index.html index 6eed4cfd..38f92814 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -8,6 +8,7 @@ FactuGES 2025 + diff --git a/apps/web/package.json b/apps/web/package.json index 2a81cd51..9c71c9d9 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -12,8 +12,26 @@ "lint": "biome lint --fix", "format": "biome format --write" }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@hookform/devtools": "^4.4.0", + "@peterek/vite-plugin-favicons": "^2.1.0", + "@repo/typescript-config": "workspace:*", + "@tailwindcss/postcss": "^4.1.5", + "@tailwindcss/vite": "^4.1.6", + "@tanstack/react-query-devtools": "^5.74.11", + "@types/node": "^22.15.12", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.3", + "@vitejs/plugin-react": "^4.4.1", + "autoprefixer": "^10.4.20", + "globals": "^16.0.0", + "typescript": "~5.8.3", + "vite": "^6.3.5" + }, "dependencies": { "@erp/core": "workspace:*", + "@erp/auth": "workspace:*", "@erp/invoices": "workspace:*", "@repo/rdx-criteria": "workspace:*", "@repo/rdx-ui": "workspace:*", @@ -28,28 +46,10 @@ "react-hook-form-persist": "^3.0.0", "react-i18next": "^15.0.1", "react-router-dom": "^6.26.0", - "react-secure-storage": "^1.3.2", + "sequelize": "^6.37.5", "tailwind-merge": "^3.2.0", "tailwindcss": "^4.1.6", "tw-animate-css": "^1.2.9", "vite-plugin-html": "^3.2.2" - }, - "devDependencies": { - "@biomejs/biome": "1.9.4", - "@hookform/devtools": "^4.4.0", - "@repo/typescript-config": "workspace:*", - "@tailwindcss/postcss": "^4.1.5", - "@tailwindcss/vite": "^4.1.6", - "@tanstack/react-query-devtools": "^5.74.11", - "@types/node": "^22.15.12", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.3", - "@vitejs/plugin-react": "^4.4.1", - "autoprefixer": "^10.4.20", - "globals": "^16.0.0", - "typescript": "~5.8.3", - "vite": "^6.3.5", - "vite-plugin-robots": "^1.0.5", - "vite-plugin-static-copy": "^2.3.1" } } diff --git a/apps/web/public/vite.svg b/apps/web/public/logo.svg similarity index 100% rename from apps/web/public/vite.svg rename to apps/web/public/logo.svg diff --git a/apps/web/public/typescript.svg b/apps/web/public/typescript.svg deleted file mode 100644 index d91c910c..00000000 --- a/apps/web/public/typescript.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/src/app.tsx b/apps/web/src/app.tsx index 85801035..ac2dc9a5 100644 --- a/apps/web/src/app.tsx +++ b/apps/web/src/app.tsx @@ -3,14 +3,19 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { I18nextProvider } from "react-i18next"; -import { createAxiosDataProvider } from "@/lib/axios/create-axios-data-provider"; import { UnsavedWarnProvider } from "@/lib/hooks"; import { i18n } from "@/locales"; -import { DataSourceProvider } from "@erp/core/hooks"; +import { clearAccessToken, getAccessToken } from "@erp/auth/client"; +import { DataSourceProvider, createAxiosDataSource, createAxiosInstance } from "@erp/core/client"; import { AppRoutes } from "./app-routes"; import "./app.css"; +/** + * Clave utilizada en el almacenamiento local para el token JWT. + */ +const TOKEN_STORAGE_KEY = "factuges.auth"; + export const App = () => { const queryClient = new QueryClient({ defaultOptions: { @@ -21,17 +26,26 @@ export const App = () => { }, }); + const dataSource = createAxiosDataSource(createAxiosInstance({ + baseURL: import.meta.env.VITE_API_URL, + getAccessToken: () => getAccessToken(TOKEN_STORAGE_KEY), + onAuthError: () => { + clearAccessToken(TOKEN_STORAGE_KEY); + window.location.href = "/login"; // o usar navegación programática + }, + });); + return ( - + - {import.meta.env.MODE === "development" && } + {import.meta.env.DEV && } diff --git a/apps/web/src/lib/api/get-api-authorization.ts b/apps/web/src/lib/api/get-api-authorization.ts deleted file mode 100644 index a63c8466..00000000 --- a/apps/web/src/lib/api/get-api-authorization.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { ILoginResponseDTO } from "@erp/auth"; -import secureLocalStorage from "react-secure-storage"; - -export const getApiAuthorization = () => { - const authInfo = secureLocalStorage.getItem("uecko.auth") as ILoginResponseDTO; - - return authInfo?.token ? `Bearer ${authInfo.token}` : ""; -}; diff --git a/apps/web/src/lib/api/index.ts b/apps/web/src/lib/api/index.ts deleted file mode 100644 index 84574298..00000000 --- a/apps/web/src/lib/api/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./get-api-authorization"; diff --git a/apps/web/src/lib/axios/axios-instance.ts b/apps/web/src/lib/axios/axios-instance.ts deleted file mode 100644 index fe3cdfd8..00000000 --- a/apps/web/src/lib/axios/axios-instance.ts +++ /dev/null @@ -1,48 +0,0 @@ -import axiosClient from "axios"; -import { setupInterceptorsTo } from "./setup-interceptors"; - -// extend the AxiosRequestConfig interface and add two optional options raw and silent. I -// https://dev.to/mperon/axios-error-handling-like-a-boss-333d -declare module "axios" { - export interface AxiosRequestConfig { - raw?: boolean; - silent?: boolean; - } -} - -export const defaultAxiosRequestConfig = { - mode: "cors", - cache: "no-cache", - credentials: "same-origin", - headers: { - Accept: "application/json", - "Content-Type": "application/json; charset=utf-8", - "Cache-Control": "no-cache", - "Access-Control-Allow-Origin": "*", // Could work and fix the previous problem, but not in all APIs - //'api-key': SERVER_API_KEY, - }, - //timeout: 300, - - // `onUploadProgress` allows handling of progress events for uploads - // browser only - //onUploadProgress: function (progressEvent) { - // Do whatever you want with the native progress event - //}, - - // `onDownloadProgress` allows handling of progress events for downloads - // browser only - //onDownloadProgress: function (progressEvent) { - // Do whatever you want with the native progress event - //}, - - // `cancelToken` specifies a cancel token that can be used to cancel the request - /*cancelToken: new CancelToken(function (cancel) { - }),*/ -}; - -/** - * Creates an initial 'axios' instance with custom settings. - */ - -export const createAxiosInstance = () => - setupInterceptorsTo(axiosClient.create(defaultAxiosRequestConfig)); diff --git a/apps/web/src/lib/axios/create-axios-auth-actions.ts b/apps/web/src/lib/axios/create-axios-auth-actions.ts index 8184e980..52752152 100644 --- a/apps/web/src/lib/axios/create-axios-auth-actions.ts +++ b/apps/web/src/lib/axios/create-axios-auth-actions.ts @@ -1,101 +1,51 @@ -import secureLocalStorage from "react-secure-storage"; -import { createAxiosInstance } from "./axios-instance"; +import { AxiosInstance } from "axios"; -export const createAxiosAuthActions = ( - apiUrl: string, - httpClient = createAxiosInstance() -): IAuthActions => ({ - login: async ({ email, password }: ILogin_DTO) => { - secureLocalStorage.clear(); +/** + * Datos requeridos para iniciar sesión. + */ +export interface LoginCredentials { + email: string; + password: string; +} - try { - const result = await httpClient.request({ - url: `${apiUrl}/auth/login`, - method: "POST", - data: { - email, - password, - }, - }); +/** + * Respuesta esperada al iniciar sesión correctamente. + */ +export interface AuthResponse { + access_token: string; +} - const { data } = result; - secureLocalStorage.setItem("uecko.auth", data); +/** + * Crea funciones de autenticación usando una instancia Axios. + * + * @param api - Instancia Axios preconfigurada. + * @returns Funciones para login y logout. + */ +export const createAuthActions = (api: AxiosInstance) => { + /** + * Envía credenciales al endpoint de login y devuelve el token. + * + * @param credentials - Correo y contraseña del usuario. + * @returns Promesa con el token JWT. + */ + const login = async (credentials: LoginCredentials): Promise => { + const response = await api.post("/auth/login", credentials); + return response.data; + }; - return { - success: true, - data, - }; - } catch (error) { - return { - success: false, - error: { - message: "Login failed", - name: "Invalid email or password", - }, - }; - } - }, + /** + * Realiza un logout desde el backend si aplica, o simplemente resuelve. + * Puede modificarse para llamar a un endpoint si se requiere. + * + * @returns Promesa resuelta. + */ + const logout = async (): Promise => { + // Ejemplo: await api.post('/auth/logout'); + return Promise.resolve(); + }; - logout: () => { - secureLocalStorage.clear(); - - return Promise.resolve({ - success: true, - redirectTo: "/login", - }); - }, - - check: () => { - const authUser = secureLocalStorage.getItem("uecko.auth") as ILogin_Response_DTO; - const isAuthenticated = !!authUser?.token; - - if (!isAuthenticated) secureLocalStorage.clear(); - - return Promise.resolve( - isAuthenticated - ? { - authenticated: true, - } - : { - authenticated: false, - redirectTo: "/login", - } - ); - }, - - getProfile: async () => { - /** - * id: string; - * name: string; - * email: string; - * lang_code: string; - * roles: string[]; - */ - - try { - const result = await httpClient.request({ - url: `${apiUrl}/profile`, - method: "GET", - }); - - const { data: profile } = result; - const authUser = secureLocalStorage.getItem("uecko.auth") as ILogin_Response_DTO; - - if (authUser?.id === profile?.id) { - secureLocalStorage.setItem("uecko.profile", profile); - return Promise.resolve(profile); - } - return Promise.resolve(null); - } catch (error) { - return Promise.resolve(null); - } - }, - - onError: (error: any) => { - secureLocalStorage.clear(); - return Promise.resolve({ - error, - logout: true, - }); - }, -}); + return { + login, + logout, + }; +}; diff --git a/apps/web/src/lib/axios/create-axios-data-provider.ts b/apps/web/src/lib/axios/create-axios-data-provider.ts deleted file mode 100644 index a96a1437..00000000 --- a/apps/web/src/lib/axios/create-axios-data-provider.ts +++ /dev/null @@ -1,416 +0,0 @@ -import type { IListResponseDTO } from "@erp/core"; -import { INITIAL_PAGE_INDEX, INITIAL_PAGE_SIZE } from "@repo/rdx-criteria"; -import type { IDataSource } from "../../../../../modules/core/src/web/hooks/use-datasource/datasource.interface"; -import { getApiAuthorization as getApiAuthLib } from "../api"; -import type { - ICreateOneDataProviderParams, - ICustomDataProviderParam, - IDownloadPDFDataProviderParams, - IDownloadPDFDataProviderResponse, - IFilterItemDataProviderParam, - IGetListDataProviderParams, - IGetOneDataProviderParams, - IPaginationDataProviderParam, - IRemoveOneDataProviderParams, - ISortItemDataProviderParam, - IUpdateOneDataProviderParams, - IUploadFileDataProviderParam, -} from "../hooks/use-datasource"; -import { createAxiosInstance, defaultAxiosRequestConfig } from "./axios-instance"; - -export const createAxiosDataProvider = ( - apiUrl: string, - httpClient = createAxiosInstance() -): IDataSource => ({ - name: () => "AxiosDataProvider", - - getApiUrl: () => apiUrl, - - getApiAuthorization: getApiAuthLib, - - getList: async (params: IGetListDataProviderParams): Promise> => { - const { resource, quickSearchTerm, pagination, filters = [], sort = [] } = params; - - const url = `${apiUrl}/${resource}`; - const urlParams = new URLSearchParams(); - - const { page, limit } = extractPaginationParams(pagination); - urlParams.append("page", String(page)); - urlParams.append("limit", String(limit)); - - const generatedSort = extractSortParams(sort); - if (generatedSort.length) { - urlParams.append("$sort_by", generatedSort.join(",")); - } - - const queryQuickSearch = generateQuickSearch(quickSearchTerm, filters); - if (queryQuickSearch.length) { - urlParams.append("q", queryQuickSearch.join(",")); - } - - const queryFilters = extractFilterParams(filters); - if (queryFilters.length) { - urlParams.append("$filters", queryFilters.join(",")); - } - - const response = await httpClient.request>({ - url: `${url}?${urlParams.toString()}`, - method: "GET", - }); - - return response.data; - }, - - getOne: async (params: IGetOneDataProviderParams): Promise => { - const { resource, id } = params; - - const response = await httpClient.request({ - url: `${apiUrl}/${resource}/${id}`, - method: "GET", - }); - - return response.data; - }, - - /*saveOne: async (params: ISaveOneDataProviderParams

): Promise => { - const { resource, data, id } = params; - - console.log(params); - - const result = await httpClient.request({ - url: `${apiUrl}/${resource}/${id}`, - method: "PUT", - data, - }); - - return result.data; - },*/ - - createOne: async (params: ICreateOneDataProviderParams

): Promise => { - const { resource, data } = params; - - const response = await httpClient.request({ - url: `${apiUrl}/${resource}`, - method: "POST", - data, - }); - - return response.data; - }, - - updateOne: async (params: IUpdateOneDataProviderParams

): Promise => { - const { resource, data, id } = params; - - const response = await httpClient.request({ - url: `${apiUrl}/${resource}/${id}`, - method: "PUT", - data, - }); - - return response.data; - }, - - removeOne: async (params: IRemoveOneDataProviderParams) => { - const { resource, id } = params; - - await httpClient.request({ - url: `${apiUrl}/${resource}/${id}`, - method: "DELETE", - }); - - return; - }, - - uploadFile: async (params: IUploadFileDataProviderParam): Promise => { - const { path, file, key, onUploadProgress } = params; - const url = `${apiUrl}/${path}`; - - const formData = new FormData(); - formData.append(key || "file", file); - - //console.log(file); - - const response = await httpClient.post(url, formData, { - headers: { - "Content-Type": "multipart/form-data", - }, - onUploadProgress, - }); - - return response.data; - }, - - downloadPDF: async ( - params: IDownloadPDFDataProviderParams - ): Promise => { - const { url, config } = params; - - const response = await httpClient.get(url, { - responseType: "arraybuffer", // Esto es necesario para recibir los datos en formato ArrayBuffer - ...config, - }); - - // Extraer el nombre del archivo de la cabecera Content-Disposition - const contentDisposition = response.headers["content-disposition"]; - let filename = "downloaded-file.pdf"; // Valor por defecto si no se encuentra el nombre en la cabecera - - if (contentDisposition) { - const match = contentDisposition.match(/filename="?(.+)"?/); - if (match && match[1]) { - filename = match[1]; - } - } - - // Crear un Blob con los datos descargados - const filedata = new Blob([response.data], { type: "application/pdf" }); - - return { - filename, - filedata, - }; - }, - - custom: async (params: ICustomDataProviderParam): Promise => { - const { url, path, method, responseType, headers, signal, data, ...payload } = params; - let requestUrl: string; - - if (path) { - requestUrl = `${apiUrl}/${path}`; - } else if (url) { - requestUrl = url; - } else { - throw new Error('"url" or "path" param is missing'); - } - - //console.log(apiUrl, path, url, requestUrl.toString()); - - // Preparar la respuesta personalizada - // biome-ignore lint/suspicious/noExplicitAny: - let customResponse: any; - - // Configurar opciones comunes para la petición - const config = { - url: requestUrl.toString(), - method, - responseType, - signal, - ...payload, - ...defaultAxiosRequestConfig, - }; - - switch (method) { - case "put": - case "post": - case "patch": - customResponse = await httpClient.request({ - ...config, - data, - }); - break; - case "delete": - customResponse = await httpClient.delete(requestUrl.toString(), { - responseType, - headers, - ...payload, - }); - break; - default: - customResponse = await httpClient.get(requestUrl.toString(), { - responseType, - signal, - headers, - ...payload, - }); - break; - } - - return customResponse.data; - }, - - /*getMany: async ({ resource }) => { - const { body } = await httpClient.request({ - url: `${apiUrl}/${resource}`, - method: "GET", - //...defaultRequestConfig, - }); - - return body; - },*/ - - /*create: async ({ resource, values }) => { - const url = `${apiUrl}/${resource}`; - - const { body } = await httpClient.post(url, values, defaultRequestConfig); - - return body; - },*/ - - /*createMany: async ({ resource, values }) => { - const response = await Promise.all( - values.map(async (param) => { - const { body } = await httpClient.post( - `${apiUrl}/${resource}`, - param - //defaultRequestConfig, - ); - return body; - }) - ); - - return response; - },*/ - - /*update: async ({ resource, id, values }) => { - const url = `${apiUrl}/${resource}/${id}`; - const { body } = await httpClient.patch(url, values, defaultRequestConfig); - return body; - },*/ - - /*updateMany: async ({ resource, ids, values }) => { - const response = await Promise.all( - ids.map(async (id) => { - const { body } = await httpClient.patch( - `${apiUrl}/${resource}/${id}`, - values - //defaultRequestConfig, - ); - return body; - }) - ); - - return response; - },*/ - - // removeMany: async ({ resource, ids }) => { - // const url = `${apiUrl}/${resource}/bulk-delete`; - - // const { body } = await httpClient.request({ - // url, - // method: "PATCH", - // data: { - // ids, - // }, - // //defaultRequestConfig, - // }); - - // return body; - // }, - - // upload: async ({ resource, file, onUploadProgress }) => { - // const url = `${apiUrl}/${resource}`; - // const options = { - // //...defaultRequestConfig, - // onUploadProgress, - // headers: { - // //...defaultRequestConfig.headers, - // "Content-Type": "multipart/form-data", - // }, - // }; - - // const formData = new FormData(); - // formData.append("file", file); - - // const { body } = await httpClient.post(url, formData, options); - // return body; - // }, - - /*uploadMany: async ({ resource, values }) => { - const url = `${apiUrl}/${resource}`; - const options = { - //...defaultRequestConfig, - headers: { - ...defaultRequestConfig.headers, - 'Content-Type': 'multipart/form-data' - } - }; - - const response = await Promise.all( - values.map(async (value) => { - const { body } = await httpClient.post( - url, - value, - options - ); - return body; - }), - ); - - return response; - },*/ - - /*custom: async ({ url, method, filters, sort, payload, query, headers }) => { - let requestUrl = `${url}?`; - - if (sort) { - const generatedSort = extractSortParams(sort); - if (generatedSort) { - const { _sort, _order } = generatedSort; - const sortQuery = { - _sort: _sort.join(","), - _order: _order.join(","), - }; - requestUrl = `${requestUrl}&${queryString.stringify(sortQuery)}`; - } - } - - if (filters) { - const filterQuery = extractFilterParams(filters); - requestUrl = `${requestUrl}&${queryString.stringify(filterQuery)}`; - } - - if (query) { - requestUrl = `${requestUrl}&${queryString.stringify(query)}`; - } - - if (headers) { - httpClient.defaults.headers = { - ...httpClient.defaults.headers, - ...headers, - }; - } - - let axiosResponse; - switch (method) { - case "put": - case "post": - case "patch": - axiosResponse = await httpClient[method](url, payload); - break; - case "remove": - axiosResponse = await httpClient.delete(url); - break; - default: - axiosResponse = await httpClient.get(requestUrl); - break; - } - - const { data } = axiosResponse; - - return Promise.resolve({ data }); - },*/ -}); - -const extractSortParams = (sort: ISortItemDataProviderParam[] = []) => - sort.map(({ field, order }) => `${order === "DESC" ? "-" : "+"}${field}`); - -const extractFilterParams = (filters: IFilterItemDataProviderParam[] = []) => - filters - .filter(({ field }) => field !== "q") - .map(({ field, operator, value }) => `${field}[${operator}]${value}`); - -const generateQuickSearch = ( - quickSearchTerm: string[] = [], - filters: IFilterItemDataProviderParam[] = [] -) => - filters.find(({ field }) => field === "q")?.value - ? [filters.find(({ field }) => field === "q")?.value ?? ""] - : quickSearchTerm; - -const extractPaginationParams = (pagination?: IPaginationDataProviderParam) => { - const { pageIndex = INITIAL_PAGE_INDEX, pageSize = INITIAL_PAGE_SIZE } = pagination || {}; - - return { - page: pageIndex, - limit: pageSize, - }; -}; diff --git a/apps/web/src/lib/axios/setup-interceptors.ts b/apps/web/src/lib/axios/setup-interceptors.ts deleted file mode 100644 index f893cb8c..00000000 --- a/apps/web/src/lib/axios/setup-interceptors.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { - AxiosError, - type AxiosInstance, - type AxiosResponse, - type InternalAxiosRequestConfig, -} from "axios"; -import { getApiAuthorization } from "../api"; - -const onRequest = (request: InternalAxiosRequestConfig): InternalAxiosRequestConfig => { - request.headers.Authorization = getApiAuthorization(); - return request; -}; - -const onRequestError = (error: AxiosError): Promise => { - /*console.group("[request error]"); - console.dir(error); - console.groupEnd();*/ - - return Promise.reject(error); -}; - -const onResponse = (response: AxiosResponse): AxiosResponse => { - /*console.group("[response]"); - console.dir(response); - console.groupEnd();*/ - - const config = response?.config; - if (config.raw) { - return response; - } - - /*if (response.status === 200) { - const data = response?.data; - if (!data) { - throw new HttpError("API Error. No data!"); - } - return data; - }*/ - //throw new HttpError("API Error! Invalid status code!"); - - return response; -}; - -const onResponseError = (error: AxiosError): Promise => { - console.debug("[response error]"); - - if (error.response) { - // La respuesta fue hecha y el servidor respondió con un código de estado - // que esta fuera del rango de 2xx - console.debug("1 => El servidor respondió con un código de estado > 200"); - - const data = error.response.data; - const status = error.response.status; - - console.debug(data); - console.debug(status); - - /* - - { - detail: "Quote data not valid", - instance: "/api/v1/quotes", - status: 422, - title: "Unprocessable Entity", - type: "about:blank", - context: { - params: { - }, - query: { - }, - body: { - date: "2024-08-13", - customer_information: "", - reference: "", - status: "draft", - id: "9c1c6073-127a-4bde-a73c-6229efb51ad0", - }, - }, - extra: { - errors: [ - { - reference: "{reference} is not allowed to be empty", - }, - { - customer_information: "{customer_information} is not allowed to be empty", - }, - ], - }, - } - - */ - - switch (status) { - case 400: - console.error("Bad Request"); - break; - case 401: - console.error("UnAuthorized"); - //window.location.href = "/logout"; - break; - case 403: - console.error("Forbidden"); - break; - /*AppEvents.publish(Events.N_Error, { - message: "Forbidden", - description: "Operation ", - });*/ - case 404: - console.error("Not found"); - break; - - case 422: - console.error("Unprocessable Content"); - break; - } - return Promise.reject(data); - } else if (error.request) { - // La petición fue hecha pero no se recibió respuesta - console.debug("2 => El servidor no respondió"); - console.error(error); - } else { - if (error.code === "ERR_CANCELED") { - // La petición fue hecha pero se ha cancelado - console.debug("3 => Petición cancelada"); - } else { - // Algo paso al preparar la petición que lanzo un Error - console.debug("4 => Error desconocido"); - console.error(error); - } - } - console.groupEnd(); - return Promise.reject(error); -}; - -export function setupInterceptorsTo(axiosInstance: AxiosInstance): AxiosInstance { - axiosInstance.interceptors.request.use(onRequest, onRequestError); - axiosInstance.interceptors.response.use(onResponse, onResponseError); - return axiosInstance; -} diff --git a/apps/web/src/locales/i18n.ts b/apps/web/src/locales/i18n.ts index 73725f12..495ce9a8 100644 --- a/apps/web/src/locales/i18n.ts +++ b/apps/web/src/locales/i18n.ts @@ -20,7 +20,7 @@ i18n detection: { order: ["navigator"], }, - debug: import.meta.env.MODE === "development", + debug: import.meta.env.DEV, fallbackLng: "es", interpolation: { escapeValue: false, diff --git a/apps/web/tsconfig.app.json b/apps/web/tsconfig.app.json index e301ec5d..9eb96c89 100644 --- a/apps/web/tsconfig.app.json +++ b/apps/web/tsconfig.app.json @@ -27,10 +27,6 @@ "noUncheckedSideEffectImports": true, "allowUnreachableCode": true }, - "include": [ - "src", - "../../modules/core/src/web/hooks/use-datasource/use-datasource.tsx", - "../../modules/core/src/web/hooks/use-datasource/datasource.interface.ts" - ], + "include": ["src"], "exclude": ["node_modules"] } diff --git a/apps/web/vite.config.mts b/apps/web/vite.config.mts index 506e619d..c991ec11 100644 --- a/apps/web/vite.config.mts +++ b/apps/web/vite.config.mts @@ -1,11 +1,12 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; +import favicons from "@peterek/vite-plugin-favicons"; import tailwindcss from "@tailwindcss/vite"; +import react from "@vitejs/plugin-react"; import path from "path"; +import { defineConfig } from "vite"; // https://vite.dev/config/ export default defineConfig({ - plugins: [react(), tailwindcss()], + plugins: [react(), tailwindcss(), favicons("public/logo.svg")], resolve: { alias: { "@": path.resolve(__dirname, "./src"), diff --git a/modules/auth/package.json b/modules/auth/package.json index 47b13f76..488f120d 100644 --- a/modules/auth/package.json +++ b/modules/auth/package.json @@ -4,13 +4,9 @@ "main": "src/index.ts", "types": "src/index.ts", "exports": { - ".": "./src/index.ts", + ".": "./src/common/index.ts", "./api": "./src/api/index.ts", - "./dto": "./src/common/dto/index.ts", - "./hooks/*": ["./src/web/hooks/*.tsx", "./src/hooks/*.ts"], - "./components": "./src/web/components/index.tsx", - "./components/*": "./src/web/components/*.tsx", - "./locales": "./src/common/locales/index.tsx" + "./client": "./src/web/index.ts" }, "peerDependencies": { "react": "^18 || ^19", @@ -28,6 +24,7 @@ "@erp/core": "workspace:*", "react": "^19.1.0", "react-dom": "^19.1.0", - "react-router-dom": "^6.26.0" + "react-router-dom": "^6.26.0", + "react-secure-storage": "^1.3.2" } } diff --git a/modules/auth/src/index.ts b/modules/auth/src/index.ts deleted file mode 100644 index 534a9fcf..00000000 --- a/modules/auth/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./api"; -export * from "./common"; -export * from "./web"; diff --git a/modules/auth/src/web/components/auth-guard.tsx b/modules/auth/src/web/components/auth-guard.tsx new file mode 100644 index 00000000..35a9aa28 --- /dev/null +++ b/modules/auth/src/web/components/auth-guard.tsx @@ -0,0 +1,15 @@ +import { JSX } from "react"; +import { Navigate } from "react-router-dom"; + +/** + * Protege una ruta para usuarios autenticados. + */ +export const AuthGuard = ({ children }: { children: JSX.Element }) => { + const { isAuthenticated } = useAuth(); + + if (!isAuthenticated) { + return ; + } + + return children; +}; diff --git a/modules/auth/src/web/components/protected-route.tsx b/modules/auth/src/web/components/protected-route.tsx index e87dc72e..a44b20f4 100644 --- a/modules/auth/src/web/components/protected-route.tsx +++ b/modules/auth/src/web/components/protected-route.tsx @@ -1,7 +1,7 @@ import { ErrorOverlay, LoadingOverlay } from "@repo/rdx-ui/components"; import React, { useId } from "react"; import { Navigate, useLocation } from "react-router-dom"; -import { useGetProfile, useIsLoggedIn } from "../hooks"; +import { useGetProfile, useIsLoggedIn } from "../hooks.old"; type ProctectRouteProps = { children?: React.ReactNode; diff --git a/modules/auth/src/web/hooks/auth-actions.ts b/modules/auth/src/web/hooks.old/auth-actions.ts similarity index 100% rename from modules/auth/src/web/hooks/auth-actions.ts rename to modules/auth/src/web/hooks.old/auth-actions.ts diff --git a/modules/auth/src/web/hooks/auth-context.tsx b/modules/auth/src/web/hooks.old/auth-context.tsx similarity index 100% rename from modules/auth/src/web/hooks/auth-context.tsx rename to modules/auth/src/web/hooks.old/auth-context.tsx diff --git a/modules/auth/src/web/hooks.old/index.ts b/modules/auth/src/web/hooks.old/index.ts new file mode 100644 index 00000000..07f02fb2 --- /dev/null +++ b/modules/auth/src/web/hooks.old/index.ts @@ -0,0 +1,6 @@ +export * from "./auth-actions"; +export * from "./auth-context"; +export * from "./use-auth"; +export * from "./use-get-profile"; +export * from "./use-is-logged-in"; +export * from "./use-login"; diff --git a/modules/auth/src/web/hooks/use-auth.tsx b/modules/auth/src/web/hooks.old/use-auth.tsx similarity index 100% rename from modules/auth/src/web/hooks/use-auth.tsx rename to modules/auth/src/web/hooks.old/use-auth.tsx diff --git a/modules/auth/src/web/hooks/use-get-profile.ts b/modules/auth/src/web/hooks.old/use-get-profile.ts similarity index 100% rename from modules/auth/src/web/hooks/use-get-profile.ts rename to modules/auth/src/web/hooks.old/use-get-profile.ts diff --git a/modules/auth/src/web/hooks/use-is-logged-in.tsx b/modules/auth/src/web/hooks.old/use-is-logged-in.tsx similarity index 100% rename from modules/auth/src/web/hooks/use-is-logged-in.tsx rename to modules/auth/src/web/hooks.old/use-is-logged-in.tsx diff --git a/modules/auth/src/web/hooks/use-login.tsx b/modules/auth/src/web/hooks.old/use-login.tsx similarity index 100% rename from modules/auth/src/web/hooks/use-login.tsx rename to modules/auth/src/web/hooks.old/use-login.tsx diff --git a/modules/auth/src/web/hooks/use-logout.tsx b/modules/auth/src/web/hooks.old/use-logout.tsx similarity index 100% rename from modules/auth/src/web/hooks/use-logout.tsx rename to modules/auth/src/web/hooks.old/use-logout.tsx diff --git a/modules/auth/src/web/hooks/index.ts b/modules/auth/src/web/hooks/index.ts index 07f02fb2..e69de29b 100644 --- a/modules/auth/src/web/hooks/index.ts +++ b/modules/auth/src/web/hooks/index.ts @@ -1,6 +0,0 @@ -export * from "./auth-actions"; -export * from "./auth-context"; -export * from "./use-auth"; -export * from "./use-get-profile"; -export * from "./use-is-logged-in"; -export * from "./use-login"; diff --git a/modules/auth/src/web/hooks/useAuth.tsx b/modules/auth/src/web/hooks/useAuth.tsx new file mode 100644 index 00000000..fb856840 --- /dev/null +++ b/modules/auth/src/web/hooks/useAuth.tsx @@ -0,0 +1,49 @@ +import { createContext, useContext, useEffect, useState } from "react"; + +interface AuthContextType { + token: string | null; + isAuthenticated: boolean; + login: (email: string, password: string) => Promise; + logout: () => void; +} + +const AuthContext = createContext(undefined); + +/** + * Proveedor de autenticación para toda la app. + */ +export const AuthProvider = ({ children }: { children: React.ReactNode }) => { + const [token, setToken] = useState(getAccessToken()); + + useEffect(() => { + setToken(getAccessToken()); + }, []); + + const login = async (email: string, password: string) => { + const { access_token } = await authService.login({ email, password }); + localStorage.setItem("access_token", access_token); + setToken(access_token); + }; + + const logout = () => { + clearAccessToken(); + setToken(null); + }; + + return ( + + {children} + + ); +}; + +/** + * Hook para acceder al contexto de autenticación. + */ +export const useAuth = (): AuthContextType => { + const context = useContext(AuthContext); + if (!context) { + throw new Error("useAuth debe usarse dentro de "); + } + return context; +}; diff --git a/modules/auth/src/web/hooks/useCurrentUser.ts b/modules/auth/src/web/hooks/useCurrentUser.ts new file mode 100644 index 00000000..e69de29b diff --git a/modules/auth/src/web/hooks/useIsAuthenticated.ts b/modules/auth/src/web/hooks/useIsAuthenticated.ts new file mode 100644 index 00000000..d5731091 --- /dev/null +++ b/modules/auth/src/web/hooks/useIsAuthenticated.ts @@ -0,0 +1,9 @@ +import { useAuth } from "./useAuth"; + +/** + * Devuelve un booleano reactivo si el usuario está autenticado. + */ +export const useIsAuthenticated = () => { + const { isAuthenticated } = useAuth(); + return isAuthenticated; +}; diff --git a/modules/auth/src/web/index.ts b/modules/auth/src/web/index.ts new file mode 100644 index 00000000..a23b02f4 --- /dev/null +++ b/modules/auth/src/web/index.ts @@ -0,0 +1,2 @@ +export * from "./components"; +export * from "./lib"; diff --git a/modules/auth/src/web/lib/access-token-setup.ts b/modules/auth/src/web/lib/access-token-setup.ts new file mode 100644 index 00000000..52312fc3 --- /dev/null +++ b/modules/auth/src/web/lib/access-token-setup.ts @@ -0,0 +1,23 @@ +import secureLocalStorage from "react-secure-storage"; + +/** + * Servicio para manejar la obtención del token JWT desde el almacenamiento local. + * Este archivo puede evolucionar a un AuthService más completo en el futuro. + */ + +/** + * Obtiene el token JWT almacenado localmente. + * + * @returns El token como string, o null si no está disponible. + */ +export const getAccessToken = (tokenStorageKey: string): string | null => { + const authInfo = secureLocalStorage.getItem(tokenStorageKey) as { token?: string } | null; + return typeof authInfo?.token === "string" ? authInfo.token : null; +}; + +/** + * Limpia el token JWT del almacenamiento local. + */ +export const clearAccessToken = (tokenStorageKey: string): void => { + secureLocalStorage.removeItem(tokenStorageKey); +}; diff --git a/modules/auth/src/web/lib/index.ts b/modules/auth/src/web/lib/index.ts new file mode 100644 index 00000000..b1d422fd --- /dev/null +++ b/modules/auth/src/web/lib/index.ts @@ -0,0 +1 @@ +export * from "./access-token-setup"; diff --git a/modules/auth/src/web/services/auth-service.ts b/modules/auth/src/web/services/auth-service.ts new file mode 100644 index 00000000..20a75eb4 --- /dev/null +++ b/modules/auth/src/web/services/auth-service.ts @@ -0,0 +1,17 @@ +export const authService = createAuthActions(axiosClient); + +/** + * Autentica al usuario con email y password, y guarda el token en localStorage. + */ +export const login = async (email: string, password: string): Promise => { + const { access_token } = await authService.login({ email, password }); + setAccessToken(access_token); +}; + +/** + * Limpia el token local y ejecuta el logout remoto (si aplica). + */ +export const logout = async (): Promise => { + await authService.logout(); // opcional: puede no existir en backend + clearAccessToken(); +}; diff --git a/modules/auth/src/web/services/index.ts b/modules/auth/src/web/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/modules/auth/src/web/services/me-service.ts b/modules/auth/src/web/services/me-service.ts new file mode 100644 index 00000000..e69de29b diff --git a/modules/auth/src/web/services/types.ts b/modules/auth/src/web/services/types.ts new file mode 100644 index 00000000..e69de29b diff --git a/modules/auth/src/web/services/user-service.ts b/modules/auth/src/web/services/user-service.ts new file mode 100644 index 00000000..e69de29b diff --git a/modules/core/package.json b/modules/core/package.json index d3639177..e537d676 100644 --- a/modules/core/package.json +++ b/modules/core/package.json @@ -4,18 +4,9 @@ "main": "src/index.ts", "types": "src/index.ts", "exports": { - ".": "./src/index.ts", - "./dto": "./src/dto/index.ts", - "./hooks": "./src/web/hooks/index.ts", - "./components": "./src/web/components/index.tsx", - "./components/*": "./src/web/components/*.tsx" - }, - "peerDependencies": { - "express": "^4.18.2", - "joi": "^17.13.3", - "react": "^18 || ^19", - "react-dom": "^18 || ^19", - "sequelize": "^6.37.5" + ".": "./src/common/index.ts", + "./api": "./src/api/index.ts", + "./client": "./src/web/index.ts" }, "devDependencies": { "@biomejs/biome": "1.9.4", @@ -33,12 +24,9 @@ "@repo/rdx-criteria": "workspace:*", "@tanstack/react-query": "^5.75.4", "axios": "^1.9.0", - "express": "^4.18.2", "http-status": "^2.1.0", "joi": "^17.13.3", "libphonenumber-js": "^1.11.20", - "react": "^19.1.0", - "react-dom": "^19.1.0", "react-router-dom": "^6.26.0", "sequelize": "^6.37.5" } diff --git a/modules/core/src/index.ts b/modules/core/src/api/index.ts similarity index 73% rename from modules/core/src/index.ts rename to modules/core/src/api/index.ts index 88533e86..346376b1 100644 --- a/modules/core/src/index.ts +++ b/modules/core/src/api/index.ts @@ -1,4 +1,4 @@ -export * from "./dto"; +export * from "../common/dto"; export * from "./infrastructure"; export * from "./logger"; export * from "./modules"; diff --git a/modules/core/src/infrastructure/database/index.ts b/modules/core/src/api/infrastructure/database/index.ts similarity index 100% rename from modules/core/src/infrastructure/database/index.ts rename to modules/core/src/api/infrastructure/database/index.ts diff --git a/modules/core/src/infrastructure/database/transaction-manager.interface.ts b/modules/core/src/api/infrastructure/database/transaction-manager.interface.ts similarity index 100% rename from modules/core/src/infrastructure/database/transaction-manager.interface.ts rename to modules/core/src/api/infrastructure/database/transaction-manager.interface.ts diff --git a/modules/core/src/infrastructure/database/transaction-manager.ts b/modules/core/src/api/infrastructure/database/transaction-manager.ts similarity index 100% rename from modules/core/src/infrastructure/database/transaction-manager.ts rename to modules/core/src/api/infrastructure/database/transaction-manager.ts diff --git a/modules/core/src/infrastructure/express/api-error.ts b/modules/core/src/api/infrastructure/express/api-error.ts similarity index 100% rename from modules/core/src/infrastructure/express/api-error.ts rename to modules/core/src/api/infrastructure/express/api-error.ts diff --git a/modules/core/src/infrastructure/express/express-controller.ts b/modules/core/src/api/infrastructure/express/express-controller.ts similarity index 99% rename from modules/core/src/infrastructure/express/express-controller.ts rename to modules/core/src/api/infrastructure/express/express-controller.ts index f1030dab..12cb0712 100644 --- a/modules/core/src/infrastructure/express/express-controller.ts +++ b/modules/core/src/api/infrastructure/express/express-controller.ts @@ -1,4 +1,4 @@ -import { Criteria, CriteriaFromUrlConverter } from "@repo/rdx-criteria"; +import { Criteria, CriteriaFromUrlConverter } from "@repo/rdx-criteria/server"; import { NextFunction, Request, Response } from "express"; import httpStatus from "http-status"; import { ApiError } from "./api-error"; diff --git a/modules/core/src/infrastructure/express/index.ts b/modules/core/src/api/infrastructure/express/index.ts similarity index 100% rename from modules/core/src/infrastructure/express/index.ts rename to modules/core/src/api/infrastructure/express/index.ts diff --git a/modules/core/src/infrastructure/express/middlewares/global-error-handler.ts b/modules/core/src/api/infrastructure/express/middlewares/global-error-handler.ts similarity index 100% rename from modules/core/src/infrastructure/express/middlewares/global-error-handler.ts rename to modules/core/src/api/infrastructure/express/middlewares/global-error-handler.ts diff --git a/modules/core/src/infrastructure/express/middlewares/index.ts b/modules/core/src/api/infrastructure/express/middlewares/index.ts similarity index 100% rename from modules/core/src/infrastructure/express/middlewares/index.ts rename to modules/core/src/api/infrastructure/express/middlewares/index.ts diff --git a/modules/core/src/infrastructure/express/validate-request-dto.ts b/modules/core/src/api/infrastructure/express/validate-request-dto.ts similarity index 100% rename from modules/core/src/infrastructure/express/validate-request-dto.ts rename to modules/core/src/api/infrastructure/express/validate-request-dto.ts diff --git a/modules/core/src/infrastructure/index.ts b/modules/core/src/api/infrastructure/index.ts similarity index 100% rename from modules/core/src/infrastructure/index.ts rename to modules/core/src/api/infrastructure/index.ts diff --git a/modules/core/src/infrastructure/sequelize/index.ts b/modules/core/src/api/infrastructure/sequelize/index.ts similarity index 100% rename from modules/core/src/infrastructure/sequelize/index.ts rename to modules/core/src/api/infrastructure/sequelize/index.ts diff --git a/modules/core/src/infrastructure/sequelize/sequelize-mapper.ts b/modules/core/src/api/infrastructure/sequelize/sequelize-mapper.ts similarity index 100% rename from modules/core/src/infrastructure/sequelize/sequelize-mapper.ts rename to modules/core/src/api/infrastructure/sequelize/sequelize-mapper.ts diff --git a/modules/core/src/infrastructure/sequelize/sequelize-repository.ts b/modules/core/src/api/infrastructure/sequelize/sequelize-repository.ts similarity index 99% rename from modules/core/src/infrastructure/sequelize/sequelize-repository.ts rename to modules/core/src/api/infrastructure/sequelize/sequelize-repository.ts index f793ed14..aac2ddb9 100644 --- a/modules/core/src/infrastructure/sequelize/sequelize-repository.ts +++ b/modules/core/src/api/infrastructure/sequelize/sequelize-repository.ts @@ -1,4 +1,4 @@ -import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria"; +import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server"; import { IAggregateRootRepository, UniqueID } from "@repo/rdx-ddd"; import { Result } from "@repo/rdx-utils"; import { FindOptions, ModelDefined, Sequelize, Transaction } from "sequelize"; diff --git a/modules/core/src/infrastructure/sequelize/sequelize-transaction-manager.ts b/modules/core/src/api/infrastructure/sequelize/sequelize-transaction-manager.ts similarity index 100% rename from modules/core/src/infrastructure/sequelize/sequelize-transaction-manager.ts rename to modules/core/src/api/infrastructure/sequelize/sequelize-transaction-manager.ts diff --git a/modules/core/src/logger/index.ts b/modules/core/src/api/logger/index.ts similarity index 100% rename from modules/core/src/logger/index.ts rename to modules/core/src/api/logger/index.ts diff --git a/modules/core/src/logger/logger.interface.ts b/modules/core/src/api/logger/logger.interface.ts similarity index 100% rename from modules/core/src/logger/logger.interface.ts rename to modules/core/src/api/logger/logger.interface.ts diff --git a/modules/core/src/modules/index.ts b/modules/core/src/api/modules/index.ts similarity index 100% rename from modules/core/src/modules/index.ts rename to modules/core/src/api/modules/index.ts diff --git a/modules/core/src/modules/module-client.interface.ts b/modules/core/src/api/modules/module-client.interface.ts similarity index 100% rename from modules/core/src/modules/module-client.interface.ts rename to modules/core/src/api/modules/module-client.interface.ts diff --git a/modules/core/src/modules/module-server.interface.ts b/modules/core/src/api/modules/module-server.interface.ts similarity index 100% rename from modules/core/src/modules/module-server.interface.ts rename to modules/core/src/api/modules/module-server.interface.ts diff --git a/modules/core/src/modules/types.ts b/modules/core/src/api/modules/types.ts similarity index 100% rename from modules/core/src/modules/types.ts rename to modules/core/src/api/modules/types.ts diff --git a/modules/core/src/dto/error.dto.ts b/modules/core/src/common/dto/error.dto.ts similarity index 100% rename from modules/core/src/dto/error.dto.ts rename to modules/core/src/common/dto/error.dto.ts diff --git a/modules/core/src/dto/index.ts b/modules/core/src/common/dto/index.ts similarity index 100% rename from modules/core/src/dto/index.ts rename to modules/core/src/common/dto/index.ts diff --git a/modules/core/src/dto/list.dto.ts b/modules/core/src/common/dto/list.dto.ts similarity index 100% rename from modules/core/src/dto/list.dto.ts rename to modules/core/src/common/dto/list.dto.ts diff --git a/modules/core/src/dto/metadata.dto.ts b/modules/core/src/common/dto/metadata.dto.ts similarity index 100% rename from modules/core/src/dto/metadata.dto.ts rename to modules/core/src/common/dto/metadata.dto.ts diff --git a/modules/core/src/dto/money.dto.ts b/modules/core/src/common/dto/money.dto.ts similarity index 100% rename from modules/core/src/dto/money.dto.ts rename to modules/core/src/common/dto/money.dto.ts diff --git a/modules/core/src/dto/percentage.dto.ts b/modules/core/src/common/dto/percentage.dto.ts similarity index 100% rename from modules/core/src/dto/percentage.dto.ts rename to modules/core/src/common/dto/percentage.dto.ts diff --git a/modules/core/src/dto/quantity.dto.ts b/modules/core/src/common/dto/quantity.dto.ts similarity index 100% rename from modules/core/src/dto/quantity.dto.ts rename to modules/core/src/common/dto/quantity.dto.ts diff --git a/modules/core/src/dto/tax-type.dto.ts b/modules/core/src/common/dto/tax-type.dto.ts similarity index 100% rename from modules/core/src/dto/tax-type.dto.ts rename to modules/core/src/common/dto/tax-type.dto.ts diff --git a/modules/core/src/web/api/axios/create-axios-data-source.ts b/modules/core/src/web/api/axios/create-axios-data-source.ts new file mode 100644 index 00000000..26856182 --- /dev/null +++ b/modules/core/src/web/api/axios/create-axios-data-source.ts @@ -0,0 +1,35 @@ +import { AxiosInstance } from "axios"; +import { IDataSource } from "../datasource.interface"; + +export const createAxiosDataSource = (client: AxiosInstance): IDataSource => { + return { + getList: async (resource: string, params?: Record) => { + const res = await client.get(resource, { params }); + return res.data; + }, + + getOne: async (resource: string, id: string | number) => { + const res = await client.get(`${resource}/${id}`); + return res.data; + }, + + getMany: async (resource: string, ids: Array) => { + const res = await client.get(`${resource}`, { params: { ids } }); + return res.data; + }, + + createOne: async (resource: string, data: Partial) => { + const res = await client.post(resource, data); + return res.data; + }, + + updateOne: async (resource: string, id: string | number, data: Partial) => { + const res = await client.put(`${resource}/${id}`, data); + return res.data; + }, + + deleteOne: async (resource: string, id: string | number) => { + await client.delete(`${resource}/${id}`); + }, + }; +}; diff --git a/modules/core/src/web/api/axios/create-axios-instance.ts b/modules/core/src/web/api/axios/create-axios-instance.ts new file mode 100644 index 00000000..3004d24d --- /dev/null +++ b/modules/core/src/web/api/axios/create-axios-instance.ts @@ -0,0 +1,47 @@ +import axios, { AxiosInstance } from "axios"; +import { setupInterceptors } from "./setup-interceptors"; + +/** + * Configuración necesaria para crear una instancia de Axios personalizada. + */ +export interface AxiosFactoryConfig { + /** URL base del backend API. */ + baseURL: string; + + /** + * Función que retorna el token JWT actual. + * Debe devolver `null` si no hay token disponible. + */ + getAccessToken: () => string | null; + + /** + * Función opcional que se ejecuta cuando ocurre un error de autenticación (por ejemplo, 401). + */ + onAuthError?: () => void; +} + +/** + * Crea una instancia de Axios preconfigurada con interceptores. + * + * @param config - Configuración necesaria para inicializar Axios correctamente. + * @returns Instancia de Axios lista para usarse. + */ +export const createAxiosInstance = ({ + baseURL, + getAccessToken, + onAuthError, +}: AxiosFactoryConfig): AxiosInstance => { + const instance = axios.create({ + baseURL, + headers: { + Accept: "application/json", + "Content-Type": "application/json; charset=utf-8", + "Cache-Control": "no-cache", + "Access-Control-Allow-Origin": "*", // Could work and fix the previous problem, but not in all APIs + }, + }); + + setupInterceptors(instance, getAccessToken, onAuthError); + + return instance; +}; diff --git a/modules/core/src/web/api/axios/index.ts b/modules/core/src/web/api/axios/index.ts new file mode 100644 index 00000000..0ee47f2b --- /dev/null +++ b/modules/core/src/web/api/axios/index.ts @@ -0,0 +1,2 @@ +export * from "./create-axios-data-source"; +export * from "./create-axios-instance"; diff --git a/modules/core/src/web/api/axios/setup-interceptors.ts b/modules/core/src/web/api/axios/setup-interceptors.ts new file mode 100644 index 00000000..56da5a48 --- /dev/null +++ b/modules/core/src/web/api/axios/setup-interceptors.ts @@ -0,0 +1,37 @@ +import { AxiosError, AxiosInstance, InternalAxiosRequestConfig } from "axios"; + +/** + * Configura interceptores para una instancia de Axios. + * + * @param instance - Instancia de Axios que será modificada. + * @param getAccessToken - Función que devuelve el token JWT actual. + * @param onAuthError - Función opcional que se ejecuta ante errores de autenticación (status 401). + */ +export const setupInterceptors = ( + instance: AxiosInstance, + getAccessToken: () => string | null, + onAuthError?: () => void +): void => { + instance.interceptors.request.use( + (config: InternalAxiosRequestConfig) => { + const token = getAccessToken(); + if (token && config.headers) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + (error: unknown) => { + return Promise.reject(error); + } + ); + + instance.interceptors.response.use( + (response) => response, + (error: AxiosError) => { + if (error.response?.status === 401 && onAuthError) { + onAuthError(); + } + return Promise.reject(error); + } + ); +}; diff --git a/modules/core/src/web/api/datasource-context.tsx b/modules/core/src/web/api/datasource-context.tsx new file mode 100644 index 00000000..3e2d8129 --- /dev/null +++ b/modules/core/src/web/api/datasource-context.tsx @@ -0,0 +1,20 @@ +import { createContext, useContext } from "react"; +import { IDataSource } from "./datasource.interface"; + +const DataSourceContext = createContext(null); + +export const DataSourceProvider = ({ + dataSource, + children, +}: { + dataSource: IDataSource; + children: React.ReactNode; +}) => {children}; + +export const useDataSource = (): IDataSource => { + const context = useContext(DataSourceContext); + if (!context) { + throw new Error("useDataSource debe usarse dentro de "); + } + return context; +}; diff --git a/modules/core/src/web/api/datasource.interface.ts b/modules/core/src/web/api/datasource.interface.ts new file mode 100644 index 00000000..a4ed5a25 --- /dev/null +++ b/modules/core/src/web/api/datasource.interface.ts @@ -0,0 +1,8 @@ +export interface IDataSource { + getList(resource: string, params?: Record): Promise; + getOne(resource: string, id: string | number): Promise; + getMany(resource: string, ids: Array): Promise; + createOne(resource: string, data: Partial): Promise; + updateOne(resource: string, id: string | number, data: Partial): Promise; + deleteOne(resource: string, id: string | number): Promise; +} diff --git a/modules/core/src/web/api/index.ts b/modules/core/src/web/api/index.ts new file mode 100644 index 00000000..660d38b6 --- /dev/null +++ b/modules/core/src/web/api/index.ts @@ -0,0 +1,3 @@ +export * from "./axios"; +export * from "./datasource-context"; +export * from "./datasource.interface"; diff --git a/modules/core/src/web/hooks/use-datasource/datasource.interface.ts b/modules/core/src/web/hooks/use-datasource/datasource.interface.ts deleted file mode 100644 index d009fdfa..00000000 --- a/modules/core/src/web/hooks/use-datasource/datasource.interface.ts +++ /dev/null @@ -1,114 +0,0 @@ -import type { IListResponseDTO } from "@erp/core"; -import { type AxiosHeaderValue, type ResponseType } from "axios"; - -export interface IPaginationDataProviderParam { - pageIndex: number; - pageSize: number; -} - -export interface ISortItemDataProviderParam { - order: string; - field: string; -} - -export interface IFilterItemDataProviderParam { - field: string; - operator?: string; - value?: string; -} - -export interface IGetListDataProviderParams { - resource: string; - quickSearchTerm?: string[]; - pagination?: IPaginationDataProviderParam; - sort?: ISortItemDataProviderParam[]; - filters?: IFilterItemDataProviderParam[]; -} - -export interface IGetOneDataProviderParams { - resource: string; - id: string; -} - -export interface ISaveOneDataProviderParams { - resource: string; - data: T; - id: string; -} - -export interface ICreateOneDataProviderParams { - resource: string; - data: T; -} - -export interface IUpdateOneDataProviderParams { - resource: string; - data: T; - id: string; -} - -export interface IRemoveOneDataProviderParams { - resource: string; - id: string; -} - -export interface IDownloadPDFDataProviderParams { - url: string; - config?: { - [key: string]: unknown; - }; -} - -export interface IDownloadPDFDataProviderResponse { - filename: string; - filedata: Blob; -} - -export interface IUploadFileDataProviderParam { - path: string; - //resource: string; - //id: string; - file: File; - key: string; - onUploadProgress?: any; -} - -export interface ICustomDataProviderParam { - url?: string; - path?: string; - method: "get" | "delete" | "head" | "options" | "post" | "put" | "patch"; - signal?: AbortSignal; - responseType?: ResponseType; - headers?: { - [key: string]: AxiosHeaderValue; - }; - [key: string]: unknown; -} - -export interface IDataSource { - name: () => string; - getList: (params: IGetListDataProviderParams) => Promise>; - getOne: (params: IGetOneDataProviderParams) => Promise; - //saveOne: (params: ISaveOneDataProviderParams

) => Promise; - createOne: (params: ICreateOneDataProviderParams

) => Promise; - updateOne: (params: IUpdateOneDataProviderParams

) => Promise; - removeOne: (params: IRemoveOneDataProviderParams) => Promise; - downloadPDF: ( - params: IDownloadPDFDataProviderParams - ) => Promise; - uploadFile: (params: IUploadFileDataProviderParam) => Promise; - custom: (params: ICustomDataProviderParam) => Promise; - - getApiUrl: () => string; - getApiAuthorization: () => string; - - //create: () => any; - //createMany: () => any; - //removeMany: () => any; - //getMany: () => any; - //update: () => any; - //updateMany: () => any; - //upload: () => any; - //custom: () => any; - //getApiUrl: () => string; -} diff --git a/modules/core/src/web/hooks/use-datasource/index.ts b/modules/core/src/web/hooks/use-datasource/index.ts index 3076a7ab..e69de29b 100644 --- a/modules/core/src/web/hooks/use-datasource/index.ts +++ b/modules/core/src/web/hooks/use-datasource/index.ts @@ -1,3 +0,0 @@ -export * from "./datasource.interface"; -export * from "./use-datasource"; -export * from "./use-list"; diff --git a/modules/core/src/web/hooks/use-datasource/use-datasource.tsx b/modules/core/src/web/hooks/use-datasource/use-datasource.tsx deleted file mode 100644 index fa424eef..00000000 --- a/modules/core/src/web/hooks/use-datasource/use-datasource.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { type PropsWithChildren, createContext, useContext } from "react"; -import { IDataSource } from "./datasource.interface"; - -export const DataSourceContext = createContext(undefined); - -export const DataSourceProvider = ({ - dataSource, - children, -}: PropsWithChildren<{ - dataSource: IDataSource; -}>) => {children}; - -export const useDataSource = () => { - const context = useContext(DataSourceContext); - if (context === undefined) - throw new Error("useDataSource must be used within a DataSourceProvider"); - - return context; -}; diff --git a/modules/core/src/web/hooks/use-datasource/use-list.ts b/modules/core/src/web/hooks/use-datasource/use-list.ts index 3f48a697..e6aa7890 100644 --- a/modules/core/src/web/hooks/use-datasource/use-list.ts +++ b/modules/core/src/web/hooks/use-datasource/use-list.ts @@ -7,7 +7,7 @@ import { useQuery, } from "@tanstack/react-query"; -import { isResponseAListDTO } from "@erp/core/dto"; +import { isResponseAListDTO } from "@erp/core/common/dto"; import { UseLoadingOvertimeOptionsProps, UseLoadingOvertimeReturnType, diff --git a/modules/core/src/web/index.ts b/modules/core/src/web/index.ts index 007f69d0..4b5050c6 100644 --- a/modules/core/src/web/index.ts +++ b/modules/core/src/web/index.ts @@ -1 +1,3 @@ +export * from "./api"; +export * from "./components"; export * from "./hooks"; diff --git a/modules/invoices/package.json b/modules/invoices/package.json index 13d1de85..996926ef 100644 --- a/modules/invoices/package.json +++ b/modules/invoices/package.json @@ -13,25 +13,12 @@ "./components/*": "./src/web/components/*.tsx", "./locales": "./src/common/locales/index.tsx" }, - "peerDependencies": { - "ag-grid-community": "^33.3.0", - "ag-grid-react": "^33.3.0", - "express": "^4.18.2", - "i18next": "^25.1.1", - "lucide-react": "^0.503.0", - "react": "^18 || ^19", - "react-dom": "^18 || ^19", - "react-i18next": "^15.5.1", - "react-router-dom": "^6.26.0", - "sequelize": "^6.37.5" - }, "devDependencies": { "@biomejs/biome": "1.9.4", "@types/express": "^4.17.21", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.3", "@types/react-i18next": "^8.1.0", - "sequelize": "^6.37.5", "typescript": "^5.8.3" }, "dependencies": { @@ -50,6 +37,7 @@ "react-dom": "^19.1.0", "react-i18next": "^15.5.1", "react-router-dom": "^6.26.0", + "sequelize": "^6.37.5", "slugify": "^1.6.6", "zod": "^3.24.4" } diff --git a/modules/invoices/src/api/application/list-invoices.use-case.ts b/modules/invoices/src/api/application/list-invoices.use-case.ts index 2d665333..906ff0ca 100644 --- a/modules/invoices/src/api/application/list-invoices.use-case.ts +++ b/modules/invoices/src/api/application/list-invoices.use-case.ts @@ -1,5 +1,5 @@ import { ITransactionManager } from "@erp/core"; -import { Criteria } from "@repo/rdx-criteria"; +import { Criteria } from "@repo/rdx-criteria/server"; import { Collection, Result } from "@repo/rdx-utils"; import { Transaction } from "sequelize"; import { IInvoiceService, Invoice } from "../domain"; diff --git a/modules/invoices/src/api/domain/repositories/invoice-repository.interface.ts b/modules/invoices/src/api/domain/repositories/invoice-repository.interface.ts index ddedc080..8d62bcf4 100644 --- a/modules/invoices/src/api/domain/repositories/invoice-repository.interface.ts +++ b/modules/invoices/src/api/domain/repositories/invoice-repository.interface.ts @@ -1,4 +1,4 @@ -import { Criteria } from "@repo/rdx-criteria"; +import { Criteria } from "@repo/rdx-criteria/server"; import { UniqueID } from "@repo/rdx-ddd"; import { Collection, Result } from "@repo/rdx-utils"; import { Invoice } from "../aggregates"; diff --git a/modules/invoices/src/api/domain/services/invoice-service.interface.ts b/modules/invoices/src/api/domain/services/invoice-service.interface.ts index 7e0f771d..26206bc4 100644 --- a/modules/invoices/src/api/domain/services/invoice-service.interface.ts +++ b/modules/invoices/src/api/domain/services/invoice-service.interface.ts @@ -1,4 +1,4 @@ -import { Criteria } from "@repo/rdx-criteria"; +import { Criteria } from "@repo/rdx-criteria/server"; import { UniqueID } from "@repo/rdx-ddd"; import { Collection, Result } from "@repo/rdx-utils"; import { IInvoiceProps, Invoice } from "../aggregates"; diff --git a/modules/invoices/src/api/domain/services/invoice.service.ts b/modules/invoices/src/api/domain/services/invoice.service.ts index f64d312d..8305c424 100644 --- a/modules/invoices/src/api/domain/services/invoice.service.ts +++ b/modules/invoices/src/api/domain/services/invoice.service.ts @@ -1,4 +1,4 @@ -import { Criteria } from "@repo/rdx-criteria"; +import { Criteria } from "@repo/rdx-criteria/server"; import { UniqueID } from "@repo/rdx-ddd"; import { Collection, Result } from "@repo/rdx-utils"; import { Transaction } from "sequelize"; diff --git a/modules/invoices/src/api/infrastructure/sequelize/invoice.repository.ts b/modules/invoices/src/api/infrastructure/sequelize/invoice.repository.ts index 08feadcc..d17b3e6c 100644 --- a/modules/invoices/src/api/infrastructure/sequelize/invoice.repository.ts +++ b/modules/invoices/src/api/infrastructure/sequelize/invoice.repository.ts @@ -1,5 +1,5 @@ import { SequelizeRepository } from "@erp/core"; -import { Criteria } from "@repo/rdx-criteria"; +import { Criteria } from "@repo/rdx-criteria/server"; import { UniqueID } from "@repo/rdx-ddd"; import { Collection, Result } from "@repo/rdx-utils"; import { Sequelize, Transaction } from "sequelize"; diff --git a/modules/invoices/src/api/presentation/list-invoices/presenter/list-invoices.presenter.ts b/modules/invoices/src/api/presentation/list-invoices/presenter/list-invoices.presenter.ts index 74caf81c..f4c795a3 100644 --- a/modules/invoices/src/api/presentation/list-invoices/presenter/list-invoices.presenter.ts +++ b/modules/invoices/src/api/presentation/list-invoices/presenter/list-invoices.presenter.ts @@ -1,5 +1,5 @@ import { IListResponseDTO } from "@erp/core"; -import { Criteria } from "@repo/rdx-criteria"; +import { Criteria } from "@repo/rdx-criteria/server"; import { Collection } from "@repo/rdx-utils"; import { IListInvoicesResponseDTO } from "../../../../common/dto"; import { Invoice } from "../../../domain"; diff --git a/modules/invoices/src/web/components/invoices-grid.tsx b/modules/invoices/src/web/components/invoices-grid.tsx index de7e21aa..728b6667 100644 --- a/modules/invoices/src/web/components/invoices-grid.tsx +++ b/modules/invoices/src/web/components/invoices-grid.tsx @@ -50,26 +50,32 @@ interface IRow { export const InvoicesGrid = () => { const { useList } = useInvoices(); - const { data, isPending, isError, error } = useList({}); + const { data, isLoading, isPending, isError, error } = useList({}); // Column Definitions: Defines & controls grid columns. const [colDefs] = useState([ + { field: "invoice_number" }, + { field: "invoice_series" }, { - field: "mission", - filter: true, - minWidth: 200, + field: "status", }, - { field: "company", filter: false }, - { field: "location" }, - { field: "date" }, + + { field: "issue_date" }, + { field: "operation_date" }, { - field: "price", + field: "subtotal", valueFormatter: (params: ValueFormatterParams) => { - return `£${params.value.toLocaleString()}`; + return "0 €"; + //return `£${params.value.toLocaleString()}`; + }, + }, + { + field: "total", + valueFormatter: (params: ValueFormatterParams) => { + return "0 €"; + //return `£${params.value.toLocaleString()}`; }, }, - { field: "successful" }, - { field: "rocket" }, ]); // Apply settings across all columns @@ -92,7 +98,7 @@ export const InvoicesGrid = () => { > =16.8.0' + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + '@emotion/is-prop-valid@1.3.1': resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/styled@11.14.0': + resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@esbuild/aix-ppc64@0.25.4': resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} @@ -1176,11 +1333,122 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hookform/devtools@4.4.0': + resolution: {integrity: sha512-Mtlic+uigoYBPXlfvPBfiYYUZuyMrD3pTjDpVIhL6eCZTvQkHsKBSKeZCvXWUZr8fqrkzDg27N+ZuazLKq6Vmg==} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: ^16.8.0 || ^17 || ^18 || ^19 + '@hookform/resolvers@5.0.1': resolution: {integrity: sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==} peerDependencies: react-hook-form: ^7.55.0 + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/checkbox@4.1.5': resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==} engines: {node: '>=18'} @@ -1306,6 +1574,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -1502,6 +1774,12 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} + '@peterek/vite-plugin-favicons@2.1.0': + resolution: {integrity: sha512-jx2eg6xXTXB+zezx6tPoS3WVlO7Kfep+brnmt4P5Jf4sdbNul1HqhyzlsRHORbXgs/MxF3fmRiaRU3dcgs49wQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + vite: '>=5.0.0' + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2122,6 +2400,10 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + '@rollup/rollup-android-arm-eabi@4.40.2': resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} cpu: [arm] @@ -2250,60 +2532,117 @@ packages: '@tailwindcss/node@4.1.5': resolution: {integrity: sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==} + '@tailwindcss/node@4.1.7': + resolution: {integrity: sha512-9rsOpdY9idRI2NH6CL4wORFY0+Q6fnx9XP9Ju+iq/0wJwGD5IByIgFmwVbyy4ymuyprj8Qh4ErxMKTUL4uNh3g==} + '@tailwindcss/oxide-android-arm64@4.1.5': resolution: {integrity: sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] + '@tailwindcss/oxide-android-arm64@4.1.7': + resolution: {integrity: sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + '@tailwindcss/oxide-darwin-arm64@4.1.5': resolution: {integrity: sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@tailwindcss/oxide-darwin-arm64@4.1.7': + resolution: {integrity: sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.5': resolution: {integrity: sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.7': + resolution: {integrity: sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@tailwindcss/oxide-freebsd-x64@4.1.5': resolution: {integrity: sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.1.7': + resolution: {integrity: sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.5': resolution: {integrity: sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7': + resolution: {integrity: sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.5': resolution: {integrity: sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.7': + resolution: {integrity: sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.5': resolution: {integrity: sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.7': + resolution: {integrity: sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.5': resolution: {integrity: sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.7': + resolution: {integrity: sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.5': resolution: {integrity: sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.7': + resolution: {integrity: sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-wasm32-wasi@4.1.5': resolution: {integrity: sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==} engines: {node: '>=14.0.0'} @@ -2316,28 +2655,70 @@ packages: - '@emnapi/wasi-threads' - tslib + '@tailwindcss/oxide-wasm32-wasi@4.1.7': + resolution: {integrity: sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + '@tailwindcss/oxide-win32-arm64-msvc@4.1.5': resolution: {integrity: sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.1.7': + resolution: {integrity: sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.5': resolution: {integrity: sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.7': + resolution: {integrity: sha512-rYHGmvoHiLJ8hWucSfSOEmdCBIGZIq7SpkPRSqLsH2Ab2YUNgKeAPT1Fi2cx3+hnYOrAb0jp9cRyode3bBW4mQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@tailwindcss/oxide@4.1.5': resolution: {integrity: sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==} engines: {node: '>= 10'} + '@tailwindcss/oxide@4.1.7': + resolution: {integrity: sha512-5SF95Ctm9DFiUyjUPnDGkoKItPX/k+xifcQhcqX5RA85m50jw1pT/KzjdvlqxRja45Y52nR4MR9fD1JYd7f8NQ==} + engines: {node: '>= 10'} + '@tailwindcss/postcss@4.1.5': resolution: {integrity: sha512-5lAC2/pzuyfhsFgk6I58HcNy6vPK3dV/PoPxSDuOTVbDvCddYHzHiJZZInGIY0venvzzfrTEUAXJFULAfFmObg==} + '@tailwindcss/vite@4.1.7': + resolution: {integrity: sha512-tYa2fO3zDe41I7WqijyVbRd8oWT0aEID1Eokz5hMT6wShLIHj3yvwj9XbfuloHP9glZ6H+aG2AN/+ZrxJ1Y5RQ==} + peerDependencies: + vite: ^5.2.0 || ^6 + '@tanstack/query-core@5.75.4': resolution: {integrity: sha512-pcqOUgWG9oGlzkfRQQMMsEFmtQu0wq81A414CtELZGq+ztVwSTAaoB3AZRAXQJs88LmNMk2YpUKuQbrvzNDyRg==} + '@tanstack/query-devtools@5.76.0': + resolution: {integrity: sha512-1p92nqOBPYVqVDU0Ua5nzHenC6EGZNrLnB2OZphYw8CNA1exuvI97FVgIKON7Uug3uQqvH/QY8suUKpQo8qHNQ==} + + '@tanstack/react-query-devtools@5.77.2': + resolution: {integrity: sha512-TxB9boB0dmTJByAfh36kbhvohNHZiPJe+m+PCnbnfL+gdDHJbp174S6BwbU2dHx980njeAKFmWz8tgHNKG3itw==} + peerDependencies: + '@tanstack/react-query': ^5.77.2 + react: ^18 || ^19 + '@tanstack/react-query@5.75.4': resolution: {integrity: sha512-Vf65pzYRkf8fk9SP1ncIZjvaXszBhtsvpf+h45Y/9kOywOrVZfBGUpCdffdsVzbmBzmz6TCFes9bM0d3pRrIsA==} peerDependencies: @@ -2490,6 +2871,9 @@ packages: '@types/jsonwebtoken@9.0.9': resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} + '@types/lodash@4.17.17': + resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==} + '@types/luxon@3.6.2': resolution: {integrity: sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==} @@ -2760,6 +3144,9 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2820,6 +3207,9 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -2861,6 +3251,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -2871,6 +3265,10 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -2943,6 +3341,13 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorspace@1.1.4: resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} @@ -2961,9 +3366,20 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + + consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2982,6 +3398,9 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -3018,6 +3437,16 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -3139,6 +3568,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -3177,9 +3610,29 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dot-case@2.1.1: resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv-expand@8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} + engines: {node: '>=12'} + dotenv@16.5.0: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} @@ -3246,6 +3699,9 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -3298,6 +3754,10 @@ packages: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -3312,6 +3772,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -3357,6 +3820,10 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + favicons@7.2.0: + resolution: {integrity: sha512-k/2rVBRIRzOeom3wI9jBPaSEvoTSQEW4iM0EveBmBBKFxO8mSyyRWtDlfC3VnEfu0avmjrMzy8/ZFPSe6F71Hw==} + engines: {node: '>=14.0.0'} + fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -3389,6 +3856,9 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3522,6 +3992,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@16.2.0: + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} + engines: {node: '>=18'} + globby@10.0.2: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} @@ -3568,6 +4042,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} @@ -3575,9 +4053,17 @@ packages: resolution: {integrity: sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==} engines: {node: '>=18.0.0'} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -3608,6 +4094,9 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + i18next-browser-languagedetector@8.1.0: + resolution: {integrity: sha512-mHZxNx1Lq09xt5kCauZ/4bsXOEA2pfpwSoU11/QTJB+pD94iONFwp+ohqi///PwiFvjFOxe1akYCdHyFo1ng5Q==} + i18next@25.1.1: resolution: {integrity: sha512-FZcp3vk3PXc8onasbsWYahfeDIWX4LkKr4vd01xeXrmqyNXlVNtVecEIw2K1o8z3xYrHMcd1bwYQub+3g7zqCw==} peerDependencies: @@ -4020,64 +4509,128 @@ packages: cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.29.2: resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.29.2: resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.29.2: resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.29.2: resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-arm64-musl@1.29.2: resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-x64-gnu@1.29.2: resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-linux-x64-musl@1.29.2: resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-win32-arm64-msvc@1.29.2: resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.29.2: resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.29.2: resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} engines: {node: '>= 12.0.0'} + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -4089,6 +4642,11 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + little-state-machine@4.8.1: + resolution: {integrity: sha512-liPHqaWMQ7rzZryQUDnbZ1Gclnnai3dIyaJ0nAgwZRXMzqbYrydrlCI0NDojRUbE5VYh5vu6hygEUZiH77nQkQ==} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4163,6 +4721,9 @@ packages: lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -4186,6 +4747,9 @@ packages: resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} engines: {node: '>=12'} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -4277,6 +4841,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -4286,6 +4854,11 @@ packages: engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + module-alias@2.2.3: resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==} @@ -4311,6 +4884,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -4362,6 +4938,9 @@ packages: no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} @@ -4377,6 +4956,9 @@ packages: encoding: optional: true + node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -4408,6 +4990,9 @@ packages: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4484,6 +5069,9 @@ packages: param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4503,6 +5091,9 @@ packages: pascal-case@2.0.1: resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + passport-jwt@4.0.1: resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} @@ -4550,6 +5141,9 @@ packages: path@0.12.7: resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + pause@0.0.1: resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} @@ -4729,6 +5323,12 @@ packages: peerDependencies: react: '>=16.13.1' + react-hook-form-persist@3.0.0: + resolution: {integrity: sha512-6nwW65JyFpBem9RjLYAWvIFxOLoCk0E13iB9e5yeF5jeHlwx1ua0M77FvwhPpD8eaCz7hG4ziCdOxRcnJVUSxQ==} + peerDependencies: + react: '>= 16.3' + react-hook-form: '>= 6' + react-hook-form@7.56.2: resolution: {integrity: sha512-vpfuHuQMF/L6GpuQ4c3ZDo+pRYxIi40gQqsCmmfUBwm+oqvBhKhwghCuj2o00YCgSfU6bR9KC/xnQGWm3Gr08A==} engines: {node: '>=18.0.0'} @@ -4800,6 +5400,14 @@ packages: peerDependencies: react: '>=16.8' + react-secure-storage@1.3.2: + resolution: {integrity: sha512-pNCyksbLXWIYRS9vCzERXdIMErtx9Ik70TPtLKivcq44+zYybbxA72wpp5ivghK9Xe0gRku2w/7zBy/9n+RtKA==} + + react-simple-animate@3.5.3: + resolution: {integrity: sha512-Ob+SmB5J1tXDEZyOe2Hf950K4M8VaWBBmQ3cS2BUnTORqHjhK0iKG8fB+bo47ZL15t8d3g/Y0roiqH05UBjG7A==} + peerDependencies: + react-dom: ^16.8.0 || ^17 || ^18 || ^19 + react-smooth@4.0.4: resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} peerDependencies: @@ -4854,6 +5462,10 @@ packages: resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} engines: {node: '>=0.10.0'} + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5030,6 +5642,10 @@ packages: shallow-equal-object@1.1.1: resolution: {integrity: sha512-9DDzYRlzCwF2CemeF0aOFk5T5KMrjG7HldcW7utwYhA/limuGHn3No8KhpDE8BrO7GLaSRJumNKReipZBybd7A==} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5106,6 +5722,10 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -5185,6 +5805,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + stylus@0.62.0: resolution: {integrity: sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==} hasBin: true @@ -5219,8 +5842,8 @@ packages: tailwindcss@4.1.5: resolution: {integrity: sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==} - tailwindcss@4.1.6: - resolution: {integrity: sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==} + tailwindcss@4.1.7: + resolution: {integrity: sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg==} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -5230,6 +5853,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + terser@5.39.0: resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} @@ -5492,6 +6119,12 @@ packages: '@types/react': optional: true + use-deep-compare-effect@1.8.1: + resolution: {integrity: sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13' + use-sidecar@1.1.3: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} @@ -5557,6 +6190,11 @@ packages: victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + vite-plugin-html@3.2.2: + resolution: {integrity: sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==} + peerDependencies: + vite: '>=2.0.0' + vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: @@ -5674,6 +6312,14 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5684,6 +6330,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -6011,13 +6661,93 @@ snapshots: react: 19.1.0 tslib: 2.8.1 + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/runtime': 7.27.1 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + '@emotion/is-prop-valid@1.3.1': dependencies: '@emotion/memoize': 0.9.0 - optional: true - '@emotion/memoize@0.9.0': - optional: true + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@19.1.3)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.1 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.3 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.3)(react@19.1.0))(@types/react@19.1.3)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.1 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.14.0(@types/react@19.1.3)(react@19.1.0) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) + '@emotion/utils': 1.4.2 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.3 + transitivePeerDependencies: + - supports-color + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.1.0)': + dependencies: + react: 19.1.0 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} '@esbuild/aix-ppc64@0.25.4': optional: true @@ -6117,11 +6847,102 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 + '@hookform/devtools@4.4.0(@types/react@19.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@emotion/react': 11.14.0(@types/react@19.1.3)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.3)(react@19.1.0))(@types/react@19.1.3)(react@19.1.0) + '@types/lodash': 4.17.17 + little-state-machine: 4.8.1(react@19.1.0) + lodash: 4.17.21 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-simple-animate: 3.5.3(react-dom@19.1.0(react@19.1.0)) + use-deep-compare-effect: 1.8.1(react@19.1.0) + uuid: 8.3.2 + transitivePeerDependencies: + - '@types/react' + - supports-color + '@hookform/resolvers@5.0.1(react-hook-form@7.56.2(react@19.1.0))': dependencies: '@standard-schema/utils': 0.3.0 react-hook-form: 7.56.2(react@19.1.0) + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.4.3 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@inquirer/checkbox@4.1.5(@types/node@22.15.12)': dependencies: '@inquirer/core': 10.1.10(@types/node@22.15.12) @@ -6247,6 +7068,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -6433,7 +7258,6 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - optional: true '@jridgewell/sourcemap-codec@1.5.0': {} @@ -6534,6 +7358,11 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.1 '@parcel/watcher-win32-x64': 2.5.1 + '@peterek/vite-plugin-favicons@2.1.0(vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))': + dependencies: + favicons: 7.2.0 + vite: 6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) + '@pkgjs/parseargs@0.11.0': optional: true @@ -7192,6 +8021,11 @@ snapshots: '@remix-run/router@1.23.0': {} + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + '@rollup/rollup-android-arm-eabi@4.40.2': optional: true @@ -7289,42 +8123,88 @@ snapshots: lightningcss: 1.29.2 tailwindcss: 4.1.5 + '@tailwindcss/node@4.1.7': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.7 + '@tailwindcss/oxide-android-arm64@4.1.5': optional: true + '@tailwindcss/oxide-android-arm64@4.1.7': + optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.5': optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.7': + optional: true + '@tailwindcss/oxide-darwin-x64@4.1.5': optional: true + '@tailwindcss/oxide-darwin-x64@4.1.7': + optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.5': optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.7': + optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.5': optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7': + optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.5': optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.7': + optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.5': optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.7': + optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.5': optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.7': + optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.5': optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.7': + optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.5': optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.7': + optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.5': optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.7': + optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.5': optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.7': + optional: true + '@tailwindcss/oxide@4.1.5': optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.1.5 @@ -7340,6 +8220,24 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.5 '@tailwindcss/oxide-win32-x64-msvc': 4.1.5 + '@tailwindcss/oxide@4.1.7': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.7 + '@tailwindcss/oxide-darwin-arm64': 4.1.7 + '@tailwindcss/oxide-darwin-x64': 4.1.7 + '@tailwindcss/oxide-freebsd-x64': 4.1.7 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.7 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.7 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.7 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.7 + '@tailwindcss/oxide-linux-x64-musl': 4.1.7 + '@tailwindcss/oxide-wasm32-wasi': 4.1.7 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.7 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.7 + '@tailwindcss/postcss@4.1.5': dependencies: '@alloc/quick-lru': 5.2.0 @@ -7348,8 +8246,23 @@ snapshots: postcss: 8.5.3 tailwindcss: 4.1.5 + '@tailwindcss/vite@4.1.7(vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))': + dependencies: + '@tailwindcss/node': 4.1.7 + '@tailwindcss/oxide': 4.1.7 + tailwindcss: 4.1.7 + vite: 6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) + '@tanstack/query-core@5.75.4': {} + '@tanstack/query-devtools@5.76.0': {} + + '@tanstack/react-query-devtools@5.77.2(@tanstack/react-query@5.75.4(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/query-devtools': 5.76.0 + '@tanstack/react-query': 5.75.4(react@19.1.0) + react: 19.1.0 + '@tanstack/react-query@5.75.4(react@19.1.0)': dependencies: '@tanstack/query-core': 5.75.4 @@ -7543,6 +8456,8 @@ snapshots: '@types/ms': 2.1.0 '@types/node': 22.15.12 + '@types/lodash@4.17.17': {} + '@types/luxon@3.6.2': {} '@types/mime@1.3.5': {} @@ -7555,8 +8470,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/parse-json@4.0.2': - optional: true + '@types/parse-json@4.0.2': {} '@types/passport-jwt@4.0.1': dependencies: @@ -7642,14 +8556,14 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.29.2)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))': + '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.29.2)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) transitivePeerDependencies: - supports-color @@ -7807,7 +8721,6 @@ snapshots: '@babel/runtime': 7.27.1 cosmiconfig: 7.1.0 resolve: 1.22.10 - optional: true babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.1): dependencies: @@ -7871,6 +8784,8 @@ snapshots: transitivePeerDependencies: - supports-color + boolbase@1.0.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -7934,6 +8849,11 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -7987,6 +8907,8 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + ci-info@3.9.0: {} cjs-module-lexer@1.4.3: {} @@ -7995,6 +8917,10 @@ snapshots: dependencies: clsx: 2.1.1 + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + clean-stack@2.2.0: {} cli-cursor@3.1.0: @@ -8061,6 +8987,13 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@2.0.20: {} + colorspace@1.1.4: dependencies: color: 3.2.1 @@ -8072,13 +9005,18 @@ snapshots: commander@10.0.1: {} - commander@2.20.3: - optional: true + commander@2.20.3: {} commander@4.1.1: {} + commander@8.3.0: {} + concat-map@0.0.1: {} + connect-history-api-fallback@1.6.0: {} + + consola@2.15.3: {} + consola@3.4.2: {} console-control-strings@1.1.0: {} @@ -8094,6 +9032,8 @@ snapshots: content-type@1.0.5: {} + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.0.6: {} @@ -8118,7 +9058,6 @@ snapshots: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - optional: true create-jest@29.7.0(@types/node@22.15.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.12)(typescript@5.8.3)): dependencies: @@ -8143,6 +9082,18 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-js@4.2.0: {} + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-what@6.1.0: {} + cssesc@3.0.0: {} csstype@3.1.3: {} @@ -8236,6 +9187,8 @@ snapshots: depd@2.0.0: {} + dequal@2.0.3: {} + destroy@1.2.0: {} detect-libc@1.0.3: {} @@ -8261,10 +9214,35 @@ snapshots: '@babel/runtime': 7.27.1 csstype: 3.1.3 + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dot-case@2.1.1: dependencies: no-case: 2.3.2 + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dotenv-expand@8.0.3: {} + dotenv@16.5.0: {} dottie@2.0.6: {} @@ -8318,6 +9296,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + entities@2.2.0: {} + errno@0.1.8: dependencies: prr: 1.0.1 @@ -8389,6 +9369,8 @@ snapshots: escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -8401,6 +9383,8 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + esutils@2.0.3: {} etag@1.8.1: {} @@ -8487,6 +9471,12 @@ snapshots: dependencies: reusify: 1.1.0 + favicons@7.2.0: + dependencies: + escape-html: 1.0.3 + sharp: 0.33.5 + xml2js: 0.6.2 + fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -8525,6 +9515,8 @@ snapshots: transitivePeerDependencies: - supports-color + find-root@1.1.0: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -8665,6 +9657,8 @@ snapshots: globals@11.12.0: {} + globals@16.2.0: {} + globby@10.0.2: dependencies: '@types/glob': 7.2.0 @@ -8712,6 +9706,8 @@ snapshots: dependencies: function-bind: 1.1.2 + he@1.2.0: {} + header-case@1.0.1: dependencies: no-case: 2.3.2 @@ -8719,8 +9715,22 @@ snapshots: helmet@8.1.0: {} + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + html-escaper@2.0.2: {} + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.39.0 + html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 @@ -8760,6 +9770,10 @@ snapshots: human-signals@2.1.0: {} + i18next-browser-languagedetector@8.1.0: + dependencies: + '@babel/runtime': 7.27.1 + i18next@25.1.1(typescript@5.8.3): dependencies: '@babel/runtime': 7.27.1 @@ -8791,7 +9805,6 @@ snapshots: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - optional: true import-local@3.2.0: dependencies: @@ -9370,33 +10383,63 @@ snapshots: lightningcss-darwin-arm64@1.29.2: optional: true + lightningcss-darwin-arm64@1.30.1: + optional: true + lightningcss-darwin-x64@1.29.2: optional: true + lightningcss-darwin-x64@1.30.1: + optional: true + lightningcss-freebsd-x64@1.29.2: optional: true + lightningcss-freebsd-x64@1.30.1: + optional: true + lightningcss-linux-arm-gnueabihf@1.29.2: optional: true + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + lightningcss-linux-arm64-gnu@1.29.2: optional: true + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + lightningcss-linux-arm64-musl@1.29.2: optional: true + lightningcss-linux-arm64-musl@1.30.1: + optional: true + lightningcss-linux-x64-gnu@1.29.2: optional: true + lightningcss-linux-x64-gnu@1.30.1: + optional: true + lightningcss-linux-x64-musl@1.29.2: optional: true + lightningcss-linux-x64-musl@1.30.1: + optional: true + lightningcss-win32-arm64-msvc@1.29.2: optional: true + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + lightningcss-win32-x64-msvc@1.29.2: optional: true + lightningcss-win32-x64-msvc@1.30.1: + optional: true + lightningcss@1.29.2: dependencies: detect-libc: 2.0.4 @@ -9412,12 +10455,31 @@ snapshots: lightningcss-win32-arm64-msvc: 1.29.2 lightningcss-win32-x64-msvc: 1.29.2 + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + lilconfig@2.1.0: {} lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} + little-state-machine@4.8.1(react@19.1.0): + dependencies: + react: 19.1.0 + load-tsconfig@0.2.5: {} loader-utils@3.3.1: {} @@ -9480,6 +10542,10 @@ snapshots: lower-case@1.1.4: {} + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -9496,6 +10562,10 @@ snapshots: luxon@3.6.1: {} + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -9570,12 +10640,18 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + mkdirp@0.5.6: dependencies: minimist: 1.2.8 mkdirp@1.0.4: {} + mkdirp@3.0.1: {} + module-alias@2.2.3: {} moment-timezone@0.5.48: @@ -9596,6 +10672,8 @@ snapshots: ms@2.1.3: {} + murmurhash-js@1.0.0: {} + mute-stream@0.0.8: {} mute-stream@2.0.0: {} @@ -9647,6 +10725,11 @@ snapshots: dependencies: lower-case: 1.1.4 + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + node-addon-api@5.1.0: {} node-addon-api@7.1.1: {} @@ -9655,6 +10738,11 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-html-parser@5.4.2: + dependencies: + css-select: 4.3.0 + he: 1.2.0 + node-int64@0.4.0: {} node-plop@0.26.3: @@ -9692,6 +10780,10 @@ snapshots: gauge: 3.0.2 set-blocking: 2.0.0 + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -9783,10 +10875,14 @@ snapshots: dependencies: no-case: 2.3.2 + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + parent-module@1.0.1: dependencies: callsites: 3.1.0 - optional: true parse-json@5.2.0: dependencies: @@ -9804,6 +10900,11 @@ snapshots: camel-case: 3.0.0 upper-case-first: 1.1.2 + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + passport-jwt@4.0.1: dependencies: jsonwebtoken: 9.0.2 @@ -9847,6 +10948,8 @@ snapshots: process: 0.11.10 util: 0.10.4 + pathe@0.2.0: {} + pause@0.0.1: {} pg-connection-string@2.8.5: {} @@ -10016,6 +11119,11 @@ snapshots: '@babel/runtime': 7.27.1 react: 19.1.0 + react-hook-form-persist@3.0.0(react-hook-form@7.56.2(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-hook-form: 7.56.2(react@19.1.0) + react-hook-form@7.56.2(react@19.1.0): dependencies: react: 19.1.0 @@ -10072,6 +11180,15 @@ snapshots: '@remix-run/router': 1.23.0 react: 19.1.0 + react-secure-storage@1.3.2: + dependencies: + crypto-js: 4.2.0 + murmurhash-js: 1.0.0 + + react-simple-animate@3.5.3(react-dom@19.1.0(react@19.1.0)): + dependencies: + react-dom: 19.1.0(react@19.1.0) + react-smooth@4.0.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: fast-equals: 5.2.2 @@ -10135,6 +11252,8 @@ snapshots: dependencies: rc: 1.2.8 + relateurl@0.2.7: {} + require-directory@2.1.1: {} reserved-words@0.1.2: {} @@ -10143,8 +11262,7 @@ snapshots: dependencies: resolve-from: 5.0.0 - resolve-from@4.0.0: - optional: true + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -10234,8 +11352,7 @@ snapshots: sax@1.3.0: {} - sax@1.4.1: - optional: true + sax@1.4.1: {} scheduler@0.26.0: {} @@ -10313,6 +11430,32 @@ snapshots: shallow-equal-object@1.1.1: {} + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -10396,7 +11539,8 @@ snapshots: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - optional: true + + source-map@0.5.7: {} source-map@0.6.1: {} @@ -10461,6 +11605,8 @@ snapshots: strip-json-comments@3.1.1: {} + stylis@4.2.0: {} + stylus@0.62.0: dependencies: '@adobe/css-tools': 4.3.3 @@ -10504,7 +11650,7 @@ snapshots: tailwindcss@4.1.5: {} - tailwindcss@4.1.6: {} + tailwindcss@4.1.7: {} tapable@2.2.1: {} @@ -10517,13 +11663,21 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 - optional: true test-exclude@6.0.0: dependencies: @@ -10775,6 +11929,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.3 + use-deep-compare-effect@1.8.1(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.1 + dequal: 2.0.3 + react: 19.1.0 + use-sidecar@1.1.3(@types/react@19.1.3)(react@19.1.0): dependencies: detect-node-es: 1.1.0 @@ -10841,18 +12001,34 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.29.2)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1)): + vite-plugin-html@3.2.2(vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1)): + dependencies: + '@rollup/pluginutils': 4.2.1 + colorette: 2.0.20 + connect-history-api-fallback: 1.6.0 + consola: 2.15.3 + dotenv: 16.5.0 + dotenv-expand: 8.0.3 + ejs: 3.1.10 + fast-glob: 3.3.3 + fs-extra: 10.1.0 + html-minifier-terser: 6.1.0 + node-html-parser: 5.4.2 + pathe: 0.2.0 + vite: 6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) + + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.29.2)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) transitivePeerDependencies: - supports-color - typescript - vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.29.2)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1): + vite@6.3.5(@types/node@22.15.12)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(sass@1.87.0)(stylus@0.62.0)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -10865,7 +12041,7 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 less: 4.3.0 - lightningcss: 1.29.2 + lightningcss: 1.30.1 sass: 1.87.0 stylus: 0.62.0 terser: 5.39.0 @@ -10964,12 +12140,21 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + y18n@5.0.8: {} yallist@3.1.1: {} yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@1.10.2: {} yaml@2.7.1: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index cf45eb65..4f0b2deb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,16 +1,13 @@ packages: - - packages/* + - packages/* - modules/* - apps/* - - "!apps/web" - - +ignoredBuiltDependencies: + - esbuild onlyBuiltDependencies: - '@biomejs/biome' - '@parcel/watcher' - '@tailwindcss/oxide' - bcrypt - core-js-pure - -ignoredBuiltDependencies: - - esbuild + - sharp