@htlkg/data 0.0.21 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/hooks/index.d.ts +601 -94
  2. package/dist/hooks/index.js +682 -73
  3. package/dist/hooks/index.js.map +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +691 -82
  6. package/dist/index.js.map +1 -1
  7. package/dist/mutations/index.js +4 -4
  8. package/dist/mutations/index.js.map +1 -1
  9. package/dist/queries/index.js +5 -5
  10. package/dist/queries/index.js.map +1 -1
  11. package/package.json +11 -12
  12. package/src/hooks/accounts/index.ts +2 -0
  13. package/src/hooks/{useAccounts.ts → accounts/useAccounts.ts} +48 -5
  14. package/src/hooks/accounts/usePaginatedAccounts.ts +166 -0
  15. package/src/hooks/brands/index.ts +2 -0
  16. package/src/hooks/{useBrands.ts → brands/useBrands.ts} +1 -1
  17. package/src/hooks/brands/usePaginatedBrands.ts +206 -0
  18. package/src/hooks/createPaginatedDataHook.ts +359 -0
  19. package/src/hooks/data-hook-errors.property.test.ts +4 -4
  20. package/src/hooks/data-hook-filters.property.test.ts +4 -4
  21. package/src/hooks/data-hooks.property.test.ts +4 -4
  22. package/src/hooks/index.ts +96 -8
  23. package/src/hooks/productInstances/index.ts +1 -0
  24. package/src/hooks/{useProductInstances.ts → productInstances/useProductInstances.ts} +9 -6
  25. package/src/hooks/products/index.ts +1 -0
  26. package/src/hooks/{useProducts.ts → products/useProducts.ts} +4 -5
  27. package/src/hooks/reservations/index.ts +2 -0
  28. package/src/hooks/reservations/usePaginatedReservations.ts +258 -0
  29. package/src/hooks/{useReservations.ts → reservations/useReservations.ts} +65 -10
  30. package/src/hooks/users/index.ts +2 -0
  31. package/src/hooks/users/usePaginatedUsers.ts +213 -0
  32. package/src/hooks/{useUsers.ts → users/useUsers.ts} +1 -1
  33. package/src/mutations/accounts/accounts.test.ts +287 -0
  34. package/src/mutations/{accounts.ts → accounts/accounts.ts} +2 -2
  35. package/src/mutations/accounts/index.ts +1 -0
  36. package/src/mutations/brands/brands.test.ts +292 -0
  37. package/src/mutations/{brands.ts → brands/brands.ts} +2 -2
  38. package/src/mutations/brands/index.ts +1 -0
  39. package/src/mutations/reservations/index.ts +1 -0
  40. package/src/mutations/{reservations.test.ts → reservations/reservations.test.ts} +1 -1
  41. package/src/mutations/{reservations.ts → reservations/reservations.ts} +2 -2
  42. package/src/mutations/users/index.ts +1 -0
  43. package/src/mutations/users/users.test.ts +289 -0
  44. package/src/mutations/{users.ts → users/users.ts} +2 -2
  45. package/src/queries/accounts/accounts.test.ts +228 -0
  46. package/src/queries/accounts/index.ts +1 -0
  47. package/src/queries/brands/brands.test.ts +288 -0
  48. package/src/queries/brands/index.ts +1 -0
  49. package/src/queries/products/index.ts +1 -0
  50. package/src/queries/products/products.test.ts +347 -0
  51. package/src/queries/reservations/index.ts +1 -0
  52. package/src/queries/users/index.ts +1 -0
  53. package/src/queries/users/users.test.ts +301 -0
  54. /package/src/queries/{accounts.ts → accounts/accounts.ts} +0 -0
  55. /package/src/queries/{brands.ts → brands/brands.ts} +0 -0
  56. /package/src/queries/{products.ts → products/products.ts} +0 -0
  57. /package/src/queries/{reservations.test.ts → reservations/reservations.test.ts} +0 -0
  58. /package/src/queries/{reservations.ts → reservations/reservations.ts} +0 -0
  59. /package/src/queries/{users.ts → users/users.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/createDataHook.ts","../../src/client/proxy.ts","../../src/hooks/useBrands.ts","../../src/hooks/useAccounts.ts","../../src/hooks/useUsers.ts","../../src/hooks/useProducts.ts","../../src/client/index.ts","../../src/client/server.ts","../../src/mutations/productInstances/productInstances.ts","../../src/hooks/useProductInstances.ts","../../src/hooks/useReservations.ts","../../src/hooks/useContacts.ts"],"sourcesContent":["/**\n * Data Hook Factory\n *\n * Creates reusable Vue composables for fetching data from GraphQL models.\n * Provides a DRY approach to data fetching with consistent patterns.\n */\n\nimport { ref, computed, onMounted, type Ref, type ComputedRef } from \"vue\";\nimport { query, hasErrors, getErrorMessage } from \"../client/proxy\";\n\n/**\n * Configuration options for creating a data hook\n */\nexport interface CreateDataHookOptions<T, TOptions extends BaseHookOptions = BaseHookOptions> {\n\t/** The GraphQL model name (e.g., 'Account', 'User', 'Brand') */\n\tmodel: string;\n\t/** Default limit for queries */\n\tdefaultLimit?: number;\n\t/** Selection set for the query (fields to fetch) */\n\tselectionSet?: string[];\n\t/** Transform function to apply to fetched data */\n\ttransform?: (item: any) => T;\n\t/** Build filter from hook options */\n\tbuildFilter?: (options: TOptions) => any;\n\t/** Define computed properties based on the data */\n\tcomputedProperties?: Record<string, (data: T[]) => any>;\n\t/** Plural name for the data property (e.g., 'accounts', 'users') */\n\tdataPropertyName?: string;\n}\n\n/**\n * Base options available to all hooks\n */\nexport interface BaseHookOptions {\n\t/** Filter criteria */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n}\n\n/**\n * Return type for data hooks\n */\nexport interface DataHookReturn<T, TComputed extends Record<string, any> = Record<string, never>> {\n\t/** Reactive array of data */\n\tdata: Ref<T[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch data */\n\trefetch: () => Promise<void>;\n\t/** Computed properties */\n\tcomputed: { [K in keyof TComputed]: ComputedRef<TComputed[K]> };\n}\n\n// Reset function for testing convenience (no-op with proxy-based approach)\nexport function resetClientInstance(): void {\n\t// No-op: proxy-based approach doesn't need client reset\n}\n\n/**\n * Creates a reusable data hook for a specific model\n *\n * @example\n * ```typescript\n * // Create a simple hook\n * export const useAccounts = createDataHook<Account>({\n * model: 'Account',\n * dataPropertyName: 'accounts',\n * });\n *\n * // Usage\n * const { data: accounts, loading, error, refetch } = useAccounts();\n * ```\n *\n * @example\n * ```typescript\n * // Create a hook with custom filters and computed properties\n * interface UseBrandsOptions extends BaseHookOptions {\n * accountId?: string;\n * activeOnly?: boolean;\n * }\n *\n * export const useBrands = createDataHook<Brand, UseBrandsOptions>({\n * model: 'Brand',\n * dataPropertyName: 'brands',\n * buildFilter: (options) => {\n * const filter: any = options.filter || {};\n * if (options.accountId) filter.accountId = { eq: options.accountId };\n * if (options.activeOnly) filter.status = { eq: 'active' };\n * return Object.keys(filter).length > 0 ? filter : undefined;\n * },\n * computedProperties: {\n * activeBrands: (brands) => brands.filter(b => b.status === 'active'),\n * },\n * });\n * ```\n */\nexport function createDataHook<\n\tT,\n\tTOptions extends BaseHookOptions = BaseHookOptions,\n\tTComputed extends Record<string, any> = Record<string, never>,\n>(\n\tconfig: CreateDataHookOptions<T, TOptions> & {\n\t\tcomputedProperties?: { [K in keyof TComputed]: (data: T[]) => TComputed[K] };\n\t},\n) {\n\tconst {\n\t\tmodel,\n\t\tdefaultLimit,\n\t\tselectionSet,\n\t\ttransform,\n\t\tbuildFilter,\n\t\tcomputedProperties,\n\t\tdataPropertyName = \"data\",\n\t} = config;\n\n\treturn function useData(options: TOptions = {} as TOptions): DataHookReturn<T, TComputed> & Record<string, any> {\n\t\tconst { filter: baseFilter, limit = defaultLimit, autoFetch = true } = options;\n\n\t\t// State\n\t\tconst data = ref<T[]>([]) as Ref<T[]>;\n\t\tconst loading = ref(false);\n\t\tconst error = ref<Error | null>(null);\n\n\t\t// Build filter using custom builder or default\n\t\tconst getFilter = () => {\n\t\t\tif (buildFilter) {\n\t\t\t\treturn buildFilter(options);\n\t\t\t}\n\t\t\treturn baseFilter && Object.keys(baseFilter).length > 0 ? baseFilter : undefined;\n\t\t};\n\n\t\t// Fetch function using server proxy\n\t\tasync function fetch() {\n\t\t\tloading.value = true;\n\t\t\terror.value = null;\n\n\t\t\ttry {\n\t\t\t\tconst queryOptions: Record<string, any> = {};\n\n\t\t\t\tconst filter = getFilter();\n\t\t\t\tif (filter) {\n\t\t\t\t\tqueryOptions.filter = filter;\n\t\t\t\t}\n\n\t\t\t\tif (limit) {\n\t\t\t\t\tqueryOptions.limit = limit;\n\t\t\t\t}\n\n\t\t\t\tif (selectionSet) {\n\t\t\t\t\tqueryOptions.selectionSet = selectionSet;\n\t\t\t\t}\n\n\t\t\t\tconst response = await query(model, \"list\", queryOptions);\n\n\t\t\t\tif (hasErrors(response)) {\n\t\t\t\t\tthrow new Error(getErrorMessage(response) || `Failed to fetch ${model}`);\n\t\t\t\t}\n\n\t\t\t\tconst items = response.data || [];\n\t\t\t\tdata.value = transform ? items.map(transform) : items;\n\t\t\t} catch (e) {\n\t\t\t\terror.value = e as Error;\n\t\t\t\tconsole.error(`[use${model}] Error fetching ${model}:`, e);\n\t\t\t} finally {\n\t\t\t\tloading.value = false;\n\t\t\t}\n\t\t}\n\n\t\t// Create computed properties\n\t\tconst computedRefs: Record<string, ComputedRef<any>> = {};\n\t\tif (computedProperties) {\n\t\t\tfor (const [key, fn] of Object.entries(computedProperties)) {\n\t\t\t\tcomputedRefs[key] = computed(() => fn(data.value));\n\t\t\t}\n\t\t}\n\n\t\t// Auto-fetch on mount if enabled\n\t\tif (autoFetch) {\n\t\t\tonMounted(() => {\n\t\t\t\tfetch();\n\t\t\t});\n\t\t}\n\n\t\t// Build return object\n\t\tconst result: DataHookReturn<T, TComputed> & Record<string, any> = {\n\t\t\tdata,\n\t\t\tloading,\n\t\t\terror,\n\t\t\trefetch: fetch,\n\t\t\tcomputed: computedRefs as { [K in keyof TComputed]: ComputedRef<TComputed[K]> },\n\t\t};\n\n\t\t// Add data property with custom name for backwards compatibility\n\t\tif (dataPropertyName !== \"data\") {\n\t\t\tresult[dataPropertyName] = data;\n\t\t}\n\n\t\t// Add computed properties at top level for backwards compatibility\n\t\tfor (const [key, computedRef] of Object.entries(computedRefs)) {\n\t\t\tresult[key] = computedRef;\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\n/**\n * Type helper to extract the return type of a created hook\n */\nexport type InferHookReturn<THook extends (...args: any[]) => any> = ReturnType<THook>;\n","/**\n * GraphQL Proxy Client\n *\n * Client-side helper for making authenticated GraphQL operations through\n * the server-side proxy. This allows Vue components to perform mutations\n * while keeping auth cookies httpOnly for security.\n *\n * @module @htlkg/data/proxy\n */\n\n/**\n * Valid GraphQL operations\n */\nexport type Operation = \"create\" | \"update\" | \"delete\" | \"get\" | \"list\";\n\n/**\n * Response type from GraphQL operations\n */\nexport interface GraphQLResponse<T = any> {\n\tdata: T | null;\n\terrors?: Array<{ message: string; [key: string]: any }>;\n}\n\n/**\n * Options for proxy requests\n */\nexport interface ProxyOptions {\n\t/** Custom API endpoint (default: /api/graphql) */\n\tendpoint?: string;\n\t/** Additional fetch options */\n\tfetchOptions?: RequestInit;\n}\n\n/**\n * Default proxy endpoint\n */\nconst DEFAULT_ENDPOINT = \"/api/graphql\";\n\n/**\n * Execute a GraphQL mutation through the server proxy\n *\n * @param model - The model name (e.g., 'User', 'Brand', 'Account')\n * @param operation - The operation type ('create', 'update', 'delete')\n * @param data - The operation data/input\n * @param options - Optional configuration\n * @returns Promise with the operation result\n *\n * @example Create\n * ```typescript\n * const result = await mutate('User', 'create', {\n * email: 'user@example.com',\n * accountId: '123',\n * });\n * ```\n *\n * @example Update\n * ```typescript\n * const result = await mutate('User', 'update', {\n * id: 'user-id',\n * status: 'deleted',\n * deletedAt: new Date().toISOString(),\n * });\n * ```\n *\n * @example Delete\n * ```typescript\n * const result = await mutate('User', 'delete', { id: 'user-id' });\n * ```\n */\nexport async function mutate<T = any>(\n\tmodel: string,\n\toperation: \"create\" | \"update\" | \"delete\",\n\tdata: Record<string, any>,\n\toptions?: ProxyOptions,\n): Promise<GraphQLResponse<T>> {\n\treturn proxyRequest<T>(model, operation, data, options);\n}\n\n/**\n * Execute a GraphQL query through the server proxy\n *\n * @param model - The model name (e.g., 'User', 'Brand', 'Account')\n * @param operation - The operation type ('get', 'list')\n * @param data - The query parameters (id for get, filter/limit for list)\n * @param options - Optional configuration\n * @returns Promise with the query result\n *\n * @example Get by ID\n * ```typescript\n * const result = await query('User', 'get', { id: 'user-id' });\n * ```\n *\n * @example List with filter\n * ```typescript\n * const result = await query('User', 'list', {\n * filter: { status: { eq: 'active' } },\n * limit: 100,\n * });\n * ```\n */\nexport async function query<T = any>(\n\tmodel: string,\n\toperation: \"get\" | \"list\",\n\tdata?: Record<string, any>,\n\toptions?: ProxyOptions,\n): Promise<GraphQLResponse<T>> {\n\treturn proxyRequest<T>(model, operation, data, options);\n}\n\n/**\n * Internal function to make proxy requests\n */\nasync function proxyRequest<T>(\n\tmodel: string,\n\toperation: Operation,\n\tdata?: Record<string, any>,\n\toptions?: ProxyOptions,\n): Promise<GraphQLResponse<T>> {\n\tconst endpoint = options?.endpoint ?? DEFAULT_ENDPOINT;\n\n\ttry {\n\t\tconst response = await fetch(endpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tcredentials: \"include\", // Important: include cookies\n\t\t\t...options?.fetchOptions,\n\t\t\tbody: JSON.stringify({ model, operation, data }),\n\t\t});\n\n\t\tconst result: GraphQLResponse<T> = await response.json();\n\n\t\t// Handle auth errors\n\t\tif (response.status === 401) {\n\t\t\tconsole.error(\"[GraphQL Proxy] Unauthorized - session may have expired\");\n\t\t\t// Optionally trigger a redirect to login\n\t\t\t// window.location.href = '/login';\n\t\t}\n\n\t\treturn result;\n\t} catch (error) {\n\t\tconsole.error(\"[GraphQL Proxy] Request failed:\", error);\n\t\treturn {\n\t\t\tdata: null,\n\t\t\terrors: [\n\t\t\t\t{\n\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Network error\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n}\n\n/**\n * Helper to check if a response has errors\n */\nexport function hasErrors(response: GraphQLResponse): boolean {\n\treturn !!response.errors && response.errors.length > 0;\n}\n\n/**\n * Helper to get the first error message from a response\n */\nexport function getErrorMessage(response: GraphQLResponse): string | null {\n\tif (!response.errors || response.errors.length === 0) {\n\t\treturn null;\n\t}\n\treturn response.errors[0].message;\n}\n","/**\n * useBrands Hook\n *\n * Vue composable for fetching and managing brand data with reactive state.\n * Provides loading states, error handling, and refetch capabilities.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Brand } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"./createDataHook\";\n\nexport interface UseBrandsOptions extends BaseHookOptions {\n\t/** Filter criteria for brands */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n\t/** Filter by account ID */\n\taccountId?: string;\n\t/** Only active brands */\n\tactiveOnly?: boolean;\n}\n\nexport interface UseBrandsReturn {\n\t/** Reactive array of brands */\n\tbrands: Ref<Brand[]>;\n\t/** Computed array of active brands only */\n\tactiveBrands: ComputedRef<Brand[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch brands */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseBrandsOptions): any {\n\tlet filter: any = options.filter || {};\n\n\tif (options.accountId) {\n\t\tfilter = { ...filter, accountId: { eq: options.accountId } };\n\t}\n\n\tif (options.activeOnly) {\n\t\tfilter = { ...filter, status: { eq: \"active\" } };\n\t}\n\n\treturn Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useBrandsInternal = createDataHook<Brand, UseBrandsOptions, { activeBrands: Brand[] }>({\n\tmodel: \"Brand\",\n\tdataPropertyName: \"brands\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tactiveBrands: (brands) => brands.filter((b) => b.status === \"active\"),\n\t},\n});\n\n/**\n * Composable for fetching and managing brands\n *\n * @example\n * ```typescript\n * import { useBrands } from '@htlkg/data/hooks';\n *\n * const { brands, loading, error, refetch } = useBrands();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { brands, loading } = useBrands({\n * accountId: 'account-123',\n * activeOnly: true,\n * limit: 50\n * });\n * ```\n */\nexport function useBrands(options: UseBrandsOptions = {}): UseBrandsReturn {\n\tconst result = useBrandsInternal(options);\n\treturn {\n\t\tbrands: result.brands as Ref<Brand[]>,\n\t\tactiveBrands: result.activeBrands as ComputedRef<Brand[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * useAccounts Hook\n *\n * Vue composable for fetching and managing account data with reactive state.\n * Provides loading states, error handling, and refetch capabilities.\n */\n\nimport type { Ref } from \"vue\";\nimport type { Account } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"./createDataHook\";\n\nexport interface UseAccountsOptions extends BaseHookOptions {\n\t/** Filter criteria for accounts */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n}\n\nexport interface UseAccountsReturn {\n\t/** Reactive array of accounts */\n\taccounts: Ref<Account[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch accounts */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useAccountsInternal = createDataHook<Account, UseAccountsOptions>({\n\tmodel: \"Account\",\n\tdataPropertyName: \"accounts\",\n});\n\n/**\n * Composable for fetching and managing accounts\n *\n * @example\n * ```typescript\n * import { useAccounts } from '@htlkg/data/hooks';\n *\n * const { accounts, loading, error, refetch } = useAccounts();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { accounts, loading } = useAccounts({\n * filter: { status: { eq: 'active' } },\n * limit: 50\n * });\n * ```\n */\nexport function useAccounts(options: UseAccountsOptions = {}): UseAccountsReturn {\n\tconst result = useAccountsInternal(options);\n\treturn {\n\t\taccounts: result.accounts as Ref<Account[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * useUsers Hook\n *\n * Vue composable for fetching and managing user data with reactive state.\n * Provides loading states, error handling, and refetch capabilities.\n */\n\nimport type { Ref } from \"vue\";\nimport type { User } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"./createDataHook\";\n\nexport interface UseUsersOptions extends BaseHookOptions {\n\t/** Filter criteria for users */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Filter by account ID */\n\taccountId?: string;\n}\n\nexport interface UseUsersReturn {\n\t/** Reactive array of users */\n\tusers: Ref<User[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch users */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseUsersOptions): any {\n\tlet filter: any = options.filter || {};\n\n\tif (options.brandId) {\n\t\tfilter = { ...filter, brandIds: { contains: options.brandId } };\n\t}\n\n\tif (options.accountId) {\n\t\tfilter = { ...filter, accountIds: { contains: options.accountId } };\n\t}\n\n\treturn Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useUsersInternal = createDataHook<User, UseUsersOptions>({\n\tmodel: \"User\",\n\tdataPropertyName: \"users\",\n\tbuildFilter,\n});\n\n/**\n * Composable for fetching and managing users\n *\n * @example\n * ```typescript\n * import { useUsers } from '@htlkg/data/hooks';\n *\n * const { users, loading, error, refetch } = useUsers();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { users, loading } = useUsers({\n * brandId: 'brand-123',\n * accountId: 'account-456',\n * limit: 50\n * });\n * ```\n */\nexport function useUsers(options: UseUsersOptions = {}): UseUsersReturn {\n\tconst result = useUsersInternal(options);\n\treturn {\n\t\tusers: result.users as Ref<User[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * useProducts Hook\n *\n * Vue composable for fetching and managing product data with reactive state.\n * Provides loading states, error handling, and refetch capabilities.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Product } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"./createDataHook\";\n\nexport interface UseProductsOptions extends BaseHookOptions {\n\t/** Filter criteria for products */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n\t/** Only active products */\n\tactiveOnly?: boolean;\n}\n\nexport interface UseProductsReturn {\n\t/** Reactive array of products */\n\tproducts: Ref<Product[]>;\n\t/** Computed array of active products only */\n\tactiveProducts: ComputedRef<Product[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch products */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseProductsOptions): any {\n\tlet filter: any = options.filter || {};\n\n\tif (options.activeOnly) {\n\t\tfilter = { ...filter, isActive: { eq: true } };\n\t}\n\n\treturn Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useProductsInternal = createDataHook<Product, UseProductsOptions, { activeProducts: Product[] }>({\n\tmodel: \"Product\",\n\tdataPropertyName: \"products\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tactiveProducts: (products) => products.filter((p) => p.isActive === true),\n\t},\n});\n\n/**\n * Composable for fetching and managing products\n *\n * @example\n * ```typescript\n * import { useProducts } from '@htlkg/data/hooks';\n *\n * const { products, loading, error, refetch } = useProducts();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { products, loading } = useProducts({\n * activeOnly: true,\n * limit: 50\n * });\n * ```\n */\nexport function useProducts(options: UseProductsOptions = {}): UseProductsReturn {\n\tconst result = useProductsInternal(options);\n\treturn {\n\t\tproducts: result.products as Ref<Product[]>,\n\t\tactiveProducts: result.activeProducts as ComputedRef<Product[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * GraphQL Client for @htlkg/data\n *\n * Provides both client-side and server-side GraphQL capabilities using AWS Amplify Data.\n * The server-side functions use the Amplify Astro adapter for proper SSR support.\n *\n * For server-side usage, use `Astro.locals.amplifyClient` (zero-config, injected by middleware).\n */\n\nimport { generateClient as generateDataClient } from \"aws-amplify/data\";\nimport { Amplify } from \"aws-amplify\";\nimport type { ResourcesConfig } from \"aws-amplify\";\nimport { generateServerClientUsingCookies } from \"./server\";\n\n// Re-export server-side client generation (used internally by middleware)\nexport { generateServerClientUsingCookies } from \"./server\";\n\n// Re-export proxy functions for authenticated client-side operations\nexport {\n\tmutate,\n\tquery,\n\thasErrors,\n\tgetErrorMessage,\n\ttype Operation,\n\ttype GraphQLResponse,\n\ttype ProxyOptions,\n} from \"./proxy\";\n\n// Re-export type-safe client-side Reservation operations\nexport {\n\tcreateReservation,\n\tupdateReservation,\n\tsoftDeleteReservation,\n\trestoreReservation,\n\tdeleteReservation,\n\tgetReservation,\n\tlistReservations,\n\tupdateReservationStatus,\n\tbulkSoftDeleteReservations,\n\tbulkRestoreReservations,\n\tbulkDeleteReservations,\n\tbulkUpdateReservationStatus,\n\ttype Reservation,\n\ttype ReservationStatus,\n} from \"./reservations\";\n\n/**\n * Type for the server-side Amplify client (for use in type declarations)\n * This represents the client returned by generateServerClientUsingCookies\n */\nexport type AmplifyServerClient<TSchema extends Record<string, unknown> = Record<string, unknown>> =\n\tReturnType<typeof generateServerClientUsingCookies<TSchema>>;\n\n// Singleton client instance for client-side fetching\nlet sharedClientInstance: any = null;\n\n/**\n * Get or create the shared GraphQL client instance (singleton pattern)\n * Use this for client-side fetching to avoid creating multiple client instances.\n *\n * @example\n * ```typescript\n * const client = getSharedClient<Schema>();\n * const { data } = await client.models.Account.list();\n * ```\n */\nexport function getSharedClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(): ReturnType<typeof generateDataClient<TSchema>> {\n\tif (!sharedClientInstance) {\n\t\tsharedClientInstance = generateDataClient<TSchema>();\n\t}\n\treturn sharedClientInstance;\n}\n\n/**\n * Reset the shared client instance (useful for testing or auth state changes)\n */\nexport function resetSharedClient(): void {\n\tsharedClientInstance = null;\n}\n\n/**\n * Generate a client-side GraphQL client for use in Vue components and browser contexts\n * This is SSR-safe and should be called within a component's setup function or after hydration\n *\n * @example\n * ```typescript\n * import type { Schema } from '@backend/data/resource';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const { data: brands } = await client.models.Brand.list();\n * ```\n */\nexport function generateClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(): ReturnType<typeof generateDataClient<TSchema>> {\n\treturn generateDataClient<TSchema>();\n}\n\n/**\n * Configuration for Amplify (matches amplify_outputs.json format)\n */\nexport type AstroAmplifyConfig = ResourcesConfig;\n\n/**\n * Authentication mode for server-side GraphQL client\n */\nexport type ServerAuthMode = 'userPool' | 'apiKey';\n\n/**\n * Options for generating a server-side GraphQL client\n */\nexport interface GenerateServerClientOptions {\n\t/** Authentication mode - 'userPool' (default) uses JWT from cookies, 'apiKey' uses API key */\n\tauthMode?: ServerAuthMode;\n}\n\n/**\n * Generate a server-side GraphQL client for use within runWithAmplifyServerContext\n * \n * This function creates a GraphQL client that can be used for server-side data fetching in Astro.\n * It MUST be called within runWithAmplifyServerContext to access JWT tokens from cookies.\n * \n * The client supports two authentication modes:\n * - 'userPool' (default): Uses JWT tokens from cookies (requires runWithAmplifyServerContext)\n * - 'apiKey': Uses API key for public/unauthenticated requests\n *\n * **Important**: \n * - Amplify.configure() must be called once at app startup (e.g., in amplify-server.ts)\n * - This function must be called INSIDE the operation function of runWithAmplifyServerContext\n * - The context automatically provides the token provider that reads JWT tokens from cookies\n *\n * @example\n * ```typescript\n * // In your Astro page\n * import type { Schema } from '../amplify/data/resource';\n * import { generateServerClient } from '@htlkg/data/client';\n * import { createRunWithAmplifyServerContext } from '@htlkg/core/amplify-astro-adapter';\n * import outputs from '../amplify_outputs.json';\n *\n * const runWithAmplifyServerContext = createRunWithAmplifyServerContext({ config: outputs });\n *\n * // Fetch data with authentication\n * const result = await runWithAmplifyServerContext({\n * astroServerContext: {\n * cookies: Astro.cookies,\n * request: Astro.request\n * },\n * operation: async (contextSpec) => {\n * // Generate client INSIDE the operation\n * const client = generateServerClient<Schema>({ authMode: 'userPool' });\n * return await client.models.User.list();\n * }\n * });\n * \n * const users = result.data || [];\n * ```\n * \n * @example Using API key for public data\n * ```typescript\n * const result = await runWithAmplifyServerContext({\n * astroServerContext: {\n * cookies: Astro.cookies,\n * request: Astro.request\n * },\n * operation: async (contextSpec) => {\n * const client = generateServerClient<Schema>({ authMode: 'apiKey' });\n * return await client.models.Brand.list();\n * }\n * });\n * ```\n */\nexport function generateServerClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(_options?: GenerateServerClientOptions): ReturnType<typeof generateDataClient<TSchema>> {\n\t// Generate the client without authMode parameter\n\t// When called within runWithAmplifyServerContext, it will automatically use the token provider\n\t// from the context (which reads JWT tokens from cookies)\n\t// The authMode should be specified per-operation, not at client creation\n\tconst client = generateDataClient<TSchema>();\n\n\treturn client;\n}\n\n/**\n * Context required for getting a server client in API routes\n */\nexport interface ServerClientContext {\n\tlocals: { amplifyClient?: any; user?: any };\n\tcookies: any;\n\trequest: Request;\n}\n\n/**\n * Get the server client from Astro context\n *\n * Uses locals.amplifyClient if available (set by middleware),\n * otherwise creates a new client using Amplify's global config.\n * No config parameter needed - uses the config set by the middleware.\n *\n * @example\n * ```typescript\n * import { getServerClient } from '@htlkg/data/client';\n *\n * export const POST: APIRoute = async (context) => {\n * const client = getServerClient(context);\n * if (!client) return new Response('Not authenticated', { status: 401 });\n *\n * const result = await client.models.User.list();\n * };\n * ```\n */\nexport function getServerClient<TSchema extends Record<string, unknown> = Record<string, unknown>>(\n\tcontext: ServerClientContext,\n): ReturnType<typeof generateServerClientUsingCookies<TSchema>> | null {\n\t// Try to use client from middleware first\n\tif (context.locals.amplifyClient) {\n\t\treturn context.locals.amplifyClient as ReturnType<typeof generateServerClientUsingCookies<TSchema>>;\n\t}\n\n\t// If no client from middleware and user is authenticated, create one using global Amplify config\n\tif (context.locals.user) {\n\t\ttry {\n\t\t\t// Get config from Amplify (set by middleware)\n\t\t\tconst amplifyConfig = Amplify.getConfig();\n\t\t\tif (amplifyConfig) {\n\t\t\t\treturn generateServerClientUsingCookies<TSchema>({\n\t\t\t\t\tconfig: amplifyConfig,\n\t\t\t\t\tcookies: context.cookies,\n\t\t\t\t\trequest: context.request,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('[getServerClient] Failed to get Amplify config:', e);\n\t\t}\n\t}\n\n\t// No authentication available\n\treturn null;\n}\n","/**\n * Server-side data client for Astro\n *\n * Provides a client generator similar to Next.js's generateServerClientUsingCookies\n * using generateClientWithAmplifyInstance for proper server context integration.\n */\n\nimport type { AstroGlobal } from \"astro\";\nimport type { ResourcesConfig } from \"aws-amplify\";\nimport {\n\tCommonPublicClientOptions,\n\tDefaultCommonClientOptions,\n\tV6ClientSSRCookies,\n\tgenerateClientWithAmplifyInstance,\n} from \"aws-amplify/api/internals\";\nimport { getAmplifyServerContext } from \"aws-amplify/adapter-core/internals\";\nimport { createRunWithAmplifyServerContext, createLogger } from \"@htlkg/core/amplify-astro-adapter\";\n\nconst log = createLogger('server-client');\n\ninterface AstroCookiesClientParams {\n\tcookies: AstroGlobal[\"cookies\"];\n\trequest: AstroGlobal[\"request\"];\n\tconfig: ResourcesConfig;\n}\n\n/**\n * Generates a server-side data client for Astro (matches Next.js implementation)\n *\n * This function creates a client that automatically wraps all operations in the Amplify server context,\n * ensuring that authentication tokens from cookies are properly used.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { generateServerClientUsingCookies } from '@htlkg/data/client';\n * import { parseAmplifyConfig } from 'aws-amplify/utils';\n * import outputs from '../amplify_outputs.json';\n *\n * const amplifyConfig = parseAmplifyConfig(outputs);\n *\n * const client = generateServerClientUsingCookies<Schema>({\n * config: amplifyConfig,\n * cookies: Astro.cookies,\n * request: Astro.request,\n * });\n *\n * // Use the client directly - operations are automatically wrapped\n * const result = await client.models.User.list({\n * selectionSet: ['id', 'email'],\n * limit: 100,\n * });\n * ```\n */\nexport function generateServerClientUsingCookies<\n\tT extends Record<any, any> = never,\n\tOptions extends CommonPublicClientOptions &\n\t\tAstroCookiesClientParams = DefaultCommonClientOptions &\n\t\tAstroCookiesClientParams,\n>(options: Options): V6ClientSSRCookies<T, Options> {\n\tconst runWithAmplifyServerContext = createRunWithAmplifyServerContext({\n\t\tconfig: options.config,\n\t});\n\n\tconst resourcesConfig = options.config;\n\n\t// This function reference gets passed down to InternalGraphQLAPI.ts.graphql\n\t// where this._graphql is passed in as the `fn` argument\n\t// causing it to always get invoked inside `runWithAmplifyServerContext`\n\tconst getAmplify = (fn: (amplify: any) => Promise<any>) => {\n\t\treturn runWithAmplifyServerContext({\n\t\t\tastroServerContext: {\n\t\t\t\tcookies: options.cookies,\n\t\t\t\trequest: options.request,\n\t\t\t},\n\t\t\toperation: async (contextSpec: any) => {\n\t\t\t\tconst amplifyInstance = getAmplifyServerContext(contextSpec).amplify;\n\t\t\t\t\n\t\t\t\t// Debug logging (only when DEBUG=true)\n\t\t\t\ttry {\n\t\t\t\t\tconst config = amplifyInstance.getConfig();\n\t\t\t\t\tlog.debug('Amplify config from instance:', {\n\t\t\t\t\t\thasAPI: !!config.API,\n\t\t\t\t\t\thasGraphQL: !!config.API?.GraphQL,\n\t\t\t\t\t\tendpoint: config.API?.GraphQL?.endpoint,\n\t\t\t\t\t\tdefaultAuthMode: config.API?.GraphQL?.defaultAuthMode,\n\t\t\t\t\t\tregion: config.API?.GraphQL?.region,\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tconst session = await amplifyInstance.Auth.fetchAuthSession();\n\t\t\t\t\tlog.debug('Auth session:', {\n\t\t\t\t\t\thasTokens: !!session.tokens,\n\t\t\t\t\t\thasAccessToken: !!session.tokens?.accessToken,\n\t\t\t\t\t\thasIdToken: !!session.tokens?.idToken,\n\t\t\t\t\t\thasCredentials: !!session.credentials,\n\t\t\t\t\t});\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\tlog.debug('Error fetching session:', e.message);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn fn(amplifyInstance);\n\t\t\t},\n\t\t});\n\t};\n\n\tconst {\n\t\tcookies: _cookies,\n\t\trequest: _request,\n\t\tconfig: _config,\n\t\t...params\n\t} = options;\n\n\treturn generateClientWithAmplifyInstance<T, V6ClientSSRCookies<T, Options>>({\n\t\tamplify: getAmplify,\n\t\tconfig: resourcesConfig,\n\t\t...params,\n\t} as any);\n}\n","/**\n * ProductInstance Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting product instances.\n * Product instances represent enabled products for a specific brand with their configuration.\n */\n\nimport type { ProductInstance } from \"@htlkg/core/types\";\nimport { getClientUser } from \"@htlkg/core/auth\";\nimport { getCurrentTimestamp } from \"@htlkg/core/utils\";\nimport { AppError } from \"@htlkg/core/errors\";\nimport type { CreateAuditFields, UpdateAuditFields } from \"../common\";\n\n/**\n * Get current user identifier for audit trails\n * Uses getClientUser() and returns email or username, falling back to \"system\"\n */\nasync function getUserIdentifier(fallback = \"system\"): Promise<string> {\n\ttry {\n\t\tconst user = await getClientUser();\n\t\tif (user) {\n\t\t\treturn user.email || user.username || fallback;\n\t\t}\n\t\treturn fallback;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\n/**\n * Input type for creating a product instance\n */\nexport interface CreateProductInstanceInput extends CreateAuditFields {\n\tproductId: string;\n\tbrandId: string;\n\taccountId: string;\n\tproductName: string;\n\tenabled: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n}\n\n/**\n * Input type for updating a product instance\n */\nexport interface UpdateProductInstanceInput extends UpdateAuditFields {\n\tid: string;\n\tenabled?: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n}\n\n/**\n * Create a new product instance\n *\n * @example\n * ```typescript\n * import { createProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await createProductInstance(client, {\n * productId: 'product-123',\n * brandId: 'brand-456',\n * accountId: 'account-789',\n * enabled: true,\n * config: { apiKey: 'xxx', maxRequests: 100 }\n * });\n * ```\n */\nexport async function createProductInstance<TClient = any>(\n\tclient: TClient,\n\tinput: CreateProductInstanceInput,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\t// Get user identifier for audit trail\n\t\tconst userIdentifier = input.createdBy || input.updatedBy || await getUserIdentifier();\n\n\t\t// Build input - manually construct to avoid Vue Proxy issues\n\t\tconst timestamp = input.createdAt || getCurrentTimestamp();\n\t\tconst createInput: any = {\n\t\t\tproductId: input.productId,\n\t\t\tproductName: input.productName,\n\t\t\tbrandId: input.brandId,\n\t\t\taccountId: input.accountId,\n\t\t\tenabled: input.enabled,\n\t\t\tversion: input.version,\n\t\t\tcreatedAt: timestamp,\n\t\t\tcreatedBy: userIdentifier,\n\t\t\tupdatedAt: input.updatedAt || timestamp,\n\t\t\tupdatedBy: userIdentifier,\n\t\t};\n\n\t\t// AWSJSON type requires JSON STRING\n\t\tif (input.config) {\n\t\t\t// Double stringify: first to strip Vue Proxy, second to create JSON string\n\t\t\tcreateInput.config = JSON.stringify(JSON.parse(JSON.stringify(input.config)));\n\t\t}\n\n\t\tconsole.log(\"[createProductInstance] Config as string:\", createInput.config);\n\t\tconsole.log(\"[createProductInstance] Config type:\", typeof createInput.config);\n\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.create(createInput);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to create product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_CREATE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[createProductInstance] Error creating product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to create product instance\",\n\t\t\t\"PRODUCT_INSTANCE_CREATE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Update an existing product instance\n *\n * @example\n * ```typescript\n * import { updateProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await updateProductInstance(client, {\n * id: 'instance-123',\n * enabled: false,\n * config: { apiKey: 'new-key', maxRequests: 200 }\n * });\n * ```\n */\nexport async function updateProductInstance<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateProductInstanceInput,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\t// Add timestamp and user metadata if not provided\n\t\t// Convert config from Vue Proxy to plain object\n\t\tconst updateInput: any = {\n\t\t\t...input,\n\t\t\tupdatedAt: input.updatedAt || getCurrentTimestamp(),\n\t\t\tupdatedBy: input.updatedBy || await getUserIdentifier(),\n\t\t};\n\n\t\t// AWSJSON type requires JSON STRING\n\t\tif (input.config) {\n\t\t\tupdateInput.config = JSON.stringify(JSON.parse(JSON.stringify(input.config)));\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.update(updateInput);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to update product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_UPDATE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[updateProductInstance] Error updating product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to update product instance\",\n\t\t\t\"PRODUCT_INSTANCE_UPDATE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Delete a product instance\n *\n * @example\n * ```typescript\n * import { deleteProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteProductInstance(client, 'instance-123');\n * ```\n */\nexport async function deleteProductInstance<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.ProductInstance.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to delete product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_DELETE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteProductInstance] Error deleting product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to delete product instance\",\n\t\t\t\"PRODUCT_INSTANCE_DELETE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Toggle the enabled status of a product instance\n *\n * @example\n * ```typescript\n * import { toggleProductInstanceEnabled } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await toggleProductInstanceEnabled(client, 'instance-123', true);\n * ```\n */\nexport async function toggleProductInstanceEnabled<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tenabled: boolean,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.update({\n\t\t\tid,\n\t\t\tenabled,\n\t\t\tlastUpdated: getCurrentTimestamp(),\n\t\t\tupdatedBy: await getUserIdentifier(),\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[toggleProductInstanceEnabled] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to toggle product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_TOGGLE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[toggleProductInstanceEnabled] Error toggling product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to toggle product instance\",\n\t\t\t\"PRODUCT_INSTANCE_TOGGLE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n","/**\n * useProductInstances Hook\n *\n * Vue composable for fetching and managing product instance data with reactive state.\n * Provides loading states, error handling, refetch capabilities, and CRUD operations.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { ProductInstance } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"./createDataHook\";\nimport { getSharedClient } from \"../client\";\nimport {\n\tcreateProductInstance,\n\tupdateProductInstance,\n\tdeleteProductInstance,\n\ttoggleProductInstanceEnabled,\n\ttype CreateProductInstanceInput,\n\ttype UpdateProductInstanceInput,\n} from \"../mutations/productInstances\";\n\nexport interface UseProductInstancesOptions extends BaseHookOptions {\n\t/** Filter criteria for product instances */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Filter by account ID */\n\taccountId?: string;\n\t/** Filter by product ID */\n\tproductId?: string;\n\t/** Only enabled instances */\n\tenabledOnly?: boolean;\n}\n\nexport interface UseProductInstancesReturn {\n\t/** Reactive array of product instances */\n\tinstances: Ref<ProductInstance[]>;\n\t/** Computed array of enabled instances only */\n\tenabledInstances: ComputedRef<ProductInstance[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch product instances */\n\trefetch: () => Promise<void>;\n\t/** Create a new product instance */\n\tcreateInstance: (input: CreateProductInstanceInput) => Promise<ProductInstance>;\n\t/** Update an existing product instance */\n\tupdateInstance: (input: UpdateProductInstanceInput) => Promise<ProductInstance>;\n\t/** Delete a product instance */\n\tdeleteInstance: (id: string) => Promise<boolean>;\n\t/** Toggle the enabled status of a product instance */\n\ttoggleEnabled: (id: string, enabled: boolean) => Promise<ProductInstance>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseProductInstancesOptions): any {\n\tlet filter: any = options.filter || {};\n\n\tif (options.brandId) {\n\t\tfilter = { ...filter, brandId: { eq: options.brandId } };\n\t}\n\n\tif (options.accountId) {\n\t\tfilter = { ...filter, accountId: { eq: options.accountId } };\n\t}\n\n\tif (options.productId) {\n\t\tfilter = { ...filter, productId: { eq: options.productId } };\n\t}\n\n\tif (options.enabledOnly) {\n\t\tfilter = { ...filter, enabled: { eq: true } };\n\t}\n\n\treturn Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useProductInstancesInternal = createDataHook<\n\tProductInstance,\n\tUseProductInstancesOptions,\n\t{ enabledInstances: ProductInstance[] }\n>({\n\tmodel: \"ProductInstance\",\n\tdataPropertyName: \"instances\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tenabledInstances: (instances) => instances.filter((i) => i.enabled),\n\t},\n});\n\n/**\n * Composable for fetching and managing product instances\n *\n * @example\n * ```typescript\n * import { useProductInstances } from '@htlkg/data/hooks';\n *\n * const { instances, loading, error, refetch } = useProductInstances();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { instances, enabledInstances, loading } = useProductInstances({\n * brandId: 'brand-123',\n * enabledOnly: true,\n * limit: 50\n * });\n * ```\n *\n * @example For a specific account\n * ```typescript\n * const { instances, loading } = useProductInstances({\n * accountId: 'account-456',\n * autoFetch: true\n * });\n * ```\n */\nexport function useProductInstances(options: UseProductInstancesOptions = {}): UseProductInstancesReturn {\n\tconst result = useProductInstancesInternal(options);\n\n\t// CRUD methods using mutations from @htlkg/data/mutations\n\tasync function createInstance(input: CreateProductInstanceInput): Promise<ProductInstance> {\n\t\tconst client = getSharedClient();\n\t\tconst instance = await createProductInstance(client, input);\n\t\tif (!instance) {\n\t\t\tthrow new Error(\"Failed to create product instance\");\n\t\t}\n\t\treturn instance;\n\t}\n\n\tasync function updateInstance(input: UpdateProductInstanceInput): Promise<ProductInstance> {\n\t\tconst client = getSharedClient();\n\t\tconst instance = await updateProductInstance(client, input);\n\t\tif (!instance) {\n\t\t\tthrow new Error(\"Failed to update product instance\");\n\t\t}\n\t\treturn instance;\n\t}\n\n\tasync function deleteInstance(id: string): Promise<boolean> {\n\t\tconst client = getSharedClient();\n\t\treturn deleteProductInstance(client, id);\n\t}\n\n\tasync function toggleEnabled(id: string, enabled: boolean): Promise<ProductInstance> {\n\t\tconst client = getSharedClient();\n\t\tconst instance = await toggleProductInstanceEnabled(client, id, enabled);\n\t\tif (!instance) {\n\t\t\tthrow new Error(\"Failed to toggle product instance\");\n\t\t}\n\t\treturn instance;\n\t}\n\n\treturn {\n\t\tinstances: result.instances as Ref<ProductInstance[]>,\n\t\tenabledInstances: result.enabledInstances as ComputedRef<ProductInstance[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t\tcreateInstance,\n\t\tupdateInstance,\n\t\tdeleteInstance,\n\t\ttoggleEnabled,\n\t};\n}\n","/**\n * useReservations Hook\n *\n * Vue composable for fetching and managing reservation data with reactive state.\n * Provides loading states, error handling, pagination, and refetch capabilities.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Reservation } from \"../queries/reservations\";\nimport { createDataHook, type BaseHookOptions } from \"./createDataHook\";\n\nexport interface UseReservationsOptions extends BaseHookOptions {\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Filter by start date (check-in date >= startDate) */\n\tstartDate?: string;\n\t/** Filter by end date (check-in date <= endDate) */\n\tendDate?: string;\n\t/** Filter by reservation status */\n\tstatus?: Reservation[\"status\"];\n\t/** Filter by contact/visit ID */\n\tcontactId?: string;\n\t/** Pagination token for fetching next page */\n\tnextToken?: string;\n}\n\nexport interface UseReservationsReturn {\n\t/** Reactive array of reservations */\n\treservations: Ref<Reservation[]>;\n\t/** Computed array of confirmed reservations */\n\tconfirmedReservations: ComputedRef<Reservation[]>;\n\t/** Computed array of active reservations (confirmed or checked_in) */\n\tactiveReservations: ComputedRef<Reservation[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch reservations */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseReservationsOptions): any {\n\tconst conditions: any[] = [];\n\n\tif (options.brandId) {\n\t\tconditions.push({ brandId: { eq: options.brandId } });\n\t}\n\n\tif (options.status) {\n\t\tconditions.push({ status: { eq: options.status } });\n\t}\n\n\tif (options.contactId) {\n\t\tconditions.push({ visitId: { eq: options.contactId } });\n\t}\n\n\tif (options.startDate) {\n\t\tconditions.push({ checkIn: { ge: options.startDate } });\n\t}\n\n\tif (options.endDate) {\n\t\tconditions.push({ checkIn: { le: options.endDate } });\n\t}\n\n\tif (options.filter) {\n\t\tconditions.push(options.filter);\n\t}\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn conditions[0];\n\t}\n\n\treturn { and: conditions };\n}\n\n/**\n * Internal hook created by factory\n */\nconst useReservationsInternal = createDataHook<\n\tReservation,\n\tUseReservationsOptions,\n\t{ confirmedReservations: Reservation[]; activeReservations: Reservation[] }\n>({\n\tmodel: \"Reservation\",\n\tdataPropertyName: \"reservations\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tconfirmedReservations: (reservations) =>\n\t\t\treservations.filter((r) => r.status === \"confirmed\"),\n\t\tactiveReservations: (reservations) =>\n\t\t\treservations.filter((r) => r.status === \"confirmed\" || r.status === \"checked_in\"),\n\t},\n});\n\n/**\n * Composable for fetching and managing reservations\n *\n * @example\n * ```typescript\n * import { useReservations } from '@htlkg/data/hooks';\n *\n * const { reservations, loading, error, refetch } = useReservations({\n * brandId: 'brand-123',\n * startDate: '2026-01-01',\n * endDate: '2026-01-31',\n * status: 'confirmed'\n * });\n * ```\n *\n * @example With contact filter\n * ```typescript\n * const { reservations, loading } = useReservations({\n * contactId: 'contact-123',\n * limit: 50\n * });\n * ```\n *\n * @example With computed properties\n * ```typescript\n * const { reservations, activeReservations, confirmedReservations } = useReservations({\n * brandId: 'brand-123'\n * });\n *\n * // activeReservations includes confirmed + checked_in\n * // confirmedReservations includes only confirmed\n * ```\n */\nexport function useReservations(options: UseReservationsOptions = {}): UseReservationsReturn {\n\tconst result = useReservationsInternal(options);\n\treturn {\n\t\treservations: result.reservations as Ref<Reservation[]>,\n\t\tconfirmedReservations: result.confirmedReservations as ComputedRef<Reservation[]>,\n\t\tactiveReservations: result.activeReservations as ComputedRef<Reservation[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * useContacts Hook\n *\n * Vue composable for fetching and managing contact data with reactive state.\n * Provides loading states, error handling, search, pagination, and refetch capabilities.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Contact } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"./createDataHook\";\n\nexport interface UseContactsOptions extends BaseHookOptions {\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Search query (searches email, firstName, lastName) */\n\tsearch?: string;\n\t/** Filter by GDPR consent */\n\tgdprConsent?: boolean;\n\t/** Filter by marketing opt-in */\n\tmarketingOptIn?: boolean;\n\t/** Filter by tags (contact must have at least one of these tags) */\n\ttags?: string[];\n\t/** Pagination token for fetching next page */\n\tnextToken?: string;\n}\n\nexport interface UseContactsReturn {\n\t/** Reactive array of contacts */\n\tcontacts: Ref<Contact[]>;\n\t/** Computed array of contacts with GDPR consent */\n\tconsentedContacts: ComputedRef<Contact[]>;\n\t/** Computed array of contacts opted-in for marketing */\n\tmarketingContacts: ComputedRef<Contact[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch contacts */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseContactsOptions): any {\n\tconst conditions: any[] = [];\n\n\t// Filter by brand\n\tif (options.brandId) {\n\t\tconditions.push({ brandId: { eq: options.brandId } });\n\t}\n\n\t// Search across email, firstName, lastName\n\tif (options.search) {\n\t\tconditions.push({\n\t\t\tor: [\n\t\t\t\t{ email: { contains: options.search } },\n\t\t\t\t{ firstName: { contains: options.search } },\n\t\t\t\t{ lastName: { contains: options.search } },\n\t\t\t],\n\t\t});\n\t}\n\n\t// Filter by GDPR consent\n\tif (options.gdprConsent !== undefined) {\n\t\tconditions.push({ gdprConsent: { eq: options.gdprConsent } });\n\t}\n\n\t// Filter by marketing opt-in\n\tif (options.marketingOptIn !== undefined) {\n\t\tconditions.push({ marketingOptIn: { eq: options.marketingOptIn } });\n\t}\n\n\t// Filter by tags (contact must have at least one of these tags)\n\tif (options.tags && options.tags.length > 0) {\n\t\tconst tagConditions = options.tags.map((tag) => ({\n\t\t\ttags: { contains: tag },\n\t\t}));\n\t\tconditions.push({ or: tagConditions });\n\t}\n\n\t// Include any additional custom filter\n\tif (options.filter) {\n\t\tconditions.push(options.filter);\n\t}\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn conditions[0];\n\t}\n\n\treturn { and: conditions };\n}\n\n/**\n * Internal hook created by factory\n */\nconst useContactsInternal = createDataHook<\n\tContact,\n\tUseContactsOptions,\n\t{ consentedContacts: Contact[]; marketingContacts: Contact[] }\n>({\n\tmodel: \"Contact\",\n\tdataPropertyName: \"contacts\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tconsentedContacts: (contacts) =>\n\t\t\tcontacts.filter((c) => c.gdprConsent === true),\n\t\tmarketingContacts: (contacts) =>\n\t\t\tcontacts.filter((c) => c.marketingOptIn === true),\n\t},\n});\n\n/**\n * Composable for fetching and managing contacts\n *\n * @example\n * ```typescript\n * import { useContacts } from '@htlkg/data/hooks';\n *\n * const { contacts, loading, error, refetch } = useContacts({\n * brandId: 'brand-123',\n * limit: 25\n * });\n * ```\n *\n * @example With search\n * ```typescript\n * const { contacts, loading } = useContacts({\n * brandId: 'brand-123',\n * search: 'john',\n * limit: 25\n * });\n * ```\n *\n * @example With GDPR and marketing filters\n * ```typescript\n * const { contacts, marketingContacts } = useContacts({\n * brandId: 'brand-123',\n * gdprConsent: true,\n * marketingOptIn: true\n * });\n * ```\n *\n * @example With computed properties\n * ```typescript\n * const { contacts, consentedContacts, marketingContacts } = useContacts({\n * brandId: 'brand-123'\n * });\n *\n * // consentedContacts - contacts with GDPR consent\n * // marketingContacts - contacts opted-in for marketing\n * ```\n *\n * @example With tag filtering\n * ```typescript\n * const { contacts } = useContacts({\n * brandId: 'brand-123',\n * tags: ['vip', 'returning']\n * });\n * ```\n */\nexport function useContacts(options: UseContactsOptions = {}): UseContactsReturn {\n\tconst result = useContactsInternal(options);\n\treturn {\n\t\tcontacts: result.contacts as Ref<Contact[]>,\n\t\tconsentedContacts: result.consentedContacts as ComputedRef<Contact[]>,\n\t\tmarketingContacts: result.marketingContacts as ComputedRef<Contact[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n"],"mappings":"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","names":["buildFilter","fetch","buildFilter","buildFilter","buildFilter","buildFilter","buildFilter"]}
1
+ {"version":3,"sources":["../../src/hooks/createDataHook.ts","../../src/client/proxy.ts","../../src/hooks/createPaginatedDataHook.ts","../../src/hooks/brands/useBrands.ts","../../src/hooks/brands/usePaginatedBrands.ts","../../src/hooks/users/useUsers.ts","../../src/hooks/users/usePaginatedUsers.ts","../../src/hooks/accounts/useAccounts.ts","../../src/hooks/accounts/usePaginatedAccounts.ts","../../src/hooks/reservations/useReservations.ts","../../src/hooks/reservations/usePaginatedReservations.ts","../../src/hooks/products/useProducts.ts","../../src/client/index.ts","../../src/client/server.ts","../../src/mutations/productInstances/productInstances.ts","../../src/hooks/productInstances/useProductInstances.ts","../../src/hooks/useContacts.ts"],"sourcesContent":["/**\n * Data Hook Factory\n *\n * Creates reusable Vue composables for fetching data from GraphQL models.\n * Provides a DRY approach to data fetching with consistent patterns.\n */\n\nimport { ref, computed, onMounted, type Ref, type ComputedRef } from \"vue\";\nimport { query, hasErrors, getErrorMessage } from \"../client/proxy\";\n\n/**\n * Configuration options for creating a data hook\n */\nexport interface CreateDataHookOptions<T, TOptions extends BaseHookOptions = BaseHookOptions> {\n\t/** The GraphQL model name (e.g., 'Account', 'User', 'Brand') */\n\tmodel: string;\n\t/** Default limit for queries */\n\tdefaultLimit?: number;\n\t/** Selection set for the query (fields to fetch) */\n\tselectionSet?: string[];\n\t/** Transform function to apply to fetched data */\n\ttransform?: (item: any) => T;\n\t/** Build filter from hook options */\n\tbuildFilter?: (options: TOptions) => any;\n\t/** Define computed properties based on the data */\n\tcomputedProperties?: Record<string, (data: T[]) => any>;\n\t/** Plural name for the data property (e.g., 'accounts', 'users') */\n\tdataPropertyName?: string;\n}\n\n/**\n * Base options available to all hooks\n */\nexport interface BaseHookOptions {\n\t/** Filter criteria */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n}\n\n/**\n * Return type for data hooks\n */\nexport interface DataHookReturn<T, TComputed extends Record<string, any> = Record<string, never>> {\n\t/** Reactive array of data */\n\tdata: Ref<T[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch data */\n\trefetch: () => Promise<void>;\n\t/** Computed properties */\n\tcomputed: { [K in keyof TComputed]: ComputedRef<TComputed[K]> };\n}\n\n// Reset function for testing convenience (no-op with proxy-based approach)\nexport function resetClientInstance(): void {\n\t// No-op: proxy-based approach doesn't need client reset\n}\n\n/**\n * Creates a reusable data hook for a specific model\n *\n * @example\n * ```typescript\n * // Create a simple hook\n * export const useAccounts = createDataHook<Account>({\n * model: 'Account',\n * dataPropertyName: 'accounts',\n * });\n *\n * // Usage\n * const { data: accounts, loading, error, refetch } = useAccounts();\n * ```\n *\n * @example\n * ```typescript\n * // Create a hook with custom filters and computed properties\n * interface UseBrandsOptions extends BaseHookOptions {\n * accountId?: string;\n * activeOnly?: boolean;\n * }\n *\n * export const useBrands = createDataHook<Brand, UseBrandsOptions>({\n * model: 'Brand',\n * dataPropertyName: 'brands',\n * buildFilter: (options) => {\n * const filter: any = options.filter || {};\n * if (options.accountId) filter.accountId = { eq: options.accountId };\n * if (options.activeOnly) filter.status = { eq: 'active' };\n * return Object.keys(filter).length > 0 ? filter : undefined;\n * },\n * computedProperties: {\n * activeBrands: (brands) => brands.filter(b => b.status === 'active'),\n * },\n * });\n * ```\n */\nexport function createDataHook<\n\tT,\n\tTOptions extends BaseHookOptions = BaseHookOptions,\n\tTComputed extends Record<string, any> = Record<string, never>,\n>(\n\tconfig: CreateDataHookOptions<T, TOptions> & {\n\t\tcomputedProperties?: { [K in keyof TComputed]: (data: T[]) => TComputed[K] };\n\t},\n) {\n\tconst {\n\t\tmodel,\n\t\tdefaultLimit,\n\t\tselectionSet,\n\t\ttransform,\n\t\tbuildFilter,\n\t\tcomputedProperties,\n\t\tdataPropertyName = \"data\",\n\t} = config;\n\n\treturn function useData(options: TOptions = {} as TOptions): DataHookReturn<T, TComputed> & Record<string, any> {\n\t\tconst { filter: baseFilter, limit = defaultLimit, autoFetch = true } = options;\n\n\t\t// State\n\t\tconst data = ref<T[]>([]) as Ref<T[]>;\n\t\tconst loading = ref(false);\n\t\tconst error = ref<Error | null>(null);\n\n\t\t// Build filter using custom builder or default\n\t\tconst getFilter = () => {\n\t\t\tif (buildFilter) {\n\t\t\t\treturn buildFilter(options);\n\t\t\t}\n\t\t\treturn baseFilter && Object.keys(baseFilter).length > 0 ? baseFilter : undefined;\n\t\t};\n\n\t\t// Fetch function using server proxy\n\t\tasync function fetch() {\n\t\t\tloading.value = true;\n\t\t\terror.value = null;\n\n\t\t\ttry {\n\t\t\t\tconst queryOptions: Record<string, any> = {};\n\n\t\t\t\tconst filter = getFilter();\n\t\t\t\tif (filter) {\n\t\t\t\t\tqueryOptions.filter = filter;\n\t\t\t\t}\n\n\t\t\t\tif (limit) {\n\t\t\t\t\tqueryOptions.limit = limit;\n\t\t\t\t}\n\n\t\t\t\tif (selectionSet) {\n\t\t\t\t\tqueryOptions.selectionSet = selectionSet;\n\t\t\t\t}\n\n\t\t\t\tconst response = await query(model, \"list\", queryOptions);\n\n\t\t\t\tif (hasErrors(response)) {\n\t\t\t\t\tthrow new Error(getErrorMessage(response) || `Failed to fetch ${model}`);\n\t\t\t\t}\n\n\t\t\t\tconst items = response.data || [];\n\t\t\t\tdata.value = transform ? items.map(transform) : items;\n\t\t\t} catch (e) {\n\t\t\t\terror.value = e as Error;\n\t\t\t\tconsole.error(`[use${model}] Error fetching ${model}:`, e);\n\t\t\t} finally {\n\t\t\t\tloading.value = false;\n\t\t\t}\n\t\t}\n\n\t\t// Create computed properties\n\t\tconst computedRefs: Record<string, ComputedRef<any>> = {};\n\t\tif (computedProperties) {\n\t\t\tfor (const [key, fn] of Object.entries(computedProperties)) {\n\t\t\t\tcomputedRefs[key] = computed(() => fn(data.value));\n\t\t\t}\n\t\t}\n\n\t\t// Auto-fetch on mount if enabled\n\t\tif (autoFetch) {\n\t\t\tonMounted(() => {\n\t\t\t\tfetch();\n\t\t\t});\n\t\t}\n\n\t\t// Build return object\n\t\tconst result: DataHookReturn<T, TComputed> & Record<string, any> = {\n\t\t\tdata,\n\t\t\tloading,\n\t\t\terror,\n\t\t\trefetch: fetch,\n\t\t\tcomputed: computedRefs as { [K in keyof TComputed]: ComputedRef<TComputed[K]> },\n\t\t};\n\n\t\t// Add data property with custom name for backwards compatibility\n\t\tif (dataPropertyName !== \"data\") {\n\t\t\tresult[dataPropertyName] = data;\n\t\t}\n\n\t\t// Add computed properties at top level for backwards compatibility\n\t\tfor (const [key, computedRef] of Object.entries(computedRefs)) {\n\t\t\tresult[key] = computedRef;\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\n/**\n * Type helper to extract the return type of a created hook\n */\nexport type InferHookReturn<THook extends (...args: any[]) => any> = ReturnType<THook>;\n","/**\n * GraphQL Proxy Client\n *\n * Client-side helper for making authenticated GraphQL operations through\n * the server-side proxy. This allows Vue components to perform mutations\n * while keeping auth cookies httpOnly for security.\n *\n * @module @htlkg/data/proxy\n */\n\n/**\n * Valid GraphQL operations\n */\nexport type Operation = \"create\" | \"update\" | \"delete\" | \"get\" | \"list\";\n\n/**\n * Response type from GraphQL operations\n */\nexport interface GraphQLResponse<T = any> {\n\tdata: T | null;\n\terrors?: Array<{ message: string; [key: string]: any }>;\n}\n\n/**\n * Options for proxy requests\n */\nexport interface ProxyOptions {\n\t/** Custom API endpoint (default: /api/graphql) */\n\tendpoint?: string;\n\t/** Additional fetch options */\n\tfetchOptions?: RequestInit;\n}\n\n/**\n * Default proxy endpoint\n */\nconst DEFAULT_ENDPOINT = \"/api/graphql\";\n\n/**\n * Execute a GraphQL mutation through the server proxy\n *\n * @param model - The model name (e.g., 'User', 'Brand', 'Account')\n * @param operation - The operation type ('create', 'update', 'delete')\n * @param data - The operation data/input\n * @param options - Optional configuration\n * @returns Promise with the operation result\n *\n * @example Create\n * ```typescript\n * const result = await mutate('User', 'create', {\n * email: 'user@example.com',\n * accountId: '123',\n * });\n * ```\n *\n * @example Update\n * ```typescript\n * const result = await mutate('User', 'update', {\n * id: 'user-id',\n * status: 'deleted',\n * deletedAt: new Date().toISOString(),\n * });\n * ```\n *\n * @example Delete\n * ```typescript\n * const result = await mutate('User', 'delete', { id: 'user-id' });\n * ```\n */\nexport async function mutate<T = any>(\n\tmodel: string,\n\toperation: \"create\" | \"update\" | \"delete\",\n\tdata: Record<string, any>,\n\toptions?: ProxyOptions,\n): Promise<GraphQLResponse<T>> {\n\treturn proxyRequest<T>(model, operation, data, options);\n}\n\n/**\n * Execute a GraphQL query through the server proxy\n *\n * @param model - The model name (e.g., 'User', 'Brand', 'Account')\n * @param operation - The operation type ('get', 'list')\n * @param data - The query parameters (id for get, filter/limit for list)\n * @param options - Optional configuration\n * @returns Promise with the query result\n *\n * @example Get by ID\n * ```typescript\n * const result = await query('User', 'get', { id: 'user-id' });\n * ```\n *\n * @example List with filter\n * ```typescript\n * const result = await query('User', 'list', {\n * filter: { status: { eq: 'active' } },\n * limit: 100,\n * });\n * ```\n */\nexport async function query<T = any>(\n\tmodel: string,\n\toperation: \"get\" | \"list\",\n\tdata?: Record<string, any>,\n\toptions?: ProxyOptions,\n): Promise<GraphQLResponse<T>> {\n\treturn proxyRequest<T>(model, operation, data, options);\n}\n\n/**\n * Internal function to make proxy requests\n */\nasync function proxyRequest<T>(\n\tmodel: string,\n\toperation: Operation,\n\tdata?: Record<string, any>,\n\toptions?: ProxyOptions,\n): Promise<GraphQLResponse<T>> {\n\tconst endpoint = options?.endpoint ?? DEFAULT_ENDPOINT;\n\n\ttry {\n\t\tconst response = await fetch(endpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tcredentials: \"include\", // Important: include cookies\n\t\t\t...options?.fetchOptions,\n\t\t\tbody: JSON.stringify({ model, operation, data }),\n\t\t});\n\n\t\tconst result: GraphQLResponse<T> = await response.json();\n\n\t\t// Handle auth errors\n\t\tif (response.status === 401) {\n\t\t\tconsole.error(\"[GraphQL Proxy] Unauthorized - session may have expired\");\n\t\t\t// Optionally trigger a redirect to login\n\t\t\t// window.location.href = '/login';\n\t\t}\n\n\t\treturn result;\n\t} catch (error) {\n\t\tconsole.error(\"[GraphQL Proxy] Request failed:\", error);\n\t\treturn {\n\t\t\tdata: null,\n\t\t\terrors: [\n\t\t\t\t{\n\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Network error\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n}\n\n/**\n * Helper to check if a response has errors\n */\nexport function hasErrors(response: GraphQLResponse): boolean {\n\treturn !!response.errors && response.errors.length > 0;\n}\n\n/**\n * Helper to get the first error message from a response\n */\nexport function getErrorMessage(response: GraphQLResponse): string | null {\n\tif (!response.errors || response.errors.length === 0) {\n\t\treturn null;\n\t}\n\treturn response.errors[0].message;\n}\n","/**\n * Paginated Data Hook Factory\n *\n * Creates reusable Vue composables for fetching paginated data from GraphQL models.\n * Supports cursor-based pagination (nextToken) for efficient handling of large datasets.\n *\n * Key features:\n * - Server-side pagination with nextToken\n * - loadMore() for infinite scroll/pagination\n * - hasMore indicator\n * - Independent pagination state per hook instance\n * - Built-in support for active/deleted filtering\n */\n\nimport { ref, computed, onMounted, type Ref, type ComputedRef } from \"vue\";\nimport { query, hasErrors, getErrorMessage } from \"../client/proxy\";\n\n/**\n * Filter for active items (not deleted)\n * Uses OR condition because deletedAt can be:\n * - Missing (attributeExists: false)\n * - Explicitly null (eq: null)\n */\nexport const ACTIVE_FILTER = {\n\tor: [{ deletedAt: { attributeExists: false } }, { deletedAt: { eq: null } }],\n};\n\n/**\n * Filter for deleted items\n * Uses gt: \"\" to match only actual timestamp strings (not null or missing)\n */\nexport const DELETED_FILTER = {\n\tdeletedAt: { gt: \"\" },\n};\n\n/**\n * Configuration options for creating a paginated data hook\n */\nexport interface CreatePaginatedDataHookOptions<T, TOptions extends PaginatedHookOptions = PaginatedHookOptions> {\n\t/** The GraphQL model name (e.g., 'Account', 'User', 'Brand') */\n\tmodel: string;\n\t/** Default page size */\n\tdefaultPageSize?: number;\n\t/** Selection set for the query (fields to fetch) */\n\tselectionSet?: string[];\n\t/** Transform function to apply to fetched data */\n\ttransform?: (item: any) => T;\n\t/** Build filter from hook options */\n\tbuildFilter?: (options: TOptions) => any;\n\t/** Plural name for the data property (e.g., 'accounts', 'users') */\n\tdataPropertyName?: string;\n\t/** Base filter to always apply (e.g., for active/deleted variants) */\n\tbaseFilter?: any;\n}\n\n/**\n * Base options available to paginated hooks\n */\nexport interface PaginatedHookOptions {\n\t/** Additional filter criteria (merged with baseFilter) */\n\tfilter?: any;\n\t/** Page size (default: 25) */\n\tpageSize?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n}\n\n/**\n * Pagination state\n */\nexport interface PaginationState {\n\t/** Current nextToken for fetching next page */\n\tnextToken: string | null;\n\t/** Whether there are more items to load */\n\thasMore: boolean;\n\t/** Total items loaded so far */\n\tloadedCount: number;\n}\n\n/**\n * Return type for paginated data hooks\n */\nexport interface PaginatedDataHookReturn<T> {\n\t/** Reactive array of data (accumulated across pages) */\n\tdata: Ref<T[]>;\n\t/** Loading state (true during any fetch) */\n\tloading: Ref<boolean>;\n\t/** Loading state for initial fetch */\n\tinitialLoading: Ref<boolean>;\n\t/** Loading state for loadMore */\n\tloadingMore: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Pagination state */\n\tpagination: Ref<PaginationState>;\n\t/** Whether there are more items to load */\n\thasMore: ComputedRef<boolean>;\n\t/** Load next page of data */\n\tloadMore: () => Promise<void>;\n\t/** Refetch data (resets to first page) */\n\trefetch: () => Promise<void>;\n\t/** Reset data and pagination state */\n\treset: () => void;\n\t/** Update search filter and refetch from server (searches ALL data) */\n\tsetSearchFilter: (filter: any) => Promise<void>;\n\t/** Current search filter */\n\tsearchFilter: Ref<any>;\n}\n\n/**\n * Creates a reusable paginated data hook for a specific model\n *\n * @example\n * ```typescript\n * // Create a hook for active brands\n * export const useActiveBrands = createPaginatedDataHook<Brand>({\n * model: 'Brand',\n * dataPropertyName: 'brands',\n * baseFilter: ACTIVE_FILTER,\n * selectionSet: ['id', 'name', 'status', 'accountId', 'account.name'],\n * });\n *\n * // Usage in component\n * const { brands, loading, hasMore, loadMore, refetch } = useActiveBrands({\n * pageSize: 25,\n * });\n * ```\n *\n * @example With custom filter builder\n * ```typescript\n * interface UseBrandsOptions extends PaginatedHookOptions {\n * accountId?: string;\n * }\n *\n * export const useActiveBrands = createPaginatedDataHook<Brand, UseBrandsOptions>({\n * model: 'Brand',\n * dataPropertyName: 'brands',\n * baseFilter: ACTIVE_FILTER,\n * buildFilter: (options) => {\n * if (options.accountId) {\n * return { accountId: { eq: options.accountId } };\n * }\n * return undefined;\n * },\n * });\n * ```\n */\nexport function createPaginatedDataHook<T, TOptions extends PaginatedHookOptions = PaginatedHookOptions>(\n\tconfig: CreatePaginatedDataHookOptions<T, TOptions>,\n) {\n\tconst {\n\t\tmodel,\n\t\tdefaultPageSize = 25,\n\t\tselectionSet,\n\t\ttransform,\n\t\tbuildFilter,\n\t\tdataPropertyName = \"data\",\n\t\tbaseFilter,\n\t} = config;\n\n\treturn function usePaginatedData(\n\t\toptions: TOptions = {} as TOptions,\n\t): PaginatedDataHookReturn<T> & Record<string, any> {\n\t\tconst { filter: additionalFilter, pageSize = defaultPageSize, autoFetch = true } = options;\n\n\t\t// State\n\t\tconst data = ref<T[]>([]) as Ref<T[]>;\n\t\tconst loading = ref(false);\n\t\tconst initialLoading = ref(false);\n\t\tconst loadingMore = ref(false);\n\t\tconst error = ref<Error | null>(null);\n\t\tconst pagination = ref<PaginationState>({\n\t\t\tnextToken: null,\n\t\t\thasMore: true,\n\t\t\tloadedCount: 0,\n\t\t});\n\n\t\t// Dynamic search filter (for server-side filtering)\n\t\tconst searchFilter = ref<any>(null);\n\n\t\t// Computed\n\t\tconst hasMore = computed(() => pagination.value.hasMore);\n\n\t\t// Build combined filter\n\t\tconst getFilter = () => {\n\t\t\tconst filters: any[] = [];\n\n\t\t\t// Add base filter (e.g., active/deleted)\n\t\t\tif (baseFilter) {\n\t\t\t\tfilters.push(baseFilter);\n\t\t\t}\n\n\t\t\t// Add custom filter from buildFilter\n\t\t\tif (buildFilter) {\n\t\t\t\tconst customFilter = buildFilter(options);\n\t\t\t\tif (customFilter) {\n\t\t\t\t\tfilters.push(customFilter);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add additional filter from options\n\t\t\tif (additionalFilter && Object.keys(additionalFilter).length > 0) {\n\t\t\t\tfilters.push(additionalFilter);\n\t\t\t}\n\n\t\t\t// Add dynamic search filter (for server-side search)\n\t\t\tif (searchFilter.value && Object.keys(searchFilter.value).length > 0) {\n\t\t\t\tfilters.push(searchFilter.value);\n\t\t\t}\n\n\t\t\t// Combine filters with AND\n\t\t\tif (filters.length === 0) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (filters.length === 1) {\n\t\t\t\treturn filters[0];\n\t\t\t}\n\t\t\treturn { and: filters };\n\t\t};\n\n\t\t// Fetch function\n\t\tasync function fetchPage(nextToken?: string | null, append: boolean = false) {\n\t\t\tif (!append) {\n\t\t\t\tinitialLoading.value = true;\n\t\t\t} else {\n\t\t\t\tloadingMore.value = true;\n\t\t\t}\n\t\t\tloading.value = true;\n\t\t\terror.value = null;\n\n\t\t\ttry {\n\t\t\t\tconst queryOptions: Record<string, any> = {\n\t\t\t\t\tlimit: pageSize,\n\t\t\t\t};\n\n\t\t\t\tconst filter = getFilter();\n\t\t\t\tif (filter) {\n\t\t\t\t\tqueryOptions.filter = filter;\n\t\t\t\t}\n\n\t\t\t\tif (nextToken) {\n\t\t\t\t\tqueryOptions.nextToken = nextToken;\n\t\t\t\t}\n\n\t\t\t\tif (selectionSet) {\n\t\t\t\t\tqueryOptions.selectionSet = selectionSet;\n\t\t\t\t}\n\n\t\t\t\tconst response = await query(model, \"list\", queryOptions);\n\n\t\t\t\tif (hasErrors(response)) {\n\t\t\t\t\tthrow new Error(getErrorMessage(response) || `Failed to fetch ${model}`);\n\t\t\t\t}\n\n\t\t\t\tconst items = response.data || [];\n\t\t\t\tconst transformedItems = transform ? items.map(transform) : items;\n\n\t\t\t\tif (append) {\n\t\t\t\t\tdata.value = [...data.value, ...transformedItems];\n\t\t\t\t} else {\n\t\t\t\t\tdata.value = transformedItems;\n\t\t\t\t}\n\n\t\t\t\t// Update pagination state\n\t\t\t\t// Note: Amplify returns nextToken in the response\n\t\t\t\tconst responseNextToken = (response as any).nextToken;\n\t\t\t\tpagination.value = {\n\t\t\t\t\tnextToken: responseNextToken || null,\n\t\t\t\t\thasMore: !!responseNextToken,\n\t\t\t\t\tloadedCount: data.value.length,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\terror.value = e as Error;\n\t\t\t\tconsole.error(`[use${model}] Error fetching ${model}:`, e);\n\t\t\t} finally {\n\t\t\t\tloading.value = false;\n\t\t\t\tinitialLoading.value = false;\n\t\t\t\tloadingMore.value = false;\n\t\t\t}\n\t\t}\n\n\t\t// Load more function\n\t\tasync function loadMore() {\n\t\t\tif (loadingMore.value || !pagination.value.hasMore) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait fetchPage(pagination.value.nextToken, true);\n\t\t}\n\n\t\t// Refetch (reset to first page)\n\t\tasync function refetch() {\n\t\t\tpagination.value = {\n\t\t\t\tnextToken: null,\n\t\t\t\thasMore: true,\n\t\t\t\tloadedCount: 0,\n\t\t\t};\n\t\t\tawait fetchPage(null, false);\n\t\t}\n\n\t\t// Reset state\n\t\tfunction reset() {\n\t\t\tdata.value = [];\n\t\t\terror.value = null;\n\t\t\tsearchFilter.value = null;\n\t\t\tpagination.value = {\n\t\t\t\tnextToken: null,\n\t\t\t\thasMore: true,\n\t\t\t\tloadedCount: 0,\n\t\t\t};\n\t\t}\n\n\t\t// Set search filter and refetch from server (searches ALL data)\n\t\tasync function setSearchFilter(filter: any) {\n\t\t\tsearchFilter.value = filter;\n\t\t\t// Reset pagination and fetch with new filter\n\t\t\tpagination.value = {\n\t\t\t\tnextToken: null,\n\t\t\t\thasMore: true,\n\t\t\t\tloadedCount: 0,\n\t\t\t};\n\t\t\tawait fetchPage(null, false);\n\t\t}\n\n\t\t// Auto-fetch on mount if enabled\n\t\tif (autoFetch) {\n\t\t\tonMounted(() => {\n\t\t\t\tfetchPage(null, false);\n\t\t\t});\n\t\t}\n\n\t\t// Build return object\n\t\tconst result: PaginatedDataHookReturn<T> & Record<string, any> = {\n\t\t\tdata,\n\t\t\tloading,\n\t\t\tinitialLoading,\n\t\t\tloadingMore,\n\t\t\terror,\n\t\t\tpagination,\n\t\t\thasMore,\n\t\t\tloadMore,\n\t\t\trefetch,\n\t\t\treset,\n\t\t\tsetSearchFilter,\n\t\t\tsearchFilter,\n\t\t};\n\n\t\t// Add data property with custom name for backwards compatibility\n\t\tif (dataPropertyName !== \"data\") {\n\t\t\tresult[dataPropertyName] = data;\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\n/**\n * Type helper to extract the return type of a created paginated hook\n */\nexport type InferPaginatedHookReturn<THook extends (...args: any[]) => any> = ReturnType<THook>;\n","/**\n * useBrands Hook\n *\n * Vue composable for fetching and managing brand data with reactive state.\n * Provides loading states, error handling, and refetch capabilities.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Brand } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"../createDataHook\";\n\nexport interface UseBrandsOptions extends BaseHookOptions {\n\t/** Filter criteria for brands */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n\t/** Filter by account ID */\n\taccountId?: string;\n\t/** Only active brands */\n\tactiveOnly?: boolean;\n}\n\nexport interface UseBrandsReturn {\n\t/** Reactive array of brands */\n\tbrands: Ref<Brand[]>;\n\t/** Computed array of active brands only */\n\tactiveBrands: ComputedRef<Brand[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch brands */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseBrandsOptions): any {\n\tlet filter: any = options.filter || {};\n\n\tif (options.accountId) {\n\t\tfilter = { ...filter, accountId: { eq: options.accountId } };\n\t}\n\n\tif (options.activeOnly) {\n\t\tfilter = { ...filter, status: { eq: \"active\" } };\n\t}\n\n\treturn Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useBrandsInternal = createDataHook<Brand, UseBrandsOptions, { activeBrands: Brand[] }>({\n\tmodel: \"Brand\",\n\tdataPropertyName: \"brands\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tactiveBrands: (brands) => brands.filter((b) => b.status === \"active\"),\n\t},\n});\n\n/**\n * Composable for fetching and managing brands\n *\n * @example\n * ```typescript\n * import { useBrands } from '@htlkg/data/hooks';\n *\n * const { brands, loading, error, refetch } = useBrands();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { brands, loading } = useBrands({\n * accountId: 'account-123',\n * activeOnly: true,\n * limit: 50\n * });\n * ```\n */\nexport function useBrands(options: UseBrandsOptions = {}): UseBrandsReturn {\n\tconst result = useBrandsInternal(options);\n\treturn {\n\t\tbrands: result.brands as Ref<Brand[]>,\n\t\tactiveBrands: result.activeBrands as ComputedRef<Brand[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * Paginated Brands Hooks\n *\n * Vue composables for fetching brands with server-side pagination.\n * Provides separate hooks for active and deleted brands to enable\n * efficient tab-based filtering in large datasets.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Brand } from \"@htlkg/core/types\";\nimport {\n\tcreatePaginatedDataHook,\n\tACTIVE_FILTER,\n\tDELETED_FILTER,\n\ttype PaginatedHookOptions,\n\ttype PaginationState,\n} from \"../createPaginatedDataHook\";\n\n/** Extended Brand type with computed fields */\nexport type BrandWithCounts = Brand & {\n\taccountName?: string;\n\tenabledProductCount?: number;\n\ttotalProductCount?: number;\n\tdeletedAt?: string;\n\tdeletedBy?: string;\n};\n\nexport interface UsePaginatedBrandsOptions extends PaginatedHookOptions {\n\t/** Filter by account ID */\n\taccountId?: string;\n}\n\nexport interface UsePaginatedBrandsReturn {\n\t/** Reactive array of brands */\n\tbrands: Ref<BrandWithCounts[]>;\n\t/** Loading state (true during any fetch) */\n\tloading: Ref<boolean>;\n\t/** Loading state for initial fetch */\n\tinitialLoading: Ref<boolean>;\n\t/** Loading state for loadMore */\n\tloadingMore: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Pagination state */\n\tpagination: Ref<PaginationState>;\n\t/** Whether there are more items to load */\n\thasMore: ComputedRef<boolean>;\n\t/** Load next page of data */\n\tloadMore: () => Promise<void>;\n\t/** Refetch data (resets to first page) */\n\trefetch: () => Promise<void>;\n\t/** Reset data and pagination state */\n\treset: () => void;\n\t/** Update search filter and refetch from server (searches ALL data) */\n\tsetSearchFilter: (filter: any) => Promise<void>;\n\t/** Current search filter */\n\tsearchFilter: Ref<any>;\n}\n\n/**\n * Build additional filter from hook options\n */\nfunction buildFilter(options: UsePaginatedBrandsOptions): any {\n\tconst conditions: any[] = [];\n\n\tif (options.accountId) {\n\t\tconditions.push({ accountId: { eq: options.accountId } });\n\t}\n\n\tif (options.filter && Object.keys(options.filter).length > 0) {\n\t\tconditions.push(options.filter);\n\t}\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\tif (conditions.length === 1) {\n\t\treturn conditions[0];\n\t}\n\treturn { and: conditions };\n}\n\n/**\n * Transform brand data\n */\nfunction transformBrand(brand: any): BrandWithCounts {\n\treturn {\n\t\t...brand,\n\t\taccountName: brand.account?.name || \"\",\n\t};\n}\n\n/**\n * Selection set for brand queries\n */\nconst BRAND_SELECTION_SET = [\n\t\"id\",\n\t\"name\",\n\t\"accountId\",\n\t\"logo\",\n\t\"timezone\",\n\t\"status\",\n\t\"settings\",\n\t\"deletedAt\",\n\t\"deletedBy\",\n\t\"account.name\",\n];\n\n/**\n * Internal hook for active brands\n */\nconst useActiveBrandsInternal = createPaginatedDataHook<BrandWithCounts, UsePaginatedBrandsOptions>({\n\tmodel: \"Brand\",\n\tdataPropertyName: \"brands\",\n\tdefaultPageSize: 25,\n\tselectionSet: BRAND_SELECTION_SET,\n\ttransform: transformBrand,\n\tbuildFilter,\n\tbaseFilter: ACTIVE_FILTER,\n});\n\n/**\n * Internal hook for deleted brands\n */\nconst useDeletedBrandsInternal = createPaginatedDataHook<BrandWithCounts, UsePaginatedBrandsOptions>({\n\tmodel: \"Brand\",\n\tdataPropertyName: \"brands\",\n\tdefaultPageSize: 25,\n\tselectionSet: BRAND_SELECTION_SET,\n\ttransform: transformBrand,\n\tbuildFilter,\n\tbaseFilter: DELETED_FILTER,\n});\n\n/**\n * Composable for fetching active (non-deleted) brands with pagination\n *\n * @example\n * ```typescript\n * import { useActiveBrands } from '@htlkg/data/hooks';\n *\n * const { brands, loading, hasMore, loadMore, refetch } = useActiveBrands({\n * pageSize: 25,\n * });\n *\n * // Load more when user scrolls or clicks \"Load More\"\n * async function onLoadMore() {\n * await loadMore();\n * }\n * ```\n *\n * @example With account filter\n * ```typescript\n * const { brands, loading } = useActiveBrands({\n * accountId: 'account-123',\n * pageSize: 50\n * });\n * ```\n */\nexport function useActiveBrands(options: UsePaginatedBrandsOptions = {}): UsePaginatedBrandsReturn {\n\tconst result = useActiveBrandsInternal(options);\n\treturn {\n\t\tbrands: result.brands as Ref<BrandWithCounts[]>,\n\t\tloading: result.loading,\n\t\tinitialLoading: result.initialLoading,\n\t\tloadingMore: result.loadingMore,\n\t\terror: result.error,\n\t\tpagination: result.pagination,\n\t\thasMore: result.hasMore,\n\t\tloadMore: result.loadMore,\n\t\trefetch: result.refetch,\n\t\treset: result.reset,\n\t\tsetSearchFilter: result.setSearchFilter,\n\t\tsearchFilter: result.searchFilter,\n\t};\n}\n\n/**\n * Composable for fetching deleted brands with pagination\n *\n * @example\n * ```typescript\n * import { useDeletedBrands } from '@htlkg/data/hooks';\n *\n * const { brands, loading, hasMore, loadMore, refetch } = useDeletedBrands({\n * pageSize: 25,\n * });\n * ```\n */\nexport function useDeletedBrands(options: UsePaginatedBrandsOptions = {}): UsePaginatedBrandsReturn {\n\tconst result = useDeletedBrandsInternal(options);\n\treturn {\n\t\tbrands: result.brands as Ref<BrandWithCounts[]>,\n\t\tloading: result.loading,\n\t\tinitialLoading: result.initialLoading,\n\t\tloadingMore: result.loadingMore,\n\t\terror: result.error,\n\t\tpagination: result.pagination,\n\t\thasMore: result.hasMore,\n\t\tloadMore: result.loadMore,\n\t\trefetch: result.refetch,\n\t\treset: result.reset,\n\t\tsetSearchFilter: result.setSearchFilter,\n\t\tsearchFilter: result.searchFilter,\n\t};\n}\n","/**\n * useUsers Hook\n *\n * Vue composable for fetching and managing user data with reactive state.\n * Provides loading states, error handling, and refetch capabilities.\n */\n\nimport type { Ref } from \"vue\";\nimport type { User } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"../createDataHook\";\n\nexport interface UseUsersOptions extends BaseHookOptions {\n\t/** Filter criteria for users */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Filter by account ID */\n\taccountId?: string;\n}\n\nexport interface UseUsersReturn {\n\t/** Reactive array of users */\n\tusers: Ref<User[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch users */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseUsersOptions): any {\n\tlet filter: any = options.filter || {};\n\n\tif (options.brandId) {\n\t\tfilter = { ...filter, brandIds: { contains: options.brandId } };\n\t}\n\n\tif (options.accountId) {\n\t\tfilter = { ...filter, accountIds: { contains: options.accountId } };\n\t}\n\n\treturn Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useUsersInternal = createDataHook<User, UseUsersOptions>({\n\tmodel: \"User\",\n\tdataPropertyName: \"users\",\n\tbuildFilter,\n});\n\n/**\n * Composable for fetching and managing users\n *\n * @example\n * ```typescript\n * import { useUsers } from '@htlkg/data/hooks';\n *\n * const { users, loading, error, refetch } = useUsers();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { users, loading } = useUsers({\n * brandId: 'brand-123',\n * accountId: 'account-456',\n * limit: 50\n * });\n * ```\n */\nexport function useUsers(options: UseUsersOptions = {}): UseUsersReturn {\n\tconst result = useUsersInternal(options);\n\treturn {\n\t\tusers: result.users as Ref<User[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * Paginated Users Hooks\n *\n * Vue composables for fetching users with server-side pagination.\n * Provides separate hooks for active and deleted users to enable\n * efficient tab-based filtering in large datasets.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { User } from \"@htlkg/core/types\";\nimport {\n\tcreatePaginatedDataHook,\n\tACTIVE_FILTER,\n\tDELETED_FILTER,\n\ttype PaginatedHookOptions,\n\ttype PaginationState,\n} from \"../createPaginatedDataHook\";\n\n/** Extended User type with computed fields */\nexport type UserWithRelations = User & {\n\taccountName?: string;\n\tbrandNames?: string[];\n\tdeletedAt?: string;\n\tdeletedBy?: string;\n};\n\nexport interface UsePaginatedUsersOptions extends PaginatedHookOptions {\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Filter by account ID */\n\taccountId?: string;\n}\n\nexport interface UsePaginatedUsersReturn {\n\t/** Reactive array of users */\n\tusers: Ref<UserWithRelations[]>;\n\t/** Loading state (true during any fetch) */\n\tloading: Ref<boolean>;\n\t/** Loading state for initial fetch */\n\tinitialLoading: Ref<boolean>;\n\t/** Loading state for loadMore */\n\tloadingMore: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Pagination state */\n\tpagination: Ref<PaginationState>;\n\t/** Whether there are more items to load */\n\thasMore: ComputedRef<boolean>;\n\t/** Load next page of data */\n\tloadMore: () => Promise<void>;\n\t/** Refetch data (resets to first page) */\n\trefetch: () => Promise<void>;\n\t/** Reset data and pagination state */\n\treset: () => void;\n\t/** Update search filter and refetch from server (searches ALL data) */\n\tsetSearchFilter: (filter: any) => Promise<void>;\n\t/** Current search filter */\n\tsearchFilter: Ref<any>;\n}\n\n/**\n * Build additional filter from hook options\n */\nfunction buildFilter(options: UsePaginatedUsersOptions): any {\n\tconst conditions: any[] = [];\n\n\tif (options.brandId) {\n\t\tconditions.push({ brandIds: { contains: options.brandId } });\n\t}\n\n\tif (options.accountId) {\n\t\tconditions.push({ accountId: { eq: options.accountId } });\n\t}\n\n\tif (options.filter && Object.keys(options.filter).length > 0) {\n\t\tconditions.push(options.filter);\n\t}\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\tif (conditions.length === 1) {\n\t\treturn conditions[0];\n\t}\n\treturn { and: conditions };\n}\n\n/**\n * Transform user data\n */\nfunction transformUser(user: any): UserWithRelations {\n\treturn {\n\t\t...user,\n\t\taccountName: user.account?.name || \"\",\n\t};\n}\n\n/**\n * Selection set for user queries\n */\nconst USER_SELECTION_SET = [\n\t\"id\",\n\t\"email\",\n\t\"accountId\",\n\t\"brandIds\",\n\t\"roles\",\n\t\"status\",\n\t\"lastLogin\",\n\t\"createdAt\",\n\t\"deletedAt\",\n\t\"deletedBy\",\n\t\"account.name\",\n];\n\n/**\n * Internal hook for active users\n */\nconst useActiveUsersInternal = createPaginatedDataHook<UserWithRelations, UsePaginatedUsersOptions>({\n\tmodel: \"User\",\n\tdataPropertyName: \"users\",\n\tdefaultPageSize: 25,\n\tselectionSet: USER_SELECTION_SET,\n\ttransform: transformUser,\n\tbuildFilter,\n\tbaseFilter: ACTIVE_FILTER,\n});\n\n/**\n * Internal hook for deleted users\n */\nconst useDeletedUsersInternal = createPaginatedDataHook<UserWithRelations, UsePaginatedUsersOptions>({\n\tmodel: \"User\",\n\tdataPropertyName: \"users\",\n\tdefaultPageSize: 25,\n\tselectionSet: USER_SELECTION_SET,\n\ttransform: transformUser,\n\tbuildFilter,\n\tbaseFilter: DELETED_FILTER,\n});\n\n/**\n * Composable for fetching active (non-deleted) users with pagination\n *\n * @example\n * ```typescript\n * import { useActiveUsers } from '@htlkg/data/hooks';\n *\n * const { users, loading, hasMore, loadMore, refetch } = useActiveUsers({\n * pageSize: 25,\n * });\n *\n * // Load more when user scrolls or clicks \"Load More\"\n * async function onLoadMore() {\n * await loadMore();\n * }\n * ```\n *\n * @example With filters\n * ```typescript\n * const { users, loading } = useActiveUsers({\n * accountId: 'account-123',\n * brandId: 'brand-456',\n * pageSize: 50\n * });\n * ```\n */\nexport function useActiveUsers(options: UsePaginatedUsersOptions = {}): UsePaginatedUsersReturn {\n\tconst result = useActiveUsersInternal(options);\n\treturn {\n\t\tusers: result.users as Ref<UserWithRelations[]>,\n\t\tloading: result.loading,\n\t\tinitialLoading: result.initialLoading,\n\t\tloadingMore: result.loadingMore,\n\t\terror: result.error,\n\t\tpagination: result.pagination,\n\t\thasMore: result.hasMore,\n\t\tloadMore: result.loadMore,\n\t\trefetch: result.refetch,\n\t\treset: result.reset,\n\t\tsetSearchFilter: result.setSearchFilter,\n\t\tsearchFilter: result.searchFilter,\n\t};\n}\n\n/**\n * Composable for fetching deleted users with pagination\n *\n * @example\n * ```typescript\n * import { useDeletedUsers } from '@htlkg/data/hooks';\n *\n * const { users, loading, hasMore, loadMore, refetch } = useDeletedUsers({\n * pageSize: 25,\n * });\n * ```\n */\nexport function useDeletedUsers(options: UsePaginatedUsersOptions = {}): UsePaginatedUsersReturn {\n\tconst result = useDeletedUsersInternal(options);\n\treturn {\n\t\tusers: result.users as Ref<UserWithRelations[]>,\n\t\tloading: result.loading,\n\t\tinitialLoading: result.initialLoading,\n\t\tloadingMore: result.loadingMore,\n\t\terror: result.error,\n\t\tpagination: result.pagination,\n\t\thasMore: result.hasMore,\n\t\tloadMore: result.loadMore,\n\t\trefetch: result.refetch,\n\t\treset: result.reset,\n\t\tsetSearchFilter: result.setSearchFilter,\n\t\tsearchFilter: result.searchFilter,\n\t};\n}\n","/**\n * useAccounts Hook\n *\n * Vue composable for fetching and managing account data with reactive state.\n * Provides loading states, error handling, and refetch capabilities.\n * Includes brands relationship data for displaying brand info without separate queries.\n */\n\nimport type { Ref } from \"vue\";\nimport type { Account } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"../createDataHook\";\n\nexport interface UseAccountsOptions extends BaseHookOptions {\n\t/** Filter criteria for accounts */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n}\n\n/** Brand info included with account */\nexport interface AccountBrand {\n\tid: string;\n\tname: string;\n\tstatus?: string;\n}\n\n/** Extended account type with brands relationship */\nexport type AccountWithBrands = Account & {\n\tbrands: AccountBrand[];\n\tbrandCount: number;\n\tdeletedAt?: string;\n\tdeletedBy?: string;\n};\n\nexport interface UseAccountsReturn {\n\t/** Reactive array of accounts with brands */\n\taccounts: Ref<AccountWithBrands[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch accounts */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Transform account data to include brandCount\n */\nfunction transformAccount(account: any): AccountWithBrands {\n\tconst brands = account.brands || [];\n\treturn {\n\t\t...account,\n\t\tbrands,\n\t\tbrandCount: brands.length,\n\t};\n}\n\n/**\n * Internal hook created by factory\n */\nconst useAccountsInternal = createDataHook<AccountWithBrands, UseAccountsOptions>({\n\tmodel: \"Account\",\n\tdataPropertyName: \"accounts\",\n\t// Include brands relationship for brand display\n\tselectionSet: [\n\t\t\"id\",\n\t\t\"name\",\n\t\t\"logo\",\n\t\t\"subscription\",\n\t\t\"settings\",\n\t\t\"status\",\n\t\t\"deletedAt\",\n\t\t\"deletedBy\",\n\t\t\"brands.id\",\n\t\t\"brands.name\",\n\t\t\"brands.status\",\n\t],\n\ttransform: transformAccount,\n});\n\n/**\n * Composable for fetching and managing accounts\n *\n * @example\n * ```typescript\n * import { useAccounts } from '@htlkg/data/hooks';\n *\n * const { accounts, loading, error, refetch } = useAccounts();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { accounts, loading } = useAccounts({\n * filter: { status: { eq: 'active' } },\n * limit: 50\n * });\n * ```\n */\nexport function useAccounts(options: UseAccountsOptions = {}): UseAccountsReturn {\n\tconst result = useAccountsInternal(options);\n\treturn {\n\t\taccounts: result.accounts as Ref<AccountWithBrands[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * Paginated Accounts Hooks\n *\n * Vue composables for fetching accounts with server-side pagination.\n * Provides separate hooks for active and deleted accounts to enable\n * efficient tab-based filtering in large datasets.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport {\n\tcreatePaginatedDataHook,\n\tACTIVE_FILTER,\n\tDELETED_FILTER,\n\ttype PaginatedHookOptions,\n\ttype PaginationState,\n} from \"../createPaginatedDataHook\";\nimport type { AccountWithBrands } from \"./useAccounts\";\n\nexport interface UsePaginatedAccountsOptions extends PaginatedHookOptions {\n\t// Add any account-specific filters here if needed\n}\n\nexport interface UsePaginatedAccountsReturn {\n\t/** Reactive array of accounts with brands */\n\taccounts: Ref<AccountWithBrands[]>;\n\t/** Loading state (true during any fetch) */\n\tloading: Ref<boolean>;\n\t/** Loading state for initial fetch */\n\tinitialLoading: Ref<boolean>;\n\t/** Loading state for loadMore */\n\tloadingMore: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Pagination state */\n\tpagination: Ref<PaginationState>;\n\t/** Whether there are more items to load */\n\thasMore: ComputedRef<boolean>;\n\t/** Load next page of data */\n\tloadMore: () => Promise<void>;\n\t/** Refetch data (resets to first page) */\n\trefetch: () => Promise<void>;\n\t/** Reset data and pagination state */\n\treset: () => void;\n\t/** Update search filter and refetch from server (searches ALL data) */\n\tsetSearchFilter: (filter: any) => Promise<void>;\n\t/** Current search filter */\n\tsearchFilter: Ref<any>;\n}\n\n/**\n * Transform account data to include brandCount\n */\nfunction transformAccount(account: any): AccountWithBrands {\n\tconst brands = account.brands || [];\n\treturn {\n\t\t...account,\n\t\tbrands,\n\t\tbrandCount: brands.length,\n\t};\n}\n\n/**\n * Selection set for account queries\n */\nconst ACCOUNT_SELECTION_SET = [\n\t\"id\",\n\t\"name\",\n\t\"logo\",\n\t\"subscription\",\n\t\"settings\",\n\t\"status\",\n\t\"deletedAt\",\n\t\"deletedBy\",\n\t\"brands.id\",\n\t\"brands.name\",\n\t\"brands.status\",\n];\n\n/**\n * Internal hook for active accounts\n */\nconst useActiveAccountsInternal = createPaginatedDataHook<AccountWithBrands, UsePaginatedAccountsOptions>({\n\tmodel: \"Account\",\n\tdataPropertyName: \"accounts\",\n\tdefaultPageSize: 25,\n\tselectionSet: ACCOUNT_SELECTION_SET,\n\ttransform: transformAccount,\n\tbaseFilter: ACTIVE_FILTER,\n});\n\n/**\n * Internal hook for deleted accounts\n */\nconst useDeletedAccountsInternal = createPaginatedDataHook<AccountWithBrands, UsePaginatedAccountsOptions>({\n\tmodel: \"Account\",\n\tdataPropertyName: \"accounts\",\n\tdefaultPageSize: 25,\n\tselectionSet: ACCOUNT_SELECTION_SET,\n\ttransform: transformAccount,\n\tbaseFilter: DELETED_FILTER,\n});\n\n/**\n * Composable for fetching active (non-deleted) accounts with pagination\n *\n * @example\n * ```typescript\n * import { useActiveAccounts } from '@htlkg/data/hooks';\n *\n * const { accounts, loading, hasMore, loadMore, refetch } = useActiveAccounts({\n * pageSize: 25,\n * });\n *\n * // Load more when user scrolls or clicks \"Load More\"\n * async function onLoadMore() {\n * await loadMore();\n * }\n * ```\n */\nexport function useActiveAccounts(options: UsePaginatedAccountsOptions = {}): UsePaginatedAccountsReturn {\n\tconst result = useActiveAccountsInternal(options);\n\treturn {\n\t\taccounts: result.accounts as Ref<AccountWithBrands[]>,\n\t\tloading: result.loading,\n\t\tinitialLoading: result.initialLoading,\n\t\tloadingMore: result.loadingMore,\n\t\terror: result.error,\n\t\tpagination: result.pagination,\n\t\thasMore: result.hasMore,\n\t\tloadMore: result.loadMore,\n\t\trefetch: result.refetch,\n\t\treset: result.reset,\n\t\tsetSearchFilter: result.setSearchFilter,\n\t\tsearchFilter: result.searchFilter,\n\t};\n}\n\n/**\n * Composable for fetching deleted accounts with pagination\n *\n * @example\n * ```typescript\n * import { useDeletedAccounts } from '@htlkg/data/hooks';\n *\n * const { accounts, loading, hasMore, loadMore, refetch } = useDeletedAccounts({\n * pageSize: 25,\n * });\n * ```\n */\nexport function useDeletedAccounts(options: UsePaginatedAccountsOptions = {}): UsePaginatedAccountsReturn {\n\tconst result = useDeletedAccountsInternal(options);\n\treturn {\n\t\taccounts: result.accounts as Ref<AccountWithBrands[]>,\n\t\tloading: result.loading,\n\t\tinitialLoading: result.initialLoading,\n\t\tloadingMore: result.loadingMore,\n\t\terror: result.error,\n\t\tpagination: result.pagination,\n\t\thasMore: result.hasMore,\n\t\tloadMore: result.loadMore,\n\t\trefetch: result.refetch,\n\t\treset: result.reset,\n\t\tsetSearchFilter: result.setSearchFilter,\n\t\tsearchFilter: result.searchFilter,\n\t};\n}\n","/**\n * useReservations Hook\n *\n * Vue composable for fetching and managing reservation data with reactive state.\n * Provides loading states, error handling, pagination, and refetch capabilities.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Reservation } from \"../../queries/reservations\";\nimport { createDataHook, type BaseHookOptions } from \"../createDataHook\";\n\nexport interface UseReservationsOptions extends BaseHookOptions {\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Filter by start date (check-in date >= startDate) */\n\tstartDate?: string;\n\t/** Filter by end date (check-in date <= endDate) */\n\tendDate?: string;\n\t/** Filter by reservation status */\n\tstatus?: Reservation[\"status\"];\n\t/** Filter by contact/visit ID */\n\tcontactId?: string;\n\t/** Pagination token for fetching next page */\n\tnextToken?: string;\n}\n\n/** Extended reservation type with related data */\nexport type ReservationWithRelations = Reservation & {\n\tbrandName: string;\n\tguestName: string;\n\tguestEmail: string;\n\tguestPhone: string;\n};\n\nexport interface UseReservationsReturn {\n\t/** Reactive array of reservations with brand and guest info */\n\treservations: Ref<ReservationWithRelations[]>;\n\t/** Computed array of confirmed reservations */\n\tconfirmedReservations: ComputedRef<ReservationWithRelations[]>;\n\t/** Computed array of active reservations (confirmed or checked_in) */\n\tactiveReservations: ComputedRef<ReservationWithRelations[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch reservations */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseReservationsOptions): any {\n\tconst conditions: any[] = [];\n\n\tif (options.brandId) {\n\t\tconditions.push({ brandId: { eq: options.brandId } });\n\t}\n\n\tif (options.status) {\n\t\tconditions.push({ status: { eq: options.status } });\n\t}\n\n\tif (options.contactId) {\n\t\tconditions.push({ visitId: { eq: options.contactId } });\n\t}\n\n\tif (options.startDate) {\n\t\tconditions.push({ checkIn: { ge: options.startDate } });\n\t}\n\n\tif (options.endDate) {\n\t\tconditions.push({ checkIn: { le: options.endDate } });\n\t}\n\n\tif (options.filter) {\n\t\tconditions.push(options.filter);\n\t}\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn conditions[0];\n\t}\n\n\treturn { and: conditions };\n}\n\n/**\n * Transform reservation data to include brandName and guest info from visit.snapshot\n */\nfunction transformReservation(r: any): Reservation & { brandName: string; guestName: string; guestEmail: string; guestPhone: string } {\n\t// Parse snapshot if it's a string (handles double-stringification from import)\n\tlet snapshot = r.visit?.snapshot;\n\tif (typeof snapshot === \"string\") {\n\t\ttry {\n\t\t\tsnapshot = JSON.parse(snapshot);\n\t\t} catch {\n\t\t\tsnapshot = null;\n\t\t}\n\t}\n\n\treturn {\n\t\t...r,\n\t\tbrandName: r.brand?.name || \"Unknown Brand\",\n\t\tguestName: snapshot\n\t\t\t? `${snapshot.firstName || \"\"} ${snapshot.lastName || \"\"}`.trim() || \"Unknown Guest\"\n\t\t\t: \"Unknown Guest\",\n\t\tguestEmail: snapshot?.email || \"\",\n\t\tguestPhone: snapshot?.phone || \"\",\n\t};\n}\n\n/**\n * Internal hook created by factory\n */\nconst useReservationsInternal = createDataHook<\n\tReservation & { brandName: string; guestName: string; guestEmail: string; guestPhone: string },\n\tUseReservationsOptions,\n\t{ confirmedReservations: Reservation[]; activeReservations: Reservation[] }\n>({\n\tmodel: \"Reservation\",\n\tdataPropertyName: \"reservations\",\n\tbuildFilter,\n\t// Include related data for brand name and guest info\n\tselectionSet: [\n\t\t\"id\",\n\t\t\"brandId\",\n\t\t\"visitId\",\n\t\t\"checkIn\",\n\t\t\"checkOut\",\n\t\t\"room\",\n\t\t\"roomType\",\n\t\t\"status\",\n\t\t\"source\",\n\t\t\"channel\",\n\t\t\"confirmationCode\",\n\t\t\"totalAmount\",\n\t\t\"currency\",\n\t\t\"nights\",\n\t\t\"deletedAt\",\n\t\t\"deletedBy\",\n\t\t\"brand.name\",\n\t\t\"visit.snapshot\",\n\t],\n\ttransform: transformReservation,\n\tcomputedProperties: {\n\t\tconfirmedReservations: (reservations) =>\n\t\t\treservations.filter((r) => r.status === \"confirmed\"),\n\t\tactiveReservations: (reservations) =>\n\t\t\treservations.filter((r) => r.status === \"confirmed\" || r.status === \"checked_in\"),\n\t},\n});\n\n/**\n * Composable for fetching and managing reservations\n *\n * @example\n * ```typescript\n * import { useReservations } from '@htlkg/data/hooks';\n *\n * const { reservations, loading, error, refetch } = useReservations({\n * brandId: 'brand-123',\n * startDate: '2026-01-01',\n * endDate: '2026-01-31',\n * status: 'confirmed'\n * });\n * ```\n *\n * @example With contact filter\n * ```typescript\n * const { reservations, loading } = useReservations({\n * contactId: 'contact-123',\n * limit: 50\n * });\n * ```\n *\n * @example With computed properties\n * ```typescript\n * const { reservations, activeReservations, confirmedReservations } = useReservations({\n * brandId: 'brand-123'\n * });\n *\n * // activeReservations includes confirmed + checked_in\n * // confirmedReservations includes only confirmed\n * ```\n */\nexport function useReservations(options: UseReservationsOptions = {}): UseReservationsReturn {\n\tconst result = useReservationsInternal(options);\n\treturn {\n\t\treservations: result.reservations as Ref<ReservationWithRelations[]>,\n\t\tconfirmedReservations: result.confirmedReservations as ComputedRef<ReservationWithRelations[]>,\n\t\tactiveReservations: result.activeReservations as ComputedRef<ReservationWithRelations[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * Paginated Reservations Hooks\n *\n * Vue composables for fetching reservations with server-side pagination.\n * Provides separate hooks for active and deleted reservations to enable\n * efficient tab-based filtering in large datasets.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Reservation } from \"../../queries/reservations\";\nimport {\n\tcreatePaginatedDataHook,\n\tACTIVE_FILTER,\n\tDELETED_FILTER,\n\ttype PaginatedHookOptions,\n\ttype PaginationState,\n} from \"../createPaginatedDataHook\";\nimport type { ReservationWithRelations } from \"./useReservations\";\n\nexport interface UsePaginatedReservationsOptions extends PaginatedHookOptions {\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Filter by start date (check-in date >= startDate) */\n\tstartDate?: string;\n\t/** Filter by end date (check-in date <= endDate) */\n\tendDate?: string;\n\t/** Filter by reservation status */\n\tstatus?: Reservation[\"status\"];\n\t/** Filter by contact/visit ID */\n\tcontactId?: string;\n}\n\nexport interface UsePaginatedReservationsReturn {\n\t/** Reactive array of reservations with brand and guest info */\n\treservations: Ref<ReservationWithRelations[]>;\n\t/** Loading state (true during any fetch) */\n\tloading: Ref<boolean>;\n\t/** Loading state for initial fetch */\n\tinitialLoading: Ref<boolean>;\n\t/** Loading state for loadMore */\n\tloadingMore: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Pagination state */\n\tpagination: Ref<PaginationState>;\n\t/** Whether there are more items to load */\n\thasMore: ComputedRef<boolean>;\n\t/** Load next page of data */\n\tloadMore: () => Promise<void>;\n\t/** Refetch data (resets to first page) */\n\trefetch: () => Promise<void>;\n\t/** Reset data and pagination state */\n\treset: () => void;\n\t/** Update search filter and refetch from server (searches ALL data) */\n\tsetSearchFilter: (filter: any) => Promise<void>;\n\t/** Current search filter */\n\tsearchFilter: Ref<any>;\n}\n\n/**\n * Build additional filter from hook options\n */\nfunction buildFilter(options: UsePaginatedReservationsOptions): any {\n\tconst conditions: any[] = [];\n\n\tif (options.brandId) {\n\t\tconditions.push({ brandId: { eq: options.brandId } });\n\t}\n\n\tif (options.status) {\n\t\tconditions.push({ status: { eq: options.status } });\n\t}\n\n\tif (options.contactId) {\n\t\tconditions.push({ visitId: { eq: options.contactId } });\n\t}\n\n\tif (options.startDate) {\n\t\tconditions.push({ checkIn: { ge: options.startDate } });\n\t}\n\n\tif (options.endDate) {\n\t\tconditions.push({ checkIn: { le: options.endDate } });\n\t}\n\n\tif (options.filter && Object.keys(options.filter).length > 0) {\n\t\tconditions.push(options.filter);\n\t}\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\tif (conditions.length === 1) {\n\t\treturn conditions[0];\n\t}\n\treturn { and: conditions };\n}\n\n/**\n * Transform reservation data to include brandName and guest info from visit.snapshot\n */\nfunction transformReservation(r: any): ReservationWithRelations {\n\t// Parse snapshot if it's a string (handles double-stringification from import)\n\tlet snapshot = r.visit?.snapshot;\n\tif (typeof snapshot === \"string\") {\n\t\ttry {\n\t\t\tsnapshot = JSON.parse(snapshot);\n\t\t} catch {\n\t\t\tsnapshot = null;\n\t\t}\n\t}\n\n\treturn {\n\t\t...r,\n\t\tbrandName: r.brand?.name || \"Unknown Brand\",\n\t\tguestName: snapshot\n\t\t\t? `${snapshot.firstName || \"\"} ${snapshot.lastName || \"\"}`.trim() || \"Unknown Guest\"\n\t\t\t: \"Unknown Guest\",\n\t\tguestEmail: snapshot?.email || \"\",\n\t\tguestPhone: snapshot?.phone || \"\",\n\t};\n}\n\n/**\n * Selection set for reservation queries\n */\nconst RESERVATION_SELECTION_SET = [\n\t\"id\",\n\t\"brandId\",\n\t\"visitId\",\n\t\"checkIn\",\n\t\"checkOut\",\n\t\"room\",\n\t\"roomType\",\n\t\"status\",\n\t\"source\",\n\t\"channel\",\n\t\"confirmationCode\",\n\t\"totalAmount\",\n\t\"currency\",\n\t\"nights\",\n\t\"deletedAt\",\n\t\"deletedBy\",\n\t\"brand.name\",\n\t\"visit.snapshot\",\n];\n\n/**\n * Internal hook for active reservations\n */\nconst useActiveReservationsInternal = createPaginatedDataHook<\n\tReservationWithRelations,\n\tUsePaginatedReservationsOptions\n>({\n\tmodel: \"Reservation\",\n\tdataPropertyName: \"reservations\",\n\tdefaultPageSize: 25,\n\tselectionSet: RESERVATION_SELECTION_SET,\n\ttransform: transformReservation,\n\tbuildFilter,\n\tbaseFilter: ACTIVE_FILTER,\n});\n\n/**\n * Internal hook for deleted reservations\n */\nconst useDeletedReservationsInternal = createPaginatedDataHook<\n\tReservationWithRelations,\n\tUsePaginatedReservationsOptions\n>({\n\tmodel: \"Reservation\",\n\tdataPropertyName: \"reservations\",\n\tdefaultPageSize: 25,\n\tselectionSet: RESERVATION_SELECTION_SET,\n\ttransform: transformReservation,\n\tbuildFilter,\n\tbaseFilter: DELETED_FILTER,\n});\n\n/**\n * Composable for fetching active (non-deleted) reservations with pagination\n *\n * @example\n * ```typescript\n * import { useActiveReservations } from '@htlkg/data/hooks';\n *\n * const { reservations, loading, hasMore, loadMore, refetch } = useActiveReservations({\n * pageSize: 25,\n * brandId: 'brand-123',\n * });\n *\n * // Load more when user scrolls or clicks \"Load More\"\n * async function onLoadMore() {\n * await loadMore();\n * }\n * ```\n *\n * @example With date filters\n * ```typescript\n * const { reservations, loading } = useActiveReservations({\n * brandId: 'brand-123',\n * startDate: '2026-01-01',\n * endDate: '2026-01-31',\n * status: 'confirmed'\n * });\n * ```\n */\nexport function useActiveReservations(\n\toptions: UsePaginatedReservationsOptions = {},\n): UsePaginatedReservationsReturn {\n\tconst result = useActiveReservationsInternal(options);\n\treturn {\n\t\treservations: result.reservations as Ref<ReservationWithRelations[]>,\n\t\tloading: result.loading,\n\t\tinitialLoading: result.initialLoading,\n\t\tloadingMore: result.loadingMore,\n\t\terror: result.error,\n\t\tpagination: result.pagination,\n\t\thasMore: result.hasMore,\n\t\tloadMore: result.loadMore,\n\t\trefetch: result.refetch,\n\t\treset: result.reset,\n\t\tsetSearchFilter: result.setSearchFilter,\n\t\tsearchFilter: result.searchFilter,\n\t};\n}\n\n/**\n * Composable for fetching deleted reservations with pagination\n *\n * @example\n * ```typescript\n * import { useDeletedReservations } from '@htlkg/data/hooks';\n *\n * const { reservations, loading, hasMore, loadMore, refetch } = useDeletedReservations({\n * pageSize: 25,\n * });\n * ```\n */\nexport function useDeletedReservations(\n\toptions: UsePaginatedReservationsOptions = {},\n): UsePaginatedReservationsReturn {\n\tconst result = useDeletedReservationsInternal(options);\n\treturn {\n\t\treservations: result.reservations as Ref<ReservationWithRelations[]>,\n\t\tloading: result.loading,\n\t\tinitialLoading: result.initialLoading,\n\t\tloadingMore: result.loadingMore,\n\t\terror: result.error,\n\t\tpagination: result.pagination,\n\t\thasMore: result.hasMore,\n\t\tloadMore: result.loadMore,\n\t\trefetch: result.refetch,\n\t\treset: result.reset,\n\t\tsetSearchFilter: result.setSearchFilter,\n\t\tsearchFilter: result.searchFilter,\n\t};\n}\n","/**\n * Product Hooks\n *\n * Vue composables for fetching and managing product data with reactive state.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Product } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"../createDataHook\";\n\nexport interface UseProductsOptions extends BaseHookOptions {\n\t/** Filter criteria for products */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n\t/** Only active products */\n\tactiveOnly?: boolean;\n}\n\nexport interface UseProductsReturn {\n\t/** Reactive array of products */\n\tproducts: Ref<Product[]>;\n\t/** Computed array of active products only */\n\tactiveProducts: ComputedRef<Product[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch products */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseProductsOptions): any {\n\tlet filter: any = options.filter || {};\n\n\tif (options.activeOnly) {\n\t\tfilter = { ...filter, isActive: { eq: true } };\n\t}\n\n\treturn Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useProductsInternal = createDataHook<Product, UseProductsOptions, { activeProducts: Product[] }>({\n\tmodel: \"Product\",\n\tdataPropertyName: \"products\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tactiveProducts: (products) => products.filter((p) => p.isActive === true),\n\t},\n});\n\n/**\n * Composable for fetching and managing products\n *\n * @example\n * ```typescript\n * import { useProducts } from '@htlkg/data/hooks/products';\n *\n * const { products, loading, error, refetch } = useProducts();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { products, loading } = useProducts({\n * activeOnly: true,\n * limit: 50\n * });\n * ```\n */\nexport function useProducts(options: UseProductsOptions = {}): UseProductsReturn {\n\tconst result = useProductsInternal(options);\n\treturn {\n\t\tproducts: result.products as Ref<Product[]>,\n\t\tactiveProducts: result.activeProducts as ComputedRef<Product[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n","/**\n * GraphQL Client for @htlkg/data\n *\n * Provides both client-side and server-side GraphQL capabilities using AWS Amplify Data.\n * The server-side functions use the Amplify Astro adapter for proper SSR support.\n *\n * For server-side usage, use `Astro.locals.amplifyClient` (zero-config, injected by middleware).\n */\n\nimport { generateClient as generateDataClient } from \"aws-amplify/data\";\nimport { Amplify } from \"aws-amplify\";\nimport type { ResourcesConfig } from \"aws-amplify\";\nimport { generateServerClientUsingCookies } from \"./server\";\n\n// Re-export server-side client generation (used internally by middleware)\nexport { generateServerClientUsingCookies } from \"./server\";\n\n// Re-export proxy functions for authenticated client-side operations\nexport {\n\tmutate,\n\tquery,\n\thasErrors,\n\tgetErrorMessage,\n\ttype Operation,\n\ttype GraphQLResponse,\n\ttype ProxyOptions,\n} from \"./proxy\";\n\n// Re-export type-safe client-side Reservation operations\nexport {\n\tcreateReservation,\n\tupdateReservation,\n\tsoftDeleteReservation,\n\trestoreReservation,\n\tdeleteReservation,\n\tgetReservation,\n\tlistReservations,\n\tupdateReservationStatus,\n\tbulkSoftDeleteReservations,\n\tbulkRestoreReservations,\n\tbulkDeleteReservations,\n\tbulkUpdateReservationStatus,\n\ttype Reservation,\n\ttype ReservationStatus,\n} from \"./reservations\";\n\n/**\n * Type for the server-side Amplify client (for use in type declarations)\n * This represents the client returned by generateServerClientUsingCookies\n */\nexport type AmplifyServerClient<TSchema extends Record<string, unknown> = Record<string, unknown>> =\n\tReturnType<typeof generateServerClientUsingCookies<TSchema>>;\n\n// Singleton client instance for client-side fetching\nlet sharedClientInstance: any = null;\n\n/**\n * Get or create the shared GraphQL client instance (singleton pattern)\n * Use this for client-side fetching to avoid creating multiple client instances.\n *\n * @example\n * ```typescript\n * const client = getSharedClient<Schema>();\n * const { data } = await client.models.Account.list();\n * ```\n */\nexport function getSharedClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(): ReturnType<typeof generateDataClient<TSchema>> {\n\tif (!sharedClientInstance) {\n\t\tsharedClientInstance = generateDataClient<TSchema>();\n\t}\n\treturn sharedClientInstance;\n}\n\n/**\n * Reset the shared client instance (useful for testing or auth state changes)\n */\nexport function resetSharedClient(): void {\n\tsharedClientInstance = null;\n}\n\n/**\n * Generate a client-side GraphQL client for use in Vue components and browser contexts\n * This is SSR-safe and should be called within a component's setup function or after hydration\n *\n * @example\n * ```typescript\n * import type { Schema } from '@backend/data/resource';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const { data: brands } = await client.models.Brand.list();\n * ```\n */\nexport function generateClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(): ReturnType<typeof generateDataClient<TSchema>> {\n\treturn generateDataClient<TSchema>();\n}\n\n/**\n * Configuration for Amplify (matches amplify_outputs.json format)\n */\nexport type AstroAmplifyConfig = ResourcesConfig;\n\n/**\n * Authentication mode for server-side GraphQL client\n */\nexport type ServerAuthMode = 'userPool' | 'apiKey';\n\n/**\n * Options for generating a server-side GraphQL client\n */\nexport interface GenerateServerClientOptions {\n\t/** Authentication mode - 'userPool' (default) uses JWT from cookies, 'apiKey' uses API key */\n\tauthMode?: ServerAuthMode;\n}\n\n/**\n * Generate a server-side GraphQL client for use within runWithAmplifyServerContext\n * \n * This function creates a GraphQL client that can be used for server-side data fetching in Astro.\n * It MUST be called within runWithAmplifyServerContext to access JWT tokens from cookies.\n * \n * The client supports two authentication modes:\n * - 'userPool' (default): Uses JWT tokens from cookies (requires runWithAmplifyServerContext)\n * - 'apiKey': Uses API key for public/unauthenticated requests\n *\n * **Important**: \n * - Amplify.configure() must be called once at app startup (e.g., in amplify-server.ts)\n * - This function must be called INSIDE the operation function of runWithAmplifyServerContext\n * - The context automatically provides the token provider that reads JWT tokens from cookies\n *\n * @example\n * ```typescript\n * // In your Astro page\n * import type { Schema } from '../amplify/data/resource';\n * import { generateServerClient } from '@htlkg/data/client';\n * import { createRunWithAmplifyServerContext } from '@htlkg/core/amplify-astro-adapter';\n * import outputs from '../amplify_outputs.json';\n *\n * const runWithAmplifyServerContext = createRunWithAmplifyServerContext({ config: outputs });\n *\n * // Fetch data with authentication\n * const result = await runWithAmplifyServerContext({\n * astroServerContext: {\n * cookies: Astro.cookies,\n * request: Astro.request\n * },\n * operation: async (contextSpec) => {\n * // Generate client INSIDE the operation\n * const client = generateServerClient<Schema>({ authMode: 'userPool' });\n * return await client.models.User.list();\n * }\n * });\n * \n * const users = result.data || [];\n * ```\n * \n * @example Using API key for public data\n * ```typescript\n * const result = await runWithAmplifyServerContext({\n * astroServerContext: {\n * cookies: Astro.cookies,\n * request: Astro.request\n * },\n * operation: async (contextSpec) => {\n * const client = generateServerClient<Schema>({ authMode: 'apiKey' });\n * return await client.models.Brand.list();\n * }\n * });\n * ```\n */\nexport function generateServerClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(_options?: GenerateServerClientOptions): ReturnType<typeof generateDataClient<TSchema>> {\n\t// Generate the client without authMode parameter\n\t// When called within runWithAmplifyServerContext, it will automatically use the token provider\n\t// from the context (which reads JWT tokens from cookies)\n\t// The authMode should be specified per-operation, not at client creation\n\tconst client = generateDataClient<TSchema>();\n\n\treturn client;\n}\n\n/**\n * Context required for getting a server client in API routes\n */\nexport interface ServerClientContext {\n\tlocals: { amplifyClient?: any; user?: any };\n\tcookies: any;\n\trequest: Request;\n}\n\n/**\n * Get the server client from Astro context\n *\n * Uses locals.amplifyClient if available (set by middleware),\n * otherwise creates a new client using Amplify's global config.\n * No config parameter needed - uses the config set by the middleware.\n *\n * @example\n * ```typescript\n * import { getServerClient } from '@htlkg/data/client';\n *\n * export const POST: APIRoute = async (context) => {\n * const client = getServerClient(context);\n * if (!client) return new Response('Not authenticated', { status: 401 });\n *\n * const result = await client.models.User.list();\n * };\n * ```\n */\nexport function getServerClient<TSchema extends Record<string, unknown> = Record<string, unknown>>(\n\tcontext: ServerClientContext,\n): ReturnType<typeof generateServerClientUsingCookies<TSchema>> | null {\n\t// Try to use client from middleware first\n\tif (context.locals.amplifyClient) {\n\t\treturn context.locals.amplifyClient as ReturnType<typeof generateServerClientUsingCookies<TSchema>>;\n\t}\n\n\t// If no client from middleware and user is authenticated, create one using global Amplify config\n\tif (context.locals.user) {\n\t\ttry {\n\t\t\t// Get config from Amplify (set by middleware)\n\t\t\tconst amplifyConfig = Amplify.getConfig();\n\t\t\tif (amplifyConfig) {\n\t\t\t\treturn generateServerClientUsingCookies<TSchema>({\n\t\t\t\t\tconfig: amplifyConfig,\n\t\t\t\t\tcookies: context.cookies,\n\t\t\t\t\trequest: context.request,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('[getServerClient] Failed to get Amplify config:', e);\n\t\t}\n\t}\n\n\t// No authentication available\n\treturn null;\n}\n","/**\n * Server-side data client for Astro\n *\n * Provides a client generator similar to Next.js's generateServerClientUsingCookies\n * using generateClientWithAmplifyInstance for proper server context integration.\n */\n\nimport type { AstroGlobal } from \"astro\";\nimport type { ResourcesConfig } from \"aws-amplify\";\nimport {\n\tCommonPublicClientOptions,\n\tDefaultCommonClientOptions,\n\tV6ClientSSRCookies,\n\tgenerateClientWithAmplifyInstance,\n} from \"aws-amplify/api/internals\";\nimport { getAmplifyServerContext } from \"aws-amplify/adapter-core/internals\";\nimport { createRunWithAmplifyServerContext, createLogger } from \"@htlkg/core/amplify-astro-adapter\";\n\nconst log = createLogger('server-client');\n\ninterface AstroCookiesClientParams {\n\tcookies: AstroGlobal[\"cookies\"];\n\trequest: AstroGlobal[\"request\"];\n\tconfig: ResourcesConfig;\n}\n\n/**\n * Generates a server-side data client for Astro (matches Next.js implementation)\n *\n * This function creates a client that automatically wraps all operations in the Amplify server context,\n * ensuring that authentication tokens from cookies are properly used.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { generateServerClientUsingCookies } from '@htlkg/data/client';\n * import { parseAmplifyConfig } from 'aws-amplify/utils';\n * import outputs from '../amplify_outputs.json';\n *\n * const amplifyConfig = parseAmplifyConfig(outputs);\n *\n * const client = generateServerClientUsingCookies<Schema>({\n * config: amplifyConfig,\n * cookies: Astro.cookies,\n * request: Astro.request,\n * });\n *\n * // Use the client directly - operations are automatically wrapped\n * const result = await client.models.User.list({\n * selectionSet: ['id', 'email'],\n * limit: 100,\n * });\n * ```\n */\nexport function generateServerClientUsingCookies<\n\tT extends Record<any, any> = never,\n\tOptions extends CommonPublicClientOptions &\n\t\tAstroCookiesClientParams = DefaultCommonClientOptions &\n\t\tAstroCookiesClientParams,\n>(options: Options): V6ClientSSRCookies<T, Options> {\n\tconst runWithAmplifyServerContext = createRunWithAmplifyServerContext({\n\t\tconfig: options.config,\n\t});\n\n\tconst resourcesConfig = options.config;\n\n\t// This function reference gets passed down to InternalGraphQLAPI.ts.graphql\n\t// where this._graphql is passed in as the `fn` argument\n\t// causing it to always get invoked inside `runWithAmplifyServerContext`\n\tconst getAmplify = (fn: (amplify: any) => Promise<any>) => {\n\t\treturn runWithAmplifyServerContext({\n\t\t\tastroServerContext: {\n\t\t\t\tcookies: options.cookies,\n\t\t\t\trequest: options.request,\n\t\t\t},\n\t\t\toperation: async (contextSpec: any) => {\n\t\t\t\tconst amplifyInstance = getAmplifyServerContext(contextSpec).amplify;\n\t\t\t\t\n\t\t\t\t// Debug logging (only when DEBUG=true)\n\t\t\t\ttry {\n\t\t\t\t\tconst config = amplifyInstance.getConfig();\n\t\t\t\t\tlog.debug('Amplify config from instance:', {\n\t\t\t\t\t\thasAPI: !!config.API,\n\t\t\t\t\t\thasGraphQL: !!config.API?.GraphQL,\n\t\t\t\t\t\tendpoint: config.API?.GraphQL?.endpoint,\n\t\t\t\t\t\tdefaultAuthMode: config.API?.GraphQL?.defaultAuthMode,\n\t\t\t\t\t\tregion: config.API?.GraphQL?.region,\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tconst session = await amplifyInstance.Auth.fetchAuthSession();\n\t\t\t\t\tlog.debug('Auth session:', {\n\t\t\t\t\t\thasTokens: !!session.tokens,\n\t\t\t\t\t\thasAccessToken: !!session.tokens?.accessToken,\n\t\t\t\t\t\thasIdToken: !!session.tokens?.idToken,\n\t\t\t\t\t\thasCredentials: !!session.credentials,\n\t\t\t\t\t});\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\tlog.debug('Error fetching session:', e.message);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn fn(amplifyInstance);\n\t\t\t},\n\t\t});\n\t};\n\n\tconst {\n\t\tcookies: _cookies,\n\t\trequest: _request,\n\t\tconfig: _config,\n\t\t...params\n\t} = options;\n\n\treturn generateClientWithAmplifyInstance<T, V6ClientSSRCookies<T, Options>>({\n\t\tamplify: getAmplify,\n\t\tconfig: resourcesConfig,\n\t\t...params,\n\t} as any);\n}\n","/**\n * ProductInstance Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting product instances.\n * Product instances represent enabled products for a specific brand with their configuration.\n */\n\nimport type { ProductInstance } from \"@htlkg/core/types\";\nimport { getClientUser } from \"@htlkg/core/auth\";\nimport { getCurrentTimestamp } from \"@htlkg/core/utils\";\nimport { AppError } from \"@htlkg/core/errors\";\nimport type { CreateAuditFields, UpdateAuditFields } from \"../common\";\n\n/**\n * Get current user identifier for audit trails\n * Uses getClientUser() and returns email or username, falling back to \"system\"\n */\nasync function getUserIdentifier(fallback = \"system\"): Promise<string> {\n\ttry {\n\t\tconst user = await getClientUser();\n\t\tif (user) {\n\t\t\treturn user.email || user.username || fallback;\n\t\t}\n\t\treturn fallback;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\n/**\n * Input type for creating a product instance\n */\nexport interface CreateProductInstanceInput extends CreateAuditFields {\n\tproductId: string;\n\tbrandId: string;\n\taccountId: string;\n\tproductName: string;\n\tenabled: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n}\n\n/**\n * Input type for updating a product instance\n */\nexport interface UpdateProductInstanceInput extends UpdateAuditFields {\n\tid: string;\n\tenabled?: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n}\n\n/**\n * Create a new product instance\n *\n * @example\n * ```typescript\n * import { createProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await createProductInstance(client, {\n * productId: 'product-123',\n * brandId: 'brand-456',\n * accountId: 'account-789',\n * enabled: true,\n * config: { apiKey: 'xxx', maxRequests: 100 }\n * });\n * ```\n */\nexport async function createProductInstance<TClient = any>(\n\tclient: TClient,\n\tinput: CreateProductInstanceInput,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\t// Get user identifier for audit trail\n\t\tconst userIdentifier = input.createdBy || input.updatedBy || await getUserIdentifier();\n\n\t\t// Build input - manually construct to avoid Vue Proxy issues\n\t\tconst timestamp = input.createdAt || getCurrentTimestamp();\n\t\tconst createInput: any = {\n\t\t\tproductId: input.productId,\n\t\t\tproductName: input.productName,\n\t\t\tbrandId: input.brandId,\n\t\t\taccountId: input.accountId,\n\t\t\tenabled: input.enabled,\n\t\t\tversion: input.version,\n\t\t\tcreatedAt: timestamp,\n\t\t\tcreatedBy: userIdentifier,\n\t\t\tupdatedAt: input.updatedAt || timestamp,\n\t\t\tupdatedBy: userIdentifier,\n\t\t};\n\n\t\t// AWSJSON type requires JSON STRING\n\t\tif (input.config) {\n\t\t\t// Double stringify: first to strip Vue Proxy, second to create JSON string\n\t\t\tcreateInput.config = JSON.stringify(JSON.parse(JSON.stringify(input.config)));\n\t\t}\n\n\t\tconsole.log(\"[createProductInstance] Config as string:\", createInput.config);\n\t\tconsole.log(\"[createProductInstance] Config type:\", typeof createInput.config);\n\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.create(createInput);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to create product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_CREATE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[createProductInstance] Error creating product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to create product instance\",\n\t\t\t\"PRODUCT_INSTANCE_CREATE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Update an existing product instance\n *\n * @example\n * ```typescript\n * import { updateProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await updateProductInstance(client, {\n * id: 'instance-123',\n * enabled: false,\n * config: { apiKey: 'new-key', maxRequests: 200 }\n * });\n * ```\n */\nexport async function updateProductInstance<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateProductInstanceInput,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\t// Add timestamp and user metadata if not provided\n\t\t// Convert config from Vue Proxy to plain object\n\t\tconst updateInput: any = {\n\t\t\t...input,\n\t\t\tupdatedAt: input.updatedAt || getCurrentTimestamp(),\n\t\t\tupdatedBy: input.updatedBy || await getUserIdentifier(),\n\t\t};\n\n\t\t// AWSJSON type requires JSON STRING\n\t\tif (input.config) {\n\t\t\tupdateInput.config = JSON.stringify(JSON.parse(JSON.stringify(input.config)));\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.update(updateInput);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to update product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_UPDATE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[updateProductInstance] Error updating product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to update product instance\",\n\t\t\t\"PRODUCT_INSTANCE_UPDATE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Delete a product instance\n *\n * @example\n * ```typescript\n * import { deleteProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteProductInstance(client, 'instance-123');\n * ```\n */\nexport async function deleteProductInstance<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.ProductInstance.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to delete product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_DELETE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteProductInstance] Error deleting product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to delete product instance\",\n\t\t\t\"PRODUCT_INSTANCE_DELETE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Toggle the enabled status of a product instance\n *\n * @example\n * ```typescript\n * import { toggleProductInstanceEnabled } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await toggleProductInstanceEnabled(client, 'instance-123', true);\n * ```\n */\nexport async function toggleProductInstanceEnabled<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tenabled: boolean,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.update({\n\t\t\tid,\n\t\t\tenabled,\n\t\t\tlastUpdated: getCurrentTimestamp(),\n\t\t\tupdatedBy: await getUserIdentifier(),\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[toggleProductInstanceEnabled] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to toggle product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_TOGGLE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[toggleProductInstanceEnabled] Error toggling product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to toggle product instance\",\n\t\t\t\"PRODUCT_INSTANCE_TOGGLE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n","/**\n * ProductInstance Hooks\n *\n * Vue composables for fetching and managing product instance data with reactive state.\n * Provides loading states, error handling, refetch capabilities, and CRUD operations.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { ProductInstance } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"../createDataHook\";\nimport { getSharedClient } from \"../../client\";\nimport {\n\tcreateProductInstance,\n\tupdateProductInstance,\n\tdeleteProductInstance,\n\ttoggleProductInstanceEnabled,\n\ttype CreateProductInstanceInput,\n\ttype UpdateProductInstanceInput,\n} from \"../../mutations/productInstances\";\n\nexport interface UseProductInstancesOptions extends BaseHookOptions {\n\t/** Filter criteria for product instances */\n\tfilter?: any;\n\t/** Limit number of results */\n\tlimit?: number;\n\t/** Auto-fetch on mount (default: true) */\n\tautoFetch?: boolean;\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Filter by account ID */\n\taccountId?: string;\n\t/** Filter by product ID */\n\tproductId?: string;\n\t/** Only enabled instances */\n\tenabledOnly?: boolean;\n}\n\nexport interface UseProductInstancesReturn {\n\t/** Reactive array of product instances */\n\tinstances: Ref<ProductInstance[]>;\n\t/** Computed array of enabled instances only */\n\tenabledInstances: ComputedRef<ProductInstance[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch product instances */\n\trefetch: () => Promise<void>;\n\t/** Create a new product instance */\n\tcreateInstance: (input: CreateProductInstanceInput) => Promise<ProductInstance>;\n\t/** Update an existing product instance */\n\tupdateInstance: (input: UpdateProductInstanceInput) => Promise<ProductInstance>;\n\t/** Delete a product instance */\n\tdeleteInstance: (id: string) => Promise<boolean>;\n\t/** Toggle the enabled status of a product instance */\n\ttoggleEnabled: (id: string, enabled: boolean) => Promise<ProductInstance>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseProductInstancesOptions): any {\n\tlet filter: any = options.filter || {};\n\n\tif (options.brandId) {\n\t\tfilter = { ...filter, brandId: { eq: options.brandId } };\n\t}\n\n\tif (options.accountId) {\n\t\tfilter = { ...filter, accountId: { eq: options.accountId } };\n\t}\n\n\tif (options.productId) {\n\t\tfilter = { ...filter, productId: { eq: options.productId } };\n\t}\n\n\tif (options.enabledOnly) {\n\t\tfilter = { ...filter, enabled: { eq: true } };\n\t}\n\n\treturn Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Internal hook created by factory\n */\nconst useProductInstancesInternal = createDataHook<\n\tProductInstance,\n\tUseProductInstancesOptions,\n\t{ enabledInstances: ProductInstance[] }\n>({\n\tmodel: \"ProductInstance\",\n\tdataPropertyName: \"instances\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tenabledInstances: (instances) => instances.filter((i) => i.enabled),\n\t},\n});\n\n/**\n * Composable for fetching and managing product instances\n *\n * @example\n * ```typescript\n * import { useProductInstances } from '@htlkg/data/hooks/productInstances';\n *\n * const { instances, loading, error, refetch } = useProductInstances();\n * ```\n *\n * @example With filters\n * ```typescript\n * const { instances, enabledInstances, loading } = useProductInstances({\n * brandId: 'brand-123',\n * enabledOnly: true,\n * limit: 50\n * });\n * ```\n *\n * @example For a specific account\n * ```typescript\n * const { instances, loading } = useProductInstances({\n * accountId: 'account-456',\n * autoFetch: true\n * });\n * ```\n */\nexport function useProductInstances(options: UseProductInstancesOptions = {}): UseProductInstancesReturn {\n\tconst result = useProductInstancesInternal(options);\n\n\t// CRUD methods using mutations from @htlkg/data/mutations\n\tasync function createInstance(input: CreateProductInstanceInput): Promise<ProductInstance> {\n\t\tconst client = getSharedClient();\n\t\tconst instance = await createProductInstance(client, input);\n\t\tif (!instance) {\n\t\t\tthrow new Error(\"Failed to create product instance\");\n\t\t}\n\t\treturn instance;\n\t}\n\n\tasync function updateInstance(input: UpdateProductInstanceInput): Promise<ProductInstance> {\n\t\tconst client = getSharedClient();\n\t\tconst instance = await updateProductInstance(client, input);\n\t\tif (!instance) {\n\t\t\tthrow new Error(\"Failed to update product instance\");\n\t\t}\n\t\treturn instance;\n\t}\n\n\tasync function deleteInstance(id: string): Promise<boolean> {\n\t\tconst client = getSharedClient();\n\t\treturn deleteProductInstance(client, id);\n\t}\n\n\tasync function toggleEnabled(id: string, enabled: boolean): Promise<ProductInstance> {\n\t\tconst client = getSharedClient();\n\t\tconst instance = await toggleProductInstanceEnabled(client, id, enabled);\n\t\tif (!instance) {\n\t\t\tthrow new Error(\"Failed to toggle product instance\");\n\t\t}\n\t\treturn instance;\n\t}\n\n\treturn {\n\t\tinstances: result.instances as Ref<ProductInstance[]>,\n\t\tenabledInstances: result.enabledInstances as ComputedRef<ProductInstance[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t\tcreateInstance,\n\t\tupdateInstance,\n\t\tdeleteInstance,\n\t\ttoggleEnabled,\n\t};\n}\n\n// Re-export types for convenience\nexport type { CreateProductInstanceInput, UpdateProductInstanceInput };\n","/**\n * useContacts Hook\n *\n * Vue composable for fetching and managing contact data with reactive state.\n * Provides loading states, error handling, search, pagination, and refetch capabilities.\n */\n\nimport type { Ref, ComputedRef } from \"vue\";\nimport type { Contact } from \"@htlkg/core/types\";\nimport { createDataHook, type BaseHookOptions } from \"./createDataHook\";\n\nexport interface UseContactsOptions extends BaseHookOptions {\n\t/** Filter by brand ID */\n\tbrandId?: string;\n\t/** Search query (searches email, firstName, lastName) */\n\tsearch?: string;\n\t/** Filter by GDPR consent */\n\tgdprConsent?: boolean;\n\t/** Filter by marketing opt-in */\n\tmarketingOptIn?: boolean;\n\t/** Filter by tags (contact must have at least one of these tags) */\n\ttags?: string[];\n\t/** Pagination token for fetching next page */\n\tnextToken?: string;\n}\n\nexport interface UseContactsReturn {\n\t/** Reactive array of contacts */\n\tcontacts: Ref<Contact[]>;\n\t/** Computed array of contacts with GDPR consent */\n\tconsentedContacts: ComputedRef<Contact[]>;\n\t/** Computed array of contacts opted-in for marketing */\n\tmarketingContacts: ComputedRef<Contact[]>;\n\t/** Loading state */\n\tloading: Ref<boolean>;\n\t/** Error state */\n\terror: Ref<Error | null>;\n\t/** Refetch contacts */\n\trefetch: () => Promise<void>;\n}\n\n/**\n * Build filter from hook options\n */\nfunction buildFilter(options: UseContactsOptions): any {\n\tconst conditions: any[] = [];\n\n\t// Filter by brand\n\tif (options.brandId) {\n\t\tconditions.push({ brandId: { eq: options.brandId } });\n\t}\n\n\t// Search across email, firstName, lastName\n\tif (options.search) {\n\t\tconditions.push({\n\t\t\tor: [\n\t\t\t\t{ email: { contains: options.search } },\n\t\t\t\t{ firstName: { contains: options.search } },\n\t\t\t\t{ lastName: { contains: options.search } },\n\t\t\t],\n\t\t});\n\t}\n\n\t// Filter by GDPR consent\n\tif (options.gdprConsent !== undefined) {\n\t\tconditions.push({ gdprConsent: { eq: options.gdprConsent } });\n\t}\n\n\t// Filter by marketing opt-in\n\tif (options.marketingOptIn !== undefined) {\n\t\tconditions.push({ marketingOptIn: { eq: options.marketingOptIn } });\n\t}\n\n\t// Filter by tags (contact must have at least one of these tags)\n\tif (options.tags && options.tags.length > 0) {\n\t\tconst tagConditions = options.tags.map((tag) => ({\n\t\t\ttags: { contains: tag },\n\t\t}));\n\t\tconditions.push({ or: tagConditions });\n\t}\n\n\t// Include any additional custom filter\n\tif (options.filter) {\n\t\tconditions.push(options.filter);\n\t}\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn conditions[0];\n\t}\n\n\treturn { and: conditions };\n}\n\n/**\n * Internal hook created by factory\n */\nconst useContactsInternal = createDataHook<\n\tContact,\n\tUseContactsOptions,\n\t{ consentedContacts: Contact[]; marketingContacts: Contact[] }\n>({\n\tmodel: \"Contact\",\n\tdataPropertyName: \"contacts\",\n\tbuildFilter,\n\tcomputedProperties: {\n\t\tconsentedContacts: (contacts) =>\n\t\t\tcontacts.filter((c) => c.gdprConsent === true),\n\t\tmarketingContacts: (contacts) =>\n\t\t\tcontacts.filter((c) => c.marketingOptIn === true),\n\t},\n});\n\n/**\n * Composable for fetching and managing contacts\n *\n * @example\n * ```typescript\n * import { useContacts } from '@htlkg/data/hooks';\n *\n * const { contacts, loading, error, refetch } = useContacts({\n * brandId: 'brand-123',\n * limit: 25\n * });\n * ```\n *\n * @example With search\n * ```typescript\n * const { contacts, loading } = useContacts({\n * brandId: 'brand-123',\n * search: 'john',\n * limit: 25\n * });\n * ```\n *\n * @example With GDPR and marketing filters\n * ```typescript\n * const { contacts, marketingContacts } = useContacts({\n * brandId: 'brand-123',\n * gdprConsent: true,\n * marketingOptIn: true\n * });\n * ```\n *\n * @example With computed properties\n * ```typescript\n * const { contacts, consentedContacts, marketingContacts } = useContacts({\n * brandId: 'brand-123'\n * });\n *\n * // consentedContacts - contacts with GDPR consent\n * // marketingContacts - contacts opted-in for marketing\n * ```\n *\n * @example With tag filtering\n * ```typescript\n * const { contacts } = useContacts({\n * brandId: 'brand-123',\n * tags: ['vip', 'returning']\n * });\n * ```\n */\nexport function useContacts(options: UseContactsOptions = {}): UseContactsReturn {\n\tconst result = useContactsInternal(options);\n\treturn {\n\t\tcontacts: result.contacts as Ref<Contact[]>,\n\t\tconsentedContacts: result.consentedContacts as ComputedRef<Contact[]>,\n\t\tmarketingContacts: result.marketingContacts as ComputedRef<Contact[]>,\n\t\tloading: result.loading,\n\t\terror: result.error,\n\t\trefetch: result.refetch,\n\t};\n}\n"],"mappings":"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","names":["buildFilter","fetch","ref","computed","onMounted","buildFilter","ref","computed","onMounted","buildFilter","buildFilter","buildFilter","transformAccount","buildFilter","buildFilter","transformReservation","buildFilter","buildFilter","buildFilter"]}
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { C as CreateAuditFields, S as SoftDeleteFields, U as UpdateAuditFields,
5
5
  export { ContactValidationError, CreateAccountInput, CreateBrandInput, CreateContactInput, CreateUserInput, MergeContactsInput, MergeContactsResult, UpdateAccountInput, UpdateBrandInput, UpdateContactInput, UpdateSystemSettingsInput, UpdateUserInput, createAccount, createBrand, createContact, createContactSchema, createUser, deleteAccount, deleteBrand, deleteContact, deleteUser, initializeSystemSettings, mergeContacts, mergeContactsSchema, restoreAccount, restoreBrand, restoreContact, restoreUser, softDeleteAccount, softDeleteBrand, softDeleteContact, softDeleteUser, updateAccount, updateBrand, updateContact, updateContactSchema, updateSystemSettings, updateUser } from './mutations/index.js';
6
6
  export { C as CreateProductInstanceInput, U as UpdateProductInstanceInput, c as createProductInstance, d as deleteProductInstance, t as toggleProductInstanceEnabled, u as updateProductInstance } from './productInstances-BpQv1oLS.js';
7
7
  export { C as CreateReservationInput, b as ReservationStatus, R as ReservationValidationError, U as UpdateReservationInput, c as createReservation, d as deleteReservation, r as restoreReservation, s as softDeleteReservation, u as updateReservation, a as updateReservationStatus } from './reservations-CdDfkcZ_.js';
8
- export { BaseHookOptions, CreateDataHookOptions, DataHookReturn, InferHookReturn, UseAccountsOptions, UseAccountsReturn, UseBrandsOptions, UseBrandsReturn, UseContactsOptions, UseContactsReturn, UseProductInstancesOptions, UseProductInstancesReturn, UseProductsOptions, UseProductsReturn, UseReservationsOptions, UseReservationsReturn, UseUsersOptions, UseUsersReturn, createDataHook, resetClientInstance, useAccounts, useBrands, useContacts, useProductInstances, useProducts, useReservations, useUsers } from './hooks/index.js';
8
+ export { ACTIVE_FILTER, AccountWithBrands, BaseHookOptions, BrandWithCounts, CreateDataHookOptions, CreatePaginatedDataHookOptions, DELETED_FILTER, DataHookReturn, InferHookReturn, InferPaginatedHookReturn, AccountWithBrands as PaginatedAccountWithBrands, PaginatedDataHookReturn, PaginatedHookOptions, PaginationState, ReservationWithRelations, UseAccountsOptions, UseAccountsReturn, UseBrandsOptions, UseBrandsReturn, UseContactsOptions, UseContactsReturn, UsePaginatedAccountsOptions, UsePaginatedAccountsReturn, UsePaginatedBrandsOptions, UsePaginatedBrandsReturn, UsePaginatedReservationsOptions, UsePaginatedReservationsReturn, UsePaginatedUsersOptions, UsePaginatedUsersReturn, UseProductInstancesOptions, UseProductInstancesReturn, UseProductsOptions, UseProductsReturn, UseReservationsOptions, UseReservationsReturn, UseUsersOptions, UseUsersReturn, UserWithRelations, createDataHook, createPaginatedDataHook, resetClientInstance, useAccounts, useActiveAccounts, useActiveBrands, useActiveReservations, useActiveUsers, useBrands, useContacts, useDeletedAccounts, useDeletedBrands, useDeletedReservations, useDeletedUsers, useProductInstances, useProducts, useReservations, useUsers } from './hooks/index.js';
9
9
  export { InferStoreType, ResourceStores, StoreConfig, createResourceStores, createSingleStore, createStore } from './stores/index.js';
10
10
  import 'aws-amplify/data';
11
11
  import 'aws-amplify';