@pfm-platform/shared 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +424 -414
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3869 -982
- package/dist/index.d.ts +3869 -982
- package/dist/index.js +396 -397
- package/dist/index.js.map +1 -1
- package/package.json +8 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/contexts/AppModeContext.tsx","../src/schemas/account.ts","../src/schemas/transaction.ts","../src/schemas/cashflow-event.ts","../src/schemas/budget.ts","../src/schemas/goal.ts","../src/schemas/user.ts","../src/schemas/tag.ts","../src/schemas/alert.ts","../src/schemas/notification.ts","../src/schemas/partner.ts","../src/schemas/expense.ts","../src/schemas/networth.ts","../src/schemas/aggregation.ts","../src/utils/chartUtils.ts","../src/utils/animations.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * App Mode Context\n *\n * Provides application mode switching between 'admin' and 'user' modes.\n *\n * - **Admin Mode**: Relaxed validation for test data creation and development\n * - **User Mode**: Full business rules and validation for production use\n *\n * Usage:\n * ```tsx\n * // In test/admin application (component-demo):\n * <AppModeProvider initialMode=\"admin\">\n * <App />\n * </AppModeProvider>\n *\n * // In production application:\n * <AppModeProvider initialMode=\"user\">\n * <App />\n * </AppModeProvider>\n *\n * // In components:\n * const { mode, setMode } = useAppMode();\n * if (mode === 'admin') {\n * // Show admin-only features\n * }\n * ```\n */\n\nimport { createContext, useContext, useState, type ReactNode } from 'react';\n\n/**\n * Application mode type\n *\n * - `admin`: Test data creation mode with relaxed validation\n * - `user`: Production mode with full business rules\n */\nexport type AppMode = 'admin' | 'user';\n\n/**\n * App Mode Context value interface\n */\nexport interface AppModeContextValue {\n /** Current application mode */\n mode: AppMode;\n /** Function to change application mode */\n setMode: (mode: AppMode) => void;\n}\n\n/**\n * App Mode Context\n *\n * Default context with 'user' mode\n */\nexport const AppModeContext = createContext<AppModeContextValue>({\n mode: 'user',\n setMode: () => {\n console.warn('AppModeContext.setMode called outside of AppModeProvider');\n },\n});\n\n/**\n * Props for AppModeProvider\n */\nexport interface AppModeProviderProps {\n /** Child components */\n children: ReactNode;\n /** Initial mode (default: 'user') */\n initialMode?: AppMode;\n}\n\n/**\n * App Mode Provider Component\n *\n * Provides application mode context to all child components.\n * Wrap your application root with this provider.\n *\n * @example\n * ```tsx\n * // Admin/Test application\n * <AppModeProvider initialMode=\"admin\">\n * <ComponentDemo />\n * </AppModeProvider>\n *\n * // Production application\n * <AppModeProvider initialMode=\"user\">\n * <ProductionApp />\n * </AppModeProvider>\n * ```\n */\nexport function AppModeProvider({\n children,\n initialMode = 'user',\n}: AppModeProviderProps) {\n const [mode, setMode] = useState<AppMode>(initialMode);\n\n return (\n <AppModeContext.Provider value={{ mode, setMode }}>\n {children}\n </AppModeContext.Provider>\n );\n}\n\n/**\n * Hook to access App Mode context\n *\n * Must be used within AppModeProvider\n *\n * @returns Current app mode and setter function\n * @throws Error if used outside AppModeProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { mode, setMode } = useAppMode();\n *\n * return (\n * <div>\n * <p>Current mode: {mode}</p>\n * {mode === 'admin' && <AdminPanel />}\n * <button onClick={() => setMode('admin')}>\n * Switch to Admin\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAppMode(): AppModeContextValue {\n const context = useContext(AppModeContext);\n\n if (!context) {\n throw new Error('useAppMode must be used within AppModeProvider');\n }\n\n return context;\n}\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Account types from legacy API\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/accounts.json\n * Note: 15 values, not the 7 we assumed in Session 1\n */\nexport const AccountTypeSchema = z.enum([\n 'checking',\n 'savings',\n 'cards',\n 'student_loans',\n 'bill',\n 'autos',\n 'home',\n 'investment',\n 'loan',\n 'asset',\n 'cd',\n 'money_market',\n 'certificates',\n 'commercial',\n 'creditline',\n]);\n\n/**\n * Account state from legacy API\n * Source: ~/code/pfm-platform/services/validator/specs/openapi-spec/components/schemas/Account.yaml\n */\nexport const AccountStateSchema = z.enum([\n 'active',\n 'closed',\n 'archived',\n 'pending_deletion',\n]);\n\n/**\n * Aggregation type from legacy API\n */\nexport const AggregationTypeSchema = z.enum([\n 'finicity',\n 'cashedge',\n 'partner',\n]);\n\n/**\n * Preferred balance type from legacy API\n */\nexport const PreferredBalanceTypeSchema = z.enum([\n 'Available',\n 'Current',\n 'Outstanding',\n]);\n\n// ============================================================================\n// NESTED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Financial institution reference\n * Note: Exists in API response but not in Prisma (JOINed in route handler)\n */\nexport const FinancialInstitutionSchema = z.object({\n id: z.number().int(),\n name: z.string(),\n}).nullable();\n\n/**\n * CashEdge account type mapping\n * Note: Exists in API response but not in Prisma\n */\nexport const CashEdgeAccountTypeSchema = z.object({\n name: z.string(),\n acct_type: z.string(),\n ext_type: z.string(),\n group: z.string(),\n}).nullable();\n\n/**\n * Account error information\n * Note: Exists in API response but not in Prisma\n */\nexport const AccountErrorSchema = z.object({\n message: z.string(),\n code: z.string(),\n actionable: z.boolean(),\n description: z.string().optional(), // Finicity-specific field\n}).nullable();\n\n/**\n * Other balance information\n */\nexport const OtherBalanceSchema = z.object({\n balance_type: z.string(),\n balance: z.string().regex(/^\\d+\\.\\d+$/),\n});\n\n// ============================================================================\n// BASE ACCOUNT SCHEMA\n// ============================================================================\n\n/**\n * Account schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/accounts.json\n *\n * CRITICAL: This matches the ACTUAL API response, not assumptions\n * - IDs are integers (e.g., 41), NOT UUIDs\n * - Balance is string \"13172.66\", NOT number\n * - Field names are account_type and state, NOT type and status\n * - Nested objects (fi, cashedge_account_type, error) included\n */\nexport const AccountSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.number().int().positive(),\n name: z.string().min(1),\n\n // ========================================\n // Balance Fields (STRINGS, not numbers!)\n // ========================================\n balance: z.string().regex(/^-?\\d+\\.\\d{1,2}$/, {\n message: 'Balance must be a string in format \"1234.56\" with 1-2 decimal places',\n }),\n locked_balance: z.string().regex(/^-?\\d+\\.\\d+$/).nullable().optional(),\n preferred_balance_type: PreferredBalanceTypeSchema.nullable().optional(),\n\n // ========================================\n // Type and State\n // ========================================\n account_type: AccountTypeSchema,\n display_account_type: z.string().optional(),\n state: AccountStateSchema,\n\n // ========================================\n // Aggregation Fields\n // ========================================\n aggregation_type: AggregationTypeSchema,\n reference_id: z.string().optional(),\n harvest_updated_at: z.string().datetime().nullable(),\n\n // ========================================\n // Include Flags (6 booleans)\n // ========================================\n include_in_expenses: z.boolean(),\n include_in_budget: z.boolean(),\n include_in_cashflow: z.boolean(),\n include_in_dashboard: z.boolean(),\n include_in_goals: z.boolean(),\n include_in_networth: z.boolean(),\n\n // ========================================\n // Nested Objects\n // ========================================\n fi: FinancialInstitutionSchema,\n cashedge_account_type: CashEdgeAccountTypeSchema,\n error: AccountErrorSchema.optional(),\n other_balances: z.array(OtherBalanceSchema).optional(),\n});\n\n/**\n * Accounts list response schema\n * Used for GET /users/{userId}/accounts/all endpoint\n */\nexport const AccountsResponseSchema = z.object({\n accounts: z.array(AccountSchema),\n});\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Account creation schema - Admin mode\n * Minimal validation for test data creation\n * Allows creating accounts with basic required fields only\n */\nexport const AccountCreateSchemaAdmin = z.object({\n name: z.string().optional().default('Test Account'),\n balance: z.string().optional().default('1000.00'),\n account_type: AccountTypeSchema.optional().default('checking'),\n state: AccountStateSchema.optional().default('active'),\n aggregation_type: AggregationTypeSchema.optional().default('partner'),\n // Include flags - all optional with defaults\n include_in_expenses: z.boolean().optional().default(true),\n include_in_budget: z.boolean().optional().default(true),\n include_in_cashflow: z.boolean().optional().default(true),\n include_in_dashboard: z.boolean().optional().default(true),\n include_in_goals: z.boolean().optional().default(false),\n include_in_networth: z.boolean().optional().default(true),\n // Optional fields\n locked_balance: z.string().regex(/^-?\\d+\\.\\d+$/).nullable().optional(),\n preferred_balance_type: PreferredBalanceTypeSchema.nullable().optional(),\n display_account_type: z.string().optional(),\n reference_id: z.string().optional(),\n harvest_updated_at: z.string().datetime().nullable().optional(),\n other_balances: z.array(OtherBalanceSchema).optional().default([]),\n // Nested objects\n fi: FinancialInstitutionSchema.optional(),\n cashedge_account_type: CashEdgeAccountTypeSchema.optional(),\n error: AccountErrorSchema.optional(),\n}).strict();\n\n/**\n * Account creation schema - User mode\n * Full validation with business rules for production use\n * Note: Legacy API doesn't expose id in request body (server-generated)\n * Using .strict() to prevent unknown fields (discovered in Session 1)\n */\nexport const AccountCreateSchemaUser = AccountSchema.omit({\n id: true,\n}).strict();\n\n// Backward compatibility - alias to user mode for existing code\nexport const AccountCreateSchema = AccountCreateSchemaUser;\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Account update schema\n * Note: Legacy API requires id, all other fields optional\n */\nexport const AccountUpdateSchema = AccountSchema.partial().required({\n id: true,\n});\n\n// ============================================================================\n// DELETE AND ARCHIVE SCHEMAS\n// ============================================================================\n\n/**\n * Account delete schema\n * Endpoint: DELETE /users/{userId}/accounts/{id}\n * Simple id-only schema (id comes from URL path)\n */\nexport const AccountDeleteSchema = z.object({\n id: z.number().int().positive(),\n});\n\n/**\n * Account archive schema\n * Endpoint: PUT /users/{userId}/accounts/{id}/archive\n * Simple id-only schema (id comes from URL path)\n */\nexport const AccountArchiveSchema = z.object({\n id: z.number().int().positive(),\n});\n\n// ============================================================================\n// PENDING ACCOUNTS SCHEMAS\n// ============================================================================\n\n/**\n * Pending account schema\n * Returned after aggregation when accounts need classification\n */\nexport const PendingAccountSchema = z.object({\n account_ids: z.array(z.number().int()),\n institution_id: z.number().int(),\n});\n\n/**\n * Pending accounts response\n * Endpoint: GET /users/{userId}/pending_accounts\n */\nexport const PendingAccountsResponseSchema = z.object({\n pending_accounts: z.array(PendingAccountSchema),\n});\n\n/**\n * Delete pending account schema\n * Endpoint: DELETE /users/{userId}/pending_accounts/{accountId}\n * Simple id-only schema (id comes from URL path)\n */\nexport const PendingAccountDeleteSchema = z.object({\n accountId: z.number().int().positive(),\n});\n\n// ============================================================================\n// INVESTMENT SCHEMAS\n// ============================================================================\n\n/**\n * Investment holding schema\n * Individual security/position in investment account\n * Note: Structure based on typical investment account responses\n */\nexport const InvestmentHoldingSchema = z.object({\n symbol: z.string(),\n description: z.string().optional(),\n quantity: z.number().finite(),\n price: z.number().finite().positive(),\n value: z.string().regex(/^\\d+\\.\\d{2}$/), // String format like other amounts\n cost_basis: z.string().regex(/^\\d+\\.\\d{2}$/).optional(),\n unrealized_gain_loss: z.string().regex(/^-?\\d+\\.\\d{2}$/).optional(),\n});\n\n/**\n * Investment schema\n * Container for investment holdings\n */\nexport const InvestmentSchema = z.object({\n account_id: z.number().int(),\n holdings: z.array(InvestmentHoldingSchema),\n total_value: z.string().regex(/^\\d+\\.\\d{2}$/),\n});\n\n/**\n * Investments response schema\n * Endpoint: GET /users/{userId}/accounts/{id}/investments\n */\nexport const InvestmentsResponseSchema = z.object({\n investments: z.array(InvestmentSchema),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Transaction type from legacy API\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/accountTransactions.json\n */\nexport const TransactionTypeSchema = z.enum(['Debit', 'Credit']);\n\n// ============================================================================\n// NESTED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Transaction tag (category) with split amount\n * Tags allow transactions to be categorized, with support for split transactions\n */\nexport const TransactionTagSchema = z.object({\n name: z.string(),\n balance: z.number().finite(),\n});\n\n/**\n * Links to related resources\n */\nexport const TransactionLinksSchema = z.object({\n account: z.number().int(),\n});\n\n// ============================================================================\n// BASE TRANSACTION SCHEMA\n// ============================================================================\n\n/**\n * Transaction schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/accountTransactions.json\n *\n * CRITICAL DIFFERENCES FROM ACCOUNT SCHEMA:\n * - ID is string format \"YYYY_MM_DD_referenceId_accountId\" (NOT integer)\n * - balance is NUMBER (NOT string) - unlike Account schema\n * - OpenAPI spec shows string but legacy data uses number - following legacy (PRIMARY source)\n */\nexport const TransactionSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.string().regex(/^\\d{4}_\\d{2}_\\d{2}_\\w+_\\d+$/, {\n message: 'Transaction ID must be in format YYYY_MM_DD_referenceId_accountId',\n }),\n reference_id: z.string(),\n\n // ========================================\n // Transaction Details\n // ========================================\n transaction_type: TransactionTypeSchema,\n memo: z.string().nullable().optional(),\n balance: z.number().finite().positive(), // NUMBER in legacy data, not string\n\n // ========================================\n // Timestamps\n // ========================================\n // Note: Legacy uses RFC 3339 format with offset (e.g., \"2020-08-06T00:00:00.000+00:00\")\n // Zod's .datetime() is too strict (requires 'Z'), so we use string validation\n posted_at: z.string(),\n created_at: z.string(),\n deleted_at: z.string().nullable().optional(),\n\n // ========================================\n // Names\n // ========================================\n nickname: z.string(),\n original_name: z.string(),\n\n // ========================================\n // Optional Fields\n // ========================================\n check_number: z.string().nullable().optional(),\n\n // ========================================\n // Nested Objects\n // ========================================\n tags: z.array(TransactionTagSchema),\n links: TransactionLinksSchema,\n});\n\n// ============================================================================\n// RESPONSE SCHEMAS\n// ============================================================================\n\n/**\n * Transactions response schema - array of transactions\n * Used by search endpoint: GET /users/:userId/transactions/search\n */\nexport const TransactionsResponseSchema = z.object({\n transactions: z.array(TransactionSchema),\n});\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Transaction creation schema - Admin mode\n * Minimal validation for test data creation\n * Allows creating transactions with basic required fields\n */\nexport const TransactionCreateSchemaAdmin = z.object({\n reference_id: z.string(),\n transaction_type: TransactionTypeSchema,\n balance: z.number().positive(),\n posted_at: z.string(),\n nickname: z.string().optional().default('Test Transaction'),\n original_name: z.string().optional().default('Test Transaction'),\n memo: z.string().nullable().optional(),\n check_number: z.string().nullable().optional(),\n deleted_at: z.string().nullable().optional(),\n tags: z.array(TransactionTagSchema).optional().default([]),\n links: TransactionLinksSchema,\n}).strict();\n\n/**\n * Transaction creation schema - User mode\n * Full validation with business rules for production use\n * Note: id is server-generated, created_at is server-generated\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const TransactionCreateSchemaUser = TransactionSchema.omit({\n id: true,\n created_at: true,\n}).strict();\n\n// Backward compatibility - alias to user mode for existing code\nexport const TransactionCreateSchema = TransactionCreateSchemaUser;\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Transaction update schema\n * Note: Partial update with required id\n * Based on legacy API updateTransaction function - only nickname and tags can be updated\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const TransactionUpdateSchema = TransactionSchema.pick({\n id: true,\n nickname: true,\n tags: true,\n}).strict();\n\n// ============================================================================\n// TRANSACTION TAGGING SCHEMAS\n// ============================================================================\n\n/**\n * Transaction tagging - Regular (non-split)\n * Applies single or multiple tags to entire transaction\n */\nexport const TransactionTaggingRegularSchema = z.object({\n type: z.literal('regular'),\n repeat: z.boolean(), // Apply to all future matching transactions\n regular: z.array(z.string()), // Tag names\n});\n\n/**\n * Transaction tagging - Split\n * Splits transaction amount across multiple tags\n */\nexport const TransactionTaggingSplitItemSchema = z.object({\n name: z.string(), // Tag name\n value: z.number().finite().positive(), // Split amount\n});\n\nexport const TransactionTaggingSplitSchema = z.object({\n type: z.literal('split'),\n split: z.array(TransactionTaggingSplitItemSchema),\n});\n\n/**\n * Transaction tagging discriminated union\n * Endpoint: PUT /users/{userId}/transactions/{id}\n */\nexport const TransactionTaggingSchema = z.discriminatedUnion('type', [\n TransactionTaggingRegularSchema,\n TransactionTaggingSplitSchema,\n]);\n\n// ============================================================================\n// SEARCH SCHEMAS\n// ============================================================================\n\n/**\n * Transaction search parameters\n * Endpoint: GET /users/{userId}/transactions/search\n */\nexport const TransactionSearchParamsSchema = z.object({\n begin_on: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/), // RFC 3339 date \"2020-01-01\"\n end_on: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/), // RFC 3339 date \"2020-12-31\"\n q: z.string().optional(), // Search query\n untagged: z.enum(['0', '1']).optional(), // \"0\" = false, \"1\" = true\n tags: z.array(z.string()).optional(), // Filter by tag names\n});\n\n// ============================================================================\n// DELETE SCHEMA\n// ============================================================================\n\n/**\n * Transaction delete schema\n * Endpoint: DELETE /users/{userId}/transactions/{id}\n * Simple id-only schema (id comes from URL path)\n */\nexport const TransactionDeleteSchema = z.object({\n id: z.string().regex(/^\\d{4}_\\d{2}_\\d{2}_\\w+_\\d+$/, {\n message: 'Transaction ID must be in format YYYY_MM_DD_referenceId_accountId',\n }),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Cashflow event type - Bill (outflow) or Income (inflow)\n */\nexport const CashflowEventTypeSchema = z.enum(['bill', 'income']);\n\n/**\n * Recurrence frequency\n */\nexport const RecurrenceFrequencySchema = z.enum([\n 'once',\n 'weekly',\n 'biweekly',\n 'monthly',\n 'quarterly',\n 'yearly',\n]);\n\n// ============================================================================\n// BASE SCHEMA\n// ============================================================================\n\n/**\n * Cashflow Event schema for upcoming bills and recurring income\n *\n * Represents scheduled transactions that haven't occurred yet:\n * - Bills to be paid\n * - Income to be received\n * - Recurring/one-time events\n *\n * Design Notes:\n * - Lightweight schema for MVP cashflow tracking\n * - Extends transaction concept with scheduling\n * - Supports recurring patterns\n */\nexport const CashflowEventSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.string().uuid(),\n event_id: z.string(), // Links to recurring series if applicable\n\n // ========================================\n // Event Details\n // ========================================\n name: z.string().min(1).max(255),\n amount: z.number().finite().positive(),\n memo: z.string().nullable().optional(),\n\n // ========================================\n // Scheduling\n // ========================================\n scheduled_date: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, {\n message: 'Scheduled date must be in format YYYY-MM-DD',\n }),\n\n // ========================================\n // Type and Status\n // ========================================\n event_type: CashflowEventTypeSchema,\n is_paid: z.boolean().default(false),\n is_recurring: z.boolean().default(false),\n recurrence_frequency: RecurrenceFrequencySchema.optional(),\n\n // ========================================\n // Metadata\n // ========================================\n created_at: z.string(),\n updated_at: z.string(),\n\n // ========================================\n // Links\n // ========================================\n account_id: z.number().int().nullable().optional(),\n transaction_id: z.string().nullable().optional(), // Links to actual transaction when paid\n});\n\n// ============================================================================\n// CREATE SCHEMA\n// ============================================================================\n\n/**\n * Create cashflow event schema\n * Server generates: id, created_at, updated_at\n */\nexport const CashflowEventCreateSchema = CashflowEventSchema.omit({\n id: true,\n created_at: true,\n updated_at: true,\n transaction_id: true, // Cannot link to transaction at creation\n}).strict();\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Update cashflow event schema\n * Allows updating event details and payment status\n */\nexport const CashflowEventUpdateSchema = CashflowEventSchema.pick({\n id: true,\n name: true,\n amount: true,\n memo: true,\n scheduled_date: true,\n is_paid: true,\n}).strict();\n\n// ============================================================================\n// FILTER SCHEMA\n// ============================================================================\n\n/**\n * Filter cashflow events by date range and type\n */\nexport const CashflowEventFilterSchema = z.object({\n start_date: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n end_date: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n event_type: z.enum(['all', 'bill', 'income']).default('all'),\n include_paid: z.boolean().default(false),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Cashflow events response - array of events\n */\nexport const CashflowEventsResponseSchema = z.object({\n events: z.array(CashflowEventSchema),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Budget state based on spending progress\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/budgets.js\n */\nexport const BudgetStateSchema = z.enum(['under', 'risk', 'over']);\n\n// ============================================================================\n// NESTED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Links to related resources\n */\nexport const BudgetLinksSchema = z.object({\n accounts: z.array(z.number().int()),\n budget_histories: z.array(z.number().int()),\n});\n\n// ============================================================================\n// BASE BUDGET SCHEMA\n// ============================================================================\n\n/**\n * Budget schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/budgets.js\n *\n * CRITICAL DIFFERENCES FROM OPENAPI:\n * - spent is NUMBER (NOT string) - legacy data shows integers\n * - budget_amount is NUMBER (NOT string) - legacy data shows integers\n * - OpenAPI shows oneOf (integer OR string) but legacy only uses integers\n */\nexport const BudgetSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.number().int().positive(),\n\n // ========================================\n // Time Period\n // ========================================\n month: z.number().int().min(1).max(12),\n year: z.number().int(),\n\n // ========================================\n // Budget Details\n // ========================================\n name: z.string().max(255),\n state: BudgetStateSchema,\n spent: z.number().finite(), // NUMBER in legacy data, not string\n budget_amount: z.number().finite().positive(), // NUMBER in legacy data, not string\n\n // ========================================\n // Category Association\n // ========================================\n tag_names: z.array(z.string()),\n\n // ========================================\n // Related Resources\n // ========================================\n links: BudgetLinksSchema,\n});\n\n// ============================================================================\n// RESPONSE SCHEMAS\n// ============================================================================\n\n/**\n * Budgets response schema - array of budgets\n * Used by list endpoint: GET /users/:userId/budgets\n */\nexport const BudgetsResponseSchema = z.object({\n budgets: z.array(BudgetSchema),\n});\n\n// ============================================================================\n// DERIVED SCHEMAS\n// ============================================================================\n\n/**\n * Budget creation schema\n * Note: id is server-generated, month/year/spent/state calculated by server\n * Based on legacy API asBudgetJson function - only these fields sent to server\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const BudgetCreateSchema = z\n .object({\n name: z.string().max(255),\n budget_amount: z.number().finite().positive(),\n tag_names: z.array(z.string()),\n account_list: z.array(z.number().int()).optional(), // Becomes links.accounts in response\n show_on_dashboard: z.boolean().optional(),\n other: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Budget update schema\n * Note: Same fields as create per asBudgetJson function\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const BudgetUpdateSchema = z\n .object({\n id: z.number().int().positive(),\n name: z.string().max(255),\n budget_amount: z.number().finite().positive(),\n tag_names: z.array(z.string()),\n account_list: z.array(z.number().int()).optional(),\n show_on_dashboard: z.boolean().optional(),\n other: z.boolean().optional(),\n })\n .strict();\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Goal state\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/goals.js\n */\nexport const GoalStateSchema = z.enum(['active', 'completed', 'archived']);\n\n/**\n * Goal status based on progress\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/goals.js\n */\nexport const GoalStatusSchema = z.enum(['complete', 'over', 'risk', 'under']);\n\n// ============================================================================\n// NESTED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Links to related resources\n */\nexport const GoalLinksSchema = z.object({\n accounts: z.array(z.number().int()),\n});\n\n// ============================================================================\n// BASE GOAL SCHEMA (SHARED FIELDS)\n// ============================================================================\n\n/**\n * Base schema with fields common to both SavingsGoal and PayoffGoal\n *\n * CRITICAL: Monetary values are STRINGS (like Account, NOT like Transaction/Budget)\n * - initial_value, current_value, target_value: string with decimal pattern\n * - monthly_contribution, remaining_monthly_contribution: string with decimal pattern\n * - Pattern: string balance (Account, Goals) vs number balance (Transaction, Budget)\n */\nconst BaseGoalSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.number().int().positive(),\n\n // ========================================\n // Goal Details\n // ========================================\n name: z.string().max(255),\n state: GoalStateSchema,\n status: GoalStatusSchema,\n\n // ========================================\n // Visual Elements\n // ========================================\n image_name: z.string(),\n image_url: z.string(),\n\n // ========================================\n // Progress Tracking\n // ========================================\n percent_complete: z.number().int().min(0).max(100),\n complete: z.boolean(),\n\n // ========================================\n // Monetary Values (STRINGS with decimal pattern)\n // ========================================\n initial_value: z.string().regex(/^\\d+\\.\\d{2}$/),\n current_value: z.string().regex(/^\\d+\\.\\d{2}$/),\n target_value: z.string().regex(/^\\d+\\.\\d{2}$/),\n monthly_contribution: z.string().regex(/^\\d+\\.\\d{2}$/),\n remaining_monthly_contribution: z.string().regex(/^\\d+\\.\\d{2}$/),\n\n // ========================================\n // Optional Fields\n // ========================================\n current_progress: z.string().regex(/^\\d+\\.\\d{2}$/).optional(),\n target_contribution: z.string().regex(/^\\d+\\.\\d{2}$/).optional(),\n target_completion_on: z.string(), // Date string YYYY-MM-DD\n\n // ========================================\n // Timestamps\n // ========================================\n // Note: Using string validation (not .datetime()) for legacy RFC 3339 format\n created_at: z.string(),\n updated_at: z.string(),\n\n // ========================================\n // Related Resources\n // ========================================\n links: GoalLinksSchema,\n});\n\n// ============================================================================\n// SAVINGS GOAL SCHEMA\n// ============================================================================\n\n/**\n * Savings goal schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/goals.js\n *\n * Savings goals save TO a target amount (building up savings)\n */\nexport const SavingsGoalSchema = BaseGoalSchema.extend({\n // Savings goals may have weight for distributing account balance\n weight: z.number().int().min(1).max(99).optional(),\n});\n\n// ============================================================================\n// PAYOFF GOAL SCHEMA\n// ============================================================================\n\n/**\n * Payoff goal schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/goals.js\n *\n * Payoff goals pay DOWN from an initial balance (paying off debt)\n */\nexport const PayoffGoalSchema = BaseGoalSchema;\n\n// ============================================================================\n// DERIVED SCHEMAS\n// ============================================================================\n\n/**\n * Goal creation schema (shared for both types)\n * Note: id, timestamps, progress fields are server-generated\n * Based on legacy API createGoal function - removes id from payload\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const GoalCreateSchema = z\n .object({\n name: z.string().max(255),\n state: GoalStateSchema.optional(),\n image_name: z.string(),\n target_value: z.string().regex(/^\\d+\\.\\d{2}$/),\n target_completion_on: z.string().optional(),\n target_contribution: z.string().regex(/^\\d+\\.\\d{2}$/).optional(),\n account_ids: z.array(z.number().int()).optional(), // Becomes links.accounts in response\n })\n .strict();\n\n/**\n * Goal update schema\n * Note: Same fields as create per updateGoal function (removes id from payload)\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const GoalUpdateSchema = z\n .object({\n id: z.number().int().positive(),\n name: z.string().max(255),\n state: GoalStateSchema.optional(),\n image_name: z.string(),\n target_value: z.string().regex(/^\\d+\\.\\d{2}$/),\n target_completion_on: z.string().optional(),\n target_contribution: z.string().regex(/^\\d+\\.\\d{2}$/).optional(),\n account_ids: z.array(z.number().int()).optional(),\n })\n .strict();\n\n// ============================================================================\n// RESPONSE SCHEMAS\n// ============================================================================\n\n/**\n * Savings goals response schema - array of savings goals\n * Used by list endpoint: GET /users/:userId/savings_goals\n */\nexport const SavingsGoalsResponseSchema = z.object({\n savings_goals: z.array(SavingsGoalSchema),\n});\n\n/**\n * Payoff goals response schema - array of payoff goals\n * Used by list endpoint: GET /users/:userId/payoff_goals\n */\nexport const PayoffGoalsResponseSchema = z.object({\n payoff_goals: z.array(PayoffGoalSchema),\n});\n\n/**\n * Goal images response schema - array of image metadata\n * Used by catalog endpoints: GET /savings_goals, GET /payoff_goals\n */\nexport const GoalImagesResponseSchema = z.object({\n images: z.array(\n z.object({\n id: z.number().int().positive(),\n name: z.string(),\n url: z.string(),\n })\n ),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * User sex/gender\n * Source: ~/code/pfm-platform/services/validator/specs/openapi-spec/components/schemas/User.yaml\n */\nexport const UserSexSchema = z.enum(['Male', 'Female']);\n\n// ============================================================================\n// USER SCHEMA\n// ============================================================================\n\n/**\n * User schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/users.json\n *\n * CRITICAL DATA TYPE NOTES:\n * - id: STRING (partner customer ID, not integer like Account/Budget)\n * - login_count: INTEGER (number type)\n * - birth_year: INTEGER (number type)\n * - custom_settings: OBJECT with arbitrary key-value pairs\n * - custom_tags: ARRAY of strings\n * - last_login_at: STRING (RFC 3339 datetime format)\n */\nexport const UserSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.string(), // Partner customer ID (STRING, not integer)\n login: z.string(),\n email: z.string().email(),\n\n // ========================================\n // Login Tracking\n // ========================================\n login_count: z.number().int().nonnegative(),\n last_login_at: z.string(), // RFC 3339 datetime format\n\n // ========================================\n // Customization\n // ========================================\n custom_tags: z.array(z.string()),\n custom_settings: z.object({}).passthrough(), // Arbitrary key-value pairs\n\n // ========================================\n // Profile Information\n // ========================================\n first_name: z.string(),\n last_name: z.string(),\n postal_code: z.string(),\n birth_year: z.number().int().min(1901),\n sex: UserSexSchema,\n\n // ========================================\n // Optional Location Fields\n // ========================================\n // Note: city and state appear in OpenAPI but not in legacy mock data\n city: z.string().optional(),\n state: z.string().optional(),\n});\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * User creation schema - Admin mode\n * Minimal validation for test data creation\n * Allows creating users with basic required fields only\n */\nexport const UserCreateSchemaAdmin = z\n .object({\n login: z.string(),\n email: z.string(), // Simple validation for test data\n first_name: z.string().optional().default('Test'),\n last_name: z.string().optional().default('User'),\n postal_code: z.string().optional().default('00000'),\n birth_year: z.number().int().min(1901).optional().default(1990),\n sex: UserSexSchema.optional().default('Male'),\n custom_tags: z.array(z.string()).optional().default([]),\n custom_settings: z.object({}).passthrough().optional().default({}),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .strict();\n\n/**\n * User creation schema - User mode\n * Full validation with business rules for production use\n * Based on legacy API createUser function - sends user object\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n * Note: id, login_count, last_login_at are server-generated\n */\nexport const UserCreateSchemaUser = z\n .object({\n login: z.string().min(3, 'Login must be at least 3 characters'),\n email: z.string().email('Valid email address required'),\n first_name: z.string().min(1, 'First name is required'),\n last_name: z.string().min(1, 'Last name is required'),\n postal_code: z.string().min(5, 'Valid postal code required'),\n birth_year: z.number().int().min(1901).max(new Date().getFullYear() - 13, 'Must be at least 13 years old'),\n sex: UserSexSchema,\n custom_tags: z.array(z.string()).optional(),\n custom_settings: z.object({}).passthrough().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .strict();\n\n// Backward compatibility - alias to user mode for existing code\nexport const UserCreateSchema = UserCreateSchemaUser;\n\n// ============================================================================\n// UPDATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * User update schema - Admin mode\n * Minimal validation for test data updates\n */\nexport const UserUpdateSchemaAdmin = z\n .object({\n email: z.string().optional(),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n postal_code: z.string().optional(),\n birth_year: z.number().int().min(1901).optional(),\n sex: UserSexSchema.optional(),\n custom_tags: z.array(z.string()).optional(),\n custom_settings: z.object({}).passthrough().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .strict();\n\n/**\n * User update schema - User mode\n * Full validation with business rules for production use\n * Based on legacy API putCurrentUser function - sends user object\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n * Note: id, login, login_count, last_login_at cannot be updated\n */\nexport const UserUpdateSchemaUser = z\n .object({\n email: z.string().email('Valid email address required'),\n first_name: z.string().min(1, 'First name is required'),\n last_name: z.string().min(1, 'Last name is required'),\n postal_code: z.string().min(5, 'Valid postal code required'),\n birth_year: z.number().int().min(1901).max(new Date().getFullYear() - 13, 'Must be at least 13 years old'),\n sex: UserSexSchema,\n custom_tags: z.array(z.string()).optional(),\n custom_settings: z.object({}).passthrough().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .strict();\n\n// Backward compatibility - alias to user mode for existing code\nexport const UserUpdateSchema = UserUpdateSchemaUser;\n","import { z } from 'zod';\n\n// ============================================================================\n// TAG SCHEMAS\n// ============================================================================\n\n/**\n * Tag schemas matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/tags.json\n *\n * CRITICAL NOTES:\n * - Tags are simple arrays of strings\n * - Two types: defaultTags (system-provided) and userTags (includes custom tags)\n * - API endpoints: GET /tags (default), GET /users/:userId/tags (user tags)\n * - Update: PUT /users/:userId/tags with array of tag names\n */\n\n/**\n * User tags response schema\n * Includes both default tags and user-created custom tags\n */\nexport const UserTagsSchema = z.object({\n userTags: z.array(z.string()),\n});\n\n/**\n * Default tags response schema\n * System-provided standard tags for transaction categorization\n */\nexport const DefaultTagsSchema = z.object({\n defaultTags: z.array(z.string()),\n});\n\n/**\n * Combined tags response (for complete legacy data structure)\n */\nexport const TagsResponseSchema = z.object({\n userTags: z.array(z.string()),\n defaultTags: z.array(z.string()),\n});\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Tag update schema\n * Based on legacy API updateTags function - sends array of tag names\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const TagsUpdateSchema = z.array(z.string()).min(0);\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Tag create schema - Admin mode\n * Minimal validation for test data creation\n */\nexport const TagCreateSchemaAdmin = z.object({\n name: z.string(),\n});\n\n/**\n * Tag create schema - User mode\n * Full business rules and validation\n */\nexport const TagCreateSchemaUser = z.object({\n name: z.string()\n .min(1, 'Tag name is required')\n .max(50, 'Tag name must be 50 characters or less')\n .regex(/^[a-zA-Z0-9\\s\\-_]+$/, 'Tag name can only contain letters, numbers, spaces, hyphens, and underscores'),\n});\n\n// ============================================================================\n// DELETE SCHEMAS\n// ============================================================================\n\n/**\n * Tag delete schema\n * Just requires the tag name to delete\n */\nexport const TagDeleteSchema = z.object({\n name: z.string().min(1),\n});\n\n// ============================================================================\n// USAGE STATISTICS SCHEMAS\n// ============================================================================\n\n/**\n * Tag usage statistics item schema\n * Represents usage count for a single tag\n */\nexport const TagUsageStatSchema = z.object({\n tag: z.string(),\n count: z.number().int().nonnegative(),\n});\n\n/**\n * Tag usage statistics response schema\n * Array of tag usage statistics\n */\nexport const TagUsageStatsSchema = z.object({\n stats: z.array(TagUsageStatSchema),\n});\n\n// ============================================================================\n// COLOR CUSTOMIZATION SCHEMAS\n// ============================================================================\n\n/**\n * Tag color schema\n * Hex color code for tag visual customization\n */\nexport const TagColorSchema = z.object({\n color: z.string().regex(/^#[0-9A-Fa-f]{6}$/, 'Color must be a valid hex code'),\n});\n\n// ============================================================================\n// USAGE REPORT SCHEMAS\n// ============================================================================\n\n/**\n * Tag usage data point for time series\n * Represents tag usage count at a specific date\n */\nexport const TagUsageDataPointSchema = z.object({\n date: z.string(), // ISO date string\n count: z.number().int().nonnegative(),\n});\n\n/**\n * Tag usage report for a single tag\n * Contains time series data for usage trends\n */\nexport const TagReportItemSchema = z.object({\n tag: z.string(),\n totalCount: z.number().int().nonnegative(),\n dataPoints: z.array(TagUsageDataPointSchema),\n});\n\n/**\n * Tag usage report response schema\n * Contains usage data for all tags over time\n */\nexport const TagUsageReportSchema = z.object({\n report: z.array(TagReportItemSchema),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Alert type enum\n * Source: ~/code/pfm-platform/apps/legacy/src/api/alerts.js (routeMapping)\n */\nexport const AlertTypeSchema = z.enum([\n 'AccountThresholdAlert',\n 'GoalAlert',\n 'MerchantNameAlert',\n 'SpendingTargetAlert',\n 'TransactionLimitAlert',\n 'UpcomingBillAlert',\n]);\n\n/**\n * Alert source type enum\n * Source: ~/code/pfm-platform/services/validator/specs/openapi-spec/components/schemas/Alert.yaml\n */\nexport const AlertSourceTypeSchema = z.enum([\n 'Account',\n 'Budget',\n 'CashflowTransaction',\n 'PayoffGoal',\n 'SavingsGoal',\n]).nullable();\n\n// ============================================================================\n// NESTED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Alert destinations schema\n * Source: ~/code/pfm-platform/services/validator/specs/openapi-spec/components/schemas/AlertDestinations.yaml\n */\nexport const AlertDestinationsSchema = z.object({\n email_address: z.string().email().nullable(),\n sms_number: z.string().regex(/^\\d{10}$/).nullable(),\n partner_sms_enabled: z.boolean(),\n});\n\n// ============================================================================\n// ALERT SCHEMA\n// ============================================================================\n\n/**\n * Alert schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/alerts.json\n *\n * CRITICAL NOTES:\n * - id: INTEGER (internal DB ID)\n * - source_id: STRING in legacy data (e.g., \"41\"), not integer like OpenAPI suggests\n * - options: Dynamic object with alert-specific config (use .passthrough())\n * - source: Full nested object (Account, Goal, Budget, etc.) - keeping as unknown for flexibility\n * - Legacy data shows source can be deeply nested with full object structure\n */\nexport const AlertSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.number().int().positive(),\n type: AlertTypeSchema,\n\n // ========================================\n // Alert Configuration\n // ========================================\n options: z.object({}).passthrough(), // Dynamic options per alert type\n\n // ========================================\n // Delivery Settings\n // ========================================\n email_delivery: z.boolean(),\n sms_delivery: z.boolean(),\n\n // ========================================\n // Source Object Reference\n // ========================================\n source_type: AlertSourceTypeSchema,\n source_id: z.union([z.string(), z.number().int()]).optional(), // STRING in legacy (\"41\"), but can be int\n\n // ========================================\n // Full Source Object (Nested)\n // ========================================\n // Note: Source is fully nested Account, Goal, Budget, etc. object\n // Using unknown for flexibility since it's a oneOf in OpenAPI\n source: z.unknown().optional(),\n});\n\n// ============================================================================\n// DERIVED SCHEMAS\n// ============================================================================\n\n/**\n * Alert creation schema\n * Based on legacy API createAlert function - uses toJson() which removes id and type\n * Type is determined by route, id is server-generated\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const AlertCreateSchema = z\n .object({\n options: z.object({}).passthrough(),\n email_delivery: z.boolean(),\n sms_delivery: z.boolean(),\n source_type: AlertSourceTypeSchema.optional(),\n source_id: z.union([z.string(), z.number().int()]).optional(),\n })\n .strict();\n\n/**\n * Alert update schema\n * Based on legacy API updateAlert function - uses toJson() which removes id and type\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const AlertUpdateSchema = z\n .object({\n options: z.object({}).passthrough(),\n email_delivery: z.boolean(),\n sms_delivery: z.boolean(),\n source_type: AlertSourceTypeSchema.optional(),\n source_id: z.union([z.string(), z.number().int()]).optional(),\n })\n .strict();\n\n/**\n * Alert destinations update schema\n * Based on legacy API updateDestinations function\n */\nexport const AlertDestinationsUpdateSchema = AlertDestinationsSchema;\n\n// ============================================================================\n// RESPONSE SCHEMAS\n// ============================================================================\n\n/**\n * Alerts response schema - array of alerts\n * Used by list endpoint: GET /users/:userId/alerts\n */\nexport const AlertsResponseSchema = z.object({\n alerts: z.array(AlertSchema),\n});\n","import { z } from 'zod';\nimport { AlertTypeSchema } from './alert.js';\n\n// ============================================================================\n// NOTIFICATION SCHEMA\n// ============================================================================\n\n/**\n * Notification schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/notifications.json\n *\n * CRITICAL NOTES:\n * - Notifications are read-only (GET + DELETE endpoints only)\n * - System-generated based on alert configurations\n * - alert_type references AlertType enum from alerts domain\n * - No create/update schemas (notifications generated by system)\n * - created_at: RFC 3339 datetime string\n */\nexport const NotificationSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.number().int().positive(),\n\n // User ID - links notification to specific user\n user_id: z.string(),\n\n // Alert ID - references the source alert that triggered this notification\n alert_id: z.number().int().positive(),\n\n // ========================================\n // Notification Content\n // ========================================\n message: z.string(),\n\n // ========================================\n // Alert Reference\n // ========================================\n // Links to Alert domain - uses same AlertType enum\n alert_type: AlertTypeSchema,\n\n // ========================================\n // Read Status\n // ========================================\n // Tracks whether user has read this notification\n is_read: z.boolean().default(false),\n\n // ========================================\n // Timestamps\n // ========================================\n // RFC 3339 datetime string (e.g., \"2018-01-01T16:54:15Z\")\n created_at: z.string(),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Notifications list response schema\n * API returns notifications array wrapper\n */\nexport const NotificationsResponseSchema = z.object({\n notifications: z.array(NotificationSchema),\n});\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Notification create schema - Admin mode\n * Minimal validation for test data creation\n * Allows creating notifications manually for testing purposes\n */\nexport const NotificationCreateSchemaAdmin = z.object({\n message: z.string(),\n alert_type: AlertTypeSchema,\n created_at: z.string().optional(), // Optional, defaults to now\n});\n\n/**\n * Notification create schema - User mode\n * Notifications are system-generated, users cannot create them\n */\nexport const NotificationCreateSchemaUser = z.never();\n\n// ============================================================================\n// UPDATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Notification update schema - Admin mode\n * Allows updating notification message for testing\n */\nexport const NotificationUpdateSchemaAdmin = z.object({\n message: z.string().optional(),\n alert_type: AlertTypeSchema.optional(),\n});\n\n/**\n * Notification update schema - User mode\n * Users can mark notifications as read/unread\n */\nexport const NotificationUpdateSchemaUser = z.object({\n is_read: z.boolean().optional(),\n});\n\n// ============================================================================\n// NOTIFICATION PREFERENCES SCHEMA\n// ============================================================================\n\n/**\n * Notification frequency options\n */\nexport const NotificationFrequencySchema = z.enum(['realtime', 'daily', 'weekly']);\n\nexport type NotificationFrequency = z.infer<typeof NotificationFrequencySchema>;\n\n/**\n * User notification preferences schema\n */\nexport const NotificationPreferencesSchema = z.object({\n emailNotifications: z.boolean(),\n pushNotifications: z.boolean(),\n frequency: NotificationFrequencySchema,\n});\n\nexport type NotificationPreferences = z.infer<typeof NotificationPreferencesSchema>;\n\n/**\n * Notification preferences update schema\n */\nexport const NotificationPreferencesUpdateSchema = z.object({\n emailNotifications: z.boolean().optional(),\n pushNotifications: z.boolean().optional(),\n frequency: NotificationFrequencySchema.optional(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// PARTNER SCHEMA\n// ============================================================================\n\n/**\n * Partner schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/partners.json\n *\n * CRITICAL NOTES:\n * - Partners are read-only configuration (GET endpoint only)\n * - OpenAPI schema has DIFFERENT fields than legacy data (name, logo_url vs product_name, browser_title)\n * - Legacy is SOURCE OF TRUTH - using actual fields from mock data\n * - modules: Dynamic nested object with partner-specific configuration\n * - featured_searches: Array of search configurations (empty in mock)\n */\nexport const PartnerSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.number().int().positive(),\n\n // ========================================\n // Partner Configuration\n // ========================================\n domain: z.string(),\n product_name: z.string(),\n browser_title: z.string(),\n\n // ========================================\n // Feature Flags\n // ========================================\n partner_alerts_enabled: z.boolean(),\n demo: z.boolean(),\n\n // ========================================\n // Dynamic Configuration Objects\n // ========================================\n // Modules contains partner-specific feature configuration\n // Structure varies by partner (aggregation, mobile, etc.)\n modules: z.object({}).passthrough(),\n\n // Featured searches configuration array\n featured_searches: z.array(z.unknown()),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Partners list response schema\n * API returns partners array wrapper\n * Note: Typically contains single partner (current partner)\n */\nexport const PartnersResponseSchema = z.object({\n partners: z.array(PartnerSchema),\n});\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Partner create schema - Admin mode\n * Minimal validation for test data creation\n * Allows creating partner configuration manually for testing purposes\n */\nexport const PartnerCreateSchemaAdmin = z.object({\n domain: z.string(),\n product_name: z.string(),\n browser_title: z.string(),\n partner_alerts_enabled: z.boolean().optional().default(false),\n demo: z.boolean().optional().default(false),\n modules: z.object({}).passthrough().optional().default({}),\n featured_searches: z.array(z.unknown()).optional().default([]),\n});\n\n/**\n * Partner create schema - User mode\n * Partners are configuration data, users cannot create them\n */\nexport const PartnerCreateSchemaUser = z.never();\n\n// ============================================================================\n// UPDATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Partner update schema - Admin mode\n * Allows updating partner configuration for testing\n */\nexport const PartnerUpdateSchemaAdmin = z.object({\n domain: z.string().optional(),\n product_name: z.string().optional(),\n browser_title: z.string().optional(),\n partner_alerts_enabled: z.boolean().optional(),\n demo: z.boolean().optional(),\n modules: z.object({}).passthrough().optional(),\n featured_searches: z.array(z.unknown()).optional(),\n});\n\n/**\n * Partner update schema - User mode\n * Partners are configuration data, users cannot update them\n */\nexport const PartnerUpdateSchemaUser = z.never();\n\n// ============================================================================\n// DELETE SCHEMA\n// ============================================================================\n\n/**\n * Partner delete schema\n * Requires partner ID for deletion\n */\nexport const PartnerDeleteSchema = z.object({\n id: z.number().int().positive(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// EXPENSE SCHEMA\n// ============================================================================\n\n/**\n * Expense schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/api/data/expenses.json\n *\n * CRITICAL NOTES:\n * - Expenses are read-only aggregated data (GET endpoint only with date range filters)\n * - Computed from transaction data grouped by tag\n * - OpenAPI has additional fields (percentage, transaction_count) NOT in legacy data\n * - Legacy is SOURCE OF TRUTH - only tag and amount present\n * - amount: STRING with decimal format (like Account, Goal amounts)\n * - tag: References tag names from tags domain (but not enforced as enum)\n */\nexport const ExpenseSchema = z.object({\n // ========================================\n // Tag Reference\n // ========================================\n // Transaction tag/category name\n // Uses lowercase tag names (health, diningout, insurance, etc.)\n tag: z.string(),\n\n // ========================================\n // Aggregated Amount\n // ========================================\n // Total expense amount for this tag in the period\n // STRING with decimal format: \"1.74\", \"102.19\", \"1219.83\"\n amount: z.string().regex(/^\\d+\\.\\d{2}$/),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Expenses list response schema\n * API returns expenses array wrapper\n * Aggregated by tag for the specified date range\n */\nexport const ExpensesResponseSchema = z.object({\n expenses: z.array(ExpenseSchema),\n});\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Expense create schema - Admin mode\n * Minimal validation for test data creation\n * Allows creating expense records manually for testing purposes\n */\nexport const ExpenseCreateSchemaAdmin = z.object({\n tag: z.string(),\n amount: z.string(), // Will be formatted to 2 decimal places\n});\n\n/**\n * Expense create schema - User mode\n * Expenses are computed from transactions, users cannot create them directly\n */\nexport const ExpenseCreateSchemaUser = z.never();\n\n// ============================================================================\n// UPDATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Expense update schema - Admin mode\n * Allows updating expense fields for testing\n */\nexport const ExpenseUpdateSchemaAdmin = z.object({\n amount: z.string().optional(),\n});\n\n/**\n * Expense update schema - User mode\n * Expenses are computed from transactions, users cannot update them\n */\nexport const ExpenseUpdateSchemaUser = z.never();\n\n// ============================================================================\n// DELETE SCHEMA\n// ============================================================================\n\n/**\n * Expense delete schema\n * Requires expense tag for deletion\n */\nexport const ExpenseDeleteSchema = z.object({\n tag: z.string(),\n});\n\n// ============================================================================\n// SEARCH SCHEMA\n// ============================================================================\n\n/**\n * Expense search parameters\n * Endpoint: GET /users/{userId}/expenses\n * Note: All expenses endpoints are read-only (computed from transactions)\n */\nexport const ExpenseSearchParamsSchema = z\n .object({\n begin_on: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(), // RFC 3339 date \"2020-01-01\"\n end_on: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(), // RFC 3339 date \"2020-12-31\"\n threshold: z.number().int().positive().optional(), // Minimum amount filter\n })\n .refine(\n (data) => {\n // If one date is provided, both must be provided\n const hasBeginOn = data.begin_on !== undefined;\n const hasEndOn = data.end_on !== undefined;\n return hasBeginOn === hasEndOn;\n },\n {\n message: 'Both begin_on and end_on must be provided together',\n }\n );\n","import { z } from 'zod';\n\n// ============================================================================\n// NET WORTH SCHEMA\n// ============================================================================\n\n/**\n * Net Worth schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/stores/netWorthStore.js\n * Endpoint: GET /users/{userId}/networth\n *\n * CRITICAL NOTES:\n * - Amounts are STRINGS with decimal format (like Account, Expense schemas)\n * - Meta provides summary totals\n * - Assets and debts are aggregated from accounts + manual net worth accounts\n * - History provides monthly snapshots for trending\n */\n\n// ============================================================================\n// NESTED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Net worth meta (summary totals)\n * All amounts are strings with decimal format\n */\nexport const NetWorthMetaSchema = z.object({\n net_worth: z.string().regex(/^-?\\d+\\.\\d{2}$/),\n net_worth_change: z.string().regex(/^-?\\d+\\.\\d{2}$/),\n total_assets: z.string().regex(/^-?\\d+\\.\\d{2}$/),\n total_debts: z.string().regex(/^-?\\d+\\.\\d{2}$/),\n});\n\n/**\n * Net worth asset item\n * Can be from aggregated account OR manual net worth account\n */\nexport const NetWorthAssetSchema = z.object({\n id: z.number().int(),\n name: z.string(),\n balance: z.string().regex(/^\\d+\\.\\d{2}$/),\n additional_networth_account: z.boolean(), // true = manual account, false = aggregated\n});\n\n/**\n * Net worth debt item\n * Can be from aggregated account OR manual net worth account\n */\nexport const NetWorthDebtSchema = z.object({\n id: z.number().int(),\n name: z.string(),\n balance: z.string().regex(/^\\d+\\.\\d{2}$/),\n additional_networth_account: z.boolean(), // true = manual account, false = aggregated\n});\n\n/**\n * Net worth history (monthly snapshot)\n * Provides historical trending data\n */\nexport const NetWorthHistorySchema = z.object({\n total: z.string().regex(/^-?\\d+\\.\\d{2}$/), // Net worth for month\n total_asset: z.string().regex(/^\\d+\\.\\d{2}$/),\n total_debt: z.string().regex(/^\\d+\\.\\d{2}$/),\n month: z.string().regex(/^\\d{2}$/), // \"04\"\n year: z.string().regex(/^\\d{4}$/), // \"2019\"\n since_last_month: z.string().regex(/^-?\\d+\\.\\d{2}$/), // Change from previous month\n});\n\n// ============================================================================\n// BASE NET WORTH SCHEMA\n// ============================================================================\n\n/**\n * Complete net worth response\n */\nexport const NetWorthSchema = z.object({\n meta: NetWorthMetaSchema,\n assets: z.array(NetWorthAssetSchema),\n debts: z.array(NetWorthDebtSchema),\n networth_histories: z.array(NetWorthHistorySchema),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Net worth response wrapper\n * Note: API returns object directly, not wrapped in array\n */\nexport const NetWorthResponseSchema = NetWorthSchema;\n\n// ============================================================================\n// MANUAL NET WORTH ACCOUNT SCHEMAS\n// ============================================================================\n\n/**\n * Manual net worth account type\n * For assets/debts not tracked via aggregation\n */\nexport const NetWorthAccountTypeSchema = z.enum(['asset', 'debt']);\n\n/**\n * Create manual net worth account\n * Endpoint: POST /users/{userId}/networth/accounts\n */\nexport const NetWorthAccountCreateSchema = z.object({\n networth_account: z.object({\n account_type: NetWorthAccountTypeSchema,\n balance: z.string(), // Will be validated as decimal\n name: z.string().min(1).max(255),\n }),\n});\n\n/**\n * Update manual net worth account\n * Endpoint: PUT /users/{userId}/networth/accounts/{id}\n */\nexport const NetWorthAccountUpdateSchema = z.object({\n networth_account: z.object({\n account_type: NetWorthAccountTypeSchema.optional(),\n balance: z.string().optional(), // Will be validated as decimal\n name: z.string().min(1).max(255).optional(),\n }),\n});\n\n/**\n * Delete manual net worth account\n * Endpoint: DELETE /users/{userId}/networth/accounts/{id}\n * Simple id-only schema (id comes from URL path)\n */\nexport const NetWorthAccountDeleteSchema = z.object({\n id: z.number().int().positive(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// CASHEDGE/AGGREGATION SCHEMAS\n// ============================================================================\n\n/**\n * CashEdge and Finicity aggregation schemas\n * Source: ~/code/pfm-platform/apps/legacy/src/stores/cashedgeStore.js\n *\n * CRITICAL NOTES:\n * - Most requests use application/x-www-form-urlencoded, NOT JSON\n * - Some endpoints are partner-level (no userId)\n * - MFA flows require session state management\n */\n\n// ============================================================================\n// INSTITUTION SCHEMAS\n// ============================================================================\n\n/**\n * Institution login parameter\n * Defines credential inputs required for institution authentication\n */\nexport const InstitutionLoginParameterSchema = z.object({\n parameter_id: z.string(), // e.g., \"username\", \"password\", \"security_question\"\n label: z.string(), // Display label: \"User ID\", \"Password\"\n type: z.string(), // Input type: \"text\", \"password\", \"select\"\n});\n\n/**\n * Institution search metadata\n * Pagination info for institution search results\n */\nexport const InstitutionSearchMetaSchema = z.object({\n page: z.number().int().positive(),\n total_pages: z.number().int().nonnegative(),\n total_results: z.number().int().nonnegative(),\n});\n\n/**\n * Financial institution schema\n * Institution available for account aggregation\n */\nexport const InstitutionSchema = z.object({\n id: z.number().int(),\n name: z.string(),\n home_url: z.string().url(),\n ce_login_parameters: z.array(InstitutionLoginParameterSchema),\n});\n\n/**\n * Institutions response schema\n * Endpoint: GET /ce_fis/search?q={query}&scope={scope}&page={page}\n * Endpoint: GET /ce_fis?page={page}\n * Endpoint: GET /ce_fis/{id}\n */\nexport const InstitutionsResponseSchema = z.object({\n ce_fis: z.array(InstitutionSchema),\n meta: InstitutionSearchMetaSchema,\n});\n\n// ============================================================================\n// AUTHENTICATION SCHEMAS\n// ============================================================================\n\n/**\n * Authenticate institution request\n * Endpoint: POST /users/{userId}/ce_fis\n * Content-Type: application/x-www-form-urlencoded\n *\n * Note: Legacy uses form encoding, not JSON\n * Example: id=101939&credentials[login_params][username]=user&credentials[login_params][password]=pass\n */\nexport const AuthenticateRequestSchema = z.object({\n id: z.number().int(), // Institution ID\n credentials: z.object({\n login_params: z.record(z.string(), z.string()), // Dynamic key-value pairs\n }),\n});\n\n/**\n * Authenticate institution response\n * Returns session IDs for tracking aggregation progress\n */\nexport const AuthenticateResponseSchema = z.object({\n harvest_id: z.string(),\n login_id: z.string(),\n status: z.string(), // \"pending\", \"success\", \"mfa_required\", \"error\"\n});\n\n// ============================================================================\n// MFA SCHEMAS\n// ============================================================================\n\n/**\n * MFA (Multi-Factor Authentication) request\n * Endpoint: PUT /users/{userId}/ce_fis/{institutionId}\n * Content-Type: application/x-www-form-urlencoded\n *\n * Example: harvest_id=H123&login_id=L789&session_key=SK123&mfa_responses[code]=123456\n */\nexport const MFARequestSchema = z.object({\n harvest_id: z.string(),\n login_id: z.string(),\n session_key: z.string(),\n mfa_responses: z.record(z.string(), z.string()), // Dynamic MFA responses\n});\n\n/**\n * MFA response\n */\nexport const MFAResponseSchema = z.object({\n status: z.string(), // \"success\", \"error\", \"pending\"\n message: z.string().optional(),\n});\n\n// ============================================================================\n// CREDENTIAL UPDATE SCHEMAS\n// ============================================================================\n\n/**\n * Update credentials request\n * Endpoint: PUT /users/{userId}/accounts/{accountId}/update_credentials\n * Content-Type: application/x-www-form-urlencoded\n *\n * Example: id=101939&credentials[login_params][username]=newuser&credentials[login_params][password]=newpass\n */\nexport const UpdateCredentialsRequestSchema = z.object({\n id: z.number().int(), // Institution ID\n credentials: z.object({\n login_params: z.record(z.string(), z.string()), // Dynamic key-value pairs\n }),\n});\n\n/**\n * Update credentials response\n */\nexport const UpdateCredentialsResponseSchema = z.object({\n status: z.string(), // \"success\", \"error\"\n message: z.string().optional(),\n});\n\n// ============================================================================\n// ACCOUNT CLASSIFICATION SCHEMAS\n// ============================================================================\n\n/**\n * Classify accounts request\n * Endpoint: PUT /users/{userId}/accounts/classify\n * Content-Type: application/x-www-form-urlencoded\n *\n * Example: accounts[123][type_code]=DDA,DDA&accounts[456][type_code]=SAV,SAV&accounts[789][type_code]=ignore\n *\n * Note: Classifies pending accounts after aggregation\n * type_code format: \"ACCT_TYPE,EXT_TYPE\" or \"ignore\" to skip\n */\nexport const ClassifyAccountsRequestSchema = z.object({\n accounts: z.record(\n z.string(), // Account ID as string key\n z.object({\n type_code: z.string(), // \"DDA,DDA\" or \"SAV,SAV\" or \"ignore\"\n })\n ),\n});\n\n// ============================================================================\n// CASHEDGE LOGIN SESSION SCHEMAS\n// ============================================================================\n\n/**\n * CashEdge login session request\n * Endpoint: POST /users/{userId}/cashedge/login\n *\n * Note: Structure unclear from legacy code, needs investigation\n * Placeholder schema based on typical session patterns\n */\nexport const CashEdgeLoginRequestSchema = z.object({\n session_token: z.string().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * CashEdge login session response\n * Endpoint: GET /users/{userId}/cashedge/login\n * Endpoint: POST /users/{userId}/cashedge/login\n *\n * Note: Structure unclear from legacy code, needs investigation\n * Placeholder schema based on typical session patterns\n */\nexport const CashEdgeLoginResponseSchema = z.object({\n session_id: z.string(),\n session_token: z.string().optional(),\n expires_at: z.string().optional(),\n status: z.string().optional(),\n});\n","/**\n * Chart Utilities\n * Shared utilities for MUI X Charts across all domains\n */\n\nimport { type Theme } from '@mui/material/styles';\n\n/**\n * Currency formatter for chart axes and tooltips\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n}\n\n/**\n * Abbreviated currency formatter for compact displays\n * E.g., $1,234 → $1.2K, $1,234,567 → $1.2M\n */\nexport function formatCurrencyAbbreviated(value: number): string {\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n\n if (absValue >= 1_000_000) {\n return `${sign}$${(absValue / 1_000_000).toFixed(1)}M`;\n }\n if (absValue >= 1_000) {\n return `${sign}$${(absValue / 1_000).toFixed(1)}K`;\n }\n return formatCurrency(value);\n}\n\n/**\n * Percentage formatter for chart labels\n */\nexport function formatPercentage(value: number): string {\n return `${value.toFixed(1)}%`;\n}\n\n/**\n * Get chart color palette from MUI theme\n * Returns an array of colors suitable for pie/donut charts\n */\nexport function getChartColors(theme: Theme): string[] {\n return [\n theme.palette.primary.main,\n theme.palette.secondary.main,\n theme.palette.success.main,\n theme.palette.warning.main,\n theme.palette.error.main,\n theme.palette.info.main,\n theme.palette.primary.light,\n theme.palette.secondary.light,\n theme.palette.success.light,\n theme.palette.warning.light,\n ];\n}\n\n/**\n * Get color by index with wrapping\n * Ensures we always have a color even for large datasets\n */\nexport function getColorByIndex(colors: string[], index: number): string {\n if (colors.length === 0) {\n return '#000000'; // Fallback color if array is empty\n }\n return colors[index % colors.length]!;\n}\n\n/**\n * Chart dimension constants\n * Based on legacy D3 component sizes\n */\nexport const CHART_DIMENSIONS = {\n donut: {\n width: 200,\n height: 200,\n innerRadius: 60,\n outerRadius: 95,\n },\n lineChart: {\n width: 300,\n height: 150,\n margin: { top: 10, right: 20, bottom: 20, left: 50 },\n },\n barChart: {\n width: 300,\n height: 160,\n margin: { top: 20, left: 50, bottom: 40, right: 20 },\n },\n} as const;\n\n/**\n * Common chart props for consistency\n */\nexport interface BaseChartData {\n name: string;\n value: number;\n}\n\n/**\n * Chart theming configuration\n * Provides consistent styling across all charts\n */\nexport function getChartThemeConfig(theme: Theme) {\n return {\n backgroundColor: theme.palette.background.paper,\n textColor: theme.palette.text.primary,\n gridColor: theme.palette.divider,\n tooltipBackgroundColor: theme.palette.background.paper,\n tooltipBorderColor: theme.palette.divider,\n };\n}\n","/**\n * Animation Utilities\n *\n * D3-equivalent animation configurations for Framer Motion.\n * Matches legacy D3 transition timing and easing functions.\n */\n\nimport { Variants, Transition } from 'framer-motion';\n\n/**\n * D3 Transition Durations (matching legacy)\n */\nexport const ANIMATION_DURATIONS = {\n /** Arc/pie slice transitions (D3: 1000ms) */\n arc: 1000,\n\n /** Text transitions (D3: 200ms) */\n text: 200,\n\n /** Meter/progress bar (D3: 600ms) */\n meter: 600,\n\n /** Settings panel slide */\n panel: 300,\n\n /** Tooltip/hover states */\n hover: 150,\n} as const;\n\n/**\n * Easing functions matching D3 defaults\n * D3 uses easeInOut by default for most transitions\n */\nexport const ANIMATION_EASING = {\n /** D3 easeInOut equivalent */\n default: [0.4, 0.0, 0.2, 1],\n\n /** D3 easeOut equivalent */\n easeOut: [0.0, 0.0, 0.2, 1],\n\n /** D3 easeIn equivalent */\n easeIn: [0.4, 0.0, 1, 1],\n\n /** D3 easeLinear equivalent */\n linear: [0.0, 0.0, 1.0, 1.0],\n} as const;\n\n/**\n * Arc/Pie Slice Animation Variants\n * Matches D3 arc enter/update/exit pattern with 1000ms duration\n */\nexport const arcVariants: Variants = {\n initial: {\n opacity: 0,\n scale: 0.8,\n },\n enter: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: ANIMATION_DURATIONS.arc / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n exit: {\n opacity: 0,\n scale: 0.8,\n transition: {\n duration: ANIMATION_DURATIONS.arc / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n hover: {\n scale: 1.05,\n transition: {\n duration: ANIMATION_DURATIONS.hover / 1000,\n ease: ANIMATION_EASING.easeOut,\n },\n },\n selected: {\n scale: 1.1,\n transition: {\n duration: ANIMATION_DURATIONS.hover / 1000,\n ease: ANIMATION_EASING.easeOut,\n },\n },\n};\n\n/**\n * Text Animation Variants\n * Matches D3 text transition with 200ms duration\n */\nexport const textVariants: Variants = {\n initial: {\n opacity: 0,\n y: -10,\n },\n enter: {\n opacity: 1,\n y: 0,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n exit: {\n opacity: 0,\n y: 10,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n selected: {\n y: 5,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n deselected: {\n y: -4,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n};\n\n/**\n * Panel Slide Animation Variants\n * For settings panel and card flipper animations\n */\nexport const panelVariants: Variants = {\n initial: {\n opacity: 0,\n x: 20,\n },\n enter: {\n opacity: 1,\n x: 0,\n transition: {\n duration: ANIMATION_DURATIONS.panel / 1000,\n ease: ANIMATION_EASING.easeOut,\n },\n },\n exit: {\n opacity: 0,\n x: 20,\n transition: {\n duration: ANIMATION_DURATIONS.panel / 1000,\n ease: ANIMATION_EASING.easeIn,\n },\n },\n};\n\n/**\n * Fade Animation Variants\n * For loading states and empty states\n */\nexport const fadeVariants: Variants = {\n initial: {\n opacity: 0,\n },\n enter: {\n opacity: 1,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n};\n\n/**\n * Progress Bar Animation Variants\n * Matches D3 meter transitions (600ms)\n */\nexport const progressVariants: Variants = {\n initial: {\n scaleX: 0,\n transformOrigin: 'left',\n },\n enter: {\n scaleX: 1,\n transition: {\n duration: ANIMATION_DURATIONS.meter / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n exit: {\n scaleX: 0,\n transition: {\n duration: ANIMATION_DURATIONS.meter / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n};\n\n/**\n * List Item Stagger Animation\n * For breakdown table rows and tag lists\n */\nexport const listContainerVariants: Variants = {\n initial: {\n opacity: 0,\n },\n enter: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n delayChildren: 0.1,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n staggerChildren: 0.03,\n staggerDirection: -1,\n },\n },\n};\n\nexport const listItemVariants: Variants = {\n initial: {\n opacity: 0,\n y: 10,\n },\n enter: {\n opacity: 1,\n y: 0,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.easeOut,\n },\n },\n exit: {\n opacity: 0,\n y: -10,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.easeIn,\n },\n },\n};\n\n/**\n * Create custom transition config\n */\nexport function createTransition(\n duration: number,\n ease: readonly number[] = ANIMATION_EASING.default\n): Transition {\n return {\n duration: duration / 1000,\n ease: ease as [number, number, number, number],\n };\n}\n\n/**\n * Spring animation config (alternative to easing)\n * Useful for interactive elements\n */\nexport const SPRING_CONFIG = {\n default: {\n type: 'spring' as const,\n stiffness: 300,\n damping: 30,\n },\n bouncy: {\n type: 'spring' as const,\n stiffness: 400,\n damping: 20,\n },\n slow: {\n type: 'spring' as const,\n stiffness: 200,\n damping: 40,\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/contexts/AppModeContext.tsx","../src/supabase/client.ts","../src/contexts/AuthProvider.tsx","../src/schemas/account.ts","../src/schemas/transaction.ts","../src/schemas/cashflow-event.ts","../src/schemas/budget.ts","../src/schemas/goal.ts","../src/schemas/user.ts","../src/schemas/tag.ts","../src/schemas/alert.ts","../src/schemas/notification.ts","../src/schemas/partner.ts","../src/schemas/expense.ts","../src/schemas/networth.ts","../src/schemas/aggregation.ts","../src/hooks/useAuth.ts","../src/utils/chartUtils.ts","../src/utils/animations.ts"],"names":["createContext","useState","jsx","z","useContext"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * App Mode Context\n *\n * Provides application mode switching between 'admin' and 'user' modes.\n *\n * - **Admin Mode**: Relaxed validation for test data creation and development\n * - **User Mode**: Full business rules and validation for production use\n *\n * Usage:\n * ```tsx\n * // In test/admin application (component-demo):\n * <AppModeProvider initialMode=\"admin\">\n * <App />\n * </AppModeProvider>\n *\n * // In production application:\n * <AppModeProvider initialMode=\"user\">\n * <App />\n * </AppModeProvider>\n *\n * // In components:\n * const { mode, setMode } = useAppMode();\n * if (mode === 'admin') {\n * // Show admin-only features\n * }\n * ```\n */\n\nimport { createContext, useContext, useState, type ReactNode } from 'react';\n\n/**\n * Application mode type\n *\n * - `admin`: Test data creation mode with relaxed validation\n * - `user`: Production mode with full business rules\n */\nexport type AppMode = 'admin' | 'user';\n\n/**\n * App Mode Context value interface\n */\nexport interface AppModeContextValue {\n /** Current application mode */\n mode: AppMode;\n /** Function to change application mode */\n setMode: (mode: AppMode) => void;\n}\n\n/**\n * App Mode Context\n *\n * Default context with 'user' mode\n */\nexport const AppModeContext = createContext<AppModeContextValue>({\n mode: 'user',\n setMode: () => {\n console.warn('AppModeContext.setMode called outside of AppModeProvider');\n },\n});\n\n/**\n * Props for AppModeProvider\n */\nexport interface AppModeProviderProps {\n /** Child components */\n children: ReactNode;\n /** Initial mode (default: 'user') */\n initialMode?: AppMode;\n}\n\n/**\n * App Mode Provider Component\n *\n * Provides application mode context to all child components.\n * Wrap your application root with this provider.\n *\n * @example\n * ```tsx\n * // Admin/Test application\n * <AppModeProvider initialMode=\"admin\">\n * <ComponentDemo />\n * </AppModeProvider>\n *\n * // Production application\n * <AppModeProvider initialMode=\"user\">\n * <ProductionApp />\n * </AppModeProvider>\n * ```\n */\nexport function AppModeProvider({\n children,\n initialMode = 'user',\n}: AppModeProviderProps) {\n const [mode, setMode] = useState<AppMode>(initialMode);\n\n return (\n <AppModeContext.Provider value={{ mode, setMode }}>\n {children}\n </AppModeContext.Provider>\n );\n}\n\n/**\n * Hook to access App Mode context\n *\n * Must be used within AppModeProvider\n *\n * @returns Current app mode and setter function\n * @throws Error if used outside AppModeProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { mode, setMode } = useAppMode();\n *\n * return (\n * <div>\n * <p>Current mode: {mode}</p>\n * {mode === 'admin' && <AdminPanel />}\n * <button onClick={() => setMode('admin')}>\n * Switch to Admin\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAppMode(): AppModeContextValue {\n const context = useContext(AppModeContext);\n\n if (!context) {\n throw new Error('useAppMode must be used within AppModeProvider');\n }\n\n return context;\n}\n","/**\n * Shared Supabase client factory for iCashflow\n *\n * Replaces per-domain axios clients. All data-access hooks\n * import the supabase client from here instead of axios.\n *\n * Usage:\n * import { supabase } from '@pfm-platform/shared';\n *\n * Environment variables (set in .env or Vite config):\n * VITE_SUPABASE_URL - Supabase project URL\n * VITE_SUPABASE_ANON_KEY - Supabase anonymous/public key\n */\n\nimport { createClient } from '@supabase/supabase-js';\nimport type { Database } from '../generated/database.types.js';\n\nconst supabaseUrl = typeof import.meta !== 'undefined'\n ? (import.meta as any).env?.VITE_SUPABASE_URL ?? ''\n : process.env.VITE_SUPABASE_URL ?? '';\n\nconst supabaseAnonKey = typeof import.meta !== 'undefined'\n ? (import.meta as any).env?.VITE_SUPABASE_ANON_KEY ?? ''\n : process.env.VITE_SUPABASE_ANON_KEY ?? '';\n\n/**\n * Typed Supabase client for iCashflow.\n *\n * Provides full type safety via generated Database types.\n * Auth is handled by Supabase's built-in session management —\n * no manual token handling needed (unlike the old axios interceptors).\n */\nexport const supabase = createClient<Database>(\n supabaseUrl || 'http://placeholder.invalid',\n supabaseAnonKey || 'placeholder-key',\n);\n\n/**\n * Create a Supabase client with custom options.\n * Useful for server-side or test contexts where you need\n * different auth or URL configuration.\n */\nexport function createSupabaseClient(url?: string, anonKey?: string) {\n return createClient<Database>(\n url ?? supabaseUrl,\n anonKey ?? supabaseAnonKey,\n );\n}\n\nexport type { Database };\n","/**\n * Auth Provider Context\n *\n * Manages Supabase auth session state and provides auth methods\n * to all child components.\n *\n * Usage:\n * ```tsx\n * <AuthProvider>\n * <App />\n * </AuthProvider>\n *\n * // In components:\n * const { user, isAuthenticated, signIn, signOut } = useAuth();\n * ```\n */\n\nimport {\n createContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from 'react';\nimport type { User, Session, AuthError } from '@supabase/supabase-js';\nimport { supabase } from '../supabase/client.js';\n\nexport interface AuthContextValue {\n /** Current authenticated user (null if not signed in) */\n user: User | null;\n /** Current auth session (null if not signed in) */\n session: Session | null;\n /** Whether the initial session check is still loading */\n isLoading: boolean;\n /** Whether a user is currently authenticated */\n isAuthenticated: boolean;\n /** Sign in with email and password */\n signIn: (email: string, password: string) => Promise<{ error: AuthError | null }>;\n /** Sign up with email and password */\n signUp: (email: string, password: string) => Promise<{ error: AuthError | null }>;\n /** Sign out the current user */\n signOut: () => Promise<{ error: AuthError | null }>;\n /** Send a password reset email */\n resetPassword: (email: string) => Promise<{ error: AuthError | null }>;\n}\n\nexport const AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps {\n children: ReactNode;\n}\n\nexport function AuthProvider({ children }: AuthProviderProps) {\n const [user, setUser] = useState<User | null>(null);\n const [session, setSession] = useState<Session | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n // Get initial session\n supabase.auth.getSession().then(({ data: { session: initialSession } }) => {\n setSession(initialSession);\n setUser(initialSession?.user ?? null);\n setIsLoading(false);\n });\n\n // Listen for auth state changes\n const { data: { subscription } } = supabase.auth.onAuthStateChange(\n (_event, newSession) => {\n setSession(newSession);\n setUser(newSession?.user ?? null);\n setIsLoading(false);\n },\n );\n\n return () => {\n subscription.unsubscribe();\n };\n }, []);\n\n const signIn = useCallback(async (email: string, password: string) => {\n const { error } = await supabase.auth.signInWithPassword({ email, password });\n return { error };\n }, []);\n\n const signUp = useCallback(async (email: string, password: string) => {\n const { error } = await supabase.auth.signUp({ email, password });\n return { error };\n }, []);\n\n const signOut = useCallback(async () => {\n const { error } = await supabase.auth.signOut();\n return { error };\n }, []);\n\n const resetPassword = useCallback(async (email: string) => {\n const { error } = await supabase.auth.resetPasswordForEmail(email);\n return { error };\n }, []);\n\n const value = useMemo<AuthContextValue>(() => ({\n user,\n session,\n isLoading,\n isAuthenticated: !!session,\n signIn,\n signUp,\n signOut,\n resetPassword,\n }), [user, session, isLoading, signIn, signUp, signOut, resetPassword]);\n\n return (\n <AuthContext.Provider value={value}>\n {children}\n </AuthContext.Provider>\n );\n}\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Account types matching Supabase CHECK constraint\n * Source: supabase/migrations/20260212000000_init_accounts.sql\n */\nexport const AccountTypeSchema = z.enum([\n 'CHECKING',\n 'SAVINGS',\n 'CREDITCARD',\n 'INVESTMENT',\n 'LOAN',\n]);\n\n/**\n * Account state enum\n * Source: supabase/migrations/20260215000001_extend_accounts.sql\n */\nexport const AccountStateSchema = z.enum([\n 'active',\n 'closed',\n 'archived',\n 'pending_deletion',\n]);\n\n/**\n * Display account type — lowercase grouping type used by feature/UI layers\n * Source: packages/accounts/feature/src/constants.ts GROUPED_ACCOUNT_TYPES\n */\nexport const DisplayAccountTypeSchema = z.enum([\n 'checking',\n 'savings',\n 'cards',\n 'student_loans',\n 'bill',\n 'autos',\n 'home',\n 'investment',\n 'loan',\n 'asset',\n 'cd',\n 'money_market',\n 'certificates',\n 'commercial',\n 'creditline',\n]);\n\n/**\n * Aggregation type enum\n */\nexport const AggregationTypeSchema = z.enum([\n 'finicity',\n 'cashedge',\n 'partner',\n 'manual',\n]);\n\n// ============================================================================\n// RELATED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Financial institution as returned by Supabase join\n * Used when selecting accounts with institution data\n */\nexport const FinancialInstitutionSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n ofx_org: z.string().nullable().optional(),\n ofx_fid: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n}).nullable();\n\n// ============================================================================\n// BASE ACCOUNT SCHEMA\n// ============================================================================\n\n/**\n * Account schema matching Supabase `accounts` table\n * Source: supabase/migrations/20260212000000_init_accounts.sql\n * supabase/migrations/20260215000001_extend_accounts.sql\n */\nexport const AccountSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string().uuid(),\n institution_id: z.string().uuid(),\n name: z.string().min(1),\n account_type: AccountTypeSchema,\n account_number_masked: z.string().nullable().optional(),\n currency: z.string().default('USD'),\n is_active: z.boolean().default(true),\n // New columns from migration 20260215000001\n balance: z.number().default(0),\n state: AccountStateSchema.default('active'),\n display_account_type: DisplayAccountTypeSchema.nullable().optional(),\n include_in_expenses: z.boolean().default(true),\n include_in_budget: z.boolean().default(true),\n include_in_cashflow: z.boolean().default(true),\n include_in_dashboard: z.boolean().default(true),\n include_in_goals: z.boolean().default(false),\n include_in_networth: z.boolean().default(true),\n aggregation_type: AggregationTypeSchema.nullable().optional(),\n created_at: z.string().nullable().optional(),\n updated_at: z.string().nullable().optional(),\n});\n\n/**\n * Account with joined institution data\n * Used when querying with .select('*, institution:financial_institutions(*)')\n */\nexport const AccountWithInstitutionSchema = AccountSchema.extend({\n institution: FinancialInstitutionSchema,\n});\n\n/**\n * Accounts list response schema\n * Supabase returns arrays directly (no wrapper object)\n */\nexport const AccountsResponseSchema = z.array(AccountSchema);\n\n/**\n * Accounts with institution response\n */\nexport const AccountsWithInstitutionResponseSchema = z.array(AccountWithInstitutionSchema);\n\n// ============================================================================\n// CREATE SCHEMA\n// ============================================================================\n\n/**\n * Account creation schema\n * Matches Supabase Insert type for accounts table.\n * id, created_at, updated_at are server-generated.\n * user_id comes from auth context (RLS).\n */\nexport const AccountCreateSchema = z.object({\n user_id: z.string().uuid(),\n institution_id: z.string().uuid(),\n name: z.string().min(1),\n account_type: AccountTypeSchema,\n account_number_masked: z.string().nullable().optional(),\n currency: z.string().default('USD'),\n is_active: z.boolean().default(true),\n balance: z.number().default(0),\n state: AccountStateSchema.default('active'),\n display_account_type: DisplayAccountTypeSchema.nullable().optional(),\n include_in_expenses: z.boolean().default(true),\n include_in_budget: z.boolean().default(true),\n include_in_cashflow: z.boolean().default(true),\n include_in_dashboard: z.boolean().default(true),\n include_in_goals: z.boolean().default(false),\n include_in_networth: z.boolean().default(true),\n aggregation_type: AggregationTypeSchema.nullable().optional(),\n});\n\n// Admin mode: relaxed validation for test data creation\nexport const AccountCreateSchemaAdmin = z.object({\n user_id: z.string().uuid(),\n institution_id: z.string().uuid(),\n name: z.string().optional().default('Test Account'),\n account_type: AccountTypeSchema.optional().default('CHECKING'),\n account_number_masked: z.string().nullable().optional(),\n currency: z.string().optional().default('USD'),\n is_active: z.boolean().optional().default(true),\n balance: z.number().optional().default(0),\n state: AccountStateSchema.optional().default('active'),\n display_account_type: DisplayAccountTypeSchema.nullable().optional(),\n include_in_expenses: z.boolean().optional().default(true),\n include_in_budget: z.boolean().optional().default(true),\n include_in_cashflow: z.boolean().optional().default(true),\n include_in_dashboard: z.boolean().optional().default(true),\n include_in_goals: z.boolean().optional().default(false),\n include_in_networth: z.boolean().optional().default(true),\n aggregation_type: AggregationTypeSchema.nullable().optional(),\n});\n\n// Backward compatibility alias\nexport const AccountCreateSchemaUser = AccountCreateSchema;\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Account update schema\n * Matches Supabase Update type — all fields optional.\n * id is used to identify the row, not sent in the update body.\n */\nexport const AccountUpdateSchema = z.object({\n name: z.string().min(1).optional(),\n account_type: AccountTypeSchema.optional(),\n account_number_masked: z.string().nullable().optional(),\n currency: z.string().optional(),\n is_active: z.boolean().optional(),\n balance: z.number().optional(),\n state: AccountStateSchema.optional(),\n display_account_type: DisplayAccountTypeSchema.nullable().optional(),\n include_in_expenses: z.boolean().optional(),\n include_in_budget: z.boolean().optional(),\n include_in_cashflow: z.boolean().optional(),\n include_in_dashboard: z.boolean().optional(),\n include_in_goals: z.boolean().optional(),\n include_in_networth: z.boolean().optional(),\n aggregation_type: AggregationTypeSchema.nullable().optional(),\n});\n\n// ============================================================================\n// DELETE AND ARCHIVE SCHEMAS\n// ============================================================================\n\n/**\n * Account delete schema — id from URL path\n */\nexport const AccountDeleteSchema = z.object({\n id: z.string().uuid(),\n});\n\n/**\n * Account archive schema — sets is_active = false (soft delete)\n */\nexport const AccountArchiveSchema = z.object({\n id: z.string().uuid(),\n});\n\n// ============================================================================\n// FINANCIAL INSTITUTION SCHEMAS\n// ============================================================================\n\n/**\n * Financial institution schema matching Supabase table\n */\nexport const FinancialInstitutionRowSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string().uuid(),\n name: z.string().min(1),\n ofx_org: z.string().nullable().optional(),\n ofx_fid: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n});\n\nexport const InstitutionCreateSchema = z.object({\n user_id: z.string().uuid(),\n name: z.string().min(1),\n ofx_org: z.string().nullable().optional(),\n ofx_fid: z.string().nullable().optional(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Transaction type — Debit or Credit\n */\nexport const TransactionTypeSchema = z.enum(['Debit', 'Credit']);\n\n// ============================================================================\n// TRANSACTION TAG SCHEMA (junction table: transaction_tags)\n// ============================================================================\n\n/**\n * Transaction tag matching Supabase `transaction_tags` table Row type.\n * NULL amount = regular tag; valued amount = split tag.\n */\nexport const TransactionTagSchema = z.object({\n id: z.string().uuid(),\n transaction_id: z.string().uuid(),\n tag_name: z.string(),\n amount: z.number().finite().nullable(),\n created_at: z.string().nullable().optional(),\n});\n\n// ============================================================================\n// BASE TRANSACTION SCHEMA (Supabase Row)\n// ============================================================================\n\n/**\n * Transaction schema matching Supabase `transactions` table Row type.\n * See migration 20260215000003_transactions_budgets.sql\n */\nexport const TransactionSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string().uuid(),\n account_id: z.string().uuid(),\n legacy_id: z.string().nullable().optional(),\n reference_id: z.string(),\n transaction_type: TransactionTypeSchema,\n amount: z.number().finite(),\n memo: z.string().nullable().optional(),\n posted_at: z.string(),\n nickname: z.string(),\n original_name: z.string(),\n check_number: z.string().nullable().optional(),\n deleted_at: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n updated_at: z.string().nullable().optional(),\n});\n\n/**\n * Transaction with joined tags from transaction_tags table.\n * Returned by queries using `.select('*, transaction_tags(*)')`.\n */\nexport const TransactionWithTagsSchema = TransactionSchema.extend({\n transaction_tags: z.array(TransactionTagSchema).default([]),\n});\n\n// ============================================================================\n// RESPONSE SCHEMAS\n// ============================================================================\n\n/**\n * Supabase returns arrays directly — no wrapper object needed.\n * Kept as a named schema for clarity.\n */\nexport const TransactionsResponseSchema = z.array(TransactionWithTagsSchema);\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Transaction creation schema — Admin mode\n * Minimal validation for seed/test data creation.\n * Matches Supabase Insert type (id, created_at, updated_at are optional/server-generated).\n */\nexport const TransactionCreateSchemaAdmin = z.object({\n user_id: z.string().uuid(),\n account_id: z.string().uuid(),\n reference_id: z.string(),\n transaction_type: TransactionTypeSchema,\n amount: z.number().finite(),\n posted_at: z.string(),\n nickname: z.string().optional().default(''),\n original_name: z.string().optional().default(''),\n memo: z.string().nullable().optional(),\n check_number: z.string().nullable().optional(),\n legacy_id: z.string().nullable().optional(),\n deleted_at: z.string().nullable().optional(),\n});\n\n/**\n * Transaction creation schema — User mode\n * Full validation with business rules for production use.\n * id, created_at, updated_at, deleted_at are server-managed.\n */\nexport const TransactionCreateSchemaUser = z.object({\n user_id: z.string().uuid(),\n account_id: z.string().uuid(),\n reference_id: z.string().min(1),\n transaction_type: TransactionTypeSchema,\n amount: z.number().finite().positive(),\n posted_at: z.string().min(1),\n nickname: z.string().min(1),\n original_name: z.string().min(1),\n memo: z.string().nullable().optional(),\n check_number: z.string().nullable().optional(),\n}).strict();\n\n/** Backward compatibility alias — points to user-mode schema */\nexport const TransactionCreateSchema = TransactionCreateSchemaUser;\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Transaction update schema — partial fields matching Supabase Update type.\n * id is required for the WHERE clause; all other fields are optional.\n */\nexport const TransactionUpdateSchema = z.object({\n id: z.string().uuid(),\n nickname: z.string().optional(),\n memo: z.string().nullable().optional(),\n amount: z.number().finite().optional(),\n transaction_type: TransactionTypeSchema.optional(),\n posted_at: z.string().optional(),\n check_number: z.string().nullable().optional(),\n}).strict();\n\n// ============================================================================\n// TRANSACTION TAGGING SCHEMAS\n// ============================================================================\n\n/**\n * Transaction tagging — Regular (non-split)\n * Applies single or multiple tags to entire transaction\n */\nexport const TransactionTaggingRegularSchema = z.object({\n type: z.literal('regular'),\n repeat: z.boolean(),\n regular: z.array(z.string()),\n});\n\n/**\n * Transaction tagging — Split\n * Splits transaction amount across multiple tags\n */\nexport const TransactionTaggingSplitItemSchema = z.object({\n name: z.string(),\n value: z.number().finite().positive(),\n});\n\nexport const TransactionTaggingSplitSchema = z.object({\n type: z.literal('split'),\n split: z.array(TransactionTaggingSplitItemSchema),\n});\n\n/**\n * Transaction tagging discriminated union\n */\nexport const TransactionTaggingSchema = z.discriminatedUnion('type', [\n TransactionTaggingRegularSchema,\n TransactionTaggingSplitSchema,\n]);\n\n// ============================================================================\n// SEARCH SCHEMAS\n// ============================================================================\n\n/**\n * Transaction search parameters — used by feature layer for filtering\n */\nexport const TransactionSearchParamsSchema = z.object({\n begin_on: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n end_on: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n q: z.string().optional(),\n untagged: z.enum(['0', '1']).optional(),\n tags: z.array(z.string()).optional(),\n});\n\n// ============================================================================\n// DELETE SCHEMA\n// ============================================================================\n\n/**\n * Transaction delete schema — UUID id for soft-delete\n */\nexport const TransactionDeleteSchema = z.object({\n id: z.string().uuid(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Cashflow event type - Bill (outflow) or Income (inflow)\n */\nexport const CashflowEventTypeSchema = z.enum(['bill', 'income']);\n\n/**\n * Recurrence frequency\n */\nexport const RecurrenceFrequencySchema = z.enum([\n 'once',\n 'weekly',\n 'biweekly',\n 'monthly',\n 'quarterly',\n 'yearly',\n]);\n\n// ============================================================================\n// BASE SCHEMA\n// ============================================================================\n\n/**\n * Cashflow Event schema for upcoming bills and recurring income\n *\n * Represents scheduled transactions that haven't occurred yet:\n * - Bills to be paid\n * - Income to be received\n * - Recurring/one-time events\n *\n * Design Notes:\n * - Lightweight schema for MVP cashflow tracking\n * - Extends transaction concept with scheduling\n * - Supports recurring patterns\n */\nexport const CashflowEventSchema = z.object({\n // ========================================\n // Core Identifiers\n // ========================================\n id: z.string().uuid(),\n event_id: z.string(), // Links to recurring series if applicable\n\n // ========================================\n // Event Details\n // ========================================\n name: z.string().min(1).max(255),\n amount: z.number().finite().positive(),\n memo: z.string().nullable().optional(),\n\n // ========================================\n // Scheduling\n // ========================================\n scheduled_date: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, {\n message: 'Scheduled date must be in format YYYY-MM-DD',\n }),\n\n // ========================================\n // Type and Status\n // ========================================\n event_type: CashflowEventTypeSchema,\n is_paid: z.boolean().default(false),\n is_recurring: z.boolean().default(false),\n recurrence_frequency: RecurrenceFrequencySchema.optional(),\n\n // ========================================\n // Metadata\n // ========================================\n created_at: z.string(),\n updated_at: z.string(),\n\n // ========================================\n // Links\n // ========================================\n account_id: z.number().int().nullable().optional(),\n transaction_id: z.string().nullable().optional(), // Links to actual transaction when paid\n});\n\n// ============================================================================\n// CREATE SCHEMA\n// ============================================================================\n\n/**\n * Create cashflow event schema\n * Server generates: id, created_at, updated_at\n */\nexport const CashflowEventCreateSchema = CashflowEventSchema.omit({\n id: true,\n created_at: true,\n updated_at: true,\n transaction_id: true, // Cannot link to transaction at creation\n}).strict();\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Update cashflow event schema\n * Allows updating event details and payment status\n */\nexport const CashflowEventUpdateSchema = CashflowEventSchema.pick({\n id: true,\n name: true,\n amount: true,\n memo: true,\n scheduled_date: true,\n is_paid: true,\n}).strict();\n\n// ============================================================================\n// FILTER SCHEMA\n// ============================================================================\n\n/**\n * Filter cashflow events by date range and type\n */\nexport const CashflowEventFilterSchema = z.object({\n start_date: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n end_date: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n event_type: z.enum(['all', 'bill', 'income']).default('all'),\n include_paid: z.boolean().default(false),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Cashflow events response - array of events\n */\nexport const CashflowEventsResponseSchema = z.object({\n events: z.array(CashflowEventSchema),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Budget state based on spending progress\n */\nexport const BudgetStateSchema = z.enum(['under', 'risk', 'over']);\n\n// ============================================================================\n// JUNCTION TABLE SCHEMAS (budget_tags, budget_accounts)\n// ============================================================================\n\n/**\n * Budget tag matching Supabase `budget_tags` table Row type.\n * Composite PK: (budget_id, tag_name)\n */\nexport const BudgetTagSchema = z.object({\n budget_id: z.string().uuid(),\n tag_name: z.string(),\n});\n\n/**\n * Budget account matching Supabase `budget_accounts` table Row type.\n * Composite PK: (budget_id, account_id)\n */\nexport const BudgetAccountSchema = z.object({\n budget_id: z.string().uuid(),\n account_id: z.string().uuid(),\n});\n\n// ============================================================================\n// BASE BUDGET SCHEMA (Supabase Row)\n// ============================================================================\n\n/**\n * Budget schema matching Supabase `budgets` table Row type.\n * See migration 20260215000003_transactions_budgets.sql\n */\nexport const BudgetSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string().uuid(),\n name: z.string().max(255),\n month: z.number().int().min(1).max(12),\n year: z.number().int(),\n budget_amount: z.number().finite(),\n spent: z.number().finite(),\n state: z.string(),\n show_on_dashboard: z.boolean(),\n created_at: z.string().nullable().optional(),\n updated_at: z.string().nullable().optional(),\n});\n\n/**\n * Budget with joined relations from budget_tags and budget_accounts tables.\n * Returned by queries using `.select('*, budget_tags(*), budget_accounts(*)')`.\n */\nexport const BudgetWithRelationsSchema = BudgetSchema.extend({\n budget_tags: z.array(BudgetTagSchema).default([]),\n budget_accounts: z.array(BudgetAccountSchema).default([]),\n});\n\n// ============================================================================\n// RESPONSE SCHEMAS\n// ============================================================================\n\n/**\n * Supabase returns arrays directly — no wrapper object needed.\n */\nexport const BudgetsResponseSchema = z.array(BudgetWithRelationsSchema);\n\n// ============================================================================\n// CREATE SCHEMA\n// ============================================================================\n\n/**\n * Budget creation schema\n * Matches Supabase Insert type for budgets table.\n * id, created_at, updated_at are server-generated.\n */\nexport const BudgetCreateSchema = z.object({\n user_id: z.string().uuid(),\n name: z.string().max(255),\n month: z.number().int().min(1).max(12),\n year: z.number().int(),\n budget_amount: z.number().finite(),\n spent: z.number().finite().optional(),\n state: z.string().optional(),\n show_on_dashboard: z.boolean().optional(),\n});\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Budget update schema — partial fields matching Supabase Update type.\n * id is required for the WHERE clause; all other fields are optional.\n */\nexport const BudgetUpdateSchema = z.object({\n id: z.string().uuid(),\n name: z.string().max(255).optional(),\n month: z.number().int().min(1).max(12).optional(),\n year: z.number().int().optional(),\n budget_amount: z.number().finite().optional(),\n spent: z.number().finite().optional(),\n state: z.string().optional(),\n show_on_dashboard: z.boolean().optional(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\nexport const GoalStateSchema = z.enum(['active', 'completed', 'archived']);\n\nexport const GoalStatusSchema = z.enum(['complete', 'over', 'risk', 'under']);\n\n// ============================================================================\n// SUPABASE ROW SCHEMAS\n// ============================================================================\n\n/**\n * Savings goal row — matches `savings_goals` table in Supabase\n * Monetary fields are numbers (NUMERIC columns), IDs are UUIDs\n */\nexport const SavingsGoalRowSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string().uuid(),\n name: z.string().max(255),\n state: z.string(),\n status: z.string(),\n image_name: z.string(),\n image_url: z.string(),\n percent_complete: z.number(),\n complete: z.boolean(),\n initial_value: z.number(),\n current_value: z.number(),\n target_value: z.number(),\n monthly_contribution: z.number(),\n remaining_monthly_contribution: z.number(),\n current_progress: z.number().nullable(),\n target_contribution: z.number().nullable(),\n target_completion_on: z.string().nullable(),\n weight: z.number().nullable(),\n created_at: z.string().nullable(),\n updated_at: z.string().nullable(),\n});\n\n/**\n * Payoff goal row — matches `payoff_goals` table in Supabase\n * Same as savings but without `weight`\n */\nexport const PayoffGoalRowSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string().uuid(),\n name: z.string().max(255),\n state: z.string(),\n status: z.string(),\n image_name: z.string(),\n image_url: z.string(),\n percent_complete: z.number(),\n complete: z.boolean(),\n initial_value: z.number(),\n current_value: z.number(),\n target_value: z.number(),\n monthly_contribution: z.number(),\n remaining_monthly_contribution: z.number(),\n current_progress: z.number().nullable(),\n target_contribution: z.number().nullable(),\n target_completion_on: z.string().nullable(),\n created_at: z.string().nullable(),\n updated_at: z.string().nullable(),\n});\n\n/**\n * Goal account junction row — matches `goal_accounts` table\n */\nexport const GoalAccountRowSchema = z.object({\n id: z.string().uuid(),\n goal_type: z.string(),\n goal_id: z.string().uuid(),\n account_id: z.string().uuid(),\n});\n\n// ============================================================================\n// RESPONSE SCHEMAS (Supabase returns arrays)\n// ============================================================================\n\nexport const SavingsGoalsResponseSchema = z.array(SavingsGoalRowSchema);\nexport const PayoffGoalsResponseSchema = z.array(PayoffGoalRowSchema);\n\n// ============================================================================\n// CREATE / UPDATE SCHEMAS\n// ============================================================================\n\n/**\n * Goal creation schema (shared for both types)\n * id, timestamps, progress fields are server-generated\n */\nexport const GoalCreateSchema = z.object({\n name: z.string().max(255),\n state: GoalStateSchema.optional(),\n image_name: z.string(),\n target_value: z.number().positive(),\n target_completion_on: z.string().optional(),\n target_contribution: z.number().optional(),\n account_ids: z.array(z.string().uuid()).optional(),\n});\n\n/**\n * Goal update schema\n */\nexport const GoalUpdateSchema = z.object({\n id: z.string().uuid(),\n name: z.string().max(255),\n state: GoalStateSchema.optional(),\n image_name: z.string(),\n target_value: z.number().positive(),\n target_completion_on: z.string().optional(),\n target_contribution: z.number().optional(),\n account_ids: z.array(z.string().uuid()).optional(),\n});\n\n// ============================================================================\n// GOAL IMAGES (static catalog, no Supabase table)\n// ============================================================================\n\nexport const GoalImageSchema = z.object({\n id: z.string(),\n name: z.string(),\n url: z.string(),\n});\n\nexport const GoalImagesResponseSchema = z.object({\n images: z.array(GoalImageSchema),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * User sex/gender\n */\nexport const UserSexSchema = z.enum(['Male', 'Female']);\n\n// ============================================================================\n// USER PROFILE ROW SCHEMA (Supabase)\n// ============================================================================\n\n/**\n * User profile row schema matching Supabase `user_profiles` table\n * UUID id (FK to auth.users), JSONB columns for custom_tags/settings\n */\nexport const UserProfileRowSchema = z.object({\n id: z.string().uuid(),\n login: z.string(),\n email: z.string(),\n login_count: z.number().int().nonnegative(),\n last_login_at: z.string().nullable(),\n custom_tags: z.unknown(), // JSONB\n custom_settings: z.unknown(), // JSONB\n first_name: z.string(),\n last_name: z.string(),\n postal_code: z.string(),\n birth_year: z.number().int().min(1901).nullable(),\n sex: z.enum(['Male', 'Female']).nullable(),\n city: z.string().nullable(),\n state: z.string().nullable(),\n created_at: z.string().nullable(),\n updated_at: z.string().nullable(),\n});\n\n// ============================================================================\n// USER SCHEMA (app-level)\n// ============================================================================\n\n/**\n * User schema matching legacy API response structure\n *\n * CRITICAL DATA TYPE NOTES:\n * - id: STRING (partner customer ID, not integer like Account/Budget)\n * - login_count: INTEGER (number type)\n * - birth_year: INTEGER (number type)\n * - custom_settings: OBJECT with arbitrary key-value pairs\n * - custom_tags: ARRAY of strings\n * - last_login_at: STRING (RFC 3339 datetime format)\n */\nexport const UserSchema = z.object({\n // Core Identifiers\n id: z.string(), // Partner customer ID (STRING, not integer)\n login: z.string(),\n email: z.string().email(),\n\n // Login Tracking\n login_count: z.number().int().nonnegative(),\n last_login_at: z.string(), // RFC 3339 datetime format\n\n // Customization\n custom_tags: z.array(z.string()),\n custom_settings: z.object({}).passthrough(), // Arbitrary key-value pairs\n\n // Profile Information\n first_name: z.string(),\n last_name: z.string(),\n postal_code: z.string(),\n birth_year: z.number().int().min(1901),\n sex: UserSexSchema,\n\n // Optional Location Fields\n city: z.string().optional(),\n state: z.string().optional(),\n});\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * User creation schema - Admin mode\n */\nexport const UserCreateSchemaAdmin = z\n .object({\n login: z.string(),\n email: z.string(), // Simple validation for test data\n first_name: z.string().optional().default('Test'),\n last_name: z.string().optional().default('User'),\n postal_code: z.string().optional().default('00000'),\n birth_year: z.number().int().min(1901).optional().default(1990),\n sex: UserSexSchema.optional().default('Male'),\n custom_tags: z.array(z.string()).optional().default([]),\n custom_settings: z.object({}).passthrough().optional().default({}),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .strict();\n\n/**\n * User creation schema - User mode\n */\nexport const UserCreateSchemaUser = z\n .object({\n login: z.string().min(3, 'Login must be at least 3 characters'),\n email: z.string().email('Valid email address required'),\n first_name: z.string().min(1, 'First name is required'),\n last_name: z.string().min(1, 'Last name is required'),\n postal_code: z.string().min(5, 'Valid postal code required'),\n birth_year: z.number().int().min(1901).max(new Date().getFullYear() - 13, 'Must be at least 13 years old'),\n sex: UserSexSchema,\n custom_tags: z.array(z.string()).optional(),\n custom_settings: z.object({}).passthrough().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .strict();\n\n// Backward compatibility - alias to user mode for existing code\nexport const UserCreateSchema = UserCreateSchemaUser;\n\n// ============================================================================\n// UPDATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * User update schema - Admin mode\n */\nexport const UserUpdateSchemaAdmin = z\n .object({\n email: z.string().optional(),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n postal_code: z.string().optional(),\n birth_year: z.number().int().min(1901).optional(),\n sex: UserSexSchema.optional(),\n custom_tags: z.array(z.string()).optional(),\n custom_settings: z.object({}).passthrough().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .strict();\n\n/**\n * User update schema - User mode\n */\nexport const UserUpdateSchemaUser = z\n .object({\n email: z.string().email('Valid email address required'),\n first_name: z.string().min(1, 'First name is required'),\n last_name: z.string().min(1, 'Last name is required'),\n postal_code: z.string().min(5, 'Valid postal code required'),\n birth_year: z.number().int().min(1901).max(new Date().getFullYear() - 13, 'Must be at least 13 years old'),\n sex: UserSexSchema,\n custom_tags: z.array(z.string()).optional(),\n custom_settings: z.object({}).passthrough().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n })\n .strict();\n\n// Backward compatibility - alias to user mode for existing code\nexport const UserUpdateSchema = UserUpdateSchemaUser;\n","import { z } from 'zod';\n\n// ============================================================================\n// TAG SCHEMAS — Supabase row schemas\n// ============================================================================\n\n/**\n * Supabase row schema for default_tags table\n * PK: name TEXT\n */\nexport const DefaultTagRowSchema = z.object({\n name: z.string(),\n created_at: z.string().nullable(),\n});\n\n/**\n * Supabase row schema for user_tags table\n * PK: (user_id, name)\n */\nexport const UserTagRowSchema = z.object({\n user_id: z.string().uuid(),\n name: z.string(),\n color: z.string().nullable(),\n created_at: z.string().nullable(),\n});\n\n/**\n * Supabase response: array of default_tags rows\n */\nexport const DefaultTagsResponseSchema = z.array(DefaultTagRowSchema);\n\n/**\n * Supabase response: array of user_tags rows\n */\nexport const UserTagsResponseSchema = z.array(UserTagRowSchema);\n\n// ============================================================================\n// UPDATE SCHEMA\n// ============================================================================\n\n/**\n * Tag update schema\n * Based on legacy API updateTags function - sends array of tag names\n * Using .strict() to prevent unknown fields (Session 1 pattern)\n */\nexport const TagsUpdateSchema = z.array(z.string()).min(0);\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Tag create schema - Admin mode\n * Minimal validation for test data creation\n */\nexport const TagCreateSchemaAdmin = z.object({\n name: z.string(),\n});\n\n/**\n * Tag create schema - User mode\n * Full business rules and validation\n */\nexport const TagCreateSchemaUser = z.object({\n name: z.string()\n .min(1, 'Tag name is required')\n .max(50, 'Tag name must be 50 characters or less')\n .regex(/^[a-zA-Z0-9\\s\\-_]+$/, 'Tag name can only contain letters, numbers, spaces, hyphens, and underscores'),\n});\n\n// ============================================================================\n// DELETE SCHEMAS\n// ============================================================================\n\n/**\n * Tag delete schema\n * Just requires the tag name to delete\n */\nexport const TagDeleteSchema = z.object({\n name: z.string().min(1),\n});\n\n// ============================================================================\n// USAGE STATISTICS SCHEMAS\n// ============================================================================\n\n/**\n * Tag usage statistics item schema\n * Represents usage count for a single tag\n */\nexport const TagUsageStatSchema = z.object({\n tag: z.string(),\n count: z.number().int().nonnegative(),\n});\n\n/**\n * Tag usage statistics response schema\n * Array of tag usage statistics\n */\nexport const TagUsageStatsSchema = z.object({\n stats: z.array(TagUsageStatSchema),\n});\n\n// ============================================================================\n// COLOR CUSTOMIZATION SCHEMAS\n// ============================================================================\n\n/**\n * Tag color schema\n * Hex color code for tag visual customization\n */\nexport const TagColorSchema = z.object({\n color: z.string().regex(/^#[0-9A-Fa-f]{6}$/, 'Color must be a valid hex code'),\n});\n\n// ============================================================================\n// USAGE REPORT SCHEMAS\n// ============================================================================\n\n/**\n * Tag usage data point for time series\n * Represents tag usage count at a specific date\n */\nexport const TagUsageDataPointSchema = z.object({\n date: z.string(), // ISO date string\n count: z.number().int().nonnegative(),\n});\n\n/**\n * Tag usage report for a single tag\n * Contains time series data for usage trends\n */\nexport const TagReportItemSchema = z.object({\n tag: z.string(),\n totalCount: z.number().int().nonnegative(),\n dataPoints: z.array(TagUsageDataPointSchema),\n});\n\n/**\n * Tag usage report response schema\n * Contains usage data for all tags over time\n */\nexport const TagUsageReportSchema = z.object({\n report: z.array(TagReportItemSchema),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Alert type enum — matches Supabase CHECK constraint on alerts.type\n */\nexport const AlertTypeSchema = z.enum([\n 'AccountThresholdAlert',\n 'GoalAlert',\n 'MerchantNameAlert',\n 'SpendingTargetAlert',\n 'TransactionLimitAlert',\n 'UpcomingBillAlert',\n]);\n\n/**\n * Alert source type enum — matches Supabase CHECK constraint on alerts.source_type\n */\nexport const AlertSourceTypeSchema = z.enum([\n 'Account',\n 'Budget',\n 'CashflowTransaction',\n 'PayoffGoal',\n 'SavingsGoal',\n]).nullable();\n\n// ============================================================================\n// NESTED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Alert destinations schema — matches alert_destinations table columns\n * (excludes user_id PK and updated_at managed by DB)\n */\nexport const AlertDestinationsSchema = z.object({\n email_address: z.string().email().nullable(),\n sms_number: z.string().regex(/^\\d{10}$/).nullable(),\n partner_sms_enabled: z.boolean(),\n});\n\n// ============================================================================\n// SUPABASE ROW SCHEMA\n// ============================================================================\n\n/**\n * Alert row schema — matches alerts table in Supabase\n */\nexport const AlertRowSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string().uuid(),\n type: AlertTypeSchema,\n options: z.record(z.string(), z.unknown()),\n email_delivery: z.boolean(),\n sms_delivery: z.boolean(),\n source_type: AlertSourceTypeSchema,\n source_id: z.string().nullable(),\n created_at: z.string().nullable(),\n updated_at: z.string().nullable(),\n});\n\n/**\n * Alerts response schema — array of alert rows from Supabase\n */\nexport const AlertsResponseSchema = z.array(AlertRowSchema);\n\n// ============================================================================\n// DERIVED SCHEMAS\n// ============================================================================\n\n/**\n * Alert creation schema — fields sent when inserting a new alert\n * (excludes id, user_id, created_at, updated_at — managed by DB)\n */\nexport const AlertCreateSchema = z.object({\n type: AlertTypeSchema,\n options: z.record(z.string(), z.unknown()),\n email_delivery: z.boolean(),\n sms_delivery: z.boolean(),\n source_type: AlertSourceTypeSchema.optional(),\n source_id: z.string().nullable().optional(),\n});\n\n/**\n * Alert update schema — fields sent when updating an alert\n * (excludes id, user_id, type, created_at, updated_at)\n */\nexport const AlertUpdateSchema = z.object({\n options: z.record(z.string(), z.unknown()),\n email_delivery: z.boolean(),\n sms_delivery: z.boolean(),\n source_type: AlertSourceTypeSchema.optional(),\n source_id: z.string().nullable().optional(),\n});\n\n/**\n * Alert destinations update schema\n */\nexport const AlertDestinationsUpdateSchema = AlertDestinationsSchema;\n","import { z } from 'zod';\nimport { AlertTypeSchema } from './alert.js';\n\n// ============================================================================\n// NOTIFICATION ROW SCHEMA (Supabase)\n// ============================================================================\n\n/**\n * Raw Supabase row schema for notifications table\n * All fields match database column names exactly\n */\nexport const NotificationRowSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string().uuid(),\n alert_id: z.string().uuid().nullable(),\n alert_type: AlertTypeSchema,\n message: z.string(),\n is_read: z.boolean(),\n created_at: z.string().nullable(),\n});\n\n// ============================================================================\n// NOTIFICATION SCHEMA (Application-level)\n// ============================================================================\n\n/**\n * Application-level notification schema\n * Fields match NotificationRowSchema — UUIDs for id and alert_id\n */\nexport const NotificationSchema = z.object({\n id: z.string().uuid(),\n user_id: z.string(),\n alert_id: z.string().uuid().nullable(),\n message: z.string(),\n alert_type: AlertTypeSchema,\n is_read: z.boolean().default(false),\n created_at: z.string(),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Notifications list response schema\n * Supabase returns a plain array of rows\n */\nexport const NotificationsResponseSchema = z.array(NotificationRowSchema);\n\n// ============================================================================\n// NOTIFICATION PREFERENCES ROW SCHEMA (Supabase)\n// ============================================================================\n\n/**\n * Raw Supabase row schema for notification_preferences table\n * Snake_case columns matching database exactly\n */\nexport const NotificationPreferencesRowSchema = z.object({\n user_id: z.string().uuid(),\n email_notifications: z.boolean(),\n push_notifications: z.boolean(),\n frequency: z.enum(['realtime', 'daily', 'weekly']),\n updated_at: z.string().nullable(),\n});\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Notification create schema - Admin mode\n * Minimal validation for test data creation\n * Allows creating notifications manually for testing purposes\n */\nexport const NotificationCreateSchemaAdmin = z.object({\n message: z.string(),\n alert_type: AlertTypeSchema,\n created_at: z.string().optional(), // Optional, defaults to now\n});\n\n/**\n * Notification create schema - User mode\n * Notifications are system-generated, users cannot create them\n */\nexport const NotificationCreateSchemaUser = z.never();\n\n// ============================================================================\n// UPDATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Notification update schema - Admin mode\n * Allows updating notification message for testing\n */\nexport const NotificationUpdateSchemaAdmin = z.object({\n message: z.string().optional(),\n alert_type: AlertTypeSchema.optional(),\n});\n\n/**\n * Notification update schema - User mode\n * Users can mark notifications as read/unread\n */\nexport const NotificationUpdateSchemaUser = z.object({\n is_read: z.boolean().optional(),\n});\n\n// ============================================================================\n// NOTIFICATION PREFERENCES SCHEMA\n// ============================================================================\n\n/**\n * Notification frequency options\n */\nexport const NotificationFrequencySchema = z.enum(['realtime', 'daily', 'weekly']);\n\nexport type NotificationFrequency = z.infer<typeof NotificationFrequencySchema>;\n\n/**\n * User notification preferences schema\n */\nexport const NotificationPreferencesSchema = z.object({\n emailNotifications: z.boolean(),\n pushNotifications: z.boolean(),\n frequency: NotificationFrequencySchema,\n});\n\nexport type NotificationPreferences = z.infer<typeof NotificationPreferencesSchema>;\n\n/**\n * Notification preferences update schema\n */\nexport const NotificationPreferencesUpdateSchema = z.object({\n emailNotifications: z.boolean().optional(),\n pushNotifications: z.boolean().optional(),\n frequency: NotificationFrequencySchema.optional(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// PARTNER ROW SCHEMA (Supabase)\n// ============================================================================\n\n/**\n * Partner row schema matching Supabase `partners` table\n * UUID primary key, JSONB columns for modules and featured_searches\n */\nexport const PartnerRowSchema = z.object({\n id: z.string().uuid(),\n domain: z.string(),\n product_name: z.string(),\n browser_title: z.string(),\n partner_alerts_enabled: z.boolean(),\n demo: z.boolean(),\n modules: z.record(z.string(), z.unknown()),\n featured_searches: z.array(z.unknown()),\n created_at: z.string().nullable(),\n});\n\n// ============================================================================\n// PARTNER SCHEMA (app-level, kept for backward compatibility)\n// ============================================================================\n\n/**\n * Partner schema — now uses UUID id to match Supabase\n */\nexport const PartnerSchema = z.object({\n id: z.string().uuid(),\n domain: z.string(),\n product_name: z.string(),\n browser_title: z.string(),\n partner_alerts_enabled: z.boolean(),\n demo: z.boolean(),\n modules: z.object({}).passthrough(),\n featured_searches: z.array(z.unknown()),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Partners response schema — flat array (Supabase returns arrays directly)\n */\nexport const PartnersResponseSchema = z.array(PartnerRowSchema);\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Partner create schema - Admin mode\n * Minimal validation for test data creation\n */\nexport const PartnerCreateSchemaAdmin = z.object({\n domain: z.string(),\n product_name: z.string(),\n browser_title: z.string(),\n partner_alerts_enabled: z.boolean().optional().default(false),\n demo: z.boolean().optional().default(false),\n modules: z.object({}).passthrough().optional().default({}),\n featured_searches: z.array(z.unknown()).optional().default([]),\n});\n\n/**\n * Partner create schema - User mode\n * Partners are configuration data, users cannot create them\n */\nexport const PartnerCreateSchemaUser = z.never();\n\n// ============================================================================\n// UPDATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Partner update schema - Admin mode\n * Allows updating partner configuration for testing\n */\nexport const PartnerUpdateSchemaAdmin = z.object({\n domain: z.string().optional(),\n product_name: z.string().optional(),\n browser_title: z.string().optional(),\n partner_alerts_enabled: z.boolean().optional(),\n demo: z.boolean().optional(),\n modules: z.object({}).passthrough().optional(),\n featured_searches: z.array(z.unknown()).optional(),\n});\n\n/**\n * Partner update schema - User mode\n * Partners are configuration data, users cannot update them\n */\nexport const PartnerUpdateSchemaUser = z.never();\n\n// ============================================================================\n// DELETE SCHEMA\n// ============================================================================\n\n/**\n * Partner delete schema\n * Requires partner UUID for deletion\n */\nexport const PartnerDeleteSchema = z.object({\n id: z.string().uuid(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// EXPENSE SCHEMA\n// ============================================================================\n\n/**\n * Expense schema matching Supabase expenses_by_tag view\n *\n * CRITICAL NOTES:\n * - Expenses are read-only aggregated data (GET endpoint only with date range filters)\n * - Computed from transaction data grouped by tag\n * - OpenAPI has additional fields (percentage, transaction_count) NOT in legacy data\n * - Legacy is SOURCE OF TRUTH - only tag and amount present\n * - amount: STRING with decimal format (like Account, Goal amounts)\n * - tag: References tag names from tags domain (but not enforced as enum)\n */\nexport const ExpenseSchema = z.object({\n // ========================================\n // Tag Reference\n // ========================================\n // Transaction tag/category name\n // Uses lowercase tag names (health, diningout, insurance, etc.)\n tag: z.string(),\n\n // ========================================\n // Aggregated Amount\n // ========================================\n // Total expense amount for this tag in the period\n // STRING with decimal format: \"1.74\", \"102.19\", \"1219.83\"\n amount: z.string().regex(/^\\d+\\.\\d{2}$/),\n});\n\n// ============================================================================\n// SUPABASE VIEW ROW SCHEMA\n// ============================================================================\n\n/**\n * Raw row from expenses_by_tag Supabase VIEW\n * All columns nullable because views return nullable columns\n */\nexport const ExpenseRowSchema = z.object({\n user_id: z.string().nullable(),\n tag: z.string().nullable(),\n amount: z.number().nullable(),\n});\n\nexport const ExpensesViewResponseSchema = z.array(ExpenseRowSchema);\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Expenses list response schema\n * Supabase returns arrays directly (no wrapper)\n */\nexport const ExpensesResponseSchema = z.array(ExpenseSchema);\n\n// ============================================================================\n// CREATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Expense create schema - Admin mode\n * Minimal validation for test data creation\n * Allows creating expense records manually for testing purposes\n */\nexport const ExpenseCreateSchemaAdmin = z.object({\n tag: z.string(),\n amount: z.string(), // Will be formatted to 2 decimal places\n});\n\n/**\n * Expense create schema - User mode\n * Expenses are computed from transactions, users cannot create them directly\n */\nexport const ExpenseCreateSchemaUser = z.never();\n\n// ============================================================================\n// UPDATE SCHEMAS (with Mode Switching)\n// ============================================================================\n\n/**\n * Expense update schema - Admin mode\n * Allows updating expense fields for testing\n */\nexport const ExpenseUpdateSchemaAdmin = z.object({\n amount: z.string().optional(),\n});\n\n/**\n * Expense update schema - User mode\n * Expenses are computed from transactions, users cannot update them\n */\nexport const ExpenseUpdateSchemaUser = z.never();\n\n// ============================================================================\n// DELETE SCHEMA\n// ============================================================================\n\n/**\n * Expense delete schema\n * Requires expense tag for deletion\n */\nexport const ExpenseDeleteSchema = z.object({\n tag: z.string(),\n});\n\n// ============================================================================\n// SEARCH SCHEMA\n// ============================================================================\n\n/**\n * Expense search parameters\n * Endpoint: GET /users/{userId}/expenses\n * Note: All expenses endpoints are read-only (computed from transactions)\n */\nexport const ExpenseSearchParamsSchema = z\n .object({\n begin_on: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(), // RFC 3339 date \"2020-01-01\"\n end_on: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(), // RFC 3339 date \"2020-12-31\"\n threshold: z.number().int().positive().optional(), // Minimum amount filter\n })\n .refine(\n (data) => {\n // If one date is provided, both must be provided\n const hasBeginOn = data.begin_on !== undefined;\n const hasEndOn = data.end_on !== undefined;\n return hasBeginOn === hasEndOn;\n },\n {\n message: 'Both begin_on and end_on must be provided together',\n }\n );\n","import { z } from 'zod';\n\n// ============================================================================\n// NET WORTH SCHEMA\n// ============================================================================\n\n/**\n * Net Worth schema matching legacy API response structure\n * Source: ~/code/pfm-platform/apps/legacy/src/stores/netWorthStore.js\n * Endpoint: GET /users/{userId}/networth\n *\n * CRITICAL NOTES:\n * - Amounts are STRINGS with decimal format (like Account, Expense schemas)\n * - Meta provides summary totals\n * - Assets and debts are aggregated from accounts + manual net worth accounts\n * - History provides monthly snapshots for trending\n */\n\n// ============================================================================\n// NESTED OBJECT SCHEMAS\n// ============================================================================\n\n/**\n * Net worth meta (summary totals)\n * All amounts are strings with decimal format\n */\nexport const NetWorthMetaSchema = z.object({\n net_worth: z.string().regex(/^-?\\d+\\.\\d{2}$/),\n net_worth_change: z.string().regex(/^-?\\d+\\.\\d{2}$/),\n total_assets: z.string().regex(/^-?\\d+\\.\\d{2}$/),\n total_debts: z.string().regex(/^-?\\d+\\.\\d{2}$/),\n});\n\n/**\n * Net worth asset item\n * Can be from aggregated account OR manual net worth account\n */\nexport const NetWorthAssetSchema = z.object({\n id: z.number().int(),\n name: z.string(),\n balance: z.string().regex(/^\\d+\\.\\d{2}$/),\n additional_networth_account: z.boolean(), // true = manual account, false = aggregated\n});\n\n/**\n * Net worth debt item\n * Can be from aggregated account OR manual net worth account\n */\nexport const NetWorthDebtSchema = z.object({\n id: z.number().int(),\n name: z.string(),\n balance: z.string().regex(/^\\d+\\.\\d{2}$/),\n additional_networth_account: z.boolean(), // true = manual account, false = aggregated\n});\n\n/**\n * Net worth history (monthly snapshot)\n * Provides historical trending data\n */\nexport const NetWorthHistorySchema = z.object({\n total: z.string().regex(/^-?\\d+\\.\\d{2}$/), // Net worth for month\n total_asset: z.string().regex(/^\\d+\\.\\d{2}$/),\n total_debt: z.string().regex(/^\\d+\\.\\d{2}$/),\n month: z.string().regex(/^\\d{2}$/), // \"04\"\n year: z.string().regex(/^\\d{4}$/), // \"2019\"\n since_last_month: z.string().regex(/^-?\\d+\\.\\d{2}$/), // Change from previous month\n});\n\n// ============================================================================\n// BASE NET WORTH SCHEMA\n// ============================================================================\n\n/**\n * Complete net worth response\n */\nexport const NetWorthSchema = z.object({\n meta: NetWorthMetaSchema,\n assets: z.array(NetWorthAssetSchema),\n debts: z.array(NetWorthDebtSchema),\n networth_histories: z.array(NetWorthHistorySchema),\n});\n\n// ============================================================================\n// RESPONSE SCHEMA\n// ============================================================================\n\n/**\n * Net worth response wrapper\n * Note: API returns object directly, not wrapped in array\n */\nexport const NetWorthResponseSchema = NetWorthSchema;\n\n// ============================================================================\n// MANUAL NET WORTH ACCOUNT SCHEMAS\n// ============================================================================\n\n/**\n * Manual net worth account type\n * For assets/debts not tracked via aggregation\n */\nexport const NetWorthAccountTypeSchema = z.enum(['asset', 'debt']);\n\n/**\n * Create manual net worth account\n * Endpoint: POST /users/{userId}/networth/accounts\n */\nexport const NetWorthAccountCreateSchema = z.object({\n networth_account: z.object({\n account_type: NetWorthAccountTypeSchema,\n balance: z.string(), // Will be validated as decimal\n name: z.string().min(1).max(255),\n }),\n});\n\n/**\n * Update manual net worth account\n * Endpoint: PUT /users/{userId}/networth/accounts/{id}\n */\nexport const NetWorthAccountUpdateSchema = z.object({\n networth_account: z.object({\n account_type: NetWorthAccountTypeSchema.optional(),\n balance: z.string().optional(), // Will be validated as decimal\n name: z.string().min(1).max(255).optional(),\n }),\n});\n\n/**\n * Delete manual net worth account\n * Endpoint: DELETE /users/{userId}/networth/accounts/{id}\n * Simple id-only schema (id comes from URL path)\n */\nexport const NetWorthAccountDeleteSchema = z.object({\n id: z.number().int().positive(),\n});\n","import { z } from 'zod';\n\n// ============================================================================\n// CASHEDGE/AGGREGATION SCHEMAS\n// ============================================================================\n\n/**\n * CashEdge and Finicity aggregation schemas\n * Source: ~/code/pfm-platform/apps/legacy/src/stores/cashedgeStore.js\n *\n * CRITICAL NOTES:\n * - Most requests use application/x-www-form-urlencoded, NOT JSON\n * - Some endpoints are partner-level (no userId)\n * - MFA flows require session state management\n */\n\n// ============================================================================\n// INSTITUTION SCHEMAS\n// ============================================================================\n\n/**\n * Institution login parameter\n * Defines credential inputs required for institution authentication\n */\nexport const InstitutionLoginParameterSchema = z.object({\n parameter_id: z.string(), // e.g., \"username\", \"password\", \"security_question\"\n label: z.string(), // Display label: \"User ID\", \"Password\"\n type: z.string(), // Input type: \"text\", \"password\", \"select\"\n});\n\n/**\n * Institution search metadata\n * Pagination info for institution search results\n */\nexport const InstitutionSearchMetaSchema = z.object({\n page: z.number().int().positive(),\n total_pages: z.number().int().nonnegative(),\n total_results: z.number().int().nonnegative(),\n});\n\n/**\n * Financial institution schema\n * Institution available for account aggregation\n */\nexport const InstitutionSchema = z.object({\n id: z.number().int(),\n name: z.string(),\n home_url: z.string().url(),\n ce_login_parameters: z.array(InstitutionLoginParameterSchema),\n});\n\n/**\n * Institutions response schema\n * Endpoint: GET /ce_fis/search?q={query}&scope={scope}&page={page}\n * Endpoint: GET /ce_fis?page={page}\n * Endpoint: GET /ce_fis/{id}\n */\nexport const InstitutionsResponseSchema = z.object({\n ce_fis: z.array(InstitutionSchema),\n meta: InstitutionSearchMetaSchema,\n});\n\n// ============================================================================\n// AUTHENTICATION SCHEMAS\n// ============================================================================\n\n/**\n * Authenticate institution request\n * Endpoint: POST /users/{userId}/ce_fis\n * Content-Type: application/x-www-form-urlencoded\n *\n * Note: Legacy uses form encoding, not JSON\n * Example: id=101939&credentials[login_params][username]=user&credentials[login_params][password]=pass\n */\nexport const AuthenticateRequestSchema = z.object({\n id: z.number().int(), // Institution ID\n credentials: z.object({\n login_params: z.record(z.string(), z.string()), // Dynamic key-value pairs\n }),\n});\n\n/**\n * Authenticate institution response\n * Returns session IDs for tracking aggregation progress\n */\nexport const AuthenticateResponseSchema = z.object({\n harvest_id: z.string(),\n login_id: z.string(),\n status: z.string(), // \"pending\", \"success\", \"mfa_required\", \"error\"\n});\n\n// ============================================================================\n// MFA SCHEMAS\n// ============================================================================\n\n/**\n * MFA (Multi-Factor Authentication) request\n * Endpoint: PUT /users/{userId}/ce_fis/{institutionId}\n * Content-Type: application/x-www-form-urlencoded\n *\n * Example: harvest_id=H123&login_id=L789&session_key=SK123&mfa_responses[code]=123456\n */\nexport const MFARequestSchema = z.object({\n harvest_id: z.string(),\n login_id: z.string(),\n session_key: z.string(),\n mfa_responses: z.record(z.string(), z.string()), // Dynamic MFA responses\n});\n\n/**\n * MFA response\n */\nexport const MFAResponseSchema = z.object({\n status: z.string(), // \"success\", \"error\", \"pending\"\n message: z.string().optional(),\n});\n\n// ============================================================================\n// CREDENTIAL UPDATE SCHEMAS\n// ============================================================================\n\n/**\n * Update credentials request\n * Endpoint: PUT /users/{userId}/accounts/{accountId}/update_credentials\n * Content-Type: application/x-www-form-urlencoded\n *\n * Example: id=101939&credentials[login_params][username]=newuser&credentials[login_params][password]=newpass\n */\nexport const UpdateCredentialsRequestSchema = z.object({\n id: z.number().int(), // Institution ID\n credentials: z.object({\n login_params: z.record(z.string(), z.string()), // Dynamic key-value pairs\n }),\n});\n\n/**\n * Update credentials response\n */\nexport const UpdateCredentialsResponseSchema = z.object({\n status: z.string(), // \"success\", \"error\"\n message: z.string().optional(),\n});\n\n// ============================================================================\n// ACCOUNT CLASSIFICATION SCHEMAS\n// ============================================================================\n\n/**\n * Classify accounts request\n * Endpoint: PUT /users/{userId}/accounts/classify\n * Content-Type: application/x-www-form-urlencoded\n *\n * Example: accounts[123][type_code]=DDA,DDA&accounts[456][type_code]=SAV,SAV&accounts[789][type_code]=ignore\n *\n * Note: Classifies pending accounts after aggregation\n * type_code format: \"ACCT_TYPE,EXT_TYPE\" or \"ignore\" to skip\n */\nexport const ClassifyAccountsRequestSchema = z.object({\n accounts: z.record(\n z.string(), // Account ID as string key\n z.object({\n type_code: z.string(), // \"DDA,DDA\" or \"SAV,SAV\" or \"ignore\"\n })\n ),\n});\n\n// ============================================================================\n// CASHEDGE LOGIN SESSION SCHEMAS\n// ============================================================================\n\n/**\n * CashEdge login session request\n * Endpoint: POST /users/{userId}/cashedge/login\n *\n * Note: Structure unclear from legacy code, needs investigation\n * Placeholder schema based on typical session patterns\n */\nexport const CashEdgeLoginRequestSchema = z.object({\n session_token: z.string().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * CashEdge login session response\n * Endpoint: GET /users/{userId}/cashedge/login\n * Endpoint: POST /users/{userId}/cashedge/login\n *\n * Note: Structure unclear from legacy code, needs investigation\n * Placeholder schema based on typical session patterns\n */\nexport const CashEdgeLoginResponseSchema = z.object({\n session_id: z.string(),\n session_token: z.string().optional(),\n expires_at: z.string().optional(),\n status: z.string().optional(),\n});\n","/**\n * useAuth hook — convenience wrapper for AuthContext\n *\n * Usage:\n * ```tsx\n * const { user, isAuthenticated, signIn, signOut } = useAuth();\n * ```\n */\n\nimport { useContext } from 'react';\nimport { AuthContext, type AuthContextValue } from '../contexts/AuthProvider.js';\n\nexport function useAuth(): AuthContextValue {\n const context = useContext(AuthContext);\n\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n\n return context;\n}\n","/**\n * Chart Utilities\n * Shared utilities for MUI X Charts across all domains\n */\n\nimport { type Theme } from '@mui/material/styles';\n\n/**\n * Currency formatter for chart axes and tooltips\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n}\n\n/**\n * Abbreviated currency formatter for compact displays\n * E.g., $1,234 → $1.2K, $1,234,567 → $1.2M\n */\nexport function formatCurrencyAbbreviated(value: number): string {\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n\n if (absValue >= 1_000_000) {\n return `${sign}$${(absValue / 1_000_000).toFixed(1)}M`;\n }\n if (absValue >= 1_000) {\n return `${sign}$${(absValue / 1_000).toFixed(1)}K`;\n }\n return formatCurrency(value);\n}\n\n/**\n * Percentage formatter for chart labels\n */\nexport function formatPercentage(value: number): string {\n return `${value.toFixed(1)}%`;\n}\n\n/**\n * Get chart color palette from MUI theme\n * Returns an array of colors suitable for pie/donut charts\n */\nexport function getChartColors(theme: Theme): string[] {\n return [\n theme.palette.primary.main,\n theme.palette.secondary.main,\n theme.palette.success.main,\n theme.palette.warning.main,\n theme.palette.error.main,\n theme.palette.info.main,\n theme.palette.primary.light,\n theme.palette.secondary.light,\n theme.palette.success.light,\n theme.palette.warning.light,\n ];\n}\n\n/**\n * Get color by index with wrapping\n * Ensures we always have a color even for large datasets\n */\nexport function getColorByIndex(colors: string[], index: number): string {\n if (colors.length === 0) {\n return '#000000'; // Fallback color if array is empty\n }\n return colors[index % colors.length]!;\n}\n\n/**\n * Chart dimension constants\n * Based on legacy D3 component sizes\n */\nexport const CHART_DIMENSIONS = {\n donut: {\n width: 200,\n height: 200,\n innerRadius: 60,\n outerRadius: 95,\n },\n lineChart: {\n width: 300,\n height: 150,\n margin: { top: 10, right: 20, bottom: 20, left: 50 },\n },\n barChart: {\n width: 300,\n height: 160,\n margin: { top: 20, left: 50, bottom: 40, right: 20 },\n },\n} as const;\n\n/**\n * Common chart props for consistency\n */\nexport interface BaseChartData {\n name: string;\n value: number;\n}\n\n/**\n * Chart theming configuration\n * Provides consistent styling across all charts\n */\nexport function getChartThemeConfig(theme: Theme) {\n return {\n backgroundColor: theme.palette.background.paper,\n textColor: theme.palette.text.primary,\n gridColor: theme.palette.divider,\n tooltipBackgroundColor: theme.palette.background.paper,\n tooltipBorderColor: theme.palette.divider,\n };\n}\n","/**\n * Animation Utilities\n *\n * D3-equivalent animation configurations for Framer Motion.\n * Matches legacy D3 transition timing and easing functions.\n */\n\nimport { Variants, Transition } from 'framer-motion';\n\n/**\n * D3 Transition Durations (matching legacy)\n */\nexport const ANIMATION_DURATIONS = {\n /** Arc/pie slice transitions (D3: 1000ms) */\n arc: 1000,\n\n /** Text transitions (D3: 200ms) */\n text: 200,\n\n /** Meter/progress bar (D3: 600ms) */\n meter: 600,\n\n /** Settings panel slide */\n panel: 300,\n\n /** Tooltip/hover states */\n hover: 150,\n} as const;\n\n/**\n * Easing functions matching D3 defaults\n * D3 uses easeInOut by default for most transitions\n */\nexport const ANIMATION_EASING = {\n /** D3 easeInOut equivalent */\n default: [0.4, 0.0, 0.2, 1],\n\n /** D3 easeOut equivalent */\n easeOut: [0.0, 0.0, 0.2, 1],\n\n /** D3 easeIn equivalent */\n easeIn: [0.4, 0.0, 1, 1],\n\n /** D3 easeLinear equivalent */\n linear: [0.0, 0.0, 1.0, 1.0],\n} as const;\n\n/**\n * Arc/Pie Slice Animation Variants\n * Matches D3 arc enter/update/exit pattern with 1000ms duration\n */\nexport const arcVariants: Variants = {\n initial: {\n opacity: 0,\n scale: 0.8,\n },\n enter: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: ANIMATION_DURATIONS.arc / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n exit: {\n opacity: 0,\n scale: 0.8,\n transition: {\n duration: ANIMATION_DURATIONS.arc / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n hover: {\n scale: 1.05,\n transition: {\n duration: ANIMATION_DURATIONS.hover / 1000,\n ease: ANIMATION_EASING.easeOut,\n },\n },\n selected: {\n scale: 1.1,\n transition: {\n duration: ANIMATION_DURATIONS.hover / 1000,\n ease: ANIMATION_EASING.easeOut,\n },\n },\n};\n\n/**\n * Text Animation Variants\n * Matches D3 text transition with 200ms duration\n */\nexport const textVariants: Variants = {\n initial: {\n opacity: 0,\n y: -10,\n },\n enter: {\n opacity: 1,\n y: 0,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n exit: {\n opacity: 0,\n y: 10,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n selected: {\n y: 5,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n deselected: {\n y: -4,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n};\n\n/**\n * Panel Slide Animation Variants\n * For settings panel and card flipper animations\n */\nexport const panelVariants: Variants = {\n initial: {\n opacity: 0,\n x: 20,\n },\n enter: {\n opacity: 1,\n x: 0,\n transition: {\n duration: ANIMATION_DURATIONS.panel / 1000,\n ease: ANIMATION_EASING.easeOut,\n },\n },\n exit: {\n opacity: 0,\n x: 20,\n transition: {\n duration: ANIMATION_DURATIONS.panel / 1000,\n ease: ANIMATION_EASING.easeIn,\n },\n },\n};\n\n/**\n * Fade Animation Variants\n * For loading states and empty states\n */\nexport const fadeVariants: Variants = {\n initial: {\n opacity: 0,\n },\n enter: {\n opacity: 1,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n};\n\n/**\n * Progress Bar Animation Variants\n * Matches D3 meter transitions (600ms)\n */\nexport const progressVariants: Variants = {\n initial: {\n scaleX: 0,\n transformOrigin: 'left',\n },\n enter: {\n scaleX: 1,\n transition: {\n duration: ANIMATION_DURATIONS.meter / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n exit: {\n scaleX: 0,\n transition: {\n duration: ANIMATION_DURATIONS.meter / 1000,\n ease: ANIMATION_EASING.default,\n },\n },\n};\n\n/**\n * List Item Stagger Animation\n * For breakdown table rows and tag lists\n */\nexport const listContainerVariants: Variants = {\n initial: {\n opacity: 0,\n },\n enter: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n delayChildren: 0.1,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n staggerChildren: 0.03,\n staggerDirection: -1,\n },\n },\n};\n\nexport const listItemVariants: Variants = {\n initial: {\n opacity: 0,\n y: 10,\n },\n enter: {\n opacity: 1,\n y: 0,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.easeOut,\n },\n },\n exit: {\n opacity: 0,\n y: -10,\n transition: {\n duration: ANIMATION_DURATIONS.text / 1000,\n ease: ANIMATION_EASING.easeIn,\n },\n },\n};\n\n/**\n * Create custom transition config\n */\nexport function createTransition(\n duration: number,\n ease: readonly number[] = ANIMATION_EASING.default\n): Transition {\n return {\n duration: duration / 1000,\n ease: ease as [number, number, number, number],\n };\n}\n\n/**\n * Spring animation config (alternative to easing)\n * Useful for interactive elements\n */\nexport const SPRING_CONFIG = {\n default: {\n type: 'spring' as const,\n stiffness: 300,\n damping: 30,\n },\n bouncy: {\n type: 'spring' as const,\n stiffness: 400,\n damping: 20,\n },\n slow: {\n type: 'spring' as const,\n stiffness: 200,\n damping: 40,\n },\n};\n"]}
|