UNPKG

@dbs-portal/tool-mock

Version:

API mocking toolkit using MSW for DBS Portal development workflows

894 lines (893 loc) 20.5 kB
import { i as g, s as O, l as v, a as T } from "./setup-oE-TArFC.js"; import { g as q } from "./environment-DlK8CH_m.js"; import { c as U } from "./auth-DT3h0fWG.js"; async function w(r) { const { baseURL: e, mockBaseURL: t = e, enableMocking: s = !1, mockConfig: n, mockHandlers: a = [], timeout: c = 3e4, headers: C = {}, interceptors: u } = r; s && !g() && await O({ config: n || {}, handlers: a }); const h = { async get(i, o) { return d("GET", i, void 0, o); }, async post(i, o, l) { return d("POST", i, o, l); }, async put(i, o, l) { return d("PUT", i, o, l); }, async patch(i, o, l) { return d("PATCH", i, o, l); }, async delete(i, o) { return d("DELETE", i, void 0, o); }, isMocking() { return s && g(); }, getConfig() { return r; }, updateConfig(i) { Object.assign(r, i); } }; async function d(i, o, l, m) { const f = o.startsWith("http") ? o : `${h.isMocking() ? t : e}${o}`, b = { "Content-Type": "application/json", ...C, ...m?.headers }; let k = { method: i, url: f, data: l, headers: b, timeout: c, ...m }; if (u?.request) for (const y of u.request) k = y(k); try { const y = await fetch(k.url, { method: k.method, headers: k.headers, body: k.data ? JSON.stringify(k.data) : null, signal: m?.signal }); if (!y.ok) throw new Error(`HTTP ${y.status}: ${y.statusText}`); let p = await y.json(); if (u?.response) for (const A of u.response) p = A(p); if (p.success !== void 0) { if (p.success) return p.data; throw new Error(p.error?.message || "API request failed"); } return p; } catch (y) { if (u?.response) for (const p of u.response) try { return p({ error: y }); } catch { } throw y; } } return h; } async function $(r) { const e = q(); let t; e.runtime.isProduction ? t = r.production : e.runtime.isTest ? t = r.testing : r.staging && process.env.NODE_ENV === "staging" ? t = r.staging : t = r.development; const s = { baseURL: "", enableMocking: e.shouldMock, ...t }; return w(s); } function F(r) { const { client: e, requestTransformer: t, responseTransformer: s, errorTransformer: n } = r, a = e.request?.bind(e), c = e.get?.bind(e), C = e.post?.bind(e), u = e.put?.bind(e), h = e.patch?.bind(e), d = e.delete?.bind(e), i = (o, l) => async (...m) => { try { t && (m = t({ method: l, args: m })); const f = await o(...m); return s ? s(f) : f; } catch (f) { throw n ? n(f) : f; } }; return a && (e.request = i(a, "request")), c && (e.get = i(c, "GET")), C && (e.post = i(C, "POST")), u && (e.put = i(u, "PUT")), h && (e.patch = i(h, "PATCH")), d && (e.delete = i(d, "DELETE")), e.isMocking = () => g(), e.getMockConfig = () => v(), e; } function L(r = {}) { return { /** * Create client for specific service */ createServiceClient: async (e, t = {}) => { const s = { ...r, ...t, baseURL: t.baseURL || `${r.baseURL}/${e}` }; return w(s); }, /** * Create client with authentication */ createAuthenticatedClient: async (e, t = {}) => { const s = { ...r, ...t, headers: { ...r.headers, ...t.headers, Authorization: `Bearer ${e}` } }; return w(s); }, /** * Create client with custom interceptors */ createInterceptedClient: async (e, t = {}) => { const s = { ...r, ...t, interceptors: { ...r.interceptors, ...e } }; return w(s); } }; } async function H(r, e) { class t extends r { mockClient; constructor(n) { super(n), e?.enableMocking && this.initializeMockClient(n, e); } async initializeMockClient(n, a) { this.mockClient = await w({ baseURL: n.baseURL || "", ...a }); } // Override HTTP methods to use mock client when available async get(...n) { return this.mockClient?.isMocking() ? this.mockClient.get(...n) : super.get(...n); } async post(...n) { return this.mockClient?.isMocking() ? this.mockClient.post(...n) : super.post(...n); } async put(...n) { return this.mockClient?.isMocking() ? this.mockClient.put(...n) : super.put(...n); } async patch(...n) { return this.mockClient?.isMocking() ? this.mockClient.patch(...n) : super.patch(...n); } async delete(...n) { return this.mockClient?.isMocking() ? this.mockClient.delete(...n) : super.delete(...n); } isMocking() { return this.mockClient?.isMocking() || !1; } } return t; } class x { authContext; config; constructor(e = {}) { this.config = e, this.authContext = e.mockAuthContext || { isAuthenticated: !1, user: null, roles: [], permissions: [] }; } /** * Set authenticated user */ setUser(e, t) { this.authContext = { isAuthenticated: !0, user: e, token: t || this.generateMockToken(e), roles: e.roles || [], permissions: e.permissions || [] }; } /** * Clear authentication */ clearAuth() { this.authContext = { isAuthenticated: !1, user: null, // token: undefined, // Optional field roles: [], permissions: [] }; } /** * Get current auth context */ getAuthContext() { return { ...this.authContext }; } /** * Check if user is authenticated */ isAuthenticated() { return this.authContext.isAuthenticated; } /** * Check if user has role */ hasRole(e) { return this.authContext.roles?.includes(e) || !1; } /** * Check if user has permission */ hasPermission(e) { return this.authContext.permissions?.includes(e) || !1; } /** * Get current user */ getCurrentUser() { return this.authContext.user; } /** * Get current token */ getCurrentToken() { return this.authContext.token || null; } /** * Validate token */ async validateToken(e) { return this.config.tokenValidator ? this.config.tokenValidator(e) : e === this.authContext.token; } /** * Get user from token */ async getUserFromToken(e) { return this.config.userProvider ? this.config.userProvider(e) : e === this.authContext.token ? this.authContext.user : null; } /** * Generate mock JWT token */ generateMockToken(e) { const t = { alg: "HS256", typ: "JWT" }, s = { sub: e.id, email: e.email, roles: e.roles || [], permissions: e.permissions || [], iat: Math.floor(Date.now() / 1e3), exp: Math.floor(Date.now() / 1e3) + 3600 // 1 hour }, n = btoa(JSON.stringify(t)), a = btoa(JSON.stringify(s)), c = btoa(`mock-signature-${e.id}`); return `${n}.${a}.${c}`; } } function S(r = {}) { return new x(r); } async function j(r = [], e = {}) { const t = S(e), s = U( e.endpoints?.login || "/api/auth", { users: r, enableRegistration: !0, enablePasswordReset: !0 } ); return T(...s), t; } function M(r = {}) { return { id: `user_${Date.now()}`, email: "user@example.com", password: "password", firstName: "Mock", lastName: "User", roles: ["user"], permissions: ["read"], isActive: !0, ...r }; } function J(r = {}) { return M({ email: "admin@example.com", firstName: "Admin", lastName: "User", roles: ["admin"], permissions: [ "users:read", "users:write", "users:delete", "roles:read", "roles:write", "settings:read", "settings:write" ], ...r }); } function W(r = {}) { return M({ email: "manager@example.com", firstName: "Manager", lastName: "User", roles: ["manager"], permissions: [ "users:read", "users:write", "roles:read" ], ...r }); } function z(r, e) { if (!e) { console.warn("Core auth store not provided for integration"); return; } const t = r.getAuthContext(); t.isAuthenticated && t.user ? (typeof e.setUser == "function" && e.setUser(t.user), typeof e.setAuthenticated == "function" && e.setAuthenticated(!0), typeof e.setToken == "function" && e.setToken(t.token)) : typeof e.clearAuth == "function" && e.clearAuth(); } function B(r, e = {}) { return r.map((t) => t); } function G(r) { return { useAuth: () => ({ isAuthenticated: r.isAuthenticated(), user: r.getCurrentUser(), token: r.getCurrentToken(), login: async (e) => { const t = M({ email: e.email }); return r.setUser(t), t; }, logout: () => { r.clearAuth(); } }), usePermissions: () => ({ hasPermission: (e) => r.hasPermission(e), hasRole: (e) => r.hasRole(e), permissions: r.getAuthContext().permissions || [], roles: r.getAuthContext().roles || [] }), useCurrentUser: () => r.getCurrentUser() }; } function V(r) { const e = S(); if (r !== void 0) { const t = M(r); e.setUser(t); } return e; } class Y { storageKey = "mock-auth-state"; save(e) { try { localStorage.setItem(this.storageKey, JSON.stringify(e)); } catch (t) { console.warn("Failed to save mock auth state:", t); } } load() { try { const e = localStorage.getItem(this.storageKey); return e ? JSON.parse(e) : null; } catch (e) { return console.warn("Failed to load mock auth state:", e), null; } } clear() { try { localStorage.removeItem(this.storageKey); } catch (e) { console.warn("Failed to clear mock auth state:", e); } } } function Z(r = {}) { const e = g(), t = { defaultOptions: { queries: { staleTime: 300 * 1e3, // 5 minutes cacheTime: 600 * 1e3, // 10 minutes retry: 3, refetchOnWindowFocus: !1, refetchOnMount: !0, refetchOnReconnect: !0, ...r.defaultOptions?.queries }, mutations: { retry: 1, ...r.defaultOptions?.mutations } } }; return e && r.mockOptions && (r.mockOptions.disableRetries && (t.defaultOptions.queries.retry = !1, t.defaultOptions.mutations.retry = !1), r.mockOptions.fastStaleTime && (t.defaultOptions.queries.staleTime = 1e3), r.mockOptions.disableBackgroundRefetch && (t.defaultOptions.queries.refetchOnWindowFocus = !1, t.defaultOptions.queries.refetchOnReconnect = !1)), t; } class E { config; constructor(e = {}) { this.config = e; } /** * Create query key for endpoint */ createKey(e, t) { if (this.config.queryKeyFactory) return this.config.queryKeyFactory(e, t); const s = [e]; if (t) if (typeof t == "object" && t !== null) { const n = Object.keys(t).sort().reduce((a, c) => (a[c] = t[c], a), {}); s.push(n); } else s.push(t); return s; } /** * Create list query key */ createListKey(e, t, s) { const n = [e, "list"]; return t && n.push(JSON.stringify({ filters: t })), s && n.push(JSON.stringify({ pagination: s })), n; } /** * Create detail query key */ createDetailKey(e, t) { return [e, "detail", t]; } /** * Create mutation key */ createMutationKey(e, t) { return [e, "mutation", t]; } } const X = { /** * Create mock query function */ createMockQuery: (r, e, t = {}) => ({ queryKey: r, queryFn: async () => { if (t.delay && await new Promise((s) => setTimeout(s, t.delay)), t.error) throw t.error; return e; } }), /** * Create mock infinite query */ createMockInfiniteQuery: (r, e, t = {}) => ({ queryKey: r, queryFn: async ({ pageParam: s = 0 }) => { if (t.delay && await new Promise((c) => setTimeout(c, t.delay)), t.error) throw t.error; const n = e[s]; if (!n) throw new Error(`No data found for page ${s}`); const a = s + 1 < e.length ? s + 1 : void 0; return { data: n, ...a !== void 0 && { nextCursor: a } }; }, getNextPageParam: (s) => s.nextCursor }), /** * Create mock mutation */ createMockMutation: (r, e = {}) => ({ mutationFn: async (t) => { if (e.delay && await new Promise((s) => setTimeout(s, e.delay)), e.error) throw e.error; return r(t); } }) }; class P { queryClient; constructor(e) { this.queryClient = e; } /** * Invalidate queries by pattern */ invalidateByPattern(e) { this.queryClient.invalidateQueries({ queryKey: e }); } /** * Invalidate all queries for an endpoint */ invalidateEndpoint(e) { this.queryClient.invalidateQueries({ queryKey: [e] }); } /** * Invalidate list queries */ invalidateList(e) { this.queryClient.invalidateQueries({ queryKey: [e, "list"] }); } /** * Invalidate detail queries */ invalidateDetail(e, t) { const s = t ? [e, "detail", t] : [e, "detail"]; this.queryClient.invalidateQueries({ queryKey: s }); } /** * Update query data directly */ updateQueryData(e, t) { this.queryClient.setQueryData(e, t); } /** * Set query data directly */ setQueryData(e, t) { this.queryClient.setQueryData(e, t); } } function N(r) { return { /** * Create mock useQuery hook */ useMockQuery: (e, t, s, n) => ({ data: s, isLoading: !1, isError: !1, error: null, refetch: () => Promise.resolve({ data: s }), ...n }), /** * Create mock useMutation hook */ useMockMutation: (e, t, s) => ({ mutate: (n) => Promise.resolve(t), mutateAsync: (n) => Promise.resolve(t), isLoading: !1, isError: !1, error: null, data: void 0, reset: () => { }, ...s }) }; } function ee(r, e = {}) { const t = new E(e), s = new P(r), n = N(); return { queryKeyFactory: t, invalidation: s, hooks: n }; } function te(r) { typeof window < "u" && g() && window.__REACT_QUERY_DEVTOOLS__ && console.log("React Query running with MSW mock data"); } function D(r) { const { name: e, initialState: t, mockData: s, actions: n = {}, persist: a = !1, storageKey: c } = r; let u = { ...g() && s ? { ...t, ...s } : t }; const h = /* @__PURE__ */ new Set(), d = { getState: () => u, setState: (i) => { const o = typeof i == "function" ? i(u) : i; if (u = { ...u, ...o }, h.forEach((l) => l()), a && c) try { localStorage.setItem(c, JSON.stringify(u)); } catch (l) { console.warn(`Failed to persist store ${e}:`, l); } }, subscribe: (i) => (h.add(i), () => h.delete(i)), destroy: () => { if (h.clear(), a && c) try { localStorage.removeItem(c); } catch (i) { console.warn(`Failed to clear persisted store ${e}:`, i); } }, // Add mock actions ...Object.entries(n).reduce((i, [o, l]) => (i[o] = (...m) => { const f = l(...m); return f && typeof f == "object" && d.setState(f), f; }, i), {}) }; if (a && c) try { const i = localStorage.getItem(c); if (i) { const o = JSON.parse(i); u = { ...u, ...o }; } } catch (i) { console.warn(`Failed to load persisted store ${e}:`, i); } return d; } class R { stores = /* @__PURE__ */ new Map(); // private _config: ZustandIntegrationConfig // Unused for now constructor(e = {}) { } /** * Register a mock store */ registerStore(e, t) { const s = D({ ...t, name: e }); return this.stores.set(e, s), s; } /** * Get registered store */ getStore(e) { return this.stores.get(e); } /** * Update store state */ updateStore(e, t) { const s = this.stores.get(e); s && s.setState(t); } /** * Reset store to initial state */ resetStore(e) { const t = this.stores.get(e); t && t.reset && t.reset(); } /** * Clear all stores */ clearAllStores() { this.stores.forEach((e) => { e.destroy && e.destroy(); }), this.stores.clear(); } /** * Get all store names */ getStoreNames() { return Array.from(this.stores.keys()); } /** * Apply global mock state */ applyGlobalMockState(e) { g() && Object.entries(e).forEach(([t, s]) => { this.updateStore(t, s); }); } } function re(r) { return { /** * Use store hook */ useStore: (e) => { const t = r.getState(); return e ? e(t) : t; }, /** * Use store actions */ useStoreActions: () => Object.keys(r).filter((e) => typeof r[e] == "function" && e !== "getState" && e !== "setState" && e !== "subscribe").reduce((e, t) => (e[t] = r[t], e), {}) }; } const _ = { /** * User store mock data */ userStore: { initialState: { currentUser: null, isAuthenticated: !1, loading: !1, error: null }, mockData: { currentUser: { id: "1", email: "user@example.com", firstName: "Mock", lastName: "User", roles: ["user"] }, isAuthenticated: !0 }, actions: { login: (r) => ({ currentUser: { id: "1", email: r.email, firstName: "Mock", lastName: "User" }, isAuthenticated: !0, loading: !1, error: null }), logout: () => ({ currentUser: null, isAuthenticated: !1, loading: !1, error: null }) } }, /** * UI store mock data */ uiStore: { initialState: { sidebarOpen: !0, theme: "light", notifications: [], loading: !1 }, mockData: { notifications: [ { id: "1", type: "info", message: "Mock notification", timestamp: (/* @__PURE__ */ new Date()).toISOString() } ] }, actions: { toggleSidebar: () => (r) => ({ sidebarOpen: !r.sidebarOpen }), setTheme: (r) => ({ theme: r }), addNotification: (r) => (e) => ({ notifications: [...e.notifications, r] }) } }, /** * Data store mock data */ dataStore: { initialState: { items: [], loading: !1, error: null, pagination: { page: 1, pageSize: 10, total: 0 } }, mockData: { items: Array.from({ length: 5 }, (r, e) => ({ id: `item-${e + 1}`, name: `Mock Item ${e + 1}`, description: `Description for mock item ${e + 1}`, createdAt: (/* @__PURE__ */ new Date()).toISOString() })), pagination: { page: 1, pageSize: 10, total: 5 } }, actions: { setItems: (r) => ({ items: r }), addItem: (r) => (e) => ({ items: [...e.items, r] }), removeItem: (r) => (e) => ({ items: e.items.filter((t) => t.id !== r) }), setLoading: (r) => ({ loading: r }), setError: (r) => ({ error: r }) } } }; function se(r = {}) { const e = new R(); return Object.entries(r).forEach(([t, s]) => { e.registerStore(t, s); }), Object.keys(r).length === 0 && Object.entries(_).forEach(([t, s]) => { e.registerStore(t, { ...s, name: t }); }), e; } function ne(r, e, t = {}) { if (!g()) return r; const { override: s = !1, merge: n = !0 } = t; if (s) r.setState(e); else if (n) { const a = r.getState(); r.setState({ ...a, ...e }); } return r; } function ie(r) { typeof window < "u" && g() && (window.__MOCK_STORES__ = r, console.log("Mock stores available:", Object.keys(r))); } export { se as A, ne as B, ie as C, x as M, $ as a, L as b, w as c, S as d, J as e, W as f, z as g, B as h, H as i, G as j, V as k, Y as l, M as m, Z as n, E as o, X as p, P as q, N as r, j as s, ee as t, te as u, D as v, F as w, R as x, re as y, _ as z }; //# sourceMappingURL=zustand-Db8qeUuc.js.map