@htlkg/data 0.0.14 → 0.0.16

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 (37) hide show
  1. package/README.md +72 -0
  2. package/dist/client/index.d.ts +123 -30
  3. package/dist/client/index.js +75 -1
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/hooks/index.d.ts +76 -2
  6. package/dist/hooks/index.js +224 -6
  7. package/dist/hooks/index.js.map +1 -1
  8. package/dist/index.d.ts +6 -4
  9. package/dist/index.js +550 -7
  10. package/dist/index.js.map +1 -1
  11. package/dist/mutations/index.d.ts +149 -5
  12. package/dist/mutations/index.js +397 -0
  13. package/dist/mutations/index.js.map +1 -1
  14. package/dist/productInstances-CzT3NZKU.d.ts +98 -0
  15. package/dist/queries/index.d.ts +54 -2
  16. package/dist/queries/index.js +60 -1
  17. package/dist/queries/index.js.map +1 -1
  18. package/dist/server/index.d.ts +47 -0
  19. package/dist/server/index.js +59 -0
  20. package/dist/server/index.js.map +1 -0
  21. package/package.json +5 -1
  22. package/src/client/index.ts +82 -3
  23. package/src/client/proxy.ts +170 -0
  24. package/src/hooks/index.ts +1 -0
  25. package/src/hooks/useProductInstances.ts +174 -0
  26. package/src/index.ts +11 -0
  27. package/src/mutations/accounts.ts +102 -1
  28. package/src/mutations/brands.ts +102 -1
  29. package/src/mutations/index.ts +23 -0
  30. package/src/mutations/productInstances/index.ts +14 -0
  31. package/src/mutations/productInstances/productInstances.integration.test.ts +621 -0
  32. package/src/mutations/productInstances/productInstances.test.ts +680 -0
  33. package/src/mutations/productInstances/productInstances.ts +280 -0
  34. package/src/mutations/systemSettings.ts +130 -0
  35. package/src/mutations/users.ts +102 -1
  36. package/src/queries/index.ts +9 -0
  37. package/src/queries/systemSettings.ts +115 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/index.ts","../src/client/server.ts","../src/queries/brands.ts","../src/queries/accounts.ts","../src/queries/users.ts","../src/queries/products.ts","../src/queries/server-helpers.ts","../src/mutations/brands.ts","../src/mutations/accounts.ts","../src/mutations/users.ts","../src/hooks/createDataHook.ts","../src/hooks/useBrands.ts","../src/hooks/useAccounts.ts","../src/hooks/useUsers.ts","../src/hooks/useProducts.ts","../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js","../src/stores/createStores.ts"],"sourcesContent":["/**\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\nimport { generateClient as generateDataClient } from \"aws-amplify/data\";\nimport type { ResourcesConfig } from \"aws-amplify\";\n\n// Re-export server-side client generation\nexport { generateServerClientUsingCookies } from \"./server\";\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\t\n\treturn client;\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 * Brand Query Functions\n *\n * Provides query functions for fetching brand data from the GraphQL API.\n */\n\nimport type { Brand } from \"@htlkg/core/types\";\n\n/**\n * Get a single brand by ID\n *\n * @example\n * ```typescript\n * import { getBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await getBrand(client, 'brand-123');\n * ```\n */\nexport async function getBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[getBrand] Error fetching brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all brands with optional filtering\n *\n * @example\n * ```typescript\n * import { listBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listBrands(client, {\n * filter: { status: { eq: 'active' } }\n * });\n * ```\n */\nexport async function listBrands<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.Brand.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listBrands] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Brand[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listBrands] Error fetching brands:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a brand with its product instances\n *\n * @example\n * ```typescript\n * import { getBrandWithProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await getBrandWithProducts(client, 'brand-123');\n * ```\n */\nexport async function getBrandWithProducts<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.get(\n\t\t\t{ id },\n\t\t\t{\n\t\t\t\tselectionSet: [\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"name\",\n\t\t\t\t\t\"accountId\",\n\t\t\t\t\t\"logo\",\n\t\t\t\t\t\"timezone\",\n\t\t\t\t\t\"status\",\n\t\t\t\t\t\"settings\",\n\t\t\t\t\t\"productInstances.*\",\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getBrandWithProducts] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[getBrandWithProducts] Error fetching brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List brands by account ID\n *\n * @example\n * ```typescript\n * import { listBrandsByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listBrandsByAccount(client, 'account-123');\n * ```\n */\nexport async function listBrandsByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\treturn listBrands(client, {\n\t\tfilter: { accountId: { eq: accountId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List active brands\n *\n * @example\n * ```typescript\n * import { listActiveBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listActiveBrands(client);\n * ```\n */\nexport async function listActiveBrands<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\treturn listBrands(client, {\n\t\tfilter: { status: { eq: \"active\" } },\n\t\t...options,\n\t});\n}\n","/**\n * Account Query Functions\n *\n * Provides query functions for fetching account data from the GraphQL API.\n */\n\nimport type { Account } from \"@htlkg/core/types\";\n\n/**\n * Get a single account by ID\n *\n * @example\n * ```typescript\n * import { getAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await getAccount(client, 'account-123');\n * ```\n */\nexport async function getAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[getAccount] Error fetching account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all accounts with optional filtering\n *\n * @example\n * ```typescript\n * import { listAccounts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const accounts = await listAccounts(client);\n * ```\n */\nexport async function listAccounts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Account[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Account.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listAccounts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Account[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listAccounts] Error fetching accounts:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get an account with its brands\n *\n * @example\n * ```typescript\n * import { getAccountWithBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await getAccountWithBrands(client, 'account-123');\n * ```\n */\nexport async function getAccountWithBrands<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.get(\n\t\t\t{ id },\n\t\t\t{\n\t\t\t\tselectionSet: [\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"name\",\n\t\t\t\t\t\"logo\",\n\t\t\t\t\t\"subscription\",\n\t\t\t\t\t\"settings\",\n\t\t\t\t\t\"brands.*\",\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getAccountWithBrands] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[getAccountWithBrands] Error fetching account:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * User Query Functions\n *\n * Provides query functions for fetching user data from the GraphQL API.\n */\n\nimport type { User } from \"@htlkg/core/types\";\n\n/**\n * Get a single user by ID\n *\n * @example\n * ```typescript\n * import { getUser } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUser(client, 'user-123');\n * ```\n */\nexport async function getUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[getUser] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a user by Cognito ID\n *\n * @example\n * ```typescript\n * import { getUserByCognitoId } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUserByCognitoId(client, 'cognito-id-123');\n * ```\n */\nexport async function getUserByCognitoId<TClient = any>(\n\tclient: TClient,\n\tcognitoId: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.list({\n\t\t\tfilter: { cognitoId: { eq: cognitoId } },\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUserByCognitoId] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as User | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getUserByCognitoId] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a user by email\n *\n * @example\n * ```typescript\n * import { getUserByEmail } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUserByEmail(client, 'user@example.com');\n * ```\n */\nexport async function getUserByEmail<TClient = any>(\n\tclient: TClient,\n\temail: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.list({\n\t\t\tfilter: { email: { eq: email } },\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUserByEmail] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as User | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getUserByEmail] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all users with optional filtering\n *\n * @example\n * ```typescript\n * import { listUsers } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listUsers(client, {\n * filter: { status: { eq: 'active' } }\n * });\n * ```\n */\nexport async function listUsers<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.User.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listUsers] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as User[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listUsers] Error fetching users:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List users by account ID\n *\n * @example\n * ```typescript\n * import { listUsersByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listUsersByAccount(client, 'account-123');\n * ```\n */\nexport async function listUsersByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\treturn listUsers(client, {\n\t\tfilter: { accountId: { eq: accountId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List active users\n *\n * @example\n * ```typescript\n * import { listActiveUsers } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listActiveUsers(client);\n * ```\n */\nexport async function listActiveUsers<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\treturn listUsers(client, {\n\t\tfilter: { status: { eq: \"active\" } },\n\t\t...options,\n\t});\n}\n","/**\n * Product Query Functions\n *\n * Provides query functions for fetching product and product instance data from the GraphQL API.\n */\n\nimport type { Product, ProductInstance } from \"@htlkg/core/types\";\n\n/**\n * Get a single product by ID\n *\n * @example\n * ```typescript\n * import { getProduct } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const product = await getProduct(client, 'product-123');\n * ```\n */\nexport async function getProduct<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Product | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Product.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getProduct] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Product;\n\t} catch (error) {\n\t\tconsole.error(\"[getProduct] Error fetching product:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all products with optional filtering\n *\n * @example\n * ```typescript\n * import { listProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const products = await listProducts(client, {\n * filter: { isActive: { eq: true } }\n * });\n * ```\n */\nexport async function listProducts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Product[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Product.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProducts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Product[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listProducts] Error fetching products:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List active products\n *\n * @example\n * ```typescript\n * import { listActiveProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const products = await listActiveProducts(client);\n * ```\n */\nexport async function listActiveProducts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Product[]; nextToken?: string }> {\n\treturn listProducts(client, {\n\t\tfilter: { isActive: { eq: true } },\n\t\t...options,\n\t});\n}\n\n/**\n * Get a single product instance by ID\n *\n * @example\n * ```typescript\n * import { getProductInstance } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await getProductInstance(client, 'instance-123');\n * ```\n */\nexport async function getProductInstance<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.get({\n\t\t\tid,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getProductInstance] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[getProductInstance] Error fetching product instance:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List product instances by brand ID\n *\n * @example\n * ```typescript\n * import { listProductInstancesByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listProductInstancesByBrand(client, 'brand-123');\n * ```\n */\nexport async function listProductInstancesByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: { brandId: { eq: brandId } },\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProductInstancesByBrand] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listProductInstancesByBrand] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List product instances by account ID\n *\n * @example\n * ```typescript\n * import { listProductInstancesByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listProductInstancesByAccount(client, 'account-123');\n * ```\n */\nexport async function listProductInstancesByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: { accountId: { eq: accountId } },\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProductInstancesByAccount] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listProductInstancesByAccount] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List enabled product instances by brand ID\n *\n * @example\n * ```typescript\n * import { listEnabledProductInstancesByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listEnabledProductInstancesByBrand(client, 'brand-123');\n * ```\n */\nexport async function listEnabledProductInstancesByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: {\n\t\t\t\tbrandId: { eq: brandId },\n\t\t\t\tenabled: { eq: true },\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\n\t\t\t\t\"[listEnabledProductInstancesByBrand] GraphQL errors:\",\n\t\t\t\terrors,\n\t\t\t);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listEnabledProductInstancesByBrand] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n","/**\n * Server-Side Query Helpers\n *\n * Convenience functions for executing server-side queries in Astro pages.\n * These helpers simplify the common pattern of using runWithAmplifyServerContext.\n */\n\nimport type { AstroGlobal } from \"astro\";\nimport { generateServerClient } from \"../client\";\n\n/**\n * Type for the runWithAmplifyServerContext function\n */\ntype RunWithAmplifyServerContext = (options: {\n\tastroServerContext: {\n\t\tcookies: AstroGlobal[\"cookies\"];\n\t\trequest: AstroGlobal[\"request\"];\n\t};\n\toperation: (contextSpec: unknown) => Promise<unknown>;\n}) => Promise<unknown>;\n\n/**\n * Helper to execute server-side queries in Astro pages\n *\n * This function wraps the common pattern of using runWithAmplifyServerContext\n * with generateServerClient, making it easier to fetch data server-side.\n *\n * **Note**: This requires `createRunWithAmplifyServerContext` from `@htlkg/core/amplify-astro-adapter`.\n * If you need more control, use the full pattern directly.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { executeServerQuery } from '@htlkg/data/queries/server-helpers';\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 * const users = await executeServerQuery<Schema>(\n * Astro,\n * runWithAmplifyServerContext,\n * async (client) => {\n * const result = await client.models.User.list();\n * return result.data || [];\n * }\n * );\n * ```\n */\nexport async function executeServerQuery<\n\tTSchema extends Record<string, unknown>,\n\tTResult,\n>(\n\tastro: AstroGlobal,\n\trunWithAmplifyServerContext: RunWithAmplifyServerContext,\n\toperation: (client: ReturnType<typeof generateServerClient<TSchema>>) => Promise<TResult>,\n): Promise<TResult> {\n\tconst result = await runWithAmplifyServerContext({\n\t\tastroServerContext: {\n\t\t\tcookies: astro.cookies,\n\t\t\trequest: astro.request,\n\t\t},\n\t\toperation: async (contextSpec: unknown) => {\n\t\t\tconst client = generateServerClient<TSchema>();\n\t\t\treturn await operation(client);\n\t\t},\n\t});\n\treturn result as TResult;\n}\n\n/**\n * Helper to execute server-side queries with API key authentication (public data)\n *\n * Use this for fetching public data that doesn't require user authentication.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { executePublicQuery } from '@htlkg/data/queries/server-helpers';\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 * const brands = await executePublicQuery<Schema>(\n * Astro,\n * runWithAmplifyServerContext,\n * async (client) => {\n * const result = await client.models.Brand.list();\n * return result.data || [];\n * }\n * );\n * ```\n */\nexport async function executePublicQuery<\n\tTSchema extends Record<string, unknown>,\n\tTResult,\n>(\n\tastro: AstroGlobal,\n\trunWithAmplifyServerContext: RunWithAmplifyServerContext,\n\toperation: (client: ReturnType<typeof generateServerClient<TSchema>>) => Promise<TResult>,\n): Promise<TResult> {\n\tconst result = await runWithAmplifyServerContext({\n\t\tastroServerContext: {\n\t\t\tcookies: astro.cookies,\n\t\t\trequest: astro.request,\n\t\t},\n\t\toperation: async (_contextSpec: unknown) => {\n\t\t\tconst client = generateServerClient<TSchema>({ authMode: \"apiKey\" });\n\t\t\treturn await operation(client);\n\t\t},\n\t});\n\treturn result as TResult;\n}\n","/**\n * Brand Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting brands.\n */\n\nimport type { Brand } from \"@htlkg/core/types\";\n\n/**\n * Input type for creating a brand\n */\nexport interface CreateBrandInput {\n\taccountId: string;\n\tname: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Input type for updating a brand\n */\nexport interface UpdateBrandInput {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Create a new brand\n *\n * @example\n * ```typescript\n * import { createBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await createBrand(client, {\n * accountId: 'account-123',\n * name: 'My Brand',\n * timezone: 'America/New_York',\n * status: 'active'\n * });\n * ```\n */\nexport async function createBrand<TClient = any>(\n\tclient: TClient,\n\tinput: CreateBrandInput,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[createBrand] Error creating brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing brand\n *\n * @example\n * ```typescript\n * import { updateBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await updateBrand(client, {\n * id: 'brand-123',\n * name: 'Updated Brand Name',\n * status: 'maintenance'\n * });\n * ```\n */\nexport async function updateBrand<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateBrandInput,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[updateBrand] Error updating brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Delete a brand\n *\n * @example\n * ```typescript\n * import { deleteBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteBrand(client, 'brand-123');\n * ```\n */\nexport async function deleteBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Brand.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteBrand] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteBrand] Error deleting brand:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Account Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting accounts.\n */\n\nimport type { Account } from \"@htlkg/core/types\";\n\n/**\n * Input type for creating an account\n */\nexport interface CreateAccountInput {\n\tname: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Input type for updating an account\n */\nexport interface UpdateAccountInput {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Create a new account\n *\n * @example\n * ```typescript\n * import { createAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await createAccount(client, {\n * name: 'My Account',\n * subscription: { plan: 'premium' }\n * });\n * ```\n */\nexport async function createAccount<TClient = any>(\n\tclient: TClient,\n\tinput: CreateAccountInput,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[createAccount] Error creating account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing account\n *\n * @example\n * ```typescript\n * import { updateAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await updateAccount(client, {\n * id: 'account-123',\n * name: 'Updated Account Name'\n * });\n * ```\n */\nexport async function updateAccount<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateAccountInput,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[updateAccount] Error updating account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Delete an account\n *\n * @example\n * ```typescript\n * import { deleteAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteAccount(client, 'account-123');\n * ```\n */\nexport async function deleteAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Account.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteAccount] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteAccount] Error deleting account:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * User Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting users.\n */\n\nimport type { User } from \"@htlkg/core/types\";\n\n/**\n * Input type for creating a user\n */\nexport interface CreateUserInput {\n\tcognitoId: string;\n\temail: string;\n\taccountId: string;\n\tbrandIds?: string[];\n\troles?: string[];\n\tpermissions?: Record<string, any>;\n\tstatus?: \"active\" | \"inactive\" | \"pending\" | \"suspended\";\n}\n\n/**\n * Input type for updating a user\n */\nexport interface UpdateUserInput {\n\tid: string;\n\temail?: string;\n\tbrandIds?: string[];\n\troles?: string[];\n\tpermissions?: Record<string, any>;\n\tlastLogin?: string;\n\tstatus?: \"active\" | \"inactive\" | \"pending\" | \"suspended\";\n}\n\n/**\n * Create a new user\n *\n * @example\n * ```typescript\n * import { createUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await createUser(client, {\n * cognitoId: 'cognito-123',\n * email: 'user@example.com',\n * accountId: 'account-123',\n * roles: ['BRAND_ADMIN'],\n * status: 'active'\n * });\n * ```\n */\nexport async function createUser<TClient = any>(\n\tclient: TClient,\n\tinput: CreateUserInput,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[createUser] Error creating user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing user\n *\n * @example\n * ```typescript\n * import { updateUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await updateUser(client, {\n * id: 'user-123',\n * roles: ['BRAND_ADMIN', 'ACCOUNT_ADMIN'],\n * status: 'active'\n * });\n * ```\n */\nexport async function updateUser<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateUserInput,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[updateUser] Error updating user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Delete a user\n *\n * @example\n * ```typescript\n * import { deleteUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteUser(client, 'user-123');\n * ```\n */\nexport async function deleteUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.User.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteUser] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteUser] Error deleting user:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\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 { getSharedClient, resetSharedClient } from \"../client\";\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// Re-export resetSharedClient for testing convenience\nexport { resetSharedClient as resetClientInstance };\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\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 client = getSharedClient();\n\t\t\t\tconst queryOptions: any = {\n\t\t\t\t\tfilter: getFilter(),\n\t\t\t\t\tlimit,\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 { data: responseData, errors } = await (client as any).models[model].list(queryOptions);\n\n\t\t\t\tif (errors) {\n\t\t\t\t\tthrow new Error(errors[0]?.message || `Failed to fetch ${model}`);\n\t\t\t\t}\n\n\t\t\t\tconst items = responseData || [];\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 * 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","import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","/**\n * Store Factory\n *\n * Creates request-scoped nanostores for sharing data across Vue islands\n * without props. Works with @inox-tools/request-nanostores for Astro integration.\n */\n\nimport { atom, type WritableAtom } from \"nanostores\";\n\n/**\n * Type for the shared function from @it-astro:request-nanostores\n */\ntype SharedFn = <T>(key: string, atomFactory: WritableAtom<T>) => WritableAtom<T>;\n\n/**\n * Configuration for a resource store\n */\nexport interface StoreConfig {\n\t/** Resource name (e.g., 'accounts', 'users') */\n\tname: string;\n\t/** Related resources to create stores for (e.g., ['brands', 'products']) */\n\trelations?: string[];\n}\n\n/**\n * Result type for created stores\n */\nexport type ResourceStores<T, TRelations extends string = never> = {\n\t/** Main resource store */\n\t$data: WritableAtom<readonly T[]>;\n} & {\n\t[K in TRelations as `$${K}`]: WritableAtom<readonly any[]>;\n};\n\n/**\n * Capitalize first letter of a string\n */\nfunction capitalize(str: string): string {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Creates request-scoped stores for a resource and its relations.\n *\n * This factory is designed to work with Astro's request-nanostores integration,\n * providing request-isolated state that syncs from server to client.\n *\n * @param shared - The shared function from @it-astro:request-nanostores\n * @param config - Store configuration\n * @returns Object containing the main store and relation stores\n *\n * @example\n * ```typescript\n * // In your store file (e.g., stores/accounts.ts)\n * import { shared } from '@it-astro:request-nanostores';\n * import { createResourceStores } from '@htlkg/data/stores';\n *\n * export const accountStores = createResourceStores(shared, {\n * name: 'accounts',\n * relations: ['brands'],\n * });\n *\n * // This creates:\n * // - accountStores.$data (WritableAtom<any[]>) - main accounts store\n * // - accountStores.$brands (WritableAtom<any[]>) - related brands store\n *\n * // For cleaner exports:\n * export const $accounts = accountStores.$data;\n * export const $accountsBrands = accountStores.$brands;\n * ```\n *\n * @example\n * ```typescript\n * // With typed stores\n * interface Account { id: number; name: string; }\n * interface Brand { id: number; name: string; }\n *\n * export const { $data: $accounts, $brands } = createResourceStores<Account, 'brands'>(\n * shared,\n * { name: 'accounts', relations: ['brands'] }\n * );\n * ```\n */\nexport function createResourceStores<T = any, TRelations extends string = never>(\n\tshared: SharedFn,\n\tconfig: StoreConfig & { relations?: TRelations[] },\n): ResourceStores<T, TRelations> {\n\tconst { name, relations = [] } = config;\n\n\tconst stores: Record<string, any> = {};\n\n\t// Main resource store\n\tstores.$data = shared(name, atom<T[]>([]));\n\n\t// Relation stores\n\tfor (const relation of relations) {\n\t\tconst storeKey = `$${relation}`;\n\t\tconst sharedKey = `${name}${capitalize(relation)}`;\n\t\tstores[storeKey] = shared(sharedKey, atom<any[]>([]));\n\t}\n\n\treturn stores as ResourceStores<T, TRelations>;\n}\n\n/**\n * Creates a simple single store (non-factory version for simpler use cases)\n *\n * @example\n * ```typescript\n * import { shared } from '@it-astro:request-nanostores';\n * import { createStore } from '@htlkg/data/stores';\n *\n * export const $currentUser = createStore<User>(shared, 'currentUser');\n * ```\n */\nexport function createStore<T>(\n\tshared: SharedFn,\n\tname: string,\n\tdefaultValue: T[] = [],\n): WritableAtom<readonly T[]> {\n\treturn shared(name, atom<T[]>(defaultValue));\n}\n\n/**\n * Creates a single-value store (for non-array values like current user)\n *\n * @example\n * ```typescript\n * import { shared } from '@it-astro:request-nanostores';\n * import { createSingleStore } from '@htlkg/data/stores';\n *\n * export const $currentUser = createSingleStore<User | null>(shared, 'currentUser', null);\n * ```\n */\nexport function createSingleStore<T>(\n\tshared: SharedFn,\n\tname: string,\n\tdefaultValue: T,\n): WritableAtom<T> {\n\treturn shared(name, atom<T>(defaultValue));\n}\n\n/**\n * Helper to create typed store with proper inference\n */\nexport type InferStoreType<TStore extends WritableAtom<any>> = TStore extends WritableAtom<infer T>\n\t? T\n\t: never;\n"],"mappings":"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","names":["buildFilter","buildFilter","buildFilter"]}
1
+ {"version":3,"sources":["../src/client/index.ts","../src/client/server.ts","../src/client/proxy.ts","../src/queries/brands.ts","../src/queries/accounts.ts","../src/queries/users.ts","../src/queries/products.ts","../src/queries/server-helpers.ts","../src/queries/systemSettings.ts","../src/mutations/brands.ts","../src/mutations/accounts.ts","../src/mutations/users.ts","../src/mutations/productInstances/productInstances.ts","../src/mutations/systemSettings.ts","../src/hooks/createDataHook.ts","../src/hooks/useBrands.ts","../src/hooks/useAccounts.ts","../src/hooks/useUsers.ts","../src/hooks/useProducts.ts","../src/hooks/useProductInstances.ts","../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js","../src/stores/createStores.ts"],"sourcesContent":["/**\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/**\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 * 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 * Brand Query Functions\n *\n * Provides query functions for fetching brand data from the GraphQL API.\n */\n\nimport type { Brand } from \"@htlkg/core/types\";\n\n/**\n * Get a single brand by ID\n *\n * @example\n * ```typescript\n * import { getBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await getBrand(client, 'brand-123');\n * ```\n */\nexport async function getBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[getBrand] Error fetching brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all brands with optional filtering\n *\n * @example\n * ```typescript\n * import { listBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listBrands(client, {\n * filter: { status: { eq: 'active' } }\n * });\n * ```\n */\nexport async function listBrands<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.Brand.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listBrands] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Brand[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listBrands] Error fetching brands:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a brand with its product instances\n *\n * @example\n * ```typescript\n * import { getBrandWithProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await getBrandWithProducts(client, 'brand-123');\n * ```\n */\nexport async function getBrandWithProducts<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.get(\n\t\t\t{ id },\n\t\t\t{\n\t\t\t\tselectionSet: [\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"name\",\n\t\t\t\t\t\"accountId\",\n\t\t\t\t\t\"logo\",\n\t\t\t\t\t\"timezone\",\n\t\t\t\t\t\"status\",\n\t\t\t\t\t\"settings\",\n\t\t\t\t\t\"productInstances.*\",\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getBrandWithProducts] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[getBrandWithProducts] Error fetching brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List brands by account ID\n *\n * @example\n * ```typescript\n * import { listBrandsByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listBrandsByAccount(client, 'account-123');\n * ```\n */\nexport async function listBrandsByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\treturn listBrands(client, {\n\t\tfilter: { accountId: { eq: accountId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List active brands\n *\n * @example\n * ```typescript\n * import { listActiveBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listActiveBrands(client);\n * ```\n */\nexport async function listActiveBrands<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\treturn listBrands(client, {\n\t\tfilter: { status: { eq: \"active\" } },\n\t\t...options,\n\t});\n}\n","/**\n * Account Query Functions\n *\n * Provides query functions for fetching account data from the GraphQL API.\n */\n\nimport type { Account } from \"@htlkg/core/types\";\n\n/**\n * Get a single account by ID\n *\n * @example\n * ```typescript\n * import { getAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await getAccount(client, 'account-123');\n * ```\n */\nexport async function getAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[getAccount] Error fetching account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all accounts with optional filtering\n *\n * @example\n * ```typescript\n * import { listAccounts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const accounts = await listAccounts(client);\n * ```\n */\nexport async function listAccounts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Account[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Account.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listAccounts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Account[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listAccounts] Error fetching accounts:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get an account with its brands\n *\n * @example\n * ```typescript\n * import { getAccountWithBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await getAccountWithBrands(client, 'account-123');\n * ```\n */\nexport async function getAccountWithBrands<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.get(\n\t\t\t{ id },\n\t\t\t{\n\t\t\t\tselectionSet: [\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"name\",\n\t\t\t\t\t\"logo\",\n\t\t\t\t\t\"subscription\",\n\t\t\t\t\t\"settings\",\n\t\t\t\t\t\"brands.*\",\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getAccountWithBrands] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[getAccountWithBrands] Error fetching account:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * User Query Functions\n *\n * Provides query functions for fetching user data from the GraphQL API.\n */\n\nimport type { User } from \"@htlkg/core/types\";\n\n/**\n * Get a single user by ID\n *\n * @example\n * ```typescript\n * import { getUser } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUser(client, 'user-123');\n * ```\n */\nexport async function getUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[getUser] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a user by Cognito ID\n *\n * @example\n * ```typescript\n * import { getUserByCognitoId } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUserByCognitoId(client, 'cognito-id-123');\n * ```\n */\nexport async function getUserByCognitoId<TClient = any>(\n\tclient: TClient,\n\tcognitoId: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.list({\n\t\t\tfilter: { cognitoId: { eq: cognitoId } },\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUserByCognitoId] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as User | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getUserByCognitoId] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a user by email\n *\n * @example\n * ```typescript\n * import { getUserByEmail } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUserByEmail(client, 'user@example.com');\n * ```\n */\nexport async function getUserByEmail<TClient = any>(\n\tclient: TClient,\n\temail: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.list({\n\t\t\tfilter: { email: { eq: email } },\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUserByEmail] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as User | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getUserByEmail] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all users with optional filtering\n *\n * @example\n * ```typescript\n * import { listUsers } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listUsers(client, {\n * filter: { status: { eq: 'active' } }\n * });\n * ```\n */\nexport async function listUsers<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.User.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listUsers] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as User[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listUsers] Error fetching users:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List users by account ID\n *\n * @example\n * ```typescript\n * import { listUsersByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listUsersByAccount(client, 'account-123');\n * ```\n */\nexport async function listUsersByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\treturn listUsers(client, {\n\t\tfilter: { accountId: { eq: accountId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List active users\n *\n * @example\n * ```typescript\n * import { listActiveUsers } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listActiveUsers(client);\n * ```\n */\nexport async function listActiveUsers<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\treturn listUsers(client, {\n\t\tfilter: { status: { eq: \"active\" } },\n\t\t...options,\n\t});\n}\n","/**\n * Product Query Functions\n *\n * Provides query functions for fetching product and product instance data from the GraphQL API.\n */\n\nimport type { Product, ProductInstance } from \"@htlkg/core/types\";\n\n/**\n * Get a single product by ID\n *\n * @example\n * ```typescript\n * import { getProduct } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const product = await getProduct(client, 'product-123');\n * ```\n */\nexport async function getProduct<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Product | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Product.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getProduct] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Product;\n\t} catch (error) {\n\t\tconsole.error(\"[getProduct] Error fetching product:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all products with optional filtering\n *\n * @example\n * ```typescript\n * import { listProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const products = await listProducts(client, {\n * filter: { isActive: { eq: true } }\n * });\n * ```\n */\nexport async function listProducts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Product[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Product.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProducts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Product[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listProducts] Error fetching products:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List active products\n *\n * @example\n * ```typescript\n * import { listActiveProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const products = await listActiveProducts(client);\n * ```\n */\nexport async function listActiveProducts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Product[]; nextToken?: string }> {\n\treturn listProducts(client, {\n\t\tfilter: { isActive: { eq: true } },\n\t\t...options,\n\t});\n}\n\n/**\n * Get a single product instance by ID\n *\n * @example\n * ```typescript\n * import { getProductInstance } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await getProductInstance(client, 'instance-123');\n * ```\n */\nexport async function getProductInstance<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.get({\n\t\t\tid,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getProductInstance] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[getProductInstance] Error fetching product instance:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List product instances by brand ID\n *\n * @example\n * ```typescript\n * import { listProductInstancesByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listProductInstancesByBrand(client, 'brand-123');\n * ```\n */\nexport async function listProductInstancesByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: { brandId: { eq: brandId } },\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProductInstancesByBrand] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listProductInstancesByBrand] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List product instances by account ID\n *\n * @example\n * ```typescript\n * import { listProductInstancesByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listProductInstancesByAccount(client, 'account-123');\n * ```\n */\nexport async function listProductInstancesByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: { accountId: { eq: accountId } },\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProductInstancesByAccount] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listProductInstancesByAccount] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List enabled product instances by brand ID\n *\n * @example\n * ```typescript\n * import { listEnabledProductInstancesByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listEnabledProductInstancesByBrand(client, 'brand-123');\n * ```\n */\nexport async function listEnabledProductInstancesByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: {\n\t\t\t\tbrandId: { eq: brandId },\n\t\t\t\tenabled: { eq: true },\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\n\t\t\t\t\"[listEnabledProductInstancesByBrand] GraphQL errors:\",\n\t\t\t\terrors,\n\t\t\t);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listEnabledProductInstancesByBrand] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n","/**\n * Server-Side Query Helpers\n *\n * Convenience functions for executing server-side queries in Astro pages.\n * These helpers simplify the common pattern of using runWithAmplifyServerContext.\n */\n\nimport type { AstroGlobal } from \"astro\";\nimport { generateServerClient } from \"../client\";\n\n/**\n * Type for the runWithAmplifyServerContext function\n */\ntype RunWithAmplifyServerContext = (options: {\n\tastroServerContext: {\n\t\tcookies: AstroGlobal[\"cookies\"];\n\t\trequest: AstroGlobal[\"request\"];\n\t};\n\toperation: (contextSpec: unknown) => Promise<unknown>;\n}) => Promise<unknown>;\n\n/**\n * Helper to execute server-side queries in Astro pages\n *\n * This function wraps the common pattern of using runWithAmplifyServerContext\n * with generateServerClient, making it easier to fetch data server-side.\n *\n * **Note**: This requires `createRunWithAmplifyServerContext` from `@htlkg/core/amplify-astro-adapter`.\n * If you need more control, use the full pattern directly.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { executeServerQuery } from '@htlkg/data/queries/server-helpers';\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 * const users = await executeServerQuery<Schema>(\n * Astro,\n * runWithAmplifyServerContext,\n * async (client) => {\n * const result = await client.models.User.list();\n * return result.data || [];\n * }\n * );\n * ```\n */\nexport async function executeServerQuery<\n\tTSchema extends Record<string, unknown>,\n\tTResult,\n>(\n\tastro: AstroGlobal,\n\trunWithAmplifyServerContext: RunWithAmplifyServerContext,\n\toperation: (client: ReturnType<typeof generateServerClient<TSchema>>) => Promise<TResult>,\n): Promise<TResult> {\n\tconst result = await runWithAmplifyServerContext({\n\t\tastroServerContext: {\n\t\t\tcookies: astro.cookies,\n\t\t\trequest: astro.request,\n\t\t},\n\t\toperation: async (contextSpec: unknown) => {\n\t\t\tconst client = generateServerClient<TSchema>();\n\t\t\treturn await operation(client);\n\t\t},\n\t});\n\treturn result as TResult;\n}\n\n/**\n * Helper to execute server-side queries with API key authentication (public data)\n *\n * Use this for fetching public data that doesn't require user authentication.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { executePublicQuery } from '@htlkg/data/queries/server-helpers';\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 * const brands = await executePublicQuery<Schema>(\n * Astro,\n * runWithAmplifyServerContext,\n * async (client) => {\n * const result = await client.models.Brand.list();\n * return result.data || [];\n * }\n * );\n * ```\n */\nexport async function executePublicQuery<\n\tTSchema extends Record<string, unknown>,\n\tTResult,\n>(\n\tastro: AstroGlobal,\n\trunWithAmplifyServerContext: RunWithAmplifyServerContext,\n\toperation: (client: ReturnType<typeof generateServerClient<TSchema>>) => Promise<TResult>,\n): Promise<TResult> {\n\tconst result = await runWithAmplifyServerContext({\n\t\tastroServerContext: {\n\t\t\tcookies: astro.cookies,\n\t\t\trequest: astro.request,\n\t\t},\n\t\toperation: async (_contextSpec: unknown) => {\n\t\t\tconst client = generateServerClient<TSchema>({ authMode: \"apiKey\" });\n\t\t\treturn await operation(client);\n\t\t},\n\t});\n\treturn result as TResult;\n}\n","/**\n * SystemSettings Query Functions\n *\n * Provides query functions for fetching system settings from the GraphQL API.\n */\n\nimport type { SystemSettings } from \"@htlkg/core/types\";\n\n/** Default retention days if no settings exist */\nexport const DEFAULT_SOFT_DELETE_RETENTION_DAYS = 30;\n\n/** The key used for global system settings */\nexport const SYSTEM_SETTINGS_KEY = \"GLOBAL\";\n\n/**\n * Get system settings\n *\n * @example\n * ```typescript\n * import { getSystemSettings } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await getSystemSettings(client);\n * ```\n */\nexport async function getSystemSettings<TClient = any>(\n\tclient: TClient,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getSystemSettings] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\"[getSystemSettings] Error fetching system settings:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get the soft delete retention days from system settings\n * Returns the default (30 days) if settings don't exist\n *\n * @example\n * ```typescript\n * import { getSoftDeleteRetentionDays } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const days = await getSoftDeleteRetentionDays(client);\n * ```\n */\nexport async function getSoftDeleteRetentionDays<TClient = any>(\n\tclient: TClient,\n): Promise<number> {\n\tconst settings = await getSystemSettings(client);\n\treturn settings?.softDeleteRetentionDays ?? DEFAULT_SOFT_DELETE_RETENTION_DAYS;\n}\n\n/**\n * Check if a soft-deleted item can still be restored based on retention period\n *\n * @param deletedAt - The ISO date string when the item was deleted\n * @param retentionDays - Number of days items can be restored\n * @returns Object with canRestore flag and daysRemaining/daysExpired\n */\nexport function checkRestoreEligibility(\n\tdeletedAt: string | undefined | null,\n\tretentionDays: number,\n): {\n\tcanRestore: boolean;\n\tdaysRemaining: number;\n\tdaysExpired: number;\n\texpiresAt: Date | null;\n} {\n\tif (!deletedAt) {\n\t\treturn {\n\t\t\tcanRestore: false,\n\t\t\tdaysRemaining: 0,\n\t\t\tdaysExpired: 0,\n\t\t\texpiresAt: null,\n\t\t};\n\t}\n\n\tconst deletedDate = new Date(deletedAt);\n\tconst expiresAt = new Date(deletedDate);\n\texpiresAt.setDate(expiresAt.getDate() + retentionDays);\n\n\tconst now = new Date();\n\tconst msRemaining = expiresAt.getTime() - now.getTime();\n\tconst daysRemaining = Math.ceil(msRemaining / (1000 * 60 * 60 * 24));\n\n\tif (daysRemaining <= 0) {\n\t\treturn {\n\t\t\tcanRestore: false,\n\t\t\tdaysRemaining: 0,\n\t\t\tdaysExpired: Math.abs(daysRemaining),\n\t\t\texpiresAt,\n\t\t};\n\t}\n\n\treturn {\n\t\tcanRestore: true,\n\t\tdaysRemaining,\n\t\tdaysExpired: 0,\n\t\texpiresAt,\n\t};\n}\n","/**\n * Brand Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting brands.\n */\n\nimport type { Brand } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\n\n/**\n * Input type for creating a brand\n */\nexport interface CreateBrandInput {\n\taccountId: string;\n\tname: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Input type for updating a brand\n */\nexport interface UpdateBrandInput {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Create a new brand\n *\n * @example\n * ```typescript\n * import { createBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await createBrand(client, {\n * accountId: 'account-123',\n * name: 'My Brand',\n * timezone: 'America/New_York',\n * status: 'active'\n * });\n * ```\n */\nexport async function createBrand<TClient = any>(\n\tclient: TClient,\n\tinput: CreateBrandInput,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[createBrand] Error creating brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing brand\n *\n * @example\n * ```typescript\n * import { updateBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await updateBrand(client, {\n * id: 'brand-123',\n * name: 'Updated Brand Name',\n * status: 'maintenance'\n * });\n * ```\n */\nexport async function updateBrand<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateBrandInput,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[updateBrand] Error updating brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a brand (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteBrand(client, 'brand-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Brand.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteBrand] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteBrand] Error soft-deleting brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted brand (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreBrand(client, 'brand-123');\n * // Or with custom retention days:\n * await restoreBrand(client, 'brand-123', 60);\n * ```\n */\nexport async function restoreBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the brand to check its deletedAt timestamp\n\t\tconst { data: brand, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Brand.get({ id });\n\n\t\tif (getErrors || !brand) {\n\t\t\tconsole.error(\"[restoreBrand] Error fetching brand:\", getErrors);\n\t\t\treturn { success: false, error: \"Brand not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(brand.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore brand. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreBrand]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Brand.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreBrand] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore brand\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreBrand] Error restoring brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a brand (permanently removes from database)\n * Use with caution - prefer softDeleteBrand for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteBrand(client, 'brand-123');\n * ```\n */\nexport async function deleteBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Brand.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteBrand] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteBrand] Error deleting brand:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Account Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting accounts.\n */\n\nimport type { Account } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\n\n/**\n * Input type for creating an account\n */\nexport interface CreateAccountInput {\n\tname: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Input type for updating an account\n */\nexport interface UpdateAccountInput {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Create a new account\n *\n * @example\n * ```typescript\n * import { createAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await createAccount(client, {\n * name: 'My Account',\n * subscription: { plan: 'premium' }\n * });\n * ```\n */\nexport async function createAccount<TClient = any>(\n\tclient: TClient,\n\tinput: CreateAccountInput,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[createAccount] Error creating account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing account\n *\n * @example\n * ```typescript\n * import { updateAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await updateAccount(client, {\n * id: 'account-123',\n * name: 'Updated Account Name'\n * });\n * ```\n */\nexport async function updateAccount<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateAccountInput,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[updateAccount] Error updating account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete an account (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteAccount(client, 'account-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Account.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteAccount] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteAccount] Error soft-deleting account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted account (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreAccount(client, 'account-123');\n * // Or with custom retention days:\n * await restoreAccount(client, 'account-123', 60);\n * ```\n */\nexport async function restoreAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the account to check its deletedAt timestamp\n\t\tconst { data: account, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Account.get({ id });\n\n\t\tif (getErrors || !account) {\n\t\t\tconsole.error(\"[restoreAccount] Error fetching account:\", getErrors);\n\t\t\treturn { success: false, error: \"Account not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(account.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore account. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreAccount]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Account.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreAccount] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore account\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreAccount] Error restoring account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete an account (permanently removes from database)\n * Use with caution - prefer softDeleteAccount for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteAccount(client, 'account-123');\n * ```\n */\nexport async function deleteAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Account.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteAccount] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteAccount] Error deleting account:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * User Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting users.\n */\n\nimport type { User } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\n\n/**\n * Input type for creating a user\n */\nexport interface CreateUserInput {\n\tcognitoId: string;\n\temail: string;\n\taccountId: string;\n\tbrandIds?: string[];\n\troles?: string[];\n\tpermissions?: Record<string, any>;\n\tstatus?: \"active\" | \"inactive\" | \"pending\" | \"suspended\";\n}\n\n/**\n * Input type for updating a user\n */\nexport interface UpdateUserInput {\n\tid: string;\n\temail?: string;\n\tbrandIds?: string[];\n\troles?: string[];\n\tpermissions?: Record<string, any>;\n\tlastLogin?: string;\n\tstatus?: \"active\" | \"inactive\" | \"pending\" | \"suspended\";\n}\n\n/**\n * Create a new user\n *\n * @example\n * ```typescript\n * import { createUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await createUser(client, {\n * cognitoId: 'cognito-123',\n * email: 'user@example.com',\n * accountId: 'account-123',\n * roles: ['BRAND_ADMIN'],\n * status: 'active'\n * });\n * ```\n */\nexport async function createUser<TClient = any>(\n\tclient: TClient,\n\tinput: CreateUserInput,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[createUser] Error creating user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing user\n *\n * @example\n * ```typescript\n * import { updateUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await updateUser(client, {\n * id: 'user-123',\n * roles: ['BRAND_ADMIN', 'ACCOUNT_ADMIN'],\n * status: 'active'\n * });\n * ```\n */\nexport async function updateUser<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateUserInput,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[updateUser] Error updating user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a user (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteUser(client, 'user-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.User.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteUser] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteUser] Error soft-deleting user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted user (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreUser(client, 'user-123');\n * // Or with custom retention days:\n * await restoreUser(client, 'user-123', 60);\n * ```\n */\nexport async function restoreUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the user to check its deletedAt timestamp\n\t\tconst { data: user, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.User.get({ id });\n\n\t\tif (getErrors || !user) {\n\t\t\tconsole.error(\"[restoreUser] Error fetching user:\", getErrors);\n\t\t\treturn { success: false, error: \"User not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(user.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore user. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreUser]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.User.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreUser] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore user\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreUser] Error restoring user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a user (permanently removes from database)\n * Use with caution - prefer softDeleteUser for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteUser(client, 'user-123');\n * ```\n */\nexport async function deleteUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.User.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteUser] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteUser] Error deleting user:\", error);\n\t\tthrow error;\n\t}\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\";\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 {\n\tproductId: string;\n\tbrandId: string;\n\taccountId: string;\n\tproductName: string;\n\tenabled: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n\tlastUpdated?: string;\n\tupdatedBy?: string;\n}\n\n/**\n * Input type for updating a product instance\n */\nexport interface UpdateProductInstanceInput {\n\tid: string;\n\tenabled?: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n\tlastUpdated?: string;\n\tupdatedBy?: 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// Build input - manually construct to avoid Vue Proxy issues\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\tlastUpdated: input.lastUpdated || 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\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\tlastUpdated: input.lastUpdated || 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 * SystemSettings Mutation Functions\n *\n * Provides mutation functions for managing system settings.\n */\n\nimport type { SystemSettings } from \"@htlkg/core/types\";\nimport {\n\tSYSTEM_SETTINGS_KEY,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\n\n/**\n * Input type for updating system settings\n */\nexport interface UpdateSystemSettingsInput {\n\tsoftDeleteRetentionDays: number;\n\tupdatedBy: string;\n}\n\n/**\n * Update or create system settings\n * Only SUPER_ADMINS can update system settings\n *\n * @example\n * ```typescript\n * import { updateSystemSettings } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await updateSystemSettings(client, {\n * softDeleteRetentionDays: 60,\n * updatedBy: 'admin@example.com'\n * });\n * ```\n */\nexport async function updateSystemSettings<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateSystemSettingsInput,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\t// Validate retention days (minimum 1 day, maximum 365 days)\n\t\tif (input.softDeleteRetentionDays < 1 || input.softDeleteRetentionDays > 365) {\n\t\t\tconsole.error(\n\t\t\t\t\"[updateSystemSettings] Invalid retention days. Must be between 1 and 365.\",\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\n\t\t// First, try to get existing settings\n\t\tconst { data: existing } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tconst settingsData = {\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t\tsoftDeleteRetentionDays: input.softDeleteRetentionDays,\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\tupdatedBy: input.updatedBy,\n\t\t};\n\n\t\tlet result;\n\t\tif (existing) {\n\t\t\t// Update existing settings\n\t\t\tresult = await (client as any).models.SystemSettings.update(settingsData);\n\t\t} else {\n\t\t\t// Create new settings\n\t\t\tresult = await (client as any).models.SystemSettings.create(settingsData);\n\t\t}\n\n\t\tif (result.errors) {\n\t\t\tconsole.error(\"[updateSystemSettings] GraphQL errors:\", result.errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn result.data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\"[updateSystemSettings] Error updating system settings:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Initialize system settings with default values if they don't exist\n *\n * @example\n * ```typescript\n * import { initializeSystemSettings } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await initializeSystemSettings(client, 'system@hotelinking.com');\n * ```\n */\nexport async function initializeSystemSettings<TClient = any>(\n\tclient: TClient,\n\tinitializedBy: string,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\t// Check if settings already exist\n\t\tconst { data: existing } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tif (existing) {\n\t\t\treturn existing as SystemSettings;\n\t\t}\n\n\t\t// Create default settings\n\t\tconst { data, errors } = await (client as any).models.SystemSettings.create({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t\tsoftDeleteRetentionDays: DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\tupdatedBy: initializedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[initializeSystemSettings] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[initializeSystemSettings] Error initializing system settings:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n","/**\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 { getSharedClient, resetSharedClient } from \"../client\";\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// Re-export resetSharedClient for testing convenience\nexport { resetSharedClient as resetClientInstance };\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\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 client = getSharedClient();\n\t\t\t\tconst queryOptions: any = {\n\t\t\t\t\tfilter: getFilter(),\n\t\t\t\t\tlimit,\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 { data: responseData, errors } = await (client as any).models[model].list(queryOptions);\n\n\t\t\t\tif (errors) {\n\t\t\t\t\tthrow new Error(errors[0]?.message || `Failed to fetch ${model}`);\n\t\t\t\t}\n\n\t\t\t\tconst items = responseData || [];\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 * 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 * 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","import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","/**\n * Store Factory\n *\n * Creates request-scoped nanostores for sharing data across Vue islands\n * without props. Works with @inox-tools/request-nanostores for Astro integration.\n */\n\nimport { atom, type WritableAtom } from \"nanostores\";\n\n/**\n * Type for the shared function from @it-astro:request-nanostores\n */\ntype SharedFn = <T>(key: string, atomFactory: WritableAtom<T>) => WritableAtom<T>;\n\n/**\n * Configuration for a resource store\n */\nexport interface StoreConfig {\n\t/** Resource name (e.g., 'accounts', 'users') */\n\tname: string;\n\t/** Related resources to create stores for (e.g., ['brands', 'products']) */\n\trelations?: string[];\n}\n\n/**\n * Result type for created stores\n */\nexport type ResourceStores<T, TRelations extends string = never> = {\n\t/** Main resource store */\n\t$data: WritableAtom<readonly T[]>;\n} & {\n\t[K in TRelations as `$${K}`]: WritableAtom<readonly any[]>;\n};\n\n/**\n * Capitalize first letter of a string\n */\nfunction capitalize(str: string): string {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Creates request-scoped stores for a resource and its relations.\n *\n * This factory is designed to work with Astro's request-nanostores integration,\n * providing request-isolated state that syncs from server to client.\n *\n * @param shared - The shared function from @it-astro:request-nanostores\n * @param config - Store configuration\n * @returns Object containing the main store and relation stores\n *\n * @example\n * ```typescript\n * // In your store file (e.g., stores/accounts.ts)\n * import { shared } from '@it-astro:request-nanostores';\n * import { createResourceStores } from '@htlkg/data/stores';\n *\n * export const accountStores = createResourceStores(shared, {\n * name: 'accounts',\n * relations: ['brands'],\n * });\n *\n * // This creates:\n * // - accountStores.$data (WritableAtom<any[]>) - main accounts store\n * // - accountStores.$brands (WritableAtom<any[]>) - related brands store\n *\n * // For cleaner exports:\n * export const $accounts = accountStores.$data;\n * export const $accountsBrands = accountStores.$brands;\n * ```\n *\n * @example\n * ```typescript\n * // With typed stores\n * interface Account { id: number; name: string; }\n * interface Brand { id: number; name: string; }\n *\n * export const { $data: $accounts, $brands } = createResourceStores<Account, 'brands'>(\n * shared,\n * { name: 'accounts', relations: ['brands'] }\n * );\n * ```\n */\nexport function createResourceStores<T = any, TRelations extends string = never>(\n\tshared: SharedFn,\n\tconfig: StoreConfig & { relations?: TRelations[] },\n): ResourceStores<T, TRelations> {\n\tconst { name, relations = [] } = config;\n\n\tconst stores: Record<string, any> = {};\n\n\t// Main resource store\n\tstores.$data = shared(name, atom<T[]>([]));\n\n\t// Relation stores\n\tfor (const relation of relations) {\n\t\tconst storeKey = `$${relation}`;\n\t\tconst sharedKey = `${name}${capitalize(relation)}`;\n\t\tstores[storeKey] = shared(sharedKey, atom<any[]>([]));\n\t}\n\n\treturn stores as ResourceStores<T, TRelations>;\n}\n\n/**\n * Creates a simple single store (non-factory version for simpler use cases)\n *\n * @example\n * ```typescript\n * import { shared } from '@it-astro:request-nanostores';\n * import { createStore } from '@htlkg/data/stores';\n *\n * export const $currentUser = createStore<User>(shared, 'currentUser');\n * ```\n */\nexport function createStore<T>(\n\tshared: SharedFn,\n\tname: string,\n\tdefaultValue: T[] = [],\n): WritableAtom<readonly T[]> {\n\treturn shared(name, atom<T[]>(defaultValue));\n}\n\n/**\n * Creates a single-value store (for non-array values like current user)\n *\n * @example\n * ```typescript\n * import { shared } from '@it-astro:request-nanostores';\n * import { createSingleStore } from '@htlkg/data/stores';\n *\n * export const $currentUser = createSingleStore<User | null>(shared, 'currentUser', null);\n * ```\n */\nexport function createSingleStore<T>(\n\tshared: SharedFn,\n\tname: string,\n\tdefaultValue: T,\n): WritableAtom<T> {\n\treturn shared(name, atom<T>(defaultValue));\n}\n\n/**\n * Helper to create typed store with proper inference\n */\nexport type InferStoreType<TStore extends WritableAtom<any>> = TStore extends WritableAtom<infer T>\n\t? T\n\t: never;\n"],"mappings":"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","names":["buildFilter","fetch","buildFilter","buildFilter","buildFilter"]}